# Copyright (C) 2009 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import unittest
from webkitpy.committers import CommitterList, Reviewer, Committer
from webkitpy.bugzilla import Bugzilla, BugzillaQueries, parse_bug_id, CommitterValidator
from webkitpy.outputcapture import OutputCapture
from webkitpy.mock import Mock
from webkitpy.BeautifulSoup import BeautifulSoup
class MockBrowser(object):
def open(self, url):
pass
def select_form(self, name):
pass
def __setitem__(self, key, value):
pass
def submit(self):
pass
class CommitterValidatorTest(unittest.TestCase):
def test_flag_permission_rejection_message(self):
validator = CommitterValidator(bugzilla=None)
expected_messsage="""foo@foo.com does not have review permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/committers.py.
- If you do not have review rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.
- If you have review rights please correct the error in WebKitTools/Scripts/webkitpy/committers.py by adding yourself to the file (no review needed). Due to bug 30084 the commit-queue will require a restart after your change. Please contact eseidel@chromium.org to request a commit-queue restart. After restart the commit-queue will correctly respect your review rights."""
self.assertEqual(validator._flag_permission_rejection_message("foo@foo.com", "review"), expected_messsage)
class BugzillaTest(unittest.TestCase):
_example_attachment = '''
337212009-07-29 10:23 PDTFixed whitespace issuepatchtext/plain9719christian.plesner.hansen@gmail.com
'''
_expected_example_attachment_parsing = {
'bug_id' : 100,
'is_obsolete' : True,
'is_patch' : True,
'id' : 33721,
'url' : "https://bugs.webkit.org/attachment.cgi?id=33721",
'name' : "Fixed whitespace issue",
'type' : "text/plain",
'review' : '+',
'reviewer_email' : 'one@test.com',
'commit-queue' : '+',
'committer_email' : 'two@test.com',
'attacher_email' : 'christian.plesner.hansen@gmail.com',
}
def test_parse_bug_id(self):
# FIXME: These would be all better as doctests
bugs = Bugzilla()
self.assertEquals(12345, parse_bug_id("http://webkit.org/b/12345"))
self.assertEquals(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345"))
self.assertEquals(12345, parse_bug_id(bugs.short_bug_url_for_bug_id(12345)))
self.assertEquals(12345, parse_bug_id(bugs.bug_url_for_bug_id(12345)))
self.assertEquals(12345, parse_bug_id(bugs.bug_url_for_bug_id(12345, xml=True)))
# Our bug parser is super-fragile, but at least we're testing it.
self.assertEquals(None, parse_bug_id("http://www.webkit.org/b/12345"))
self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&id=12345"))
_example_bug = """
325852009-12-15 15:17 PSTbug to test webkit-patch and commit-queue failures2009-12-27 21:04:50 PST111UnclassifiedWebKitTools / Tests528+ (Nightly build)PCMac OS X 10.5NEWP2Normal---1eric@webkit.orgwebkit-unassigned@lists.webkit.orgfoo@bar.comexample@example.comeric@webkit.org2009-12-15 15:17:28 PSTbug to test webkit-patch and commit-queue failures
Ignore this bug. Just for testing failure modes of webkit-patch and the commit-queue.455482009-12-27 23:51 PSTPatchbug-32585-20091228005112.patchtext/plain10882mjs@apple.com1261988248-dc51409e9c421a4358f365fa8bec8357
SW5kZXg6IFdlYktpdC9tYWMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
removed-because-it-was-really-long
ZEZpbmlzaExvYWRXaXRoUmVhc29uOnJlYXNvbl07Cit9CisKIEBlbmQKIAogI2VuZGlmCg==
"""
_expected_example_bug_parsing = {
"id" : 32585,
"title" : u"bug to test webkit-patch and commit-queue failures",
"cc_emails" : ["foo@bar.com", "example@example.com"],
"reporter_email" : "eric@webkit.org",
"assigned_to_email" : "webkit-unassigned@lists.webkit.org",
"attachments" : [{
'name': u'Patch',
'url' : "https://bugs.webkit.org/attachment.cgi?id=45548",
'is_obsolete': False,
'review': '?',
'is_patch': True,
'attacher_email': 'mjs@apple.com',
'bug_id': 32585,
'type': 'text/plain',
'id': 45548
}],
}
def _assert_dictionaries_equal(self, actual, expected):
# Make sure we aren't parsing more or less than we expect
self.assertEquals(sorted(actual.keys()), sorted(expected.keys()))
for key, expected_value in expected.items():
self.assertEquals(actual[key], expected_value, ("Failure for key: %s: Actual='%s' Expected='%s'" % (key, actual[key], expected_value)))
def test_bug_parsing(self):
bug = Bugzilla()._parse_bug_page(self._example_bug)
self._assert_dictionaries_equal(bug, self._expected_example_bug_parsing)
# This could be combined into test_bug_parsing later if desired.
def test_attachment_parsing(self):
bugzilla = Bugzilla()
soup = BeautifulSoup(self._example_attachment)
attachment_element = soup.find("attachment")
attachment = bugzilla._parse_attachment_element(attachment_element, self._expected_example_attachment_parsing['bug_id'])
self.assertTrue(attachment)
self._assert_dictionaries_equal(attachment, self._expected_example_attachment_parsing)
_sample_attachment_detail_page = """
Attachment 41073 Details for Bug 27314
"""
def test_attachment_detail_bug_parsing(self):
bugzilla = Bugzilla()
self.assertEquals(27314, bugzilla._parse_bug_id_from_attachment_page(self._sample_attachment_detail_page))
def test_add_cc_to_bug(self):
bugzilla = Bugzilla()
bugzilla.browser = MockBrowser()
bugzilla.authenticate = lambda: None
expected_stderr = "Adding ['adam@example.com'] to the CC list for bug 42\n"
OutputCapture().assert_outputs(self, bugzilla.add_cc_to_bug, [42, ["adam@example.com"]], expected_stderr=expected_stderr)
class BugzillaQueriesTest(unittest.TestCase):
_sample_request_page = """
Request Queue