Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / WebKitTools / Scripts / webkitpy / common / checkout / api_unittest.py
1 # Copyright (C) 2010 Google Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
5 # met:
6 #
7 #    * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 #    * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer
11 # in the documentation and/or other materials provided with the
12 # distribution.
13 #    * Neither the name of Google Inc. nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 from __future__ import with_statement
30
31 import codecs
32 import os
33 import shutil
34 import tempfile
35 import unittest
36
37 from webkitpy.common.checkout.api import Checkout
38 from webkitpy.common.checkout.changelog import ChangeLogEntry
39 from webkitpy.common.checkout.scm import detect_scm_system, CommitMessage
40 from webkitpy.common.system.outputcapture import OutputCapture
41 from webkitpy.thirdparty.mock import Mock
42
43
44 # FIXME: Copied from scm_unittest.py
45 def write_into_file_at_path(file_path, contents, encoding="utf-8"):
46     with codecs.open(file_path, "w", encoding) as file:
47         file.write(contents)
48
49
50 _changelog1entry1 = u"""2010-03-25  Tor Arne Vestb\u00f8  <vestbo@webkit.org>
51
52         Unreviewed build fix to un-break webkit-patch land.
53
54         Move commit_message_for_this_commit from scm to checkout
55         https://bugs.webkit.org/show_bug.cgi?id=36629
56
57         * Scripts/webkitpy/common/checkout/api.py: import scm.CommitMessage
58 """
59 _changelog1entry2 = u"""2010-03-25  Adam Barth  <abarth@webkit.org>
60
61         Reviewed by Eric Seidel.
62
63         Move commit_message_for_this_commit from scm to checkout
64         https://bugs.webkit.org/show_bug.cgi?id=36629
65
66         * Scripts/webkitpy/common/checkout/api.py:
67 """
68 _changelog1 = u"\n".join([_changelog1entry1, _changelog1entry2])
69 _changelog2 = u"""2010-03-25  Tor Arne Vestb\u00f8  <vestbo@webkit.org>
70
71         Unreviewed build fix to un-break webkit-patch land.
72
73         Second part of this complicated change.
74
75         * Path/To/Complicated/File: Added.
76
77 2010-03-25  Adam Barth  <abarth@webkit.org>
78
79         Reviewed by Eric Seidel.
80
81         Filler change.
82 """
83
84 class CommitMessageForThisCommitTest(unittest.TestCase):
85     expected_commit_message = u"""2010-03-25  Tor Arne Vestb\u00f8  <vestbo@webkit.org>
86
87         Unreviewed build fix to un-break webkit-patch land.
88
89         Move commit_message_for_this_commit from scm to checkout
90         https://bugs.webkit.org/show_bug.cgi?id=36629
91
92         * Scripts/webkitpy/common/checkout/api.py: import scm.CommitMessage
93 2010-03-25  Tor Arne Vestb\u00f8  <vestbo@webkit.org>
94
95         Unreviewed build fix to un-break webkit-patch land.
96
97         Second part of this complicated change.
98
99         * Path/To/Complicated/File: Added.
100 """
101
102     def setUp(self):
103         self.temp_dir = tempfile.mkdtemp(suffix="changelogs")
104         self.old_cwd = os.getcwd()
105         os.chdir(self.temp_dir)
106         write_into_file_at_path("ChangeLog1", _changelog1)
107         write_into_file_at_path("ChangeLog2", _changelog2)
108
109     def tearDown(self):
110         shutil.rmtree(self.temp_dir, ignore_errors=True)
111         os.chdir(self.old_cwd)
112
113     # FIXME: This should not need to touch the file system, however
114     # ChangeLog is difficult to mock at current.
115     def test_commit_message_for_this_commit(self):
116         checkout = Checkout(None)
117         checkout.modified_changelogs = lambda git_commit, changed_files=None: ["ChangeLog1", "ChangeLog2"]
118         output = OutputCapture()
119         expected_stderr = "Parsing ChangeLog: ChangeLog1\nParsing ChangeLog: ChangeLog2\n"
120         commit_message = output.assert_outputs(self, checkout.commit_message_for_this_commit,
121             kwargs={"git_commit": None}, expected_stderr=expected_stderr)
122         self.assertEqual(commit_message.message(), self.expected_commit_message)
123
124
125 class CheckoutTest(unittest.TestCase):
126     def test_latest_entry_for_changelog_at_revision(self):
127         scm = Mock()
128         def mock_contents_at_revision(changelog_path, revision):
129             self.assertEqual(changelog_path, "foo")
130             self.assertEqual(revision, "bar")
131             # contents_at_revision is expected to return a byte array (str)
132             # so we encode our unicode ChangeLog down to a utf-8 stream.
133             return _changelog1.encode("utf-8")
134         scm.contents_at_revision = mock_contents_at_revision
135         checkout = Checkout(scm)
136         entry = checkout._latest_entry_for_changelog_at_revision("foo", "bar")
137         self.assertEqual(entry.contents(), _changelog1entry1)
138
139     def test_commit_info_for_revision(self):
140         scm = Mock()
141         scm.committer_email_for_revision = lambda revision: "committer@example.com"
142         checkout = Checkout(scm)
143         checkout.changelog_entries_for_revision = lambda revision: [ChangeLogEntry(_changelog1entry1)]
144         commitinfo = checkout.commit_info_for_revision(4)
145         self.assertEqual(commitinfo.bug_id(), 36629)
146         self.assertEqual(commitinfo.author_name(), u"Tor Arne Vestb\u00f8")
147         self.assertEqual(commitinfo.author_email(), "vestbo@webkit.org")
148         self.assertEqual(commitinfo.reviewer_text(), None)
149         self.assertEqual(commitinfo.reviewer(), None)
150         self.assertEqual(commitinfo.committer_email(), "committer@example.com")
151         self.assertEqual(commitinfo.committer(), None)
152
153         checkout.changelog_entries_for_revision = lambda revision: []
154         self.assertEqual(checkout.commit_info_for_revision(1), None)
155
156     def test_bug_id_for_revision(self):
157         scm = Mock()
158         scm.committer_email_for_revision = lambda revision: "committer@example.com"
159         checkout = Checkout(scm)
160         checkout.changelog_entries_for_revision = lambda revision: [ChangeLogEntry(_changelog1entry1)]
161         self.assertEqual(checkout.bug_id_for_revision(4), 36629)
162
163     def test_bug_id_for_this_commit(self):
164         scm = Mock()
165         checkout = Checkout(scm)
166         checkout.commit_message_for_this_commit = lambda git_commit, changed_files=None: CommitMessage(ChangeLogEntry(_changelog1entry1).contents().splitlines())
167         self.assertEqual(checkout.bug_id_for_this_commit(git_commit=None), 36629)
168
169     def test_modified_changelogs(self):
170         scm = Mock()
171         scm.checkout_root = "/foo/bar"
172         scm.changed_files = lambda git_commit: ["file1", "ChangeLog", "relative/path/ChangeLog"]
173         checkout = Checkout(scm)
174         expected_changlogs = ["/foo/bar/ChangeLog", "/foo/bar/relative/path/ChangeLog"]
175         self.assertEqual(checkout.modified_changelogs(git_commit=None), expected_changlogs)
176
177     def test_suggested_reviewers(self):
178         def mock_changelog_entries_for_revision(revision):
179             if revision % 2 == 0:
180                 return [ChangeLogEntry(_changelog1entry1)]
181             return [ChangeLogEntry(_changelog1entry2)]
182
183         def mock_revisions_changing_file(path, limit=5):
184             if path.endswith("ChangeLog"):
185                 return [3]
186             return [4, 8]
187
188         scm = Mock()
189         scm.checkout_root = "/foo/bar"
190         scm.changed_files = lambda git_commit: ["file1", "file2", "relative/path/ChangeLog"]
191         scm.revisions_changing_file = mock_revisions_changing_file
192         checkout = Checkout(scm)
193         checkout.changelog_entries_for_revision = mock_changelog_entries_for_revision
194         reviewers = checkout.suggested_reviewers(git_commit=None)
195         reviewer_names = [reviewer.full_name for reviewer in reviewers]
196         self.assertEqual(reviewer_names, [u'Tor Arne Vestb\xf8'])