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

Side by Side Diff: third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py

Issue 2693533003: webkitpy: Reworking test chunking for sharding. (Closed)
Patch Set: Rebase onto revert-1491143003 Created 3 years, 10 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 | third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.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 (C) 2010 Google Inc. All rights reserved. 1 # Copyright (C) 2010 Google Inc. All rights reserved.
2 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Sze ged 2 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Sze ged
3 # 3 #
4 # Redistribution and use in source and binary forms, with or without 4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are 5 # modification, are permitted provided that the following conditions are
6 # met: 6 # met:
7 # 7 #
8 # * Redistributions of source code must retain the above copyright 8 # * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer. 9 # notice, this list of conditions and the following disclaimer.
10 # * Redistributions in binary form must reproduce the above 10 # * Redistributions in binary form must reproduce the above
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 self._results_directory = self._port.results_directory() 89 self._results_directory = self._port.results_directory()
90 self._finder = LayoutTestFinder(self._port, self._options) 90 self._finder = LayoutTestFinder(self._port, self._options)
91 self._runner = LayoutTestRunner(self._options, self._port, self._printer , self._results_directory, self._test_is_slow) 91 self._runner = LayoutTestRunner(self._options, self._port, self._printer , self._results_directory, self._test_is_slow)
92 92
93 def run(self, args): 93 def run(self, args):
94 """Run the tests and return a RunDetails object with the results.""" 94 """Run the tests and return a RunDetails object with the results."""
95 start_time = time.time() 95 start_time = time.time()
96 self._printer.write_update("Collecting tests ...") 96 self._printer.write_update("Collecting tests ...")
97 running_all_tests = False 97 running_all_tests = False
98 try: 98 try:
99 paths, test_names, running_all_tests = self._collect_tests(args) 99 paths, all_test_names, running_all_tests = self._collect_tests(args)
100 except IOError: 100 except IOError:
101 # This is raised if --test-list doesn't exist 101 # This is raised if --test-list doesn't exist
102 return test_run_results.RunDetails(exit_code=test_run_results.NO_TES TS_EXIT_STATUS) 102 return test_run_results.RunDetails(exit_code=test_run_results.NO_TES TS_EXIT_STATUS)
103 103
104 # Create a sorted list of test files so the subset chunk,
105 # if used, contains alphabetically consecutive tests.
106 if self._options.order == 'natural':
107 all_test_names.sort(key=self._port.test_key)
108 elif self._options.order == 'random':
109 all_test_names.sort()
110 random.Random(self._options.seed).shuffle(all_test_names)
111
112 test_names, tests_in_other_chunks = self._finder.split_into_chunks(all_t est_names)
113
104 self._printer.write_update("Parsing expectations ...") 114 self._printer.write_update("Parsing expectations ...")
105 self._expectations = test_expectations.TestExpectations(self._port, test _names) 115 self._expectations = test_expectations.TestExpectations(self._port, test _names)
106 116
107 tests_to_run, tests_to_skip = self._prepare_lists(paths, test_names) 117 tests_to_run, tests_to_skip = self._prepare_lists(paths, test_names)
108 self._printer.print_found(len(test_names), len(tests_to_run), self._opti ons.repeat_each, self._options.iterations) 118
119 self._expectations.remove_tests(tests_in_other_chunks)
120
121 self._printer.print_found(
122 len(all_test_names), len(test_names), len(tests_to_run),
123 self._options.repeat_each, self._options.iterations)
109 124
110 # Check to make sure we're not skipping every test. 125 # Check to make sure we're not skipping every test.
111 if not tests_to_run: 126 if not tests_to_run:
112 _log.critical('No tests to run.') 127 _log.critical('No tests to run.')
113 return test_run_results.RunDetails(exit_code=test_run_results.NO_TES TS_EXIT_STATUS) 128 return test_run_results.RunDetails(exit_code=test_run_results.NO_TES TS_EXIT_STATUS)
114 129
115 exit_code = self._set_up_run(tests_to_run) 130 exit_code = self._set_up_run(tests_to_run)
116 if exit_code: 131 if exit_code:
117 return test_run_results.RunDetails(exit_code=exit_code) 132 return test_run_results.RunDetails(exit_code=exit_code)
118 133
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 def _http_tests(self, test_names): 250 def _http_tests(self, test_names):
236 return set(test for test in test_names if self._is_http_test(test)) 251 return set(test for test in test_names if self._is_http_test(test))
237 252
238 def _is_perf_test(self, test): 253 def _is_perf_test(self, test):
239 return self.PERF_SUBDIR == test or (self.PERF_SUBDIR + self._port.TEST_P ATH_SEPARATOR) in test 254 return self.PERF_SUBDIR == test or (self.PERF_SUBDIR + self._port.TEST_P ATH_SEPARATOR) in test
240 255
241 def _prepare_lists(self, paths, test_names): 256 def _prepare_lists(self, paths, test_names):
242 tests_to_skip = self._finder.skip_tests(paths, test_names, self._expecta tions, self._http_tests(test_names)) 257 tests_to_skip = self._finder.skip_tests(paths, test_names, self._expecta tions, self._http_tests(test_names))
243 tests_to_run = [test for test in test_names if test not in tests_to_skip ] 258 tests_to_run = [test for test in test_names if test not in tests_to_skip ]
244 259
245 if not tests_to_run:
246 return tests_to_run, tests_to_skip
247
248 # Create a sorted list of test files so the subset chunk,
249 # if used, contains alphabetically consecutive tests.
250 if self._options.order == 'natural':
251 tests_to_run.sort(key=self._port.test_key)
252 elif self._options.order == 'random':
253 tests_to_run.sort()
254 random.Random(self._options.seed).shuffle(tests_to_run)
255
256 tests_to_run, tests_in_other_chunks = self._finder.split_into_chunks(tes ts_to_run)
257 self._expectations.add_extra_skipped_tests(tests_in_other_chunks)
258 tests_to_skip.update(tests_in_other_chunks)
259
260 return tests_to_run, tests_to_skip 260 return tests_to_run, tests_to_skip
261 261
262 def _test_input_for_file(self, test_file): 262 def _test_input_for_file(self, test_file):
263 return TestInput(test_file, 263 return TestInput(test_file,
264 self._options.slow_time_out_ms if self._test_is_slow(te st_file) else self._options.time_out_ms, 264 self._options.slow_time_out_ms if self._test_is_slow(te st_file) else self._options.time_out_ms,
265 self._test_requires_lock(test_file), 265 self._test_requires_lock(test_file),
266 should_add_missing_baselines=(self._options.new_test_re sults and 266 should_add_missing_baselines=(self._options.new_test_re sults and
267 not self._test_is_expecte d_missing(test_file))) 267 not self._test_is_expecte d_missing(test_file)))
268 268
269 def _test_requires_lock(self, test_file): 269 def _test_requires_lock(self, test_file):
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 538
539 stats = {} 539 stats = {}
540 for result in initial_results.results_by_name.values(): 540 for result in initial_results.results_by_name.values():
541 if result.type != test_expectations.SKIP: 541 if result.type != test_expectations.SKIP:
542 stats[result.test_name] = {'results': (_worker_number(result.wor ker_name), result.test_number, result.pid, int( 542 stats[result.test_name] = {'results': (_worker_number(result.wor ker_name), result.test_number, result.pid, int(
543 result.test_run_time * 1000), int(result.total_run_time * 10 00))} 543 result.test_run_time * 1000), int(result.total_run_time * 10 00))}
544 stats_trie = {} 544 stats_trie = {}
545 for name, value in stats.iteritems(): 545 for name, value in stats.iteritems():
546 json_results_generator.add_path_to_trie(name, value, stats_trie) 546 json_results_generator.add_path_to_trie(name, value, stats_trie)
547 return stats_trie 547 return stats_trie
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698