Support skia gold without parallel

This adds the option of running skia tests one by one or in parallel.
pdfium recipe is currently not passing in the --run-skia-gold flag, so
this CL will not change any build behavior.

Bug: pdfium:1642
Change-Id: I7550a29aa0052a156d1a715c954021b5ea2e199d
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/78370
Reviewed-by: Hui Yingst <nigi@chromium.org>
Commit-Queue: Stephanie Kim <kimstephanie@google.com>
diff --git a/testing/tools/test_runner.py b/testing/tools/test_runner.py
index 77ac19f..2b5ba1e 100644
--- a/testing/tools/test_runner.py
+++ b/testing/tools/test_runner.py
@@ -300,6 +300,13 @@
         default=False,
         help='When flag is on, skia gold tests will be run.')
 
+    parser.add_argument(
+        '--run-skia-gold-parallel',
+        action='store_true',
+        default=False,
+        help='When flag is on, skia gold tests will be run in parallel with '
+        '--num_workers amount of processes.')
+
     # TODO: Remove when pdfium recipe stops passing this argument
     parser.add_argument(
         '--gold_properties',
@@ -417,13 +424,17 @@
     self.result_suppressed_cases = []
 
     gold_results = []
+    if self.test_type not in TEXT_TESTS:
+      # Clear out and create top level gold output directory before starting
+      skia_gold.clear_gold_output_dir(self.options.gold_output_dir)
+
     if self.options.num_workers > 1 and len(self.test_cases) > 1:
       try:
         pool = multiprocessing.Pool(self.options.num_workers)
         worker_func = functools.partial(TestOneFileParallel, self)
 
         worker_results = pool.imap(worker_func, self.test_cases)
-        skia_gold_inputs = []
+        skia_gold_parallel_inputs = []
         for worker_result in worker_results:
           result, input_filename, source_dir = worker_result
           input_path = os.path.join(source_dir, input_filename)
@@ -433,16 +444,19 @@
           if self.test_type not in TEXT_TESTS and self.options.run_skia_gold:
             _, image_paths = result
             if image_paths:
-              path_filename_tuples = [
-                  (path, input_filename) for path, _ in image_paths
-              ]
-              skia_gold_inputs.extend(path_filename_tuples)
+              if self.options.run_skia_gold_parallel:
+                path_filename_tuples = [
+                    (path, input_filename) for path, _ in image_paths
+                ]
+                skia_gold_parallel_inputs.extend(path_filename_tuples)
+              else:
+                for img_path, _ in image_paths:
+                  test_name, skia_success = self.RunSkia(img_path)
+                  gold_results.append((test_name, skia_success, input_filename))
 
-        if skia_gold_inputs and self.test_type not in TEXT_TESTS:
+        if skia_gold_parallel_inputs:
           gold_worker_func = functools.partial(RunSkiaWrapper, self)
-          # Clear out top level gold output directory before starting
-          skia_gold.clear_gold_output_dir(self.options.gold_output_dir)
-          gold_results = pool.imap(gold_worker_func, skia_gold_inputs)
+          gold_results = pool.imap(gold_worker_func, skia_gold_parallel_inputs)
 
       except KeyboardInterrupt:
         pool.terminate()
@@ -457,9 +471,8 @@
                           os.path.join(input_file_dir, input_filename), result)
 
         _, image_paths = result
-        if image_paths and self.test_type not in TEXT_TESTS:
-          # Clear out top level gold output directory before starting
-          skia_gold.clear_gold_output_dir(self.options.gold_output_dir)
+        if image_paths and self.test_type not in TEXT_TESTS and \
+            self.options.run_skia_gold:
           for img_path, _ in image_paths:
             test_name, skia_success = self.RunSkia(img_path)
             gold_results.append((test_name, skia_success, input_filename))
@@ -517,7 +530,7 @@
     print('  Suppressed:', number_suppressed)
     print('  Surprises:', number_surprises)
     print('  Failures:', number_failures)
-    if self.test_type not in TEXT_TESTS:
+    if self.test_type not in TEXT_TESTS and self.options.run_skia_gold:
       number_gold_failures = len(self.skia_gold_failures)
       number_gold_successes = len(self.skia_gold_successes)
       number_gold_surprises = len(self.skia_gold_unexpected_successes)