OLD | NEW |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 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 """A class for updating layout test expectations when updating w3c tests. | 5 """A class for updating layout test expectations when updating w3c tests. |
6 | 6 |
7 Specifically, this class fetches results from try bots for the current CL, and: | 7 Specifically, this class fetches results from try bots for the current CL, and: |
8 1. Downloads new baseline files for any tests that can be rebaselined. | 8 1. Downloads new baseline files for any tests that can be rebaselined. |
9 2. Updates the generic TestExpectations file for any other failing tests. | 9 2. Updates the generic TestExpectations file for any other failing tests. |
10 | 10 |
11 This is used as part of the w3c test auto-import process. | 11 This is used as part of the w3c test auto-import process. |
12 """ | 12 """ |
13 | 13 |
| 14 import argparse |
14 import logging | 15 import logging |
15 | 16 |
16 from webkitpy.common.net.buildbot import BuildBot, Build | |
17 from webkitpy.common.net.git_cl import GitCL | 17 from webkitpy.common.net.git_cl import GitCL |
18 from webkitpy.common.net.rietveld import Rietveld | 18 from webkitpy.common.net.rietveld import Rietveld |
19 from webkitpy.common.webkit_finder import WebKitFinder | 19 from webkitpy.common.webkit_finder import WebKitFinder |
20 from webkitpy.w3c.test_parser import TestParser | 20 from webkitpy.w3c.test_parser import TestParser |
21 | 21 |
22 _log = logging.getLogger(__name__) | 22 _log = logging.getLogger(__name__) |
23 | 23 |
24 | 24 |
25 class W3CExpectationsLineAdder(object): | 25 class W3CExpectationsLineAdder(object): |
26 | 26 |
27 def __init__(self, host): | 27 def __init__(self, host): |
28 self.host = host | 28 self.host = host |
29 self.host.initialize_scm() | 29 self.host.initialize_scm() |
30 self.finder = WebKitFinder(self.host.filesystem) | 30 self.finder = WebKitFinder(self.host.filesystem) |
31 | 31 |
32 def run(self): | 32 def run(self, args=None): |
| 33 parser = argparse.ArgumentParser(description=__doc__) |
| 34 parser.add_argument('-v', '--verbose', action='store_true', help='More v
erbose logging.') |
| 35 args = parser.parse_args(args) |
| 36 log_level = logging.DEBUG if args.verbose else logging.INFO |
| 37 logging.basicConfig(level=log_level, format='%(message)s') |
| 38 |
33 issue_number = self.get_issue_number() | 39 issue_number = self.get_issue_number() |
| 40 if issue_number == 'None': |
| 41 _log.error('No issue on current branch.') |
| 42 return 1 |
| 43 |
34 try_bots = self.get_try_bots() | 44 try_bots = self.get_try_bots() |
35 rietveld = Rietveld(self.host.web) | 45 rietveld = Rietveld(self.host.web) |
36 try_jobs = rietveld.latest_try_jobs(issue_number, try_bots) | 46 try_jobs = rietveld.latest_try_jobs(issue_number, try_bots) |
| 47 _log.debug('Latest try jobs: %r', try_jobs) |
37 | 48 |
38 if not try_jobs: | 49 if not try_jobs: |
39 print 'No Try Job information was collected.' | 50 _log.error('No try job information was collected.') |
40 return 1 | 51 return 1 |
41 | 52 |
42 test_expectations = {} | 53 test_expectations = {} |
43 for job in try_jobs: | 54 for job in try_jobs: |
44 platform_results = self.get_failing_results_dict(job) | 55 platform_results = self.get_failing_results_dict(job) |
45 test_expectations = self.merge_dicts(test_expectations, platform_res
ults) | 56 test_expectations = self.merge_dicts(test_expectations, platform_res
ults) |
46 | 57 |
47 for test_name, platform_result in test_expectations.iteritems(): | 58 for test_name, platform_result in test_expectations.iteritems(): |
48 test_expectations[test_name] = self.merge_same_valued_keys(platform_
result) | 59 test_expectations[test_name] = self.merge_same_valued_keys(platform_
result) |
49 | 60 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 Writes the test expectations lines in |line_list| to the test | 259 Writes the test expectations lines in |line_list| to the test |
249 expectations file. | 260 expectations file. |
250 | 261 |
251 The place in the file where the new lines are inserted is after a | 262 The place in the file where the new lines are inserted is after a |
252 marker comment line. If this marker comment line is not found, it will | 263 marker comment line. If this marker comment line is not found, it will |
253 be added to the end of the file. | 264 be added to the end of the file. |
254 | 265 |
255 Args: | 266 Args: |
256 line_list: A list of w3c test expectations lines. | 267 line_list: A list of w3c test expectations lines. |
257 """ | 268 """ |
| 269 _log.debug('Lines to write to TestExpectations: %r', line_list) |
258 port = self.host.port_factory.get() | 270 port = self.host.port_factory.get() |
259 expectations_file = port.path_to_generic_test_expectations_file() | 271 expectations_file = port.path_to_generic_test_expectations_file() |
260 comment_line = '# Tests added from W3C auto import bot' | 272 comment_line = '# Tests added from W3C auto import bot' |
261 file_contents = self.host.filesystem.read_text_file(expectations_file) | 273 file_contents = self.host.filesystem.read_text_file(expectations_file) |
262 w3c_comment_line_index = file_contents.find(comment_line) | 274 w3c_comment_line_index = file_contents.find(comment_line) |
263 all_lines = '' | 275 all_lines = '' |
264 for line in line_list: | 276 for line in line_list: |
265 end_bracket_index = line.split().index(']') | 277 end_bracket_index = line.split().index(']') |
266 test_name = line.split()[end_bracket_index + 1] | 278 test_name = line.split()[end_bracket_index + 1] |
267 if test_name in file_contents: | 279 if test_name in file_contents: |
(...skipping 20 matching lines...) Expand all Loading... |
288 Args: | 300 Args: |
289 tests_results: A dict mapping test name to platform to test results. | 301 tests_results: A dict mapping test name to platform to test results. |
290 | 302 |
291 Returns: | 303 Returns: |
292 An updated tests_results dictionary without the platform-specific | 304 An updated tests_results dictionary without the platform-specific |
293 testharness.js tests that required new baselines to be downloaded | 305 testharness.js tests that required new baselines to be downloaded |
294 from `webkit-patch rebaseline-from-try-jobs`. | 306 from `webkit-patch rebaseline-from-try-jobs`. |
295 """ | 307 """ |
296 modified_files = self.host.executive.run_command(['git', 'diff', 'origin
/master', '--name-only']).splitlines() | 308 modified_files = self.host.executive.run_command(['git', 'diff', 'origin
/master', '--name-only']).splitlines() |
297 tests_to_rebaseline, tests_results = self.get_tests_to_rebaseline(modifi
ed_files, tests_results) | 309 tests_to_rebaseline, tests_results = self.get_tests_to_rebaseline(modifi
ed_files, tests_results) |
| 310 _log.debug('Tests to rebaseline: %r', tests_to_rebaseline) |
298 if tests_to_rebaseline: | 311 if tests_to_rebaseline: |
299 webkit_patch = self.host.filesystem.join( | 312 webkit_patch = self.host.filesystem.join( |
300 self.finder.chromium_base(), self.finder.webkit_base(), self.fin
der.path_to_script('webkit-patch')) | 313 self.finder.chromium_base(), self.finder.webkit_base(), self.fin
der.path_to_script('webkit-patch')) |
301 self.host.executive.run_command([ | 314 self.host.executive.run_command([ |
302 'python', | 315 'python', |
303 webkit_patch, | 316 webkit_patch, |
304 'rebaseline-cl', | 317 'rebaseline-cl', |
305 '--verbose', | 318 '--verbose', |
306 '--no-trigger-jobs', | 319 '--no-trigger-jobs', |
307 '--only-changed-tests', | 320 '--only-changed-tests', |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 | 356 |
344 Args: | 357 Args: |
345 test_path: A file path relative to the layout tests directory. | 358 test_path: A file path relative to the layout tests directory. |
346 This might correspond to a deleted file or a non-test. | 359 This might correspond to a deleted file or a non-test. |
347 """ | 360 """ |
348 absolute_path = self.host.filesystem.join(self.finder.layout_tests_dir()
, test_path) | 361 absolute_path = self.host.filesystem.join(self.finder.layout_tests_dir()
, test_path) |
349 test_parser = TestParser(absolute_path, self.host) | 362 test_parser = TestParser(absolute_path, self.host) |
350 if not test_parser.test_doc: | 363 if not test_parser.test_doc: |
351 return False | 364 return False |
352 return test_parser.is_jstest() | 365 return test_parser.is_jstest() |
OLD | NEW |