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

Side by Side Diff: scripts/slave/recipe_modules/isolate/api.py

Issue 313693003: Swarming: conditionally run tests on swarming in chromium_trybot recipe. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: rebase Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | scripts/slave/recipe_modules/isolate/test_api.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 from slave import recipe_api 5 from slave import recipe_api
6 6
7 7
8 class IsolateApi(recipe_api.RecipeApi): 8 class IsolateApi(recipe_api.RecipeApi):
9 """APIs for interacting with isolates.""" 9 """APIs for interacting with isolates."""
10 10
(...skipping 20 matching lines...) Expand all
31 server during the build. This must be called early in your recipe; 31 server during the build. This must be called early in your recipe;
32 definitely before the checkout and runhooks steps. 32 definitely before the checkout and runhooks steps.
33 33
34 Uses current values of self.isolate_server. It should be property configured 34 Uses current values of self.isolate_server. It should be property configured
35 before calling this method if the default value (production instance of 35 before calling this method if the default value (production instance of
36 Isolate service) is not ok. 36 Isolate service) is not ok.
37 """ 37 """
38 config.gyp_env.GYP_DEFINES['test_isolation_mode'] = 'archive' 38 config.gyp_env.GYP_DEFINES['test_isolation_mode'] = 'archive'
39 config.gyp_env.GYP_DEFINES['test_isolation_outdir'] = self._isolate_server 39 config.gyp_env.GYP_DEFINES['test_isolation_outdir'] = self._isolate_server
40 40
41 def find_isolated_tests(self, build_dir, targets=None): 41 def find_isolated_tests(self, build_dir, targets=None, **kwargs):
42 """Returns a step which finds all *.isolated files in a build directory. 42 """Returns a step which finds all *.isolated files in a build directory.
43 43
44 Assigns the dict {target name -> *.isolated file hash} to the swarm_hashes 44 Assigns the dict {target name -> *.isolated file hash} to the swarm_hashes
45 build property. This implies this step can currently only be run once 45 build property. This implies this step can currently only be run once
46 per recipe. 46 per recipe.
47 47
48 If |targets| is None, the step will use all *.isolated files it finds. 48 If |targets| is None, the step will use all *.isolated files it finds.
49 Otherwise, it will verify that all |targets| are found and will use only 49 Otherwise, it will verify that all |targets| are found and will use only
50 them. If some expected targets are missing, will abort the build. 50 them. If some expected targets are missing, will abort the build.
51
52 Also accepts step execution controlling flags (always_run, can_fail_build,
53 etc.) via kwargs.
51 """ 54 """
55 # Failure is fatal by default.
56 kwargs.setdefault('abort_on_failure', True)
57
52 def followup_fn(step_result): 58 def followup_fn(step_result):
53 assert isinstance(step_result.json.output, dict) 59 assert isinstance(step_result.json.output, dict)
54 self._isolated_tests = step_result.json.output 60 self._isolated_tests = step_result.json.output
55 if targets is not None and step_result.presentation.status != 'FAILURE': 61 if targets is not None and step_result.presentation.status != 'FAILURE':
56 found = set(step_result.json.output) 62 found = set(step_result.json.output)
57 expected = set(targets) 63 expected = set(targets)
58 if found >= expected: 64 if found >= expected:
59 # Limit result only to |expected|. 65 # Limit result only to |expected|.
60 self._isolated_tests = { 66 self._isolated_tests = {
61 target: step_result.json.output[target] for target in expected 67 target: step_result.json.output[target] for target in expected
62 } 68 }
63 else: 69 else:
64 # Some expected targets are missing? Fail the step. 70 # Some expected targets are missing? Fail the step.
65 step_result.presentation.status = 'FAILURE' 71 step_result.presentation.status = 'FAILURE'
66 step_result.presentation.logs['missing.isolates'] = ( 72 step_result.presentation.logs['missing.isolates'] = (
67 ['Failed to find *.isolated files:'] + list(expected - found)) 73 ['Failed to find *.isolated files:'] + list(expected - found))
68 step_result.presentation.properties['swarm_hashes'] = self._isolated_tests 74 step_result.presentation.properties['swarm_hashes'] = self._isolated_tests
69 # No isolated files found? That looks suspicious, emit warning. 75 # No isolated files found? That looks suspicious, emit warning.
70 if (not self._isolated_tests and 76 if (not self._isolated_tests and
71 step_result.presentation.status != 'FAILURE'): 77 step_result.presentation.status != 'FAILURE'):
72 step_result.presentation.status = 'WARNING' 78 step_result.presentation.status = 'WARNING'
79
73 return self.m.python( 80 return self.m.python(
74 'find isolated tests', 81 'find isolated tests',
75 self.resource('find_isolated_tests.py'), 82 self.resource('find_isolated_tests.py'),
76 [ 83 [
77 '--build-dir', build_dir, 84 '--build-dir', build_dir,
78 '--output-json', self.m.json.output(), 85 '--output-json', self.m.json.output(),
79 ], 86 ],
80 abort_on_failure=True,
81 followup_fn=followup_fn, 87 followup_fn=followup_fn,
82 step_test_data=lambda: (self.test_api.output_json(targets))) 88 step_test_data=lambda: (self.test_api.output_json(targets)),
89 **kwargs)
83 90
84 @property 91 @property
85 def isolated_tests(self): 92 def isolated_tests(self):
86 """The dictionary of 'target name -> isolated hash' for this run. 93 """The dictionary of 'target name -> isolated hash' for this run.
87 94
88 These come either from the incoming swarm_hashes build property, 95 These come either from the incoming swarm_hashes build property,
89 or from calling find_isolated_tests, above, at some point during the run. 96 or from calling find_isolated_tests, above, at some point during the run.
90 """ 97 """
91 hashes = self.m.properties.get('swarm_hashes', self._isolated_tests) 98 hashes = self.m.properties.get('swarm_hashes', self._isolated_tests)
92 return { 99 return {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 # When running the Telemetry test via an isolate we need to tell 168 # When running the Telemetry test via an isolate we need to tell
162 # run_isolated.py the hash and isolate server first, and then give 169 # run_isolated.py the hash and isolate server first, and then give
163 # the isolate the test name and other arguments separately. 170 # the isolate the test name and other arguments separately.
164 prefix_args=self.runtest_args_list(isolate_name), 171 prefix_args=self.runtest_args_list(isolate_name),
165 args=args, 172 args=args,
166 name=name, 173 name=name,
167 revision=revision, 174 revision=revision,
168 webkit_revision=webkit_revision, 175 webkit_revision=webkit_revision,
169 master_class_name=master_class_name, 176 master_class_name=master_class_name,
170 **runtest_kwargs) 177 **runtest_kwargs)
OLDNEW
« no previous file with comments | « no previous file | scripts/slave/recipe_modules/isolate/test_api.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698