[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
abarth at webkit.org
abarth at webkit.org
Wed Dec 22 13:56:37 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 4cb1afeb7e48cb4bb3e06dd6cf353ea4a1b69dde
Author: abarth at webkit.org <abarth at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Sep 30 03:57:30 2010 +0000
2010-09-29 Adam Barth <abarth at webkit.org>
Reviewed by Eric Seidel.
SheriffBot should post the list of failing tests to bugs
https://bugs.webkit.org/show_bug.cgi?id=46871
* Scripts/webkitpy/common/net/buildbot.py:
* Scripts/webkitpy/common/net/failuremap.py:
* Scripts/webkitpy/common/net/regressionwindow.py:
* Scripts/webkitpy/tool/bot/sheriff.py:
* Scripts/webkitpy/tool/bot/sheriff_unittest.py:
* Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
* Scripts/webkitpy/tool/commands/queues_unittest.py:
* Scripts/webkitpy/tool/commands/sheriffbot.py:
* Scripts/webkitpy/tool/commands/sheriffbot_unittest.py:
* Scripts/webkitpy/tool/commands/upload_unittest.py:
* Scripts/webkitpy/tool/mocktool.py:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68746 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
index 8de808c..b272c77 100644
--- a/WebKitTools/ChangeLog
+++ b/WebKitTools/ChangeLog
@@ -1,3 +1,22 @@
+2010-09-29 Adam Barth <abarth at webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ SheriffBot should post the list of failing tests to bugs
+ https://bugs.webkit.org/show_bug.cgi?id=46871
+
+ * Scripts/webkitpy/common/net/buildbot.py:
+ * Scripts/webkitpy/common/net/failuremap.py:
+ * Scripts/webkitpy/common/net/regressionwindow.py:
+ * Scripts/webkitpy/tool/bot/sheriff.py:
+ * Scripts/webkitpy/tool/bot/sheriff_unittest.py:
+ * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
+ * Scripts/webkitpy/tool/commands/queues_unittest.py:
+ * Scripts/webkitpy/tool/commands/sheriffbot.py:
+ * Scripts/webkitpy/tool/commands/sheriffbot_unittest.py:
+ * Scripts/webkitpy/tool/commands/upload_unittest.py:
+ * Scripts/webkitpy/tool/mocktool.py:
+
2010-09-29 Brent Fulgham <bfulgham at webkit.org>
Reviewed by Martin Robinson, Eric Seidel, and Mark Rowe.
diff --git a/WebKitTools/Scripts/webkitpy/common/net/buildbot.py b/WebKitTools/Scripts/webkitpy/common/net/buildbot.py
index 17f6c7a..1a5f7f7 100644
--- a/WebKitTools/Scripts/webkitpy/common/net/buildbot.py
+++ b/WebKitTools/Scripts/webkitpy/common/net/buildbot.py
@@ -174,14 +174,14 @@ class Builder(object):
break
look_back_count += 1
if look_back_count > look_back_limit:
- return RegressionWindow(None, current_build, common_failures=common_failures)
+ return RegressionWindow(None, current_build, failing_tests=common_failures)
build_after_current_build = current_build
current_build = current_build.previous_build()
# We must iterate at least once because red_build is red.
assert(build_after_current_build)
# Current build must either be green or have no failures in common
# with red build, so we've found our failure transition.
- return RegressionWindow(current_build, build_after_current_build, common_failures=common_failures)
+ return RegressionWindow(current_build, build_after_current_build, failing_tests=common_failures)
def find_blameworthy_regression_window(self, red_build_number, look_back_limit=30, avoid_flakey_tests=True):
red_build = self.build(red_build_number)
diff --git a/WebKitTools/Scripts/webkitpy/common/net/failuremap.py b/WebKitTools/Scripts/webkitpy/common/net/failuremap.py
index b2efe08..2938d38 100644
--- a/WebKitTools/Scripts/webkitpy/common/net/failuremap.py
+++ b/WebKitTools/Scripts/webkitpy/common/net/failuremap.py
@@ -45,6 +45,17 @@ class FailureMap(object):
for failure_info in self._failures]
return sorted(set(sum(failing_revisions, [])))
+ def builders_failing_for(self, revision):
+ return self._builders_failing_because_of([revision])
+
+ def tests_failing_for(self, revision):
+ tests = [failure_info['regression_window'].failing_tests()
+ for failure_info in self._failures
+ if revision in failure_info['regression_window'].revisions()]
+ return sorted(set(sum(failing_tests, [])))
+
+ # FIXME: Consider removing this method. It might now exist only for
+ # unit testing!
def revisions_causing_failures(self):
revision_to_failing_bots = {}
for failure_info in self._failures:
diff --git a/WebKitTools/Scripts/webkitpy/common/net/regressionwindow.py b/WebKitTools/Scripts/webkitpy/common/net/regressionwindow.py
index fcceb35..ad89815 100644
--- a/WebKitTools/Scripts/webkitpy/common/net/regressionwindow.py
+++ b/WebKitTools/Scripts/webkitpy/common/net/regressionwindow.py
@@ -28,10 +28,10 @@
class RegressionWindow(object):
- def __init__(self, build_before_failure, failing_build, common_failures=None):
+ def __init__(self, build_before_failure, failing_build, failing_tests=None):
self._build_before_failure = build_before_failure
self._failing_build = failing_build
- self._common_failures = common_failures
+ self._failing_tests = failing_tests
self._revisions = None
def build_before_failure(self):
@@ -40,8 +40,8 @@ class RegressionWindow(object):
def failing_build(self):
return self._failing_build
- def common_failures(self):
- return self._common_failures
+ def failing_tests(self):
+ return self._failing_tests
def revisions(self):
# Cache revisions to avoid excessive allocations.
diff --git a/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py b/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py
index a38c3cf..da506bc 100644
--- a/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py
+++ b/WebKitTools/Scripts/webkitpy/tool/bot/sheriff.py
@@ -77,55 +77,15 @@ class Sheriff(object):
])
return parse_bug_id(output)
- def _rollout_reason(self, builders):
- # FIXME: This should explain which layout tests failed
- # however, that would require Build objects here, either passed
- # in through failure_info, or through Builder.latest_build.
- names = [builder.name() for builder in builders]
- return "Caused builders %s to fail." % join_with_separators(names)
-
- def post_automatic_rollout_patch(self, commit_info, builders):
- # For now we're only posting rollout patches for commit-queue patches.
- commit_bot_email = "eseidel at chromium.org"
- if commit_bot_email == commit_info.committer_email():
- try:
- self.post_rollout_patch(commit_info.revision(),
- self._rollout_reason(builders))
- except ScriptError, e:
- log("Failed to create-rollout.")
-
- def post_blame_comment_on_bug(self, commit_info, builders, blame_list):
+ def post_blame_comment_on_bug(self, commit_info, builders, tests):
if not commit_info.bug_id():
return
comment = "%s might have broken %s" % (
view_source_url(commit_info.revision()),
join_with_separators([builder.name() for builder in builders]))
- if len(blame_list) > 1:
- comment += "\nThe following changes are on the blame list:\n"
- comment += "\n".join(map(view_source_url, blame_list))
+ if tests:
+ comment += "\nThe following tests are not passing:\n"
+ comment += "\n".join(tests)
self._tool.bugs.post_comment_to_bug(commit_info.bug_id(),
comment,
cc=self._sheriffbot.watchers)
-
- # FIXME: Should some of this logic be on BuildBot?
- def provoke_flaky_builders(self, revisions_causing_failures):
- # We force_build builders that are red but have not "failed" (i.e.,
- # been red twice). We do this to avoid a deadlock situation where a
- # flaky test blocks the commit-queue and there aren't any other
- # patches being landed to re-spin the builder.
- failed_builders = sum([revisions_causing_failures[key] for
- key in revisions_causing_failures.keys()], [])
- failed_builder_names = \
- set([builder.name() for builder in failed_builders])
- idle_red_builder_names = \
- set([builder["name"]
- for builder in self._tool.buildbot.idle_red_core_builders()])
-
- # We only want to provoke these builders if they are idle and have not
- # yet "failed" (i.e., been red twice) to avoid overloading the bots.
- flaky_builder_names = idle_red_builder_names - failed_builder_names
-
- for name in flaky_builder_names:
- flaky_builder = self._tool.buildbot.builder_with_name(name)
- flaky_builder.force_build(username=self._sheriffbot.name,
- comments="Probe for flakiness.")
diff --git a/WebKitTools/Scripts/webkitpy/tool/bot/sheriff_unittest.py b/WebKitTools/Scripts/webkitpy/tool/bot/sheriff_unittest.py
index c375ff9..690af1f 100644
--- a/WebKitTools/Scripts/webkitpy/tool/bot/sheriff_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/bot/sheriff_unittest.py
@@ -47,15 +47,6 @@ class MockSheriffBot(object):
class SheriffTest(unittest.TestCase):
- def test_rollout_reason(self):
- sheriff = Sheriff(MockTool(), MockSheriffBot())
- builders = [
- Builder("Foo", None),
- Builder("Bar", None),
- ]
- reason = "Caused builders Foo and Bar to fail."
- self.assertEquals(sheriff._rollout_reason(builders), reason)
-
def test_post_blame_comment_on_bug(self):
def run():
sheriff = Sheriff(MockTool(), MockSheriffBot())
@@ -68,38 +59,32 @@ class SheriffTest(unittest.TestCase):
commit_info.revision = lambda: 4321
# Should do nothing with no bug_id
sheriff.post_blame_comment_on_bug(commit_info, builders, [])
- sheriff.post_blame_comment_on_bug(commit_info, builders, [2468, 5646])
+ sheriff.post_blame_comment_on_bug(commit_info, builders, ["mock-test-1", "mock-test-2"])
# Should try to post a comment to the bug, but MockTool.bugs does nothing.
commit_info.bug_id = lambda: 1234
sheriff.post_blame_comment_on_bug(commit_info, builders, [])
- sheriff.post_blame_comment_on_bug(commit_info, builders, [3432])
- sheriff.post_blame_comment_on_bug(commit_info, builders, [841, 5646])
+ sheriff.post_blame_comment_on_bug(commit_info, builders, ["mock-test-1"])
+ sheriff.post_blame_comment_on_bug(commit_info, builders, ["mock-test-1", "mock-test-2"])
- expected_stderr = u"MOCK bug comment: bug_id=1234, cc=['watcher at example.com']\n--- Begin comment ---\\http://trac.webkit.org/changeset/4321 might have broken Foo and Bar\n--- End comment ---\n\nMOCK bug comment: bug_id=1234, cc=['watcher at example.com']\n--- Begin comment ---\\http://trac.webkit.org/changeset/4321 might have broken Foo and Bar\n--- End comment ---\n\nMOCK bug comment: bug_id=1234, cc=['watcher at example.com']\n--- Begin comment ---\\http://trac.webkit.org/changeset/4321 might have broken Foo and Bar\nThe following changes are on the blame list:\nhttp://trac.webkit.org/changeset/841\nhttp://trac.webkit.org/changeset/5646\n--- End comment ---\n\n"
- OutputCapture().assert_outputs(self, run, expected_stderr=expected_stderr)
+ expected_stderr = u"""MOCK bug comment: bug_id=1234, cc=['watcher at example.com']
+--- Begin comment ---
+http://trac.webkit.org/changeset/4321 might have broken Foo and Bar
+--- End comment ---
- def test_provoke_flaky_builders(self):
- def run():
- tool = MockTool()
- tool.buildbot.light_tree_on_fire()
- sheriff = Sheriff(tool, MockSheriffBot())
- revisions_causing_failures = {}
- sheriff.provoke_flaky_builders(revisions_causing_failures)
- expected_stderr = "MOCK: force_build: name=Builder2, username=mock-sheriff-bot, comments=Probe for flakiness.\n"
- OutputCapture().assert_outputs(self, run, expected_stderr=expected_stderr)
+MOCK bug comment: bug_id=1234, cc=['watcher at example.com']
+--- Begin comment ---
+http://trac.webkit.org/changeset/4321 might have broken Foo and Bar
+The following tests are not passing:
+mock-test-1
+--- End comment ---
- def test_post_blame_comment_on_bug(self):
- sheriff = Sheriff(MockTool(), MockSheriffBot())
- builders = [
- Builder("Foo", None),
- Builder("Bar", None),
- ]
- commit_info = Mock()
- commit_info.bug_id = lambda: None
- commit_info.revision = lambda: 4321
- commit_info.committer = lambda: None
- commit_info.committer_email = lambda: "foo at example.com"
- commit_info.reviewer = lambda: None
- commit_info.author = lambda: None
- sheriff.post_automatic_rollout_patch(commit_info, builders)
+MOCK bug comment: bug_id=1234, cc=['watcher at example.com']
+--- Begin comment ---
+http://trac.webkit.org/changeset/4321 might have broken Foo and Bar
+The following tests are not passing:
+mock-test-1
+mock-test-2
+--- End comment ---
+"""
+ OutputCapture().assert_outputs(self, run, expected_stderr=expected_stderr)
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
index 3b0ea47..aad59e8 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
@@ -50,7 +50,7 @@ class EarlyWarningSytemTest(QueuesTest):
"handle_unexpected_error": "Mock error message\n",
"next_work_item": "MOCK: update_work_items: %(name)s [103]\n" % string_replacemnts,
"process_work_item": "MOCK: update_status: %(name)s Pass\n" % string_replacemnts,
- "handle_script_error": "MOCK: update_status: %(name)s ScriptError error message\nMOCK bug comment: bug_id=142, cc=%(watchers)s\n--- Begin comment ---\\Attachment 197 did not build on %(port)s:\nBuild output: http://dummy_url\n--- End comment ---\n\n" % string_replacemnts,
+ "handle_script_error": "MOCK: update_status: %(name)s ScriptError error message\nMOCK bug comment: bug_id=142, cc=%(watchers)s\n--- Begin comment ---\nAttachment 197 did not build on %(port)s:\nBuild output: http://dummy_url\n--- End comment ---\n\n" % string_replacemnts,
}
return expected_stderr
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
index c89a0c0..5a9dc3a 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py
@@ -320,7 +320,7 @@ class StyleQueueTest(QueuesTest):
"should_proceed_with_work_item": "MOCK: update_status: style-queue Checking style\n",
"process_work_item": "MOCK: update_status: style-queue Pass\n",
"handle_unexpected_error": "Mock error message\n",
- "handle_script_error": "MOCK: update_status: style-queue ScriptError error message\nMOCK bug comment: bug_id=142, cc=[]\n--- Begin comment ---\\Attachment 197 did not pass style-queue:\n\nScriptError error message\n\nIf any of these errors are false positives, please file a bug against check-webkit-style.\n--- End comment ---\n\n",
+ "handle_script_error": "MOCK: update_status: style-queue ScriptError error message\nMOCK bug comment: bug_id=142, cc=[]\n--- Begin comment ---\nAttachment 197 did not pass style-queue:\n\nScriptError error message\n\nIf any of these errors are false positives, please file a bug against check-webkit-style.\n--- End comment ---\n\n",
}
expected_exceptions = {
"handle_script_error": SystemExit,
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot.py b/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot.py
index cd83c0d..145f485 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot.py
@@ -57,8 +57,8 @@ class SheriffBot(AbstractQueue, StepSequenceErrorHandler):
def work_item_log_path(self, failure_map):
return None
- def _is_old_failure(self, svn_revision):
- return self._tool.status_server.svn_revision(svn_revision)
+ def _is_old_failure(self, revision):
+ return self._tool.status_server.svn_revision(revision)
def next_work_item(self):
self._irc_bot.process_pending_messages()
@@ -77,24 +77,21 @@ class SheriffBot(AbstractQueue, StepSequenceErrorHandler):
return True
def process_work_item(self, failure_map):
- new_failures = failure_map.revisions_causing_failures()
- blame_list = new_failures.keys()
- for svn_revision, builders in new_failures.items():
+ failing_revisions = failure_map.failing_revisions()
+ for revision in failing_revisions:
+ builders = failure_map.builders_failing_for(revision)
+ tests = failure_map.tests_failing_for(revision)
try:
- commit_info = self._tool.checkout().commit_info_for_revision(svn_revision)
+ commit_info = self._tool.checkout().commit_info_for_revision(revision)
if not commit_info:
print "FAILED to fetch CommitInfo for r%s, likely missing ChangeLog" % revision
continue
self._sheriff.post_irc_warning(commit_info, builders)
- self._sheriff.post_blame_comment_on_bug(commit_info,
- builders,
- blame_list)
- self._sheriff.post_automatic_rollout_patch(commit_info,
- builders)
+ self._sheriff.post_blame_comment_on_bug(commit_info, builders, tests)
+
finally:
for builder in builders:
- self._tool.status_server.update_svn_revision(svn_revision,
- builder.name())
+ self._tool.status_server.update_svn_revision(revision, builder.name())
return True
def handle_unexpected_error(self, failure_map, message):
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py
index 5343ca7..32eb016 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py
@@ -30,8 +30,7 @@ import os
from webkitpy.tool.commands.queuestest import QueuesTest
from webkitpy.tool.commands.sheriffbot import SheriffBot
-from webkitpy.tool.mocktool import MockBuilder
-from webkitpy.thirdparty.mock import Mock
+from webkitpy.tool.mocktool import *
class SheriffBotTest(QueuesTest):
@@ -39,14 +38,19 @@ class SheriffBotTest(QueuesTest):
builder2 = MockBuilder("Builder2")
def test_sheriff_bot(self):
- mock_work_item = Mock()
- mock_work_item.revisions_causing_failures = lambda: {
- 29837: [self.builder1],
- }
+ mock_work_item = MockFailureMap(MockTool().buildbot)
expected_stderr = {
"begin_work_queue": self._default_begin_work_queue_stderr("sheriff-bot", os.getcwd()),
"next_work_item": "",
- "process_work_item": "MOCK: irc.post: abarth, darin, eseidel: http://trac.webkit.org/changeset/29837 might have broken Builder1\nMOCK bug comment: bug_id=42, cc=['abarth at webkit.org', 'eric at webkit.org']\n--- Begin comment ---\\http://trac.webkit.org/changeset/29837 might have broken Builder1\n--- End comment ---\n\n",
+ "process_work_item": """MOCK: irc.post: abarth, darin, eseidel: http://trac.webkit.org/changeset/29837 might have broken Builder1
+MOCK bug comment: bug_id=42, cc=['abarth at webkit.org', 'eric at webkit.org']
+--- Begin comment ---
+http://trac.webkit.org/changeset/29837 might have broken Builder1
+The following tests are not passing:
+mock-test-1
+--- End comment ---
+
+""",
"handle_unexpected_error": "Mock error message\n"
}
self.assert_queue_outputs(SheriffBot(), work_item=mock_work_item, expected_stderr=expected_stderr)
diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py
index 5f3f400..887d3b6 100644
--- a/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py
+++ b/WebKitTools/Scripts/webkitpy/tool/commands/upload_unittest.py
@@ -103,7 +103,7 @@ MOCK: user.open_url: http://example.com/42
options = Mock()
options.bug_id = 42
options.comment = "MOCK comment"
- expected_stderr = "Bug: <http://example.com/42> Bug with two r+'d and cq+'d patches, one of which has an invalid commit-queue setter.\nRevision: 9876\nMOCK: user.open_url: http://example.com/42\nAdding comment to Bug 42.\nMOCK bug comment: bug_id=42, cc=None\n--- Begin comment ---\\MOCK comment\n\nCommitted r9876: <http://trac.webkit.org/changeset/9876>\n--- End comment ---\n\n"
+ expected_stderr = "Bug: <http://example.com/42> Bug with two r+'d and cq+'d patches, one of which has an invalid commit-queue setter.\nRevision: 9876\nMOCK: user.open_url: http://example.com/42\nAdding comment to Bug 42.\nMOCK bug comment: bug_id=42, cc=None\n--- Begin comment ---\nMOCK comment\n\nCommitted r9876: <http://trac.webkit.org/changeset/9876>\n--- End comment ---\n\n"
self.assert_execute_outputs(MarkBugFixed(), [], expected_stderr=expected_stderr, tool=tool, options=options)
def test_edit_changelog(self):
diff --git a/WebKitTools/Scripts/webkitpy/tool/mocktool.py b/WebKitTools/Scripts/webkitpy/tool/mocktool.py
index ba52883..03f2864 100644
--- a/WebKitTools/Scripts/webkitpy/tool/mocktool.py
+++ b/WebKitTools/Scripts/webkitpy/tool/mocktool.py
@@ -317,7 +317,7 @@ class MockBugzilla(Mock):
flag_name, flag_value, attachment_id, comment_text, additional_comment_text))
def post_comment_to_bug(self, bug_id, comment_text, cc=None):
- log("MOCK bug comment: bug_id=%s, cc=%s\n--- Begin comment ---\%s\n--- End comment ---\n" % (
+ log("MOCK bug comment: bug_id=%s, cc=%s\n--- Begin comment ---\n%s\n--- End comment ---\n" % (
bug_id, cc, comment_text))
def add_patch_to_bug(self,
@@ -350,7 +350,7 @@ class MockBuilder(object):
self._name, username, comments))
-class MockFailureMap():
+class MockFailureMap(object):
def __init__(self, buildbot):
self._buildbot = buildbot
@@ -365,6 +365,15 @@ class MockFailureMap():
def filter_out_old_failures(self, is_old_revision):
pass
+ def failing_revisions(self):
+ return [29837]
+
+ def builders_failing_for(self, revision):
+ return [self._buildbot.builder_with_name("Builder1")]
+
+ def tests_failing_for(self, revision):
+ return ["mock-test-1"]
+
class MockBuildBot(object):
buildbot_host = "dummy_buildbot_host"
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list