Changeset 86020 in webkit
- Timestamp:
- May 7, 2011 7:50:09 PM (13 years ago)
- Location:
- trunk/Tools
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r86013 r86020 1 2011-05-07 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Eric Seidel. 4 5 Testing EWS spins on patches with a large number of failures 6 https://bugs.webkit.org/show_bug.cgi?id=60441 7 8 In cases where the tree has a small number of persistent failures but a 9 patch has a large number of failures, we weren't believing any results. 10 That lead to us retrying the patch forever while we waited for 11 trustworthy results that would never come. 12 13 This patch loosens the semantics of unexpected_failures to return a 14 subset (rather than the exact set) of unexpected failures. In the case 15 where the tree has a bounded number of failures and the patch has an 16 unbounded number of failures, we can accurately compute such a subset 17 and reject the patch. 18 19 * Scripts/webkitpy/tool/bot/expectedfailures.py: 20 * Scripts/webkitpy/tool/bot/expectedfailures_unittest.py: 21 * Scripts/webkitpy/tool/bot/patchanalysistask.py: 22 * Scripts/webkitpy/tool/commands/earlywarningsystem.py: 23 * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py: 24 1 25 2011-05-07 Joe Mason <jmason@rim.com> 2 26 -
trunk/Tools/Scripts/webkitpy/tool/bot/expectedfailures.py
r85463 r86020 31 31 def __init__(self): 32 32 self._failures = set() 33 # If the set of failures is unbounded, self._failures isn't very 34 # meaningful because we can't store an unbounded set in memory. 35 self._failures_are_bounded = True 36 37 def _has_failures(self, results): 38 return bool(results and len(results.failing_tests()) != 0) 39 40 def has_bounded_failures(self, results): 41 assert(results) # You probably want to call _has_failures first! 42 return bool(results.failure_limit_count() and len(results.failing_tests()) < results.failure_limit_count()) 33 43 34 44 def _can_trust_results(self, results): 35 if not results or not results.failure_limit_count(): 36 return False 37 return len(results.failing_tests()) != 0 and len(results.failing_tests()) < results.failure_limit_count() 45 return self._has_failures(results) and self.has_bounded_failures(results) 38 46 39 47 def failures_were_expected(self, results): … … 42 50 return set(results.failing_tests()) <= self._failures 43 51 44 def unexpected_failures(self, results): 45 if not self._can_trust_results(results): 52 def unexpected_failures_observed(self, results): 53 if not self._has_failures(results): 54 return None 55 if not self._failures_are_bounded: 46 56 return None 47 57 return set(results.failing_tests()) - self._failures … … 50 60 if run_success: 51 61 self._failures = set() 62 self._failures_are_bounded = True 52 63 elif self._can_trust_results(results): 53 64 # Remove all expected failures which are not in the new failing results. 54 65 self._failures.intersection_update(set(results.failing_tests())) 66 self._failures_are_bounded = True 55 67 56 68 def grow_expected_failures(self, results): 57 69 if not self._can_trust_results(results): 70 self._failures_are_bounded = False 58 71 return 59 72 self._failures.update(results.failing_tests()) 73 self._failures_are_bounded = True 60 74 # FIXME: Should we assert() here that expected_failures never crosses a certain size? -
trunk/Tools/Scripts/webkitpy/tool/bot/expectedfailures_unittest.py
r85463 r86020 74 74 self._assert_expected(failures, ['baz.html'], False) 75 75 76 def test_unexpected_failures (self):76 def test_unexpected_failures_observed(self): 77 77 failures = ExpectedFailures() 78 78 failures.grow_expected_failures(MockResults(['foo.html'])) 79 self.assertEquals(failures.unexpected_failures(MockResults(['foo.html', 'bar.html'])), set(['bar.html'])) 80 self.assertEquals(failures.unexpected_failures(MockResults(['baz.html'])), set(['baz.html'])) 79 self.assertEquals(failures.unexpected_failures_observed(MockResults(['foo.html', 'bar.html'])), set(['bar.html'])) 80 self.assertEquals(failures.unexpected_failures_observed(MockResults(['baz.html'])), set(['baz.html'])) 81 unbounded_results = MockResults(['baz.html', 'qux.html', 'taco.html'], failure_limit=3) 82 self.assertEquals(failures.unexpected_failures_observed(unbounded_results), set(['baz.html', 'qux.html', 'taco.html'])) 83 unbounded_results_with_existing_failure = MockResults(['foo.html', 'baz.html', 'qux.html', 'taco.html'], failure_limit=4) 84 self.assertEquals(failures.unexpected_failures_observed(unbounded_results_with_existing_failure), set(['baz.html', 'qux.html', 'taco.html'])) 85 86 def test_unexpected_failures_observed_when_tree_is_hosed(self): 87 failures = ExpectedFailures() 88 failures.grow_expected_failures(MockResults(['foo.html', 'banana.html'], failure_limit=2)) 89 self.assertEquals(failures.unexpected_failures_observed(MockResults(['foo.html', 'bar.html'])), None) 90 self.assertEquals(failures.unexpected_failures_observed(MockResults(['baz.html'])), None) 91 unbounded_results = MockResults(['baz.html', 'qux.html', 'taco.html'], failure_limit=3) 92 self.assertEquals(failures.unexpected_failures_observed(unbounded_results), None) 93 unbounded_results_with_existing_failure = MockResults(['foo.html', 'baz.html', 'qux.html', 'taco.html'], failure_limit=4) 94 self.assertEquals(failures.unexpected_failures_observed(unbounded_results_with_existing_failure), None) -
trunk/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py
r85509 r86020 221 221 # Now that we have updated information about failing tests with a clean checkout, we can 222 222 # tell if our original failures were unexpected and fail the patch if necessary. 223 if self._expected_failures.unexpected_failures (first_results):223 if self._expected_failures.unexpected_failures_observed(first_results): 224 224 return self.report_failure(first_results_archive, first_results) 225 225 -
trunk/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py
r85922 r86020 131 131 def _failing_tests_message(self, task, patch): 132 132 results = task.results_from_patch_test_run(patch) 133 unexpected_failures = self._expected_failures.unexpected_failures (results)133 unexpected_failures = self._expected_failures.unexpected_failures_observed(results) 134 134 if not unexpected_failures: 135 135 return None -
trunk/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
r85922 r86020 92 92 ews._options = MockOptions(port=None, confirm=False) 93 93 OutputCapture().assert_outputs(self, ews.begin_work_queue, expected_stderr=self._default_begin_work_queue_stderr(ews.name, ews._tool.scm().checkout_root)) 94 ews._expected_failures.unexpected_failures = lambda results: set(["foo.html", "bar.html"])94 ews._expected_failures.unexpected_failures_observed = lambda results: set(["foo.html", "bar.html"]) 95 95 task = Mock() 96 96 patch = ews._tool.bugs.fetch_attachment(197)
Note: See TracChangeset
for help on using the changeset viewer.