Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1098)

Unified Diff: scripts/slave/recipe_modules/ios/api.py

Issue 2245303004: Interpret collected iOS Swarming task results (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | scripts/slave/recipe_modules/ios/example.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: scripts/slave/recipe_modules/ios/api.py
diff --git a/scripts/slave/recipe_modules/ios/api.py b/scripts/slave/recipe_modules/ios/api.py
index 469a39407260380880d5b75134875217eb312475..ee3d91f85414f3057367513e72d361ea99621734 100644
--- a/scripts/slave/recipe_modules/ios/api.py
+++ b/scripts/slave/recipe_modules/ios/api.py
@@ -14,6 +14,7 @@ class iOSApi(recipe_api.RecipeApi):
PRODUCT_TYPES = {
'iPad Air': 'iPad4,1',
'iPhone 5s': 'iPhone6,1',
+ 'iPhone 6s': 'iPhone8,1',
}
def __init__(self, *args, **kwargs):
@@ -699,19 +700,71 @@ class iOSApi(recipe_api.RecipeApi):
step_result = self.m.step(task.step_name, [])
step_result.presentation.status = self.m.step.EXCEPTION
step_result.presentation.step_text = 'Failed to trigger the test.'
+ infra_failures.append(task.step_name)
continue
try:
- # TODO(smut): We need our own script here to interpret the results.
- self.m.swarming.collect_task(task.task)
+ step_result = self.m.swarming.collect_task(task.task)
except self.m.step.StepFailure as f:
+ step_result = f.result
+
+ # We only run one shard, so the results we're interested in will
+ # always be shard 0.
+ swarming_summary = step_result.json.output['shards'][0]
+ state = swarming_summary['state']
+ exit_code = (swarming_summary.get('exit_codes') or [None])[0]
+
+ # Interpret the result and set the display appropriately.
+ if state == self.m.swarming.State.COMPLETED and exit_code is not None:
+ # Task completed and we got an exit code from the iOS test runner.
+ if exit_code == 1:
+ step_result.presentation.status = self.m.step.FAILURE
+ test_failures.append(task.step_name)
+ elif exit_code == 2:
+ # The iOS test runner exits 2 to indicate an infrastructure failure.
+ step_result.presentation.status = self.m.step.EXCEPTION
+ infra_failures.append(task.step_name)
+ elif state == self.m.swarming.State.TIMED_OUT:
+ # The task was killed for taking too long. This is a test failure
+ # because the test itself hung.
+ step_result.presentation.status = self.m.step.FAILURE
+ step_result.presentation.step_text = 'Test timed out.'
test_failures.append(task.step_name)
+ elif state == self.m.swarming.State.EXPIRED:
+ # No Swarming bot accepted the task in time.
+ step_result.presentation.status = self.m.step.EXCEPTION
+ step_result.presentation.step_text = (
+ 'No suitable Swarming bot found in time.'
+ )
+ infra_failures.append(task.step_name)
+ else:
+ step_result.presentation.status = self.m.step.EXCEPTION
+ step_result.presentation.step_text = (
+ 'Unexpected infrastructure failure.'
+ )
+ infra_failures.append(task.step_name)
+
+ # Add any iOS test runner results to the display.
+ test_summary = self.m.path.join(
+ task.task.task_output_dir, '0', 'summary.json')
+ if self.m.path.exists(test_summary): # pragma: no cover
Dirk Pranke 2016/08/17 01:53:58 is it too difficult to write a test for this?
smut 2016/08/17 21:51:56 Sort of, because I'm not sure how to mock the open
+ with open(test_summary) as f:
+ test_summary_json = self.m.json.load(f)
+ step_result.presentation.logs['test_summary.json'] = self.m.json.dumps(
+ test_summary_json, indent=2).splitlines()
+ step_result.presentation.logs.update(test_summary_json.get('logs', {}))
+ step_result.presentation.links.update(
+ test_summary_json.get('links', {}))
+ if test_summary_json.get('step_text'):
+ step_result.presentation.step_text = '%s<br />%s' % (
+ step_result.presentation.step_text, test_summary_json['step_text'])
Dirk Pranke 2016/08/17 01:53:58 The routines in this module are, generally, pretty
smut 2016/08/17 21:51:56 I tried it, but I didn't like the way it looked.
if test_failures:
raise self.m.step.StepFailure(
- 'Failed %s.' % ', '.join(test_failures + infra_failures))
+ 'Failed %s.' % ', '.join(sorted(set(test_failures + infra_failures))))
elif infra_failures:
- raise self.m.step.InfraFailure('Failed %s.' % ', '.join(infra_failures))
+ raise self.m.step.InfraFailure(
+ 'Failed %s.' % ', '.join(sorted(set(infra_failures))))
@property
def most_recent_app_dir(self):
« no previous file with comments | « no previous file | scripts/slave/recipe_modules/ios/example.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698