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

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

Issue 1828573003: Add support for swarming priority and expiration in the test spec (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/build.git@master
Patch Set: Addressed comments Created 4 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
« no previous file with comments | « no previous file | scripts/slave/recipes/chromium_trybot.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 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 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 test_spec.get(buildername, {}).get('gtest_tests', [])] 412 test_spec.get(buildername, {}).get('gtest_tests', [])]
413 413
414 for test in get_tests(api): 414 for test in get_tests(api):
415 args = test.get('args', []) 415 args = test.get('args', [])
416 if test['shard_index'] != 0 or test['total_shards'] != 1: 416 if test['shard_index'] != 0 or test['total_shards'] != 1:
417 args.extend(['--test-launcher-shard-index=%d' % test['shard_index'], 417 args.extend(['--test-launcher-shard-index=%d' % test['shard_index'],
418 '--test-launcher-total-shards=%d' % test['total_shards']]) 418 '--test-launcher-total-shards=%d' % test['total_shards']])
419 use_swarming = False 419 use_swarming = False
420 swarming_shards = 1 420 swarming_shards = 1
421 swarming_dimension_sets = None 421 swarming_dimension_sets = None
422 swarming_priority = None
423 swarming_expiration = None
422 if enable_swarming: 424 if enable_swarming:
423 swarming_spec = test.get('swarming', {}) 425 swarming_spec = test.get('swarming', {})
424 if swarming_spec.get('can_use_on_swarming_builders'): 426 if swarming_spec.get('can_use_on_swarming_builders'):
425 use_swarming = True 427 use_swarming = True
426 swarming_shards = swarming_spec.get('shards', 1) 428 swarming_shards = swarming_spec.get('shards', 1)
427 swarming_dimension_sets = swarming_spec.get('dimension_sets') 429 swarming_dimension_sets = swarming_spec.get('dimension_sets')
430 swarming_priority = swarming_spec.get('priority_adjustment')
431 swarming_expiration = swarming_spec.get('expiration')
428 override_compile_targets = test.get('override_compile_targets', None) 432 override_compile_targets = test.get('override_compile_targets', None)
429 target_name = str(test['test']) 433 target_name = str(test['test'])
430 name = str(test.get('name', target_name)) 434 name = str(test.get('name', target_name))
431 swarming_dimensions = swarming_dimensions or {} 435 swarming_dimensions = swarming_dimensions or {}
432 use_xvfb = test.get('use_xvfb', True) 436 use_xvfb = test.get('use_xvfb', True)
433 if use_swarming and swarming_dimension_sets: 437 if use_swarming and swarming_dimension_sets:
434 for dimensions in swarming_dimension_sets: 438 for dimensions in swarming_dimension_sets:
435 # Yield potentially multiple invocations of the same test, on 439 # Yield potentially multiple invocations of the same test, on
436 # different machine configurations. 440 # different machine configurations.
437 new_dimensions = dict(swarming_dimensions) 441 new_dimensions = dict(swarming_dimensions)
438 new_dimensions.update(dimensions) 442 new_dimensions.update(dimensions)
439 yield GTestTest(name, args=args, target_name=target_name, 443 yield GTestTest(name, args=args, target_name=target_name,
440 flakiness_dash=True, 444 flakiness_dash=True,
441 enable_swarming=True, 445 enable_swarming=True,
442 swarming_shards=swarming_shards, 446 swarming_shards=swarming_shards,
443 swarming_dimensions=new_dimensions, 447 swarming_dimensions=new_dimensions,
448 swarming_priority=swarming_priority,
449 swarming_expiration=swarming_expiration,
444 override_compile_targets=override_compile_targets, 450 override_compile_targets=override_compile_targets,
445 use_xvfb=use_xvfb) 451 use_xvfb=use_xvfb)
446 else: 452 else:
447 yield GTestTest(name, args=args, target_name=target_name, 453 yield GTestTest(name, args=args, target_name=target_name,
448 flakiness_dash=True, 454 flakiness_dash=True,
449 enable_swarming=use_swarming, 455 enable_swarming=use_swarming,
450 swarming_dimensions=swarming_dimensions, 456 swarming_dimensions=swarming_dimensions,
451 swarming_shards=swarming_shards, 457 swarming_shards=swarming_shards,
458 swarming_priority=swarming_priority,
459 swarming_expiration=swarming_expiration,
452 override_compile_targets=override_compile_targets, 460 override_compile_targets=override_compile_targets,
453 use_xvfb=use_xvfb) 461 use_xvfb=use_xvfb)
454 462
455 463
456 def generate_instrumentation_test(api, chromium_tests_api, mastername, 464 def generate_instrumentation_test(api, chromium_tests_api, mastername,
457 buildername, test_spec, bot_update_step, 465 buildername, test_spec, bot_update_step,
458 enable_swarming=False, 466 enable_swarming=False,
459 swarming_dimensions=None, 467 swarming_dimensions=None,
460 scripts_compile_targets=None): 468 scripts_compile_targets=None):
461 for test in test_spec.get(buildername, {}).get('instrumentation_tests', []): 469 for test in test_spec.get(buildername, {}).get('instrumentation_tests', []):
462 test_name = str(test.get('test')) 470 test_name = str(test.get('test'))
463 use_swarming = False 471 use_swarming = False
464 if enable_swarming: 472 if enable_swarming:
465 swarming_spec = test.get('swarming', {}) 473 swarming_spec = test.get('swarming', {})
466 if swarming_spec.get('can_use_on_swarming_builders'): 474 if swarming_spec.get('can_use_on_swarming_builders'):
467 use_swarming = True 475 use_swarming = True
468 swarming_shards = swarming_spec.get('shards', 1) 476 swarming_shards = swarming_spec.get('shards', 1)
469 swarming_dimension_sets = swarming_spec.get('dimension_sets') 477 swarming_dimension_sets = swarming_spec.get('dimension_sets')
478 swarming_priority = swarming_spec.get('priority_adjustment')
479 swarming_expiration = swarming_spec.get('expiration')
470 if use_swarming and swarming_dimension_sets: 480 if use_swarming and swarming_dimension_sets:
471 for dimensions in swarming_dimension_sets: 481 for dimensions in swarming_dimension_sets:
472 # TODO(stip): Swarmify instrumentation tests 482 # TODO(stip): Swarmify instrumentation tests
473 pass 483 pass
474 else: 484 else:
475 yield AndroidInstrumentationTest( 485 yield AndroidInstrumentationTest(
476 test_name, 486 test_name,
477 compile_targets=test.get('override_compile_targets', None), 487 compile_targets=test.get('override_compile_targets', None),
478 isolate_file_path=test.get('isolate_file_path', None), 488 isolate_file_path=test.get('isolate_file_path', None),
479 apk_under_test=test.get('apk_under_test', None), 489 apk_under_test=test.get('apk_under_test', None),
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 596
587 if failure: 597 if failure:
588 raise failure 598 raise failure
589 599
590 @staticmethod 600 @staticmethod
591 def compile_targets(_): 601 def compile_targets(_):
592 return [] 602 return []
593 603
594 604
595 class SwarmingTest(Test): 605 class SwarmingTest(Test):
606 PRIORITY_ADJUSTMENTS = {
607 'higher': -10,
608 'normal': 0,
609 'lower': +10,
610 }
611
596 def __init__(self, name, dimensions=None, tags=None, target_name=None, 612 def __init__(self, name, dimensions=None, tags=None, target_name=None,
597 extra_suffix=None): 613 extra_suffix=None, priority=None, expiration=None):
598 self._name = name 614 self._name = name
599 self._tasks = {} 615 self._tasks = {}
600 self._results = {} 616 self._results = {}
601 self._target_name = target_name 617 self._target_name = target_name
602 self._dimensions = dimensions 618 self._dimensions = dimensions
603 self._tags = tags 619 self._tags = tags
604 self._extra_suffix = extra_suffix 620 self._extra_suffix = extra_suffix
621 self._priority = priority
622 self._expiration = expiration
605 if dimensions and not extra_suffix: 623 if dimensions and not extra_suffix:
606 self._extra_suffix = self._get_gpu_suffix(dimensions) 624 self._extra_suffix = self._get_gpu_suffix(dimensions)
607 625
608 @staticmethod 626 @staticmethod
609 def _get_gpu_suffix(dimensions): 627 def _get_gpu_suffix(dimensions):
610 if not dimensions.get('gpu'): 628 if not dimensions.get('gpu'):
611 return None 629 return None
612 gpu_vendor_id = dimensions.get('gpu', '').split(':')[0].lower() 630 gpu_vendor_id = dimensions.get('gpu', '').split(':')[0].lower()
613 vendor_ids = { 631 vendor_ids = {
614 '8086': 'Intel', 632 '8086': 'Intel',
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 import sys 690 import sys
673 print '*.isolated file for target %s is missing' % sys.argv[1] 691 print '*.isolated file for target %s is missing' % sys.argv[1]
674 sys.exit(1) 692 sys.exit(1)
675 """, 693 """,
676 args=[self.isolate_target(api)]) 694 args=[self.isolate_target(api)])
677 695
678 # Create task. 696 # Create task.
679 self._tasks[suffix] = self.create_task( 697 self._tasks[suffix] = self.create_task(
680 api, suffix, isolated_hash, test_filter=test_filter) 698 api, suffix, isolated_hash, test_filter=test_filter)
681 699
700 if self._priority in self.PRIORITY_ADJUSTMENTS:
701 self._tasks[suffix].priority += self.PRIORITY_ADJUSTMENTS[self._priority]
702
703 if self._expiration:
704 self._tasks[suffix].expiration = self._expiration
705
682 # Add custom dimensions. 706 # Add custom dimensions.
683 if self._dimensions: # pragma: no cover 707 if self._dimensions: # pragma: no cover
684 #TODO(stip): concoct a test case that will trigger this codepath 708 #TODO(stip): concoct a test case that will trigger this codepath
685 for k, v in self._dimensions.iteritems(): 709 for k, v in self._dimensions.iteritems():
686 if v is None: 710 if v is None:
687 # Remove key if it exists. This allows one to use None to remove 711 # Remove key if it exists. This allows one to use None to remove
688 # default dimensions. 712 # default dimensions.
689 self._tasks[suffix].dimensions.pop(k, None) 713 self._tasks[suffix].dimensions.pop(k, None)
690 else: 714 else:
691 self._tasks[suffix].dimensions[k] = v 715 self._tasks[suffix].dimensions[k] = v
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 assert self.has_valid_results(api, suffix) 785 assert self.has_valid_results(api, suffix)
762 return self._results[suffix]['failures'] 786 return self._results[suffix]['failures']
763 787
764 @property 788 @property
765 def uses_swarming(self): 789 def uses_swarming(self):
766 return True 790 return True
767 791
768 792
769 class SwarmingGTestTest(SwarmingTest): 793 class SwarmingGTestTest(SwarmingTest):
770 def __init__(self, name, args=None, target_name=None, shards=1, 794 def __init__(self, name, args=None, target_name=None, shards=1,
771 dimensions=None, tags=None, extra_suffix=None, 795 dimensions=None, tags=None, extra_suffix=None, priority=None,
772 upload_test_results=True, override_compile_targets=None): 796 expiration=None, upload_test_results=True,
797 override_compile_targets=None):
773 super(SwarmingGTestTest, self).__init__(name, dimensions, tags, target_name, 798 super(SwarmingGTestTest, self).__init__(name, dimensions, tags, target_name,
774 extra_suffix) 799 extra_suffix, priority, expiration)
775 self._args = args or [] 800 self._args = args or []
776 self._shards = shards 801 self._shards = shards
777 self._upload_test_results = upload_test_results 802 self._upload_test_results = upload_test_results
778 self._override_compile_targets = override_compile_targets 803 self._override_compile_targets = override_compile_targets
779 804
780 def compile_targets(self, api): 805 def compile_targets(self, api):
781 # <X>_run target depends on <X>, and then isolates it invoking isolate.py. 806 # <X>_run target depends on <X>, and then isolates it invoking isolate.py.
782 # It is a convention, not a hard coded rule. 807 # It is a convention, not a hard coded rule.
783 # Also include name without the _run suffix to help recipes correctly 808 # Also include name without the _run suffix to help recipes correctly
784 # interpret results returned by "analyze". 809 # interpret results returned by "analyze".
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 return self._test_runs[suffix].json.output['valid'] 1179 return self._test_runs[suffix].json.output['valid']
1155 except Exception: # pragma: no cover 1180 except Exception: # pragma: no cover
1156 return False 1181 return False
1157 1182
1158 def failures(self, api, suffix): 1183 def failures(self, api, suffix):
1159 return self._test_runs[suffix].json.output['failures'] 1184 return self._test_runs[suffix].json.output['failures']
1160 1185
1161 1186
1162 class SwarmingIsolatedScriptTest(SwarmingTest): 1187 class SwarmingIsolatedScriptTest(SwarmingTest):
1163 def __init__(self, name, args=None, target_name=None, shards=1, 1188 def __init__(self, name, args=None, target_name=None, shards=1,
1164 dimensions=None, tags=None, extra_suffix=None, 1189 dimensions=None, tags=None, extra_suffix=None, priority=None,
1165 upload_test_results=True, override_compile_targets=None): 1190 expiration=None, upload_test_results=True,
1191 override_compile_targets=None):
1166 super(SwarmingIsolatedScriptTest, self).__init__( 1192 super(SwarmingIsolatedScriptTest, self).__init__(
1167 name, dimensions, tags, target_name, extra_suffix) 1193 name, dimensions, tags, target_name, extra_suffix, priority, expiration)
1168 self._args = args or [] 1194 self._args = args or []
1169 self._shards = shards 1195 self._shards = shards
1170 self._upload_test_results = upload_test_results 1196 self._upload_test_results = upload_test_results
1171 self._override_compile_targets = override_compile_targets 1197 self._override_compile_targets = override_compile_targets
1172 1198
1173 @property 1199 @property
1174 def target_name(self): 1200 def target_name(self):
1175 return self._target_name or self._name 1201 return self._target_name or self._name
1176 1202
1177 def compile_targets(self, _): 1203 def compile_targets(self, _):
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 1243
1218 1244
1219 def generate_isolated_script(api, chromium_tests_api, mastername, buildername, 1245 def generate_isolated_script(api, chromium_tests_api, mastername, buildername,
1220 test_spec, bot_update_step, enable_swarming=False, 1246 test_spec, bot_update_step, enable_swarming=False,
1221 swarming_dimensions=None, 1247 swarming_dimensions=None,
1222 scripts_compile_targets=None): 1248 scripts_compile_targets=None):
1223 for spec in test_spec.get(buildername, {}).get('isolated_scripts', []): 1249 for spec in test_spec.get(buildername, {}).get('isolated_scripts', []):
1224 use_swarming = False 1250 use_swarming = False
1225 swarming_shards = 1 1251 swarming_shards = 1
1226 swarming_dimension_sets = None 1252 swarming_dimension_sets = None
1253 swarming_priority = None
1254 swarming_expiration = None
1227 if enable_swarming: 1255 if enable_swarming:
1228 swarming_spec = spec.get('swarming', {}) 1256 swarming_spec = spec.get('swarming', {})
1229 if swarming_spec.get('can_use_on_swarming_builders', False): 1257 if swarming_spec.get('can_use_on_swarming_builders', False):
1230 use_swarming = True 1258 use_swarming = True
1231 swarming_shards = swarming_spec.get('shards', 1) 1259 swarming_shards = swarming_spec.get('shards', 1)
1232 swarming_dimension_sets = swarming_spec.get('dimension_sets') 1260 swarming_dimension_sets = swarming_spec.get('dimension_sets')
1261 swarming_priority = swarming_spec.get('priority_adjustment')
1262 swarming_expiration = swarming_spec.get('expiration')
1233 name = str(spec['name']) 1263 name = str(spec['name'])
1234 # The variable substitution and precommit/non-precommit arguments 1264 # The variable substitution and precommit/non-precommit arguments
1235 # could be supported for the other test types too, but that wasn't 1265 # could be supported for the other test types too, but that wasn't
1236 # desired at the time of this writing. 1266 # desired at the time of this writing.
1237 args = get_args_for_test(api, chromium_tests_api, spec, bot_update_step) 1267 args = get_args_for_test(api, chromium_tests_api, spec, bot_update_step)
1238 target_name = spec['isolate_name'] 1268 target_name = spec['isolate_name']
1239 # This features is only needed for the cases in which the *_run compile 1269 # This features is only needed for the cases in which the *_run compile
1240 # target is needed to generate isolate files that contains dynamically libs. 1270 # target is needed to generate isolate files that contains dynamically libs.
1241 # TODO(nednguyen, kbr): Remove this once all the GYP builds are converted 1271 # TODO(nednguyen, kbr): Remove this once all the GYP builds are converted
1242 # to GN. 1272 # to GN.
1243 override_compile_targets = spec.get('override_compile_targets', None) 1273 override_compile_targets = spec.get('override_compile_targets', None)
1244 swarming_dimensions = swarming_dimensions or {} 1274 swarming_dimensions = swarming_dimensions or {}
1245 if use_swarming: 1275 if use_swarming:
1246 if swarming_dimension_sets: 1276 if swarming_dimension_sets:
1247 for dimensions in swarming_dimension_sets: 1277 for dimensions in swarming_dimension_sets:
1248 # Yield potentially multiple invocations of the same test, 1278 # Yield potentially multiple invocations of the same test,
1249 # on different machine configurations. 1279 # on different machine configurations.
1250 new_dimensions = dict(swarming_dimensions) 1280 new_dimensions = dict(swarming_dimensions)
1251 new_dimensions.update(dimensions) 1281 new_dimensions.update(dimensions)
1252 yield SwarmingIsolatedScriptTest( 1282 yield SwarmingIsolatedScriptTest(
1253 name=name, args=args, target_name=target_name, 1283 name=name, args=args, target_name=target_name,
1254 shards=swarming_shards, dimensions=new_dimensions, 1284 shards=swarming_shards, dimensions=new_dimensions,
1255 override_compile_targets=override_compile_targets) 1285 override_compile_targets=override_compile_targets,
1286 priority=swarming_priority, expiration=swarming_expiration)
1256 else: 1287 else:
1257 yield SwarmingIsolatedScriptTest( 1288 yield SwarmingIsolatedScriptTest(
1258 name=name, args=args, target_name=target_name, 1289 name=name, args=args, target_name=target_name,
1259 shards=swarming_shards, dimensions=swarming_dimensions, 1290 shards=swarming_shards, dimensions=swarming_dimensions,
1260 override_compile_targets=override_compile_targets) 1291 override_compile_targets=override_compile_targets,
1292 priority=swarming_priority, expiration=swarming_expiration)
1261 else: 1293 else:
1262 yield LocalIsolatedScriptTest( 1294 yield LocalIsolatedScriptTest(
1263 name=name, args=args, target_name=target_name, 1295 name=name, args=args, target_name=target_name,
1264 override_compile_targets=override_compile_targets) 1296 override_compile_targets=override_compile_targets)
1265 1297
1266 1298
1267 class GTestTest(Test): 1299 class GTestTest(Test):
1268 def __init__(self, name, args=None, target_name=None, enable_swarming=False, 1300 def __init__(self, name, args=None, target_name=None, enable_swarming=False,
1269 swarming_shards=1, swarming_dimensions=None, swarming_tags=None, 1301 swarming_shards=1, swarming_dimensions=None, swarming_tags=None,
1270 swarming_extra_suffix=None, **runtest_kwargs): 1302 swarming_extra_suffix=None, swarming_priority=None,
1303 swarming_expiration=None, **runtest_kwargs):
1271 super(GTestTest, self).__init__() 1304 super(GTestTest, self).__init__()
1272 if enable_swarming: 1305 if enable_swarming:
1273 self._test = SwarmingGTestTest( 1306 self._test = SwarmingGTestTest(
1274 name, args, target_name, swarming_shards, swarming_dimensions, 1307 name, args, target_name, swarming_shards, swarming_dimensions,
1275 swarming_tags, swarming_extra_suffix, 1308 swarming_tags, swarming_extra_suffix, swarming_priority,
1276 override_compile_targets=runtest_kwargs.get( 1309 swarming_expiration, override_compile_targets=runtest_kwargs.get(
1277 'override_compile_targets')) 1310 'override_compile_targets'))
1278 else: 1311 else:
1279 self._test = LocalGTestTest(name, args, target_name, **runtest_kwargs) 1312 self._test = LocalGTestTest(name, args, target_name, **runtest_kwargs)
1280 1313
1281 self.enable_swarming = enable_swarming 1314 self.enable_swarming = enable_swarming
1282 1315
1283 @property 1316 @property
1284 def name(self): 1317 def name(self):
1285 return self._test.name 1318 return self._test.name
1286 1319
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
1868 def run(self, api, suffix, test_filter=None): 1901 def run(self, api, suffix, test_filter=None):
1869 api.chromium_android.coverage_report(upload=False) 1902 api.chromium_android.coverage_report(upload=False)
1870 api.chromium_android.get_changed_lines_for_revision() 1903 api.chromium_android.get_changed_lines_for_revision()
1871 api.chromium_android.incremental_coverage_report() 1904 api.chromium_android.incremental_coverage_report()
1872 1905
1873 1906
1874 GOMA_TESTS = [ 1907 GOMA_TESTS = [
1875 GTestTest('base_unittests'), 1908 GTestTest('base_unittests'),
1876 GTestTest('content_unittests'), 1909 GTestTest('content_unittests'),
1877 ] 1910 ]
OLDNEW
« no previous file with comments | « no previous file | scripts/slave/recipes/chromium_trybot.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698