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

Side by Side Diff: scripts/slave/recipe_modules/chromium_tests/steps.py

Issue 1588793002: Support variable substitution and tryserver- and waterfall-only cmd line args. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/build.git@master
Patch Set: Addressed review feedback. Created 4 years, 11 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
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 import re 5 import re
6 import string 6 import string
7 7
8 8
9 class Test(object): 9 class Test(object):
10 """ 10 """
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 gtest_results = self._test_runs[suffix].test_utils.gtest_results 340 gtest_results = self._test_runs[suffix].test_utils.gtest_results
341 if not gtest_results.valid: # pragma: no cover 341 if not gtest_results.valid: # pragma: no cover
342 return False 342 return False
343 global_tags = gtest_results.raw.get('global_tags', []) 343 global_tags = gtest_results.raw.get('global_tags', [])
344 return 'UNRELIABLE_RESULTS' not in global_tags 344 return 'UNRELIABLE_RESULTS' not in global_tags
345 345
346 def failures(self, api, suffix): 346 def failures(self, api, suffix):
347 return self._test_runs[suffix].test_utils.gtest_results.failures 347 return self._test_runs[suffix].test_utils.gtest_results.failures
348 348
349 349
350 def generate_gtest(api, mastername, buildername, test_spec, 350 def get_args_for_test(api, chromium_tests_api, test_spec, bot_update_step):
351 enable_swarming=False, scripts_compile_targets=None): 351 """Gets the argument list for a dynamically generated test, as
352 provided by the JSON files in src/testing/buildbot/ in the Chromium
353 workspace. This function provides the following build properties in
354 the form of variable substitutions in the tests' argument lists:
355
356 buildername
357 got_revision
358
359 so, for example, a test can declare the argument:
360
361 --test-machine-name=\"${buildername}\"
362
363 and ${buildername} will be replaced with the associated build
364 property. In this example, it will also be double-quoted, to handle
365 the case where the machine name contains contains spaces.
366
367 This function also supports trybot-only and waterfall-only
368 arguments, so that a test can pass a different argument lists on the
369 continuous builders compared to tryjobs. This is useful when the
370 waterfall bots generate some reference data that is tested against
371 during tryjobs.
372 """
373
374 args = test_spec.get('args', [])
375 if chromium_tests_api.is_precommit_mode():
376 args = args + test_spec.get('precommit_args', [])
377 else:
378 args = args + test_spec.get('non_precommit_args', [])
379 # Perform substitution of known variables.
380 substitutions = {
381 'buildername': api.properties.get('buildername'),
382 'got_revision': bot_update_step.presentation.properties['got_revision']
383 }
384 return [string.Template(arg).safe_substitute(substitutions) for arg in args]
385
386
387 def generate_gtest(api, chromium_tests_api, mastername, buildername, test_spec,
388 bot_update_step, enable_swarming=False,
389 scripts_compile_targets=None):
352 def canonicalize_test(test): 390 def canonicalize_test(test):
353 if isinstance(test, basestring): 391 if isinstance(test, basestring):
354 canonical_test = {'test': test} 392 canonical_test = {'test': test}
355 else: 393 else:
356 canonical_test = test.copy() 394 canonical_test = test.copy()
357 395
358 canonical_test.setdefault('shard_index', 0) 396 canonical_test.setdefault('shard_index', 0)
359 canonical_test.setdefault('total_shards', 1) 397 canonical_test.setdefault('total_shards', 1)
360 return canonical_test 398 return canonical_test
361 399
362 def get_tests(api): 400 def get_tests(api):
363 return [canonicalize_test(t) for t in 401 return [canonicalize_test(t) for t in
364 test_spec.get(buildername, {}).get('gtest_tests', [])] 402 test_spec.get(buildername, {}).get('gtest_tests', [])]
365 403
366 for test in get_tests(api): 404 for test in get_tests(api):
367 args = test.get('args', []) 405 args = get_args_for_test(api, chromium_tests_api, test, bot_update_step)
368 if test['shard_index'] != 0 or test['total_shards'] != 1: 406 if test['shard_index'] != 0 or test['total_shards'] != 1:
369 args.extend(['--test-launcher-shard-index=%d' % test['shard_index'], 407 args.extend(['--test-launcher-shard-index=%d' % test['shard_index'],
370 '--test-launcher-total-shards=%d' % test['total_shards']]) 408 '--test-launcher-total-shards=%d' % test['total_shards']])
371 use_swarming = False 409 use_swarming = False
372 swarming_shards = 1 410 swarming_shards = 1
373 swarming_dimension_sets = None 411 swarming_dimension_sets = None
374 if enable_swarming: 412 if enable_swarming:
375 swarming_spec = test.get('swarming', {}) 413 swarming_spec = test.get('swarming', {})
376 if swarming_spec.get('can_use_on_swarming_builders'): 414 if swarming_spec.get('can_use_on_swarming_builders'):
377 use_swarming = True 415 use_swarming = True
(...skipping 13 matching lines...) Expand all
391 swarming_dimensions=dimensions, 429 swarming_dimensions=dimensions,
392 override_compile_targets=override_compile_targets) 430 override_compile_targets=override_compile_targets)
393 else: 431 else:
394 yield GTestTest(name, args=args, target_name=target_name, 432 yield GTestTest(name, args=args, target_name=target_name,
395 flakiness_dash=True, 433 flakiness_dash=True,
396 enable_swarming=use_swarming, 434 enable_swarming=use_swarming,
397 swarming_shards=swarming_shards, 435 swarming_shards=swarming_shards,
398 override_compile_targets=override_compile_targets) 436 override_compile_targets=override_compile_targets)
399 437
400 438
401 def generate_script(api, mastername, buildername, test_spec, 439 def generate_script(api, chromium_tests_api, mastername, buildername, test_spec,
402 enable_swarming=False, scripts_compile_targets=None): 440 bot_update_step, enable_swarming=False,
441 scripts_compile_targets=None):
403 for script_spec in test_spec.get(buildername, {}).get('scripts', []): 442 for script_spec in test_spec.get(buildername, {}).get('scripts', []):
404 yield ScriptTest( 443 yield ScriptTest(
405 str(script_spec['name']), 444 str(script_spec['name']),
406 script_spec['script'], 445 script_spec['script'],
407 scripts_compile_targets, # pragma: no cover 446 scripts_compile_targets, # pragma: no cover
408 script_spec.get('args', [])) 447 get_args_for_test(
448 api, chromium_tests_api, script_spec, bot_update_step))
409 449
410 450
411 class DynamicPerfTests(Test): 451 class DynamicPerfTests(Test):
412 def __init__(self, perf_id, platform, target_bits, max_battery_temp=None, 452 def __init__(self, perf_id, platform, target_bits, max_battery_temp=None,
413 num_device_shards=1, num_host_shards=1, shard_index=0): 453 num_device_shards=1, num_host_shards=1, shard_index=0):
414 self._perf_id = perf_id 454 self._perf_id = perf_id
415 self._platform = platform 455 self._platform = platform
416 self._target_bits = target_bits 456 self._target_bits = target_bits
417 457
418 self._max_battery_temp = max_battery_temp 458 self._max_battery_temp = max_battery_temp
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 step_result.presentation.logs['invalid_results_exc'] = [str(e)] 1153 step_result.presentation.logs['invalid_results_exc'] = [str(e)]
1114 valid = False 1154 valid = False
1115 failures = None 1155 failures = None
1116 if valid: 1156 if valid:
1117 step_result.presentation.step_text += api.test_utils.format_step_text([ 1157 step_result.presentation.step_text += api.test_utils.format_step_text([
1118 ['failures:', failures] 1158 ['failures:', failures]
1119 ]) 1159 ])
1120 return valid, failures 1160 return valid, failures
1121 1161
1122 1162
1123 def generate_isolated_script(api, mastername, buildername, test_spec, 1163 def generate_isolated_script(api, chromium_tests_api, mastername, buildername,
1124 enable_swarming=False, 1164 test_spec, bot_update_step, enable_swarming=False,
1125 scripts_compile_targets=None): 1165 scripts_compile_targets=None):
1126 for spec in test_spec.get(buildername, {}).get('isolated_scripts', []): 1166 for spec in test_spec.get(buildername, {}).get('isolated_scripts', []):
1127 use_swarming = False 1167 use_swarming = False
1128 swarming_shards = 1 1168 swarming_shards = 1
1129 swarming_dimension_sets = None 1169 swarming_dimension_sets = None
1130 if enable_swarming: 1170 if enable_swarming:
1131 swarming_spec = spec.get('swarming', {}) 1171 swarming_spec = spec.get('swarming', {})
1132 if swarming_spec.get('can_use_on_swarming_builders', False): 1172 if swarming_spec.get('can_use_on_swarming_builders', False):
1133 use_swarming = True 1173 use_swarming = True
1134 swarming_shards = swarming_spec.get('shards', 1) 1174 swarming_shards = swarming_spec.get('shards', 1)
1135 swarming_dimension_sets = swarming_spec.get('dimension_sets') 1175 swarming_dimension_sets = swarming_spec.get('dimension_sets')
1136 name = str(spec['name']) 1176 name = str(spec['name'])
1137 args = args=spec.get('args', []) 1177 args = get_args_for_test(api, chromium_tests_api, spec, bot_update_step)
Paweł Hajdan Jr. 2016/01/20 15:10:38 If the support is intended for isolated script tes
Ken Russell (switch to Gerrit) 2016/01/21 01:29:27 Done and tests updated.
1138 target_name = spec['isolate_name'] 1178 target_name = spec['isolate_name']
1139 # This features is only needed for the cases in which the *_run compile 1179 # This features is only needed for the cases in which the *_run compile
1140 # target is needed to generate isolate files that contains dynamically libs. 1180 # target is needed to generate isolate files that contains dynamically libs.
1141 # TODO(nednguyen, kbr): Remove this once all the GYP builds are converted 1181 # TODO(nednguyen, kbr): Remove this once all the GYP builds are converted
1142 # to GN. 1182 # to GN.
1143 override_compile_targets = spec.get('override_compile_targets', None) 1183 override_compile_targets = spec.get('override_compile_targets', None)
1144 if use_swarming: 1184 if use_swarming:
1145 if swarming_dimension_sets: 1185 if swarming_dimension_sets:
1146 for dimensions in swarming_dimension_sets: 1186 for dimensions in swarming_dimension_sets:
1147 # Yield potentially multiple invocations of the same test, 1187 # Yield potentially multiple invocations of the same test,
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 def run(self, api, suffix, test_filter=None): 1755 def run(self, api, suffix, test_filter=None):
1716 api.chromium_android.coverage_report(upload=False) 1756 api.chromium_android.coverage_report(upload=False)
1717 api.chromium_android.get_changed_lines_for_revision() 1757 api.chromium_android.get_changed_lines_for_revision()
1718 api.chromium_android.incremental_coverage_report() 1758 api.chromium_android.incremental_coverage_report()
1719 1759
1720 1760
1721 GOMA_TESTS = [ 1761 GOMA_TESTS = [
1722 GTestTest('base_unittests'), 1762 GTestTest('base_unittests'),
1723 GTestTest('content_unittests'), 1763 GTestTest('content_unittests'),
1724 ] 1764 ]
OLDNEW
« no previous file with comments | « scripts/slave/recipe_modules/chromium_tests/bot_config_and_test_db.py ('k') | scripts/slave/recipes/android/perf.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698