[benchmarks] Factor out duplication in use of ssh.run() + processResults()

Introduce runTestCommand() function for the common code.

Also add a cleanup step that removes the performance results file from
the Fuchsia device under test.

Disable the "cascade_invocations" Dart lint warning/error because it
complains about the use of _tests.add(), and cascading these would be
less readable.

Bug: 68471
Test: fx set terminal.x64 --with src/tests/end_to_end/perf:tests
  + run the individual tests such as this one:
      fx test --e2e fidlc_microbenchmarks_test
Change-Id: Iaeacd7a263eac077bd3b6319493c03ea96a7a82c
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/514062
Commit-Queue: Mark Seaborn <mseaborn@google.com>
Reviewed-by: Nathan Rogers <nathanrogers@google.com>
diff --git a/src/tests/end_to_end/perf/analysis_options.yaml b/src/tests/end_to_end/perf/analysis_options.yaml
index c288793..58e32da 100644
--- a/src/tests/end_to_end/perf/analysis_options.yaml
+++ b/src/tests/end_to_end/perf/analysis_options.yaml
@@ -3,3 +3,7 @@
 # found in the LICENSE file.
 
 include: ../../../../topaz/tools/analysis_options.yaml
+
+linter:
+  rules:
+    cascade_invocations: false
diff --git a/src/tests/end_to_end/perf/test/archivist_benchmarks_test.dart b/src/tests/end_to_end/perf/test/archivist_benchmarks_test.dart
index 1a532ad..f4f1d32 100644
--- a/src/tests/end_to_end/perf/test/archivist_benchmarks_test.dart
+++ b/src/tests/end_to_end/perf/test/archivist_benchmarks_test.dart
@@ -6,25 +6,12 @@
 
 import 'helpers.dart';
 
-String tmpPerfResultsJson(String benchmarkBinary) {
-  return '/tmp/perf_results_$benchmarkBinary.json';
-}
-
-void runBenchmark(String benchmarkBinary, String resultsFile) {
-  final command = '/bin/$benchmarkBinary $resultsFile';
-  test(benchmarkBinary, () async {
-    final helper = await PerfTestHelper.make();
-    var result = await helper.sl4fDriver.ssh.run(command);
-    expect(result.exitCode, equals(0));
-    await helper.processResults(resultsFile);
-    result = await helper.sl4fDriver.ssh.run('rm $resultsFile');
-    expect(result.exitCode, equals(0));
-  }, timeout: Timeout.none);
-}
-
 void main() {
   enableLoggingOutput();
 
-  runBenchmark(
-      'archivist_benchmarks', tmpPerfResultsJson('archivist_benchmarks'));
+  test('archivist_benchmarks', () async {
+    final helper = await PerfTestHelper.make();
+    await helper.runTestCommand(
+        (resultsFile) => '/bin/archivist_benchmarks $resultsFile');
+  }, timeout: Timeout.none);
 }
diff --git a/src/tests/end_to_end/perf/test/audio_mixer_profiler_test.dart b/src/tests/end_to_end/perf/test/audio_mixer_profiler_test.dart
index fa55398..2706b37 100644
--- a/src/tests/end_to_end/perf/test/audio_mixer_profiler_test.dart
+++ b/src/tests/end_to_end/perf/test/audio_mixer_profiler_test.dart
@@ -11,10 +11,7 @@
 
   test('fuchsia.audio.mixer', () async {
     final helper = await PerfTestHelper.make();
-    const resultsFile = '/tmp/perf_results.json';
-    final result = await helper.sl4fDriver.ssh
-        .run('/bin/audio_mixer_profiler --perftest-json=$resultsFile');
-    expect(result.exitCode, equals(0));
-    await helper.processResults(resultsFile);
+    await helper.runTestCommand((resultsFile) =>
+        '/bin/audio_mixer_profiler --perftest-json=$resultsFile');
   }, timeout: Timeout.none);
 }
