Commit fd3e46e8 authored by Steve Kobes's avatar Steve Kobes Committed by Commit Bot

try-flag: Intersect unexpected passes with the flag expectation file.

Previously, try-flag reported all unexpected passes, even if the failure
expectation came from the main TestExpectations file.  This produced a lot of
irrelevant noise.

Now, try-flag only reports unexpected passes of tests that have flag-specific
failure expectations.

The --flag argument is no longer optional.

Bug: 755401
Change-Id: Ifa507e19159b8cdadf63752f5c8aa2635de014d5
Reviewed-on: https://chromium-review.googlesource.com/794877
Commit-Queue: Steve Kobes <skobes@chromium.org>
Reviewed-by: default avatarQuinten Yearsley <qyearsley@chromium.org>
Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519950}
parent 90fd74c1
...@@ -47,29 +47,41 @@ class TryFlag(object): ...@@ -47,29 +47,41 @@ class TryFlag(object):
self._path_finder = PathFinder(self._filesystem) self._path_finder = PathFinder(self._filesystem)
self._git = self._host.git() self._git = self._host.git()
def _set_flag(self, flag): def _force_flag_for_test_runner(self):
flag = self._args.flag
path = self._path_finder.path_from_layout_tests(FLAG_FILE) path = self._path_finder.path_from_layout_tests(FLAG_FILE)
self._filesystem.write_text_file(path, flag + '\n') self._filesystem.write_text_file(path, flag + '\n')
self._git.add_list([path]) self._git.add_list([path])
self._git.commit_locally_with_message( self._git.commit_locally_with_message(
'Flag try job: force %s for run-webkit-tests.' % flag) 'Flag try job: force %s for run-webkit-tests.' % flag)
def _clear_expectations(self, flag): def _flag_expectations_path(self):
path = self._path_finder.path_from_layout_tests( return self._path_finder.path_from_layout_tests(
'FlagExpectations', flag.lstrip('-')) 'FlagExpectations', self._args.flag.lstrip('-'))
def _clear_expectations(self):
path = self._flag_expectations_path()
self._filesystem.write_text_file(path, '') self._filesystem.write_text_file(path, '')
self._git.add_list([path]) self._git.add_list([path])
self._git.commit_locally_with_message( self._git.commit_locally_with_message(
'Flag try job: clear expectations for %s.' % flag) 'Flag try job: clear expectations for %s.' % self._args.flag)
def _tests_in_flag_expectations(self):
result = set()
path = self._flag_expectations_path()
for line in self._filesystem.read_text_file(path).split('\n'):
expectation_line = TestExpectationLine.tokenize_line(path, line, 0)
test_name = expectation_line.name
if test_name:
result.add(test_name)
return result
def trigger(self): def trigger(self):
flag = self._args.flag self._force_flag_for_test_runner()
if flag: if self._args.regenerate:
self._set_flag(flag) self._clear_expectations()
if self._args.regenerate: self._git_cl.run(['upload', '--bypass-hooks', '-f',
self._clear_expectations(flag) '-m', 'Flag try job for %s.' % self._args.flag])
self._git_cl.run(['upload', '--bypass-hooks', '-f',
'-m', 'Flag try job for %s.' % flag])
for builder in sorted(BUILDER_MASTERS.keys()): for builder in sorted(BUILDER_MASTERS.keys()):
master = BUILDER_MASTERS[builder] master = BUILDER_MASTERS[builder]
self._git_cl.trigger_try_jobs([builder], master) self._git_cl.trigger_try_jobs([builder], master)
...@@ -106,7 +118,7 @@ class TryFlag(object): ...@@ -106,7 +118,7 @@ class TryFlag(object):
# TODO: Get jobs from the _tryflag branch. Current branch for now. # TODO: Get jobs from the _tryflag branch. Current branch for now.
jobs = self._git_cl.latest_try_jobs(BUILDER_CONFIGS.keys()) jobs = self._git_cl.latest_try_jobs(BUILDER_CONFIGS.keys())
buildbot = self._host.buildbot buildbot = self._host.buildbot
for build in sorted(jobs.keys()): for build in sorted(jobs):
self._host.print_('-- %s: %s/results.html' % ( self._host.print_('-- %s: %s/results.html' % (
BUILDER_CONFIGS[build.builder_name].version, BUILDER_CONFIGS[build.builder_name].version,
buildbot.results_url(build.builder_name, build.build_number))) buildbot.results_url(build.builder_name, build.build_number)))
...@@ -117,11 +129,14 @@ class TryFlag(object): ...@@ -117,11 +129,14 @@ class TryFlag(object):
# TODO: Write to flag expectations file. For now, stdout. :) # TODO: Write to flag expectations file. For now, stdout. :)
unexpected_failures = [] unexpected_failures = []
unexpected_passes = [] unexpected_passes = []
tests_in_flag_expectations = self._tests_in_flag_expectations()
for line in self._expectations_model.all_lines(): for line in self._expectations_model.all_lines():
if TestExpectations.EXPECTATIONS['pass'] in line.parsed_expectations: is_pass = (TestExpectations.EXPECTATIONS['pass'] in
unexpected_passes.append(line) line.parsed_expectations)
else: if not is_pass:
unexpected_failures.append(line) unexpected_failures.append(line)
elif line.name in tests_in_flag_expectations:
unexpected_passes.append(line)
self._print_all(unexpected_passes, 'unexpected passes') self._print_all(unexpected_passes, 'unexpected passes')
self._print_all(unexpected_failures, 'unexpected failures') self._print_all(unexpected_failures, 'unexpected failures')
...@@ -150,7 +165,7 @@ def parse_args(argv): ...@@ -150,7 +165,7 @@ def parse_args(argv):
formatter_class=argparse.RawDescriptionHelpFormatter) formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('action', help='"trigger" or "update"') parser.add_argument('action', help='"trigger" or "update"')
parser.add_argument('--bug', help='crbug number for expectation lines') parser.add_argument('--bug', help='crbug number for expectation lines')
parser.add_argument('--flag', parser.add_argument('--flag', required=True,
help='flag to force-enable in run-webkit-tests') help='flag to force-enable in run-webkit-tests')
parser.add_argument('--regenerate', action='store_true', parser.add_argument('--regenerate', action='store_true',
help='clear the flag expectations before triggering') help='clear the flag expectations before triggering')
......
...@@ -19,6 +19,11 @@ class TryFlagTest(unittest.TestCase): ...@@ -19,6 +19,11 @@ class TryFlagTest(unittest.TestCase):
self.linux_build = Build('linux_chromium_rel_ng', 100) self.linux_build = Build('linux_chromium_rel_ng', 100)
self.mac_build = Build('mac_chromium_rel_ng', 101) self.mac_build = Build('mac_chromium_rel_ng', 101)
self.win_build = Build('win7_chromium_rel_ng', 102) self.win_build = Build('win7_chromium_rel_ng', 102)
self.mock_try_results = {
self.linux_build: TryJobStatus('COMPLETED', 'SUCCESS'),
self.win_build: TryJobStatus('COMPLETED', 'SUCCESS'),
self.mac_build: TryJobStatus('COMPLETED', 'SUCCESS')
}
super(TryFlagTest, self).__init__(*args, **kwargs) super(TryFlagTest, self).__init__(*args, **kwargs)
def _run_trigger_test(self, regenerate): def _run_trigger_test(self, regenerate):
...@@ -115,13 +120,18 @@ class TryFlagTest(unittest.TestCase): ...@@ -115,13 +120,18 @@ class TryFlagTest(unittest.TestCase):
def test_update(self): def test_update(self):
host = MockHost() host = MockHost()
try_jobs = { filesystem = host.filesystem
self.linux_build: TryJobStatus('COMPLETED', 'SUCCESS'), finder = PathFinder(filesystem)
self.win_build: TryJobStatus('COMPLETED', 'SUCCESS'),
self.mac_build: TryJobStatus('COMPLETED', 'SUCCESS') flag_expectations_file = finder.path_from_layout_tests(
} 'FlagExpectations', 'foo')
filesystem.write_text_file(
flag_expectations_file,
'something/pass-unexpectedly-mac.html [ Fail ]')
self._setup_mock_results(host.buildbot) self._setup_mock_results(host.buildbot)
TryFlag(['update'], host, MockGitCL(host, try_jobs)).run() cmd = ['update', '--flag=--foo']
TryFlag(cmd, host, MockGitCL(host, self.mock_try_results)).run()
def results_url(build): def results_url(build):
return '%s/%s/%s/layout-test-results/results.html' % ( return '%s/%s/%s/layout-test-results/results.html' % (
...@@ -146,8 +156,24 @@ class TryFlagTest(unittest.TestCase): ...@@ -146,8 +156,24 @@ class TryFlagTest(unittest.TestCase):
'' ''
])) ]))
def test_update_irrelevant_unexpected_pass(self):
host = MockHost()
filesystem = host.filesystem
finder = PathFinder(filesystem)
flag_expectations_file = finder.path_from_layout_tests(
'FlagExpectations', 'foo')
self._setup_mock_results(host.buildbot)
cmd = ['update', '--flag=--foo']
# Unexpected passes that don't have flag-specific failure expectations
# should not be reported.
filesystem.write_text_file(flag_expectations_file, '')
TryFlag(cmd, host, MockGitCL(host, self.mock_try_results)).run()
self.assertTrue('### 0 unexpected passes' in host.stdout.getvalue())
def test_invalid_action(self): def test_invalid_action(self):
host = MockHost() host = MockHost()
TryFlag(['invalid'], host, MockGitCL(host)).run() cmd = ['invalid', '--flag=--foo']
TryFlag(cmd, host, MockGitCL(host)).run()
self.assertEqual(host.stderr.getvalue(), self.assertEqual(host.stderr.getvalue(),
'specify "trigger" or "update"\n') 'specify "trigger" or "update"\n')
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment