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

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

Powered by Google App Engine
This is Rietveld 408576698