diff --git a/src/tests/end_to_end/perf/test/diagnostics_benchmarks_test.dart b/src/tests/end_to_end/perf/test/diagnostics_benchmarks_test.dart
index ffb3253..09d6b26 100644
--- a/src/tests/end_to_end/perf/test/diagnostics_benchmarks_test.dart
+++ b/src/tests/end_to_end/perf/test/diagnostics_benchmarks_test.dart
@@ -6,25 +6,12 @@
 
 import 'helpers.dart';
 
-String tmpPerfResultsJson(String benchmarkBinary) {
-  return '/tmp/perf_results_$benchmarkBinary.json';
-}
-
-void runBenchmark(String benchmarkBinary, String resultsFile) {
-  final command = '/bin/$benchmarkBinary $resultsFile';
-  test(benchmarkBinary, () async {
-    final helper = await PerfTestHelper.make();
-    var result = await helper.sl4fDriver.ssh.run(command);
-    expect(result.exitCode, equals(0));
-    await helper.processResults(resultsFile);
-    result = await helper.sl4fDriver.ssh.run('rm $resultsFile');
-    expect(result.exitCode, equals(0));
-  }, timeout: Timeout.none);
-}
-
 void main() {
   enableLoggingOutput();
 
-  runBenchmark(
-      'selectors_benchmarks', tmpPerfResultsJson('selectors_benchmarks'));
+  test('selectors_benchmarks', () async {
+    final helper = await PerfTestHelper.make();
+    await helper.runTestCommand(
+        (resultsFile) => '/bin/selectors_benchmarks $resultsFile');
+  }, timeout: Timeout.none);
 }
diff --git a/src/tests/end_to_end/perf/test/fidl_microbenchmarks_test.dart b/src/tests/end_to_end/perf/test/fidl_microbenchmarks_test.dart
index 8b0324f..cac29b3 100644
--- a/src/tests/end_to_end/perf/test/fidl_microbenchmarks_test.dart
+++ b/src/tests/end_to_end/perf/test/fidl_microbenchmarks_test.dart
@@ -16,19 +16,6 @@
   return '/tmp/perf_results_$benchmarkBinary.json';
 }
 
-void runFidlBenchmark(String benchmarkBinary, String args) {
-  final resultsFile = tmpPerfResultsJson(benchmarkBinary);
-  final path = '/bin/$benchmarkBinary $args';
-  _tests.add(() {
-    test(benchmarkBinary, () async {
-      final helper = await PerfTestHelper.make();
-      final result = await helper.sl4fDriver.ssh.run(path);
-      expect(result.exitCode, equals(0));
-      await helper.processResults(resultsFile);
-    }, timeout: Timeout.none);
-  });
-}
-
 // Runs a benchmark that uses the C++ perftest runner.
 // It is believed that benchmarks converge to different means in different
 // process runs (and reboots). Since each of these benchmarks are currently
@@ -57,17 +44,29 @@
 void main(List<String> args) {
   enableLoggingOutput();
 
-  runFidlBenchmark('go_fidl_microbenchmarks',
-      '--out_file ${tmpPerfResultsJson('go_fidl_microbenchmarks')}');
   runPerftestFidlBenchmark('hlcpp_fidl_microbenchmarks');
   runPerftestFidlBenchmark('lib_fidl_microbenchmarks');
   runPerftestFidlBenchmark('llcpp_fidl_microbenchmarks');
   runPerftestFidlBenchmark('walker_fidl_microbenchmarks');
-  runFidlBenchmark('rust_fidl_microbenchmarks',
-      tmpPerfResultsJson('rust_fidl_microbenchmarks'));
   runPerftestFidlBenchmark('reference_fidl_microbenchmarks');
 
   _tests.add(() {
+    test('go_fidl_microbenchmarks', () async {
+      final helper = await PerfTestHelper.make();
+      await helper.runTestCommand((resultsFile) =>
+          '/bin/go_fidl_microbenchmarks --out_file $resultsFile');
+    }, timeout: Timeout.none);
+  });
+
+  _tests.add(() {
+    test('rust_fidl_microbenchmarks', () async {
+      final helper = await PerfTestHelper.make();
+      await helper.runTestCommand(
+          (resultsFile) => '/bin/rust_fidl_microbenchmarks $resultsFile');
+    }, timeout: Timeout.none);
+  });
+
+  _tests.add(() {
     test('dart_fidl_microbenchmarks', () async {
       final helper = await PerfTestHelper.make();
       const resultsFile =
diff --git a/src/tests/end_to_end/perf/test/fidlc_microbenchmarks_test.dart b/src/tests/end_to_end/perf/test/fidlc_microbenchmarks_test.dart
index e7fe3af..38daf55 100644
--- a/src/tests/end_to_end/perf/test/fidlc_microbenchmarks_test.dart
+++ b/src/tests/end_to_end/perf/test/fidlc_microbenchmarks_test.dart
@@ -11,10 +11,7 @@
 
   test('/bin/fidlc_microbenchmarks', () async {
     final helper = await PerfTestHelper.make();
-    const resultsFile = '/tmp/perf_results_fidlc_microbenchmarks';
-    final result = await helper.sl4fDriver.ssh
-        .run('/bin/fidlc_microbenchmarks -p --quiet --out $resultsFile');
-    expect(result.exitCode, equals(0));
-    await helper.processResults(resultsFile);
+    await helper.runTestCommand((resultsFile) =>
+        '/bin/fidlc_microbenchmarks -p --quiet --out $resultsFile');
   }, timeout: Timeout.none);
 }
diff --git a/src/tests/end_to_end/perf/test/helpers.dart b/src/tests/end_to_end/perf/test/helpers.dart
index be37aae..ba5e342 100644
--- a/src/tests/end_to_end/perf/test/helpers.dart
+++ b/src/tests/end_to_end/perf/test/helpers.dart
@@ -95,6 +95,35 @@
     await performance.convertResults('runtime_deps/catapult_converter',
         jsonSummaryFile, Platform.environment);
   }
+
+  // Runs a command over SSH and publishes its output as performance
+  // test results.
+  //
+  // The command to run is specified via a function that takes a
+  // filename as an argument and returns a shell command string.  The
+  // filename is for the results file that the command will write its
+  // results to, in fuchsiaperf.json format.
+  Future<void> runTestCommand(
+      String Function(String resultsFilename) getCommand) async {
+    // Make a filename that is very likely to be unique.  Using a
+    // unique filename should not be strictly necessary, but it should
+    // avoid potential problems.  We do not expect performance tests
+    // to be run concurrently on the Infra builders, but it may be
+    // useful to do so locally for development purposes when we don't
+    // care about the performance results.
+    final timestamp = DateTime.now().microsecondsSinceEpoch;
+    final resultsFile = '/tmp/perf_results_$timestamp.fuchsiaperf.json';
+    final command = getCommand(resultsFile);
+    final result = await sl4fDriver.ssh.run(command);
+    expect(result.exitCode, equals(0));
+    try {
+      await processResults(resultsFile);
+    } finally {
+      // Clean up: remove the temporary file.
+      final result = await sl4fDriver.ssh.run('rm -f $resultsFile');
+      expect(result.exitCode, equals(0));
+    }
+  }
 }
 
 final _log = Logger('TouchInputLatencyMetricsProcessor');
diff --git a/src/tests/end_to_end/perf/test/kernel_boot_stats_test.dart b/src/tests/end_to_end/perf/test/kernel_boot_stats_test.dart
index 5f80cb0..a6ea7e3 100644
--- a/src/tests/end_to_end/perf/test/kernel_boot_stats_test.dart
+++ b/src/tests/end_to_end/perf/test/kernel_boot_stats_test.dart
@@ -11,10 +11,7 @@
 
   test('fuchsia.kernel.boot', () async {
     final helper = await PerfTestHelper.make();
-    const resultsFile = '/tmp/perf_results.json';
-    final result =
-        await helper.sl4fDriver.ssh.run('/bin/kernel-boot-stats $resultsFile');
-    expect(result.exitCode, equals(0));
-    await helper.processResults(resultsFile);
+    await helper
+        .runTestCommand((resultsFile) => '/bin/kernel-boot-stats $resultsFile');
   }, timeout: Timeout.none);
 }