OLD | NEW |
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 datetime | 5 import datetime |
6 import re | 6 import re |
7 import string | 7 import string |
8 | 8 |
9 | 9 |
10 class Test(object): | 10 class Test(object): |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 if test['shard_index'] != 0 or test['total_shards'] != 1: | 427 if test['shard_index'] != 0 or test['total_shards'] != 1: |
428 args.extend(['--test-launcher-shard-index=%d' % test['shard_index'], | 428 args.extend(['--test-launcher-shard-index=%d' % test['shard_index'], |
429 '--test-launcher-total-shards=%d' % test['total_shards']]) | 429 '--test-launcher-total-shards=%d' % test['total_shards']]) |
430 use_swarming = False | 430 use_swarming = False |
431 swarming_shards = 1 | 431 swarming_shards = 1 |
432 swarming_dimension_sets = None | 432 swarming_dimension_sets = None |
433 swarming_priority = None | 433 swarming_priority = None |
434 swarming_expiration = None | 434 swarming_expiration = None |
435 swarming_hard_timeout = None | 435 swarming_hard_timeout = None |
436 cipd_packages = None | 436 cipd_packages = None |
| 437 output_links = None |
437 if enable_swarming: | 438 if enable_swarming: |
438 swarming_spec = test.get('swarming', {}) | 439 swarming_spec = test.get('swarming', {}) |
439 if swarming_spec.get('can_use_on_swarming_builders'): | 440 if swarming_spec.get('can_use_on_swarming_builders'): |
440 use_swarming = True | 441 use_swarming = True |
441 swarming_shards = swarming_spec.get('shards', 1) | 442 swarming_shards = swarming_spec.get('shards', 1) |
442 swarming_dimension_sets = swarming_spec.get('dimension_sets') | 443 swarming_dimension_sets = swarming_spec.get('dimension_sets') |
443 swarming_priority = swarming_spec.get('priority_adjustment') | 444 swarming_priority = swarming_spec.get('priority_adjustment') |
444 swarming_expiration = swarming_spec.get('expiration') | 445 swarming_expiration = swarming_spec.get('expiration') |
445 swarming_hard_timeout = swarming_spec.get('hard_timeout') | 446 swarming_hard_timeout = swarming_spec.get('hard_timeout') |
446 packages = swarming_spec.get('cipd_packages') | 447 packages = swarming_spec.get('cipd_packages') |
| 448 output_links = swarming_spec.get('output_links') |
447 if packages: | 449 if packages: |
448 cipd_packages = [(p['location'], | 450 cipd_packages = [(p['location'], |
449 p['cipd_package'], | 451 p['cipd_package'], |
450 p['revision']) | 452 p['revision']) |
451 for p in packages] | 453 for p in packages] |
452 override_compile_targets = test.get('override_compile_targets', None) | 454 override_compile_targets = test.get('override_compile_targets', None) |
453 override_isolate_target = test.get('override_isolate_target', None) | 455 override_isolate_target = test.get('override_isolate_target', None) |
454 target_name = str(test['test']) | 456 target_name = str(test['test']) |
455 name = str(test.get('name', target_name)) | 457 name = str(test.get('name', target_name)) |
456 swarming_dimensions = swarming_dimensions or {} | 458 swarming_dimensions = swarming_dimensions or {} |
457 use_xvfb = test.get('use_xvfb', True) | 459 use_xvfb = test.get('use_xvfb', True) |
458 if use_swarming and swarming_dimension_sets: | 460 if use_swarming and swarming_dimension_sets: |
459 for dimensions in swarming_dimension_sets: | 461 for dimensions in swarming_dimension_sets: |
460 # Yield potentially multiple invocations of the same test, on | 462 # Yield potentially multiple invocations of the same test, on |
461 # different machine configurations. | 463 # different machine configurations. |
462 new_dimensions = dict(swarming_dimensions) | 464 new_dimensions = dict(swarming_dimensions) |
463 new_dimensions.update(dimensions) | 465 new_dimensions.update(dimensions) |
464 yield GTestTest(name, args=args, target_name=target_name, | 466 yield GTestTest(name, args=args, target_name=target_name, |
465 flakiness_dash=True, | 467 flakiness_dash=True, |
466 enable_swarming=True, | 468 enable_swarming=True, |
467 swarming_shards=swarming_shards, | 469 swarming_shards=swarming_shards, |
468 swarming_dimensions=new_dimensions, | 470 swarming_dimensions=new_dimensions, |
469 swarming_priority=swarming_priority, | 471 swarming_priority=swarming_priority, |
470 swarming_expiration=swarming_expiration, | 472 swarming_expiration=swarming_expiration, |
471 swarming_hard_timeout=swarming_hard_timeout, | 473 swarming_hard_timeout=swarming_hard_timeout, |
472 override_compile_targets=override_compile_targets, | 474 override_compile_targets=override_compile_targets, |
473 override_isolate_target=override_isolate_target, | 475 override_isolate_target=override_isolate_target, |
474 use_xvfb=use_xvfb, cipd_packages=cipd_packages) | 476 use_xvfb=use_xvfb, cipd_packages=cipd_packages, |
| 477 output_links=output_links) |
475 else: | 478 else: |
476 yield GTestTest(name, args=args, target_name=target_name, | 479 yield GTestTest(name, args=args, target_name=target_name, |
477 flakiness_dash=True, | 480 flakiness_dash=True, |
478 enable_swarming=use_swarming, | 481 enable_swarming=use_swarming, |
479 swarming_dimensions=swarming_dimensions, | 482 swarming_dimensions=swarming_dimensions, |
480 swarming_shards=swarming_shards, | 483 swarming_shards=swarming_shards, |
481 swarming_priority=swarming_priority, | 484 swarming_priority=swarming_priority, |
482 swarming_expiration=swarming_expiration, | 485 swarming_expiration=swarming_expiration, |
483 swarming_hard_timeout=swarming_hard_timeout, | 486 swarming_hard_timeout=swarming_hard_timeout, |
484 override_compile_targets=override_compile_targets, | 487 override_compile_targets=override_compile_targets, |
485 override_isolate_target=override_isolate_target, | 488 override_isolate_target=override_isolate_target, |
486 use_xvfb=use_xvfb, cipd_packages=cipd_packages) | 489 use_xvfb=use_xvfb, cipd_packages=cipd_packages, |
| 490 output_links=output_links) |
487 | 491 |
488 | 492 |
489 def generate_instrumentation_test(api, chromium_tests_api, mastername, | 493 def generate_instrumentation_test(api, chromium_tests_api, mastername, |
490 buildername, test_spec, bot_update_step, | 494 buildername, test_spec, bot_update_step, |
491 enable_swarming=False, | 495 enable_swarming=False, |
492 swarming_dimensions=None, | 496 swarming_dimensions=None, |
493 scripts_compile_targets=None): | 497 scripts_compile_targets=None): |
494 for test in test_spec.get(buildername, {}).get('instrumentation_tests', []): | 498 for test in test_spec.get(buildername, {}).get('instrumentation_tests', []): |
495 test_name = str(test.get('test')) | 499 test_name = str(test.get('test')) |
496 use_swarming = False | 500 use_swarming = False |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 @property | 826 @property |
823 def uses_swarming(self): | 827 def uses_swarming(self): |
824 return True | 828 return True |
825 | 829 |
826 | 830 |
827 class SwarmingGTestTest(SwarmingTest): | 831 class SwarmingGTestTest(SwarmingTest): |
828 def __init__(self, name, args=None, target_name=None, shards=1, | 832 def __init__(self, name, args=None, target_name=None, shards=1, |
829 dimensions=None, tags=None, extra_suffix=None, priority=None, | 833 dimensions=None, tags=None, extra_suffix=None, priority=None, |
830 expiration=None, hard_timeout=None, upload_test_results=True, | 834 expiration=None, hard_timeout=None, upload_test_results=True, |
831 override_compile_targets=None, override_isolate_target=None, | 835 override_compile_targets=None, override_isolate_target=None, |
832 cipd_packages=None): | 836 cipd_packages=None, output_links=None): |
833 super(SwarmingGTestTest, self).__init__(name, dimensions, tags, target_name, | 837 super(SwarmingGTestTest, self).__init__(name, dimensions, tags, target_name, |
834 extra_suffix, priority, expiration, | 838 extra_suffix, priority, expiration, |
835 hard_timeout) | 839 hard_timeout) |
836 self._args = args or [] | 840 self._args = args or [] |
837 self._shards = shards | 841 self._shards = shards |
838 self._upload_test_results = upload_test_results | 842 self._upload_test_results = upload_test_results |
839 self._override_compile_targets = override_compile_targets | 843 self._override_compile_targets = override_compile_targets |
840 self._override_isolate_target = override_isolate_target | 844 self._override_isolate_target = override_isolate_target |
841 self._cipd_packages = cipd_packages | 845 self._cipd_packages = cipd_packages |
| 846 self._output_links = output_links |
842 | 847 |
843 def compile_targets(self, api): | 848 def compile_targets(self, api): |
844 # <X>_run target depends on <X>, and then isolates it invoking isolate.py. | 849 # <X>_run target depends on <X>, and then isolates it invoking isolate.py. |
845 # It is a convention, not a hard coded rule. | 850 # It is a convention, not a hard coded rule. |
846 # Also include name without the _run suffix to help recipes correctly | 851 # Also include name without the _run suffix to help recipes correctly |
847 # interpret results returned by "analyze". | 852 # interpret results returned by "analyze". |
848 if self._override_compile_targets: | 853 if self._override_compile_targets: |
849 return self._override_compile_targets | 854 return self._override_compile_targets |
850 | 855 |
851 if api.chromium.c.TARGET_PLATFORM == 'android': | 856 if api.chromium.c.TARGET_PLATFORM == 'android': |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 | 903 |
899 return True, gtest_results.failures | 904 return True, gtest_results.failures |
900 | 905 |
901 def post_run(self, api, suffix, test_filter=None): | 906 def post_run(self, api, suffix, test_filter=None): |
902 """Waits for launched test to finish and collects the results.""" | 907 """Waits for launched test to finish and collects the results.""" |
903 try: | 908 try: |
904 super(SwarmingGTestTest, self).post_run( | 909 super(SwarmingGTestTest, self).post_run( |
905 api, suffix,test_filter=test_filter) | 910 api, suffix,test_filter=test_filter) |
906 finally: | 911 finally: |
907 step_result = api.step.active_result | 912 step_result = api.step.active_result |
| 913 |
| 914 # Populate additional swarming links on buildbot page. |
| 915 if self._output_links: |
| 916 for task in self._tasks.values(): |
| 917 for test in task.trigger_output['tasks'].values(): |
| 918 # Replace task_id and shard_index placeholders |
| 919 # Adding 1 to task id to match what is populated in the |
| 920 # task environment |
| 921 task_id = format(int(test.get('task_id'), 16) + 1, 'x') |
| 922 shard_index = str(test.get('shard_index')) |
| 923 for output in self._output_links: |
| 924 name = output['name'] |
| 925 name = (name.replace('${SHARD_INDEX}', shard_index)).replace( |
| 926 '${TASK_ID}', task_id) |
| 927 link = output['link'] |
| 928 # Rejoin web links that are broken into a list in the JSON file. |
| 929 link = ''.join(link) |
| 930 link = (link.replace('${SHARD_INDEX}', shard_index)).replace( |
| 931 '${TASK_ID}', task_id) |
| 932 step_result.presentation.links[name] = link |
| 933 |
908 # Only upload test results if we have gtest results. | 934 # Only upload test results if we have gtest results. |
909 if (self._upload_test_results and | 935 if (self._upload_test_results and |
910 hasattr(step_result, 'test_utils') and | 936 hasattr(step_result, 'test_utils') and |
911 hasattr(step_result.test_utils, 'gtest_results')): | 937 hasattr(step_result.test_utils, 'gtest_results')): |
912 gtest_results = getattr(step_result.test_utils, 'gtest_results', None) | 938 gtest_results = getattr(step_result.test_utils, 'gtest_results', None) |
913 if gtest_results and gtest_results.raw: | 939 if gtest_results and gtest_results.raw: |
914 parsed_gtest_data = gtest_results.raw | 940 parsed_gtest_data = gtest_results.raw |
915 chrome_revision_cp = api.bot_update.last_returned_properties.get( | 941 chrome_revision_cp = api.bot_update.last_returned_properties.get( |
916 'got_revision_cp', 'x@{#0}') | 942 'got_revision_cp', 'x@{#0}') |
917 chrome_revision = str(api.commit_position.parse_revision( | 943 chrome_revision = str(api.commit_position.parse_revision( |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1141 yield LocalIsolatedScriptTest( | 1167 yield LocalIsolatedScriptTest( |
1142 name=name, args=args, target_name=target_name, | 1168 name=name, args=args, target_name=target_name, |
1143 override_compile_targets=override_compile_targets) | 1169 override_compile_targets=override_compile_targets) |
1144 | 1170 |
1145 | 1171 |
1146 class GTestTest(Test): | 1172 class GTestTest(Test): |
1147 def __init__(self, name, args=None, target_name=None, enable_swarming=False, | 1173 def __init__(self, name, args=None, target_name=None, enable_swarming=False, |
1148 swarming_shards=1, swarming_dimensions=None, swarming_tags=None, | 1174 swarming_shards=1, swarming_dimensions=None, swarming_tags=None, |
1149 swarming_extra_suffix=None, swarming_priority=None, | 1175 swarming_extra_suffix=None, swarming_priority=None, |
1150 swarming_expiration=None, swarming_hard_timeout=None, | 1176 swarming_expiration=None, swarming_hard_timeout=None, |
1151 cipd_packages=None, **runtest_kwargs): | 1177 cipd_packages=None, output_links=None, **runtest_kwargs): |
1152 super(GTestTest, self).__init__() | 1178 super(GTestTest, self).__init__() |
1153 if enable_swarming: | 1179 if enable_swarming: |
1154 self._test = SwarmingGTestTest( | 1180 self._test = SwarmingGTestTest( |
1155 name, args, target_name, swarming_shards, swarming_dimensions, | 1181 name, args, target_name, swarming_shards, swarming_dimensions, |
1156 swarming_tags, swarming_extra_suffix, swarming_priority, | 1182 swarming_tags, swarming_extra_suffix, swarming_priority, |
1157 swarming_expiration, swarming_hard_timeout, | 1183 swarming_expiration, swarming_hard_timeout, |
1158 cipd_packages=cipd_packages, | 1184 cipd_packages=cipd_packages, output_links=output_links, |
1159 override_compile_targets=runtest_kwargs.get( | 1185 override_compile_targets=runtest_kwargs.get( |
1160 'override_compile_targets'), | 1186 'override_compile_targets'), |
1161 override_isolate_target=runtest_kwargs.get( | 1187 override_isolate_target=runtest_kwargs.get( |
1162 'override_isolate_target')) | 1188 'override_isolate_target')) |
1163 else: | 1189 else: |
1164 self._test = LocalGTestTest(name, args, target_name, **runtest_kwargs) | 1190 self._test = LocalGTestTest(name, args, target_name, **runtest_kwargs) |
1165 | 1191 |
1166 self.enable_swarming = enable_swarming | 1192 self.enable_swarming = enable_swarming |
1167 | 1193 |
1168 @property | 1194 @property |
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1737 args=args) | 1763 args=args) |
1738 api.gsutil.upload( | 1764 api.gsutil.upload( |
1739 temp_output_dir.join( | 1765 temp_output_dir.join( |
1740 '%s-android-chrome.json' % timestamp_string), | 1766 '%s-android-chrome.json' % timestamp_string), |
1741 'chromium-annotated-tests', 'android') | 1767 'chromium-annotated-tests', 'android') |
1742 | 1768 |
1743 GOMA_TESTS = [ | 1769 GOMA_TESTS = [ |
1744 GTestTest('base_unittests'), | 1770 GTestTest('base_unittests'), |
1745 GTestTest('content_unittests'), | 1771 GTestTest('content_unittests'), |
1746 ] | 1772 ] |
OLD | NEW |