| 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 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 ] |
| OLD | NEW |