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

Side by Side Diff: scripts/slave/recipe_modules/auto_bisect/example.py

Issue 940123005: Adding ability to bisect recipe to bisect into dependency repos. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/build.git@hax
Patch Set: Addressing feedback, adding TODOs Created 5 years, 9 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
OLDNEW
(Empty)
1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import json
6
7 DEPS = [
8 'auto_bisect',
9 'path',
10 'properties',
11 'raw_io',
12 'step',
13 ]
14
15
16 # This file is just a recipe showing how one would use this module.
17 #
18 # The GenSteps and GenTests functions define the required interface for a
19 # recipe.
20 #
21 # GenSteps is run by the recipe infrastructure and it defines the actual steps
22 # required to execute the recipe.
23 #
24 # GenTests yields test cases to test the recipe using the recipe infrastructure
25 # and it is run when executing recipe_simulation_test.py and by presubmit checks
26 # by git cl. Note that coverage of a 100% of the statements in the recipe and
27 # the recipe_modules themselves is required.
28 #
29 # More information is available in scripts/slave/README.recipes.md
30 def GenSteps(api):
31 # Setting `api.path['checkout']` would ordinarily be done by
32 # `api.chromium_tests.sync_and_configure_build`
33 fake_checkout_path = api.path.mkdtemp('fake_checkout')
34 api.path['checkout'] = fake_checkout_path
35 bisector = api.auto_bisect.create_bisector(api.properties['bisect_config'])
36
37 # Request builds/tests for initial range and wait
38 bisector.good_rev.start_job()
39 bisector.bad_rev.start_job()
40 bisector.wait_for_all([bisector.good_rev, bisector.bad_rev])
41
42 assert bisector.check_improvement_direction()
43 assert bisector.check_regression_confidence()
44 revisions_to_check = bisector.get_revisions_to_eval(1)
45 assert len(revisions_to_check) == 1
46 revisions_to_check[0].start_job()
47 bisector.wait_for_any(revisions_to_check)
48 bisector.check_bisect_finished(revisions_to_check[0])
49
50 # Evaluate inserted DEPS-modified revisions
51 revisions_to_check = bisector.get_revisions_to_eval(2)
52 if revisions_to_check:
53 revisions_to_check[0].start_job()
54 revisions_to_check[0].read_deps() # Only added for coverage.
55 else:
56 raise api.step.StepFailure('Expected revisions to check.')
57 # TODO(robertocn): Add examples for the following operations
58 # Abort unnecesary jobs # Print results
59
60
61 def GenTests(api):
62 basic_data = _get_basic_test_data()
63 yield _make_test(api, basic_data, 'basic')
64
65 reversed_basic_data = _get_reversed_basic_test_data()
66 yield _make_test(api, reversed_basic_data, 'reversed_basic')
67
68 bad_git_hash_data = _get_basic_test_data()
69 bad_git_hash_data[1]['interned_hashes'] = {'003': '12345', '002': 'Bad Hash'}
70 yield _make_test(api, bad_git_hash_data, 'failed_git_hash_object')
71
72 missing_dep_data = _get_basic_test_data()
73 tricked_DEPS_file = ("vars={'v8_' + 'revision': '001'};"
74 "deps = {'src/v8': 'v8.git@' + Var('v8_revision'),"
75 "'src/third_party/WebKit': 'webkit.git@010'}")
76 missing_dep_data[0]['DEPS'] = tricked_DEPS_file
77 yield _make_test(api, missing_dep_data, 'missing_vars_entry')
78
79 missing_dep_data = _get_basic_test_data()
80 tricked_DEPS_file = ("vars={'v8_revision': '001'};"
81 "deps = {'src/v8': 'v8.XXX@' + Var('v8_revision'),"
82 "'src/third_party/WebKit': 'webkit.git@010'}")
83 missing_dep_data[0]['DEPS'] = tricked_DEPS_file
84 yield _make_test(api, missing_dep_data, 'missing_deps_entry')
85
86 bad_deps_syntax_data = _get_basic_test_data()
87 bad_deps_syntax_data[1]['DEPS']='raise RuntimeError("")'
88 yield _make_test(api, bad_deps_syntax_data, 'bad_deps_syntax')
89
90
91 def _get_basic_test_data():
92 return [
93 {
94 'hash': 'a6298e4afedbf2cd461755ea6f45b0ad64222222',
95 'commit_pos': '314015',
96 'test_results': {
97 'results':{
98 'mean': 20,
99 'std_err': 1,
100 'values': [19, 20, 21],
101 }
102 },
103 "DEPS": ("vars={'v8_revision': '001'};"
104 "deps = {'src/v8': 'v8.git@' + Var('v8_revision'),"
105 "'src/third_party/WebKit': 'webkit.git@010'}"),
106 'git_diff': {
107 '002': 'Dummy .diff contents 001 - 002',
108 '003': 'Dummy .diff contents 001 - 003',
109 },
110 },
111 {
112 'hash': 'dcdcdc0ff1122212323134879ddceeb1240b0988',
113 'commit_pos': '314016',
114 'test_results': {
115 'results':{
116 'mean': 15,
117 'std_err': 1,
118 'values': [14, 15, 16],
119 }
120 },
121 'DEPS_change': 'True',
122 "DEPS": ("vars={'v8_revision': '004'};"
123 "deps = {'src/v8': 'v8.git@' + Var('v8_revision'),"
124 "'src/third_party/WebKit': 'webkit.git@010'}"),
125 'DEPS_interval': {'v8': '004 003 002'.split()},
126 },
127 {
128 'hash': '00316c9ddfb9d7b4e1ed2fff9fe6d964d2111111',
129 'commit_pos': '314017',
130 'test_results': {
131 'results':{
132 'mean': 15,
133 'std_err': 1,
134 'values': [14, 15, 16],
135 }
136 }
137 },
138 ]
139
140
141 def _get_reversed_basic_test_data():
142 return [
143 {
144 'hash': '00316c9ddfb9d7b4e1ed2fff9fe6d964d2111111',
145 'commit_pos': '314015',
146 'test_results': {
147 'results':{
148 'mean': 20,
149 'std_err': 1,
150 'values': [19, 20, 21],
151 }
152 }
153 },
154 {
155 'hash': 'a6298e4afedbf2cd461755ea6f45b0ad64222222',
156 'commit_pos': '314016',
157 'test_results': {
158 'results':{
159 'mean': 20,
160 'std_err': 1,
161 'values': [19, 20, 21],
162 }
163 },
164 "DEPS": ("vars={'v8_revision': '001'};"
165 "deps = {'src/v8': 'v8.git@' + Var('v8_revision'),"
166 "'src/third_party/WebKit': 'webkit.git@010'}"),
167 'git_diff': {
168 '002': 'Dummy .diff contents 001 - 002',
169 '003': 'Dummy .diff contents 001 - 003',
170 },
171 },
172 {
173 'hash': 'dcdcdc0ff1122212323134879ddceeb1240b0988',
174 'commit_pos': '314017',
175 'test_results': {
176 'results':{
177 'mean': 15,
178 'std_err': 1,
179 'values': [14, 15, 16],
180 }
181 },
182 'DEPS_change': 'True',
183 "DEPS": ("vars={'v8_revision': '004'};"
184 "deps = {'src/v8': 'v8.git@' + Var('v8_revision'),"
185 "'src/third_party/WebKit': 'webkit.git@010'}"),
186 'DEPS_interval': {'v8': '004 003 002'.split()},
187 },
188 ]
189
190
191 def _make_test(api, test_data, test_name):
192 basic_test = api.test(test_name)
193 for revision_data in test_data:
194 for step_data in _get_step_data_for_revision(api, revision_data):
195 basic_test += step_data
196 basic_test += api.properties(bisect_config=_get_default_config())
197 return basic_test
198
199
200 def _get_default_config():
201 example_config = {
202 'test_type':'perf',
203 'command':
204 ('src/tools/perf/run_benchmark -v --browser=release smoothness.'
205 'tough_scrolling_cases'),
206 'good_revision': '314015',
207 'bad_revision': '314017',
208 'metric': 'mean_input_event_latency/mean_input_event_latency',
209 'repeat_count': '2',
210 'max_time_minutes': '5',
211 'truncate_percent': '0',
212 'bug_id': '',
213 'gs_bucket': 'chrome-perf',
214 'builder_host': 'master4.golo.chromium.org',
215 'builder_port': '8341',
216 'dummy_builds': 'True',
217 'skip_gclient_ops': 'True',
218 }
219 return example_config
220
221
222 def _get_step_data_for_revision(api, revision_data, include_build_steps=True):
223 """Generator that produces step patches for fake results."""
224 commit_pos = revision_data['commit_pos']
225 commit_hash = revision_data['hash']
226 test_results = revision_data['test_results']
227
228 step_name = 'resolving commit_pos ' + commit_pos
229 yield api.step_data(step_name, stdout=api.raw_io.output('hash:' +
230 commit_hash))
231
232 step_name = 'resolving hash ' + commit_hash
233 commit_pos_str = 'refs/heads/master@{#%s}' % commit_pos
234 yield api.step_data(step_name, stdout=api.raw_io.output(commit_pos_str))
235
236 if include_build_steps:
237 step_name = 'gsutil Get test results for build ' + commit_hash
238 yield api.step_data(step_name, stdout=api.raw_io.output(json.dumps(
239 test_results)))
240
241 step_name = 'Get test status for build ' + commit_hash
242 yield api.step_data(step_name, stdout=api.raw_io.output('Complete'))
243
244 step_name = 'gsutil Get test status url for build ' + commit_hash
245 yield api.step_data(step_name, stdout=api.raw_io.output('dummy/url'))
246
247 if revision_data.get('DEPS', False):
248 step_name = 'git cat-file %s:DEPS' % commit_hash
249 yield api.step_data(step_name, stdout=api.raw_io.output(
250 revision_data['DEPS']))
251
252 if 'git_diff' in revision_data:
253 for deps_rev, diff_file in revision_data['git_diff'].iteritems():
254 step_name = 'Generating patch for %s:DEPS to %s'
255 step_name %= (commit_hash, deps_rev)
256 yield api.step_data(step_name, stdout=api.raw_io.output(diff_file))
257
258 if 'DEPS_change' in revision_data:
259 step_name = 'Checking DEPS for ' + commit_hash
260 yield api.step_data(step_name, stdout=api.raw_io.output('DEPS'))
261
262 if 'DEPS_interval' in revision_data:
263 for depot_name, interval in revision_data['DEPS_interval'].iteritems():
264 for item in interval[1:]:
265 step_name = 'Hashing modified DEPS file with revision ' + item
266 file_hash = 'f412e8458'
267 if 'interned_hashes' in revision_data:
268 file_hash = revision_data['interned_hashes'][item]
269 yield api.step_data(step_name, stdout=api.raw_io.output(file_hash))
270 step_name = 'Expanding revision range for revision %s on depot %s'
271 step_name %= (interval[0], depot_name)
272 stdout = api.raw_io.output('\n'.join(interval))
273 yield api.step_data(step_name, stdout=stdout)
274
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698