Fix benchmark tests (#9696)
diff --git a/packages/devtools_app/benchmark/devtools_benchmarks_test.dart b/packages/devtools_app/benchmark/devtools_benchmarks_test.dart
index c8bf4b8..15cf0a6 100644
--- a/packages/devtools_app/benchmark/devtools_benchmarks_test.dart
+++ b/packages/devtools_app/benchmark/devtools_benchmarks_test.dart
@@ -9,6 +9,7 @@
 import 'dart:io';
 
 import 'package:collection/collection.dart';
+import 'package:devtools_test/helpers.dart';
 import 'package:test/test.dart';
 import 'package:web_benchmarks/metrics.dart';
 import 'package:web_benchmarks/server.dart';
@@ -44,8 +45,6 @@
       },
       timeout: const Timeout(Duration(minutes: 15)),
       retry: 0,
-      // TODO(elliette): Re-enable once flakiness is addressed.
-      skip: 'https://github.com/flutter/devtools/issues/9674',
     );
   }
 }
@@ -53,20 +52,44 @@
 Future<void> _runBenchmarks({bool useWasm = false}) async {
   stdout.writeln('Starting web benchmark tests ...');
 
-  final benchmarkPort = await _findAvailablePort(startingAt: 9999);
-  final chromePort = await _findAvailablePort(startingAt: benchmarkPort + 1);
+  var benchmarkPort = await _findAvailablePort(startingAt: 9999);
+  var chromePort = await _findAvailablePort(startingAt: benchmarkPort + 1);
 
-  final taskResult = await serveWebBenchmark(
-    benchmarkAppDirectory: projectRootDirectory(),
-    entryPoint: generateBenchmarkEntryPoint(useWasm: useWasm),
-    compilationOptions: useWasm
-        ? const CompilationOptions.wasm()
-        : const CompilationOptions.js(),
-    treeShakeIcons: false,
-    benchmarkPath: benchmarkPath(useWasm: useWasm),
-    benchmarkServerPort: benchmarkPort,
-    chromeDebugPort: chromePort,
+  // TODO(elliette): Retry logic can likely be removed after
+  // https://github.com/flutter/flutter/issues/183335 is resolved.
+  final taskResult = await retryAsync<BenchmarkResults?>(
+    () async {
+      try {
+        logStatus(
+          'Serving benchmarks (server port: $benchmarkPort, chrome port: $chromePort)',
+        );
+        return await serveWebBenchmark(
+          benchmarkAppDirectory: projectRootDirectory(),
+          entryPoint: generateBenchmarkEntryPoint(useWasm: useWasm),
+          compilationOptions: useWasm
+              ? const CompilationOptions.wasm()
+              : const CompilationOptions.js(),
+          treeShakeIcons: false,
+          benchmarkPath: benchmarkPath(useWasm: useWasm),
+          benchmarkServerPort: benchmarkPort,
+          chromeDebugPort: chromePort,
+        );
+      } catch (e) {
+        logStatus('Serving benchmarks failed with error: $e');
+        return null;
+      }
+    },
+    condition: (result) => result != null,
+    onRetry: () async {
+      logStatus('Retrying with new ports...');
+      benchmarkPort = await _findAvailablePort(startingAt: chromePort + 1);
+      chromePort = await _findAvailablePort(startingAt: benchmarkPort + 1);
+    },
   );
+  if (taskResult == null) {
+    throw Exception('Failed to serve benchmarks after retries.');
+  }
+
   stdout.writeln('Web benchmark tests finished.');
 
   expect(
diff --git a/pubspec.lock b/pubspec.lock
index b0a61b8..7831ae0 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -530,10 +530,10 @@
     dependency: transitive
     description:
       name: matcher
-      sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
+      sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
       url: "https://pub.dev"
     source: hosted
-    version: "0.12.19"
+    version: "0.12.18"
   material_color_utilities:
     dependency: transitive
     description:
@@ -854,26 +854,26 @@
     dependency: transitive
     description:
       name: test
-      sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7"
+      sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a"
       url: "https://pub.dev"
     source: hosted
-    version: "1.30.0"
+    version: "1.29.0"
   test_api:
     dependency: transitive
     description:
       name: test_api
-      sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
+      sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
       url: "https://pub.dev"
     source: hosted
-    version: "0.7.10"
+    version: "0.7.9"
   test_core:
     dependency: transitive
     description:
       name: test_core
-      sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51"
+      sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943"
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.16"
+    version: "0.6.15"
   typed_data:
     dependency: transitive
     description: