Simplify iOS swarming dispatch by using failure_as_exception=False.

This CL is a refactor with no intended behavior change.

Bug: 951182
Change-Id: I592143778334d9105297350af02d619c9f87b78a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/build/+/1575845
Commit-Queue: Erik Chen <erikchen@chromium.org>
Reviewed-by: John Budorick <jbudorick@chromium.org>
diff --git a/scripts/slave/README.recipes.md b/scripts/slave/README.recipes.md
index 52793ea..18187d8 100644
--- a/scripts/slave/README.recipes.md
+++ b/scripts/slave/README.recipes.md
@@ -1116,11 +1116,11 @@
 
 Tags can be added per individual task.
 
-&mdash; **def [check\_client\_version](/scripts/slave/recipe_modules/chromium_swarming/api.py#696)(self, step_test_data=None):**
+&mdash; **def [check\_client\_version](/scripts/slave/recipe_modules/chromium_swarming/api.py#699)(self, step_test_data=None):**
 
 Yields steps to verify compatibility with swarming_client version.
 
-&mdash; **def [collect\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#1026)(self, task, \*\*kwargs):**
+&mdash; **def [collect\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#1029)(self, task, \*\*kwargs):**
 
 Waits for a single triggered task to finish.
 
@@ -1132,7 +1132,7 @@
   task: SwarmingTask instance, previously triggered with 'trigger' method.
   kwargs: passed to recipe step constructor as-is.
 
-&mdash; **def [configure\_swarming](/scripts/slave/recipe_modules/chromium_swarming/api.py#1662)(self, project_name, precommit, mastername=None, default_priority=None, path_to_testing_dir=None):**
+&mdash; **def [configure\_swarming](/scripts/slave/recipe_modules/chromium_swarming/api.py#1665)(self, project_name, precommit, mastername=None, default_priority=None, path_to_testing_dir=None):**
 
 Configures default swarming dimensions and tags.
 
@@ -1187,7 +1187,7 @@
 
 &emsp; **@default_user.setter**<br>&mdash; **def [default\_user](/scripts/slave/recipe_modules/chromium_swarming/api.py#348)(self, value):**
 
-&mdash; **def [generate\_trigger\_task\_shard\_args](/scripts/slave/recipe_modules/chromium_swarming/api.py#773)(self, task, \*\*kwargs):**
+&mdash; **def [generate\_trigger\_task\_shard\_args](/scripts/slave/recipe_modules/chromium_swarming/api.py#776)(self, task, \*\*kwargs):**
 
 Generates the arguments for triggered shards.
 
@@ -1198,11 +1198,11 @@
   pre_trigger_args: All arguments up to and including 'trigger'
   post_triggers_args: All arguments following 'trigger'
 
-&mdash; **def [get\_collect\_cmd\_args](/scripts/slave/recipe_modules/chromium_swarming/api.py#1613)(self, task):**
+&mdash; **def [get\_collect\_cmd\_args](/scripts/slave/recipe_modules/chromium_swarming/api.py#1616)(self, task):**
 
 SwarmingTask -> argument list for go swarming command.
 
-&mdash; **def [get\_step\_name](/scripts/slave/recipe_modules/chromium_swarming/api.py#1454)(self, prefix, task):**
+&mdash; **def [get\_step\_name](/scripts/slave/recipe_modules/chromium_swarming/api.py#1457)(self, prefix, task):**
 
 SwarmingTask -> name of a step of a waterfall.
 
@@ -1215,7 +1215,7 @@
 Returns:
   '[<prefix>] <task title> on <OS>'
 
-&mdash; **def [gtest\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#617)(self, title, isolated_hash, extra_args=None, cipd_packages=None, merge=None, \*\*kwargs):**
+&mdash; **def [gtest\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#620)(self, title, isolated_hash, extra_args=None, cipd_packages=None, merge=None, \*\*kwargs):**
 
 Returns a new SwarmingTask instance to run an isolated gtest on Swarming.
 
@@ -1226,7 +1226,7 @@
 
 &mdash; **def [initialize](/scripts/slave/recipe_modules/chromium_swarming/api.py#225)(self):**
 
-&mdash; **def [isolated\_script\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#661)(self, title, isolated_hash, extra_args=None, idempotent=False, merge=None, \*\*kwargs):**
+&mdash; **def [isolated\_script\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#664)(self, title, isolated_hash, extra_args=None, idempotent=False, merge=None, \*\*kwargs):**
 
 Returns a new SwarmingTask to run an isolated script test on Swarming.
 
@@ -1258,7 +1258,7 @@
 example WinXP try bot recipe may explicitly specify 'Windows-XP-SP3'
 dimension.
 
-&mdash; **def [report\_stats](/scripts/slave/recipe_modules/chromium_swarming/api.py#1054)(self):**
+&mdash; **def [report\_stats](/scripts/slave/recipe_modules/chromium_swarming/api.py#1057)(self):**
 
 Report statistics on all tasks ran so far.
 
@@ -1280,7 +1280,7 @@
 
 Changes URL of Swarming server to use.
 
-&mdash; **def [task](/scripts/slave/recipe_modules/chromium_swarming/api.py#473)(self, title, isolated_hash, ignore_task_failure=False, shards=1, shard_indices=None, task_output_dir=None, extra_args=None, idempotent=None, cipd_packages=None, build_properties=None, builder_name=None, build_number=None, merge=None, trigger_script=None, named_caches=None, service_account=None, raw_cmd=None, env_prefixes=None, env=None, optional_dimensions=None, task_to_retry=None):**
+&mdash; **def [task](/scripts/slave/recipe_modules/chromium_swarming/api.py#473)(self, title, isolated_hash, ignore_task_failure=False, shards=1, shard_indices=None, task_output_dir=None, extra_args=None, idempotent=None, cipd_packages=None, build_properties=None, builder_name=None, build_number=None, merge=None, trigger_script=None, named_caches=None, service_account=None, raw_cmd=None, env_prefixes=None, env=None, optional_dimensions=None, task_to_retry=None, failure_as_exception=True):**
 
 Returns a new SwarmingTask instance to run an isolated executable on
 Swarming.
@@ -1366,10 +1366,12 @@
       (potentially partial) retry of another task. When collecting, the
       successful shards from 'task_to_retry' will be merged with the new
       shards in this task.
+  * failure_as_exception: Boolean. Whether test failures should throw a
+    recipe exception during the collet step.
 
 &emsp; **@task_output_stdout.setter**<br>&mdash; **def [task\_output\_stdout](/scripts/slave/recipe_modules/chromium_swarming/api.py#413)(self, value):**
 
-&mdash; **def [trigger\_all\_task\_shards](/scripts/slave/recipe_modules/chromium_swarming/api.py#928)(self, task, shard_indices, \*\*kwargs):**
+&mdash; **def [trigger\_all\_task\_shards](/scripts/slave/recipe_modules/chromium_swarming/api.py#931)(self, task, shard_indices, \*\*kwargs):**
 
 Triggers all shards as a single step.
 
@@ -1379,7 +1381,7 @@
 Returns:
   StepResult from the step.
 
-&mdash; **def [trigger\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#701)(self, task, \*\*kwargs):**
+&mdash; **def [trigger\_task](/scripts/slave/recipe_modules/chromium_swarming/api.py#704)(self, task, \*\*kwargs):**
 
 Triggers one task.
 
@@ -1397,7 +1399,7 @@
 Returns:
   A list of StepResults, one for each shard triggered.
 
-&mdash; **def [trigger\_task\_shard](/scripts/slave/recipe_modules/chromium_swarming/api.py#972)(self, task, shard_index, \*\*kwargs):**
+&mdash; **def [trigger\_task\_shard](/scripts/slave/recipe_modules/chromium_swarming/api.py#975)(self, task, shard_index, \*\*kwargs):**
 
 Triggers a single shard for a task.
 
@@ -1412,7 +1414,7 @@
 
 Enables or disables verbose output in swarming scripts.
 
-&mdash; **def [wait\_for\_finished\_task\_set](/scripts/slave/recipe_modules/chromium_swarming/api.py#1363)(self, task_sets, suffix=None, attempts=0):**
+&mdash; **def [wait\_for\_finished\_task\_set](/scripts/slave/recipe_modules/chromium_swarming/api.py#1366)(self, task_sets, suffix=None, attempts=0):**
 
 Waits for a finished set of tasks.
 
diff --git a/scripts/slave/recipe_modules/chromium_swarming/api.py b/scripts/slave/recipe_modules/chromium_swarming/api.py
index 985ef9d..d482c4e 100644
--- a/scripts/slave/recipe_modules/chromium_swarming/api.py
+++ b/scripts/slave/recipe_modules/chromium_swarming/api.py
@@ -476,7 +476,8 @@
            builder_name=None, build_number=None,
            merge=None, trigger_script=None, named_caches=None,
            service_account=None, raw_cmd=None, env_prefixes=None, env=None,
-           optional_dimensions=None, task_to_retry=None):
+           optional_dimensions=None, task_to_retry=None,
+           failure_as_exception=True):
     """Returns a new SwarmingTask instance to run an isolated executable on
     Swarming.
 
@@ -561,6 +562,8 @@
           (potentially partial) retry of another task. When collecting, the
           successful shards from 'task_to_retry' will be merged with the new
           shards in this task.
+      * failure_as_exception: Boolean. Whether test failures should throw a
+        recipe exception during the collet step.
     """
     if idempotent is None:
       idempotent = self.default_idempotent
@@ -581,7 +584,7 @@
     if shard_indices is None:
       shard_indices = range(shards)
     collect_step = functools.partial(
-        self._default_collect_step, failure_as_exception=True)
+        self._default_collect_step, failure_as_exception=failure_as_exception)
     return SwarmingTask(
         title=title,
         isolated_hash=isolated_hash,
diff --git a/scripts/slave/recipe_modules/chromium_tests/steps.py b/scripts/slave/recipe_modules/chromium_tests/steps.py
index bf2e82f..cea8422 100644
--- a/scripts/slave/recipe_modules/chromium_tests/steps.py
+++ b/scripts/slave/recipe_modules/chromium_tests/steps.py
@@ -2527,6 +2527,7 @@
       task_output_dir=task['tmp_dir'],
       service_account=self._swarming_service_account,
       cipd_packages=cipd_packages,
+      failure_as_exception=False,
     )
     swarming_task.dimensions = {
       'pool': 'Chrome',
@@ -2587,10 +2588,7 @@
         'The task should have been triggered and have an '
         'associated swarming task')
 
-    try:
-      step_result = api.chromium_swarming.collect_task(task['task'])
-    except api.step.StepFailure as f:
-      step_result = f.result
+    step_result = api.chromium_swarming.collect_task(task['task'])
 
     # We only run one shard, so the results we're interested in will
     # always be shard 0.