1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2009 Google Inc. All rights reserved.
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Redistribution and use in source and binary forms, with or without
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# modification, are permitted provided that the following conditions are
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# met:
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#    * Redistributions of source code must retain the above copyright
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# notice, this list of conditions and the following disclaimer.
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#    * Redistributions in binary form must reproduce the above
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# copyright notice, this list of conditions and the following disclaimer
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# in the documentation and/or other materials provided with the
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# distribution.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#    * Neither the name of Google Inc. nor the names of its
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# contributors may be used to endorse or promote products derived from
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# this software without specific prior written permission.
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockimport os
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockimport threading
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.config.committers import CommitterList, Reviewer
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.checkout.commitinfo import CommitInfo
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.checkout.scm import CommitMessage
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.net.bugzilla import Bug, Attachment
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockfrom webkitpy.common.system.deprecated_logging import log
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochfrom webkitpy.common.system.filesystem_mock import MockFileSystem
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochfrom webkitpy.thirdparty.mock import Mock
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockdef _id_to_object_dictionary(*objects):
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    dictionary = {}
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for thing in objects:
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dictionary[thing["id"]] = thing
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return dictionary
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Testing
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# FIXME: The ids should be 1, 2, 3 instead of crazy numbers.
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch1 = {
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 197,
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 42,
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/197",
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "Patch1",
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": False,
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "review": "+",
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "reviewer_email": "foo@bar.com",
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "commit-queue": "+",
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "committer_email": "foo@bar.com",
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "Contributer1",
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch2 = {
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 128,
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 42,
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/128",
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "Patch2",
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": False,
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "review": "+",
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "reviewer_email": "foo@bar.com",
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "commit-queue": "+",
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "committer_email": "non-committer@example.com",
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "eric@webkit.org",
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch3 = {
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 103,
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 75,
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/103",
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "Patch3",
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": False,
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "review": "?",
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "eric@webkit.org",
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch4 = {
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 104,
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 77,
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/103",
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "Patch3",
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": False,
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "review": "+",
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "commit-queue": "?",
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "reviewer_email": "foo@bar.com",
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "Contributer2",
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch5 = {
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 105,
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 77,
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/103",
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "Patch5",
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": False,
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "review": "+",
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "reviewer_email": "foo@bar.com",
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "eric@webkit.org",
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch6 = { # Valid committer, but no reviewer.
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 106,
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 77,
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/103",
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "ROLLOUT of r3489",
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": False,
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "commit-queue": "+",
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "committer_email": "foo@bar.com",
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "eric@webkit.org",
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_patch7 = { # Valid review, patch is marked obsolete.
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 107,
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "bug_id": 76,
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "url": "http://example.com/103",
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "name": "Patch7",
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_obsolete": True,
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "is_patch": True,
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "review": "+",
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "reviewer_email": "foo@bar.com",
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attacher_email": "eric@webkit.org",
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# This matches one of Bug.unassigned_emails
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_unassigned_email = "webkit-unassigned@lists.webkit.org"
149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch# This is needed for the FlakyTestReporter to believe the bug
150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch# was filed by one of the webkitpy bots.
151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch_commit_queue_email = "commit-queue@webkit.org"
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# FIXME: The ids should be 1, 2, 3 instead of crazy numbers.
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_bug1 = {
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 42,
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "title": "Bug with two r+'d and cq+'d patches, one of which has an "
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             "invalid commit-queue setter.",
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "reporter_email": "foo@foo.com",
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "assigned_to_email": _unassigned_email,
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attachments": [_patch1, _patch2],
16468513a70bcd92384395513322f1b801e7bf9c729Steve Block    "bug_status": "UNCONFIRMED",
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_bug2 = {
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 75,
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "title": "Bug with a patch needing review.",
171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "reporter_email": "foo@foo.com",
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "assigned_to_email": "foo@foo.com",
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attachments": [_patch3],
17468513a70bcd92384395513322f1b801e7bf9c729Steve Block    "bug_status": "ASSIGNED",
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_bug3 = {
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 76,
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "title": "The third bug",
181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "reporter_email": "foo@foo.com",
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "assigned_to_email": _unassigned_email,
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attachments": [_patch7],
18468513a70bcd92384395513322f1b801e7bf9c729Steve Block    "bug_status": "NEW",
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_bug4 = {
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "id": 77,
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "title": "The fourth bug",
191f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "reporter_email": "foo@foo.com",
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "assigned_to_email": "foo@foo.com",
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "attachments": [_patch4, _patch5, _patch6],
19468513a70bcd92384395513322f1b801e7bf9c729Steve Block    "bug_status": "REOPENED",
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch_bug5 = {
199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "id": 78,
200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "title": "The fifth bug",
201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "reporter_email": _commit_queue_email,
202f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "assigned_to_email": "foo@foo.com",
203f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "attachments": [],
204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "bug_status": "RESOLVED",
205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    "dup_id": 76,
206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
207f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
208f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
209e14391e94c850b8bd03680c23b38978db68687a8John Reck# FIXME: This should not inherit from Mock
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockBugzillaQueries(Mock):
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def __init__(self, bugzilla):
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Mock.__init__(self)
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._bugzilla = bugzilla
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def _all_bugs(self):
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return map(lambda bug_dictionary: Bug(bug_dictionary, self._bugzilla),
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   self._bugzilla.bug_cache.values())
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_bug_ids_from_commit_queue(self):
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bugs_with_commit_queued_patches = filter(
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                lambda bug: bug.commit_queued_patches(),
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                self._all_bugs())
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return map(lambda bug: bug.id(), bugs_with_commit_queued_patches)
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_attachment_ids_from_review_queue(self):
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        unreviewed_patches = sum([bug.unreviewed_patches()
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                  for bug in self._all_bugs()], [])
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return map(lambda patch: patch.id(), unreviewed_patches)
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_patches_from_commit_queue(self):
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return sum([bug.commit_queued_patches()
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    for bug in self._all_bugs()], [])
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_bug_ids_from_pending_commit_list(self):
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bugs_with_reviewed_patches = filter(lambda bug: bug.reviewed_patches(),
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                            self._all_bugs())
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bug_ids = map(lambda bug: bug.id(), bugs_with_reviewed_patches)
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # NOTE: This manual hack here is to allow testing logging in
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # test_assign_to_committer the real pending-commit query on bugzilla
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # will return bugs with patches which have r+, but are also obsolete.
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return bug_ids + [76]
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_patches_from_pending_commit_list(self):
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return sum([bug.reviewed_patches() for bug in self._all_bugs()], [])
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    def fetch_bugs_matching_search(self, search_string, author_email=None):
248f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return [self._bugzilla.fetch_bug(78), self._bugzilla.fetch_bug(77)]
249e14391e94c850b8bd03680c23b38978db68687a8John Reck
250e14391e94c850b8bd03680c23b38978db68687a8John Reck_mock_reviewer = Reviewer("Foo Bar", "foo@bar.com")
251e14391e94c850b8bd03680c23b38978db68687a8John Reck
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# FIXME: Bugzilla is the wrong Mock-point.  Once we have a BugzillaNetwork
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#        class we should mock that instead.
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Most of this class is just copy/paste from Bugzilla.
256e14391e94c850b8bd03680c23b38978db68687a8John Reck# FIXME: This should not inherit from Mock
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockBugzilla(Mock):
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bug_server_url = "http://example.com"
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bug_cache = _id_to_object_dictionary(_bug1, _bug2, _bug3, _bug4, _bug5)
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    attachment_cache = _id_to_object_dictionary(_patch1,
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                                _patch2,
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                                _patch3,
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                                _patch4,
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                                _patch5,
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                                _patch6,
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                                _patch7)
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def __init__(self):
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Mock.__init__(self)
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.queries = MockBugzillaQueries(self)
274e14391e94c850b8bd03680c23b38978db68687a8John Reck        self.committers = CommitterList(reviewers=[_mock_reviewer])
27568513a70bcd92384395513322f1b801e7bf9c729Steve Block        self._override_patch = None
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def create_bug(self,
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   bug_title,
279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   bug_description,
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   component=None,
28121939df44de1705786c545cd1bf519d47250322dBen Murdoch                   diff=None,
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   patch_description=None,
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   cc=None,
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   blocked=None,
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   mark_for_review=False,
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   mark_for_commit_queue=False):
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("MOCK create_bug")
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("bug_title: %s" % bug_title)
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("bug_description: %s" % bug_description)
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if component:
291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("component: %s" % component)
292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if cc:
293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("cc: %s" % cc)
294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if blocked:
295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("blocked: %s" % blocked)
296f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return 78
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def quips(self):
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return ["Good artists copy. Great artists steal. - Pablo Picasso"]
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_bug(self, bug_id):
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return Bug(self.bug_cache.get(bug_id), self)
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
30468513a70bcd92384395513322f1b801e7bf9c729Steve Block    def set_override_patch(self, patch):
30568513a70bcd92384395513322f1b801e7bf9c729Steve Block        self._override_patch = patch
30668513a70bcd92384395513322f1b801e7bf9c729Steve Block
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_attachment(self, attachment_id):
30868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if self._override_patch:
30968513a70bcd92384395513322f1b801e7bf9c729Steve Block            return self._override_patch
31068513a70bcd92384395513322f1b801e7bf9c729Steve Block
311e14391e94c850b8bd03680c23b38978db68687a8John Reck        attachment_dictionary = self.attachment_cache.get(attachment_id)
312e14391e94c850b8bd03680c23b38978db68687a8John Reck        if not attachment_dictionary:
313e14391e94c850b8bd03680c23b38978db68687a8John Reck            print "MOCK: fetch_attachment: %s is not a known attachment id" % attachment_id
314e14391e94c850b8bd03680c23b38978db68687a8John Reck            return None
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bug = self.fetch_bug(attachment_dictionary["bug_id"])
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        for attachment in bug.attachments(include_obsolete=True):
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if attachment.id() == int(attachment_id):
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                return attachment
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def bug_url_for_bug_id(self, bug_id):
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "%s/%s" % (self.bug_server_url, bug_id)
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def fetch_bug_dictionary(self, bug_id):
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return self.bug_cache.get(bug_id)
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def attachment_url_for_id(self, attachment_id, action="view"):
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        action_param = ""
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if action and action != "view":
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            action_param = "&action=%s" % action
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "%s/%s%s" % (self.bug_server_url, attachment_id, action_param)
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
332545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    def set_flag_on_attachment(self,
333545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                               attachment_id,
334545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                               flag_name,
335545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                               flag_value,
336545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                               comment_text=None,
337545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                               additional_comment_text=None):
338545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        log("MOCK setting flag '%s' to '%s' on attachment '%s' with comment '%s' and additional comment '%s'" % (
339545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            flag_name, flag_value, attachment_id, comment_text, additional_comment_text))
340545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def post_comment_to_bug(self, bug_id, comment_text, cc=None):
342a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        log("MOCK bug comment: bug_id=%s, cc=%s\n--- Begin comment ---\n%s\n--- End comment ---\n" % (
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            bug_id, cc, comment_text))
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
345f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    def add_attachment_to_bug(self,
346f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                              bug_id,
347f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                              file_or_string,
348f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                              description,
349f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                              filename=None,
350f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                              comment_text=None):
351f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        log("MOCK add_attachment_to_bug: bug_id=%s, description=%s filename=%s" % (bug_id, description, filename))
352f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if comment_text:
353f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("-- Begin comment --")
354f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log(comment_text)
355f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("-- End comment --")
356f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def add_patch_to_bug(self,
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                         bug_id,
35921939df44de1705786c545cd1bf519d47250322dBen Murdoch                         diff,
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                         description,
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                         comment_text=None,
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                         mark_for_review=False,
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                         mark_for_commit_queue=False,
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                         mark_for_landing=False):
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("MOCK add_patch_to_bug: bug_id=%s, description=%s, mark_for_review=%s, mark_for_commit_queue=%s, mark_for_landing=%s" %
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            (bug_id, description, mark_for_review, mark_for_commit_queue, mark_for_landing))
367f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if comment_text:
368f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("-- Begin comment --")
369f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log(comment_text)
370f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log("-- End comment --")
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockBuilder(object):
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def __init__(self, name):
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._name = name
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    def name(self):
3786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return self._name
3796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
380967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    def results_url(self):
381967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return "http://example.com/builders/%s/results/" % self.name()
382967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def force_build(self, username, comments):
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("MOCK: force_build: name=%s, username=%s, comments=%s" % (
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            self._name, username, comments))
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
388a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass MockFailureMap(object):
389bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def __init__(self, buildbot):
390bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self._buildbot = buildbot
391bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
392a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def is_empty(self):
393a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return False
394a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
395a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def filter_out_old_failures(self, is_old_revision):
396a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        pass
397a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
398a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def failing_revisions(self):
399a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return [29837]
400a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
401a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def builders_failing_for(self, revision):
402a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return [self._buildbot.builder_with_name("Builder1")]
403a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
404a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def tests_failing_for(self, revision):
405a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return ["mock-test-1"]
406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockBuildBot(object):
409e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    buildbot_host = "dummy_buildbot_host"
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def __init__(self):
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._mock_builder1_status = {
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "name": "Builder1",
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "is_green": True,
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "activity": "building",
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._mock_builder2_status = {
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "name": "Builder2",
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "is_green": True,
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "activity": "idle",
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def builder_with_name(self, name):
423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return MockBuilder(name)
424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def builder_statuses(self):
426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return [
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            self._mock_builder1_status,
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            self._mock_builder2_status,
429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ]
430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def red_core_builders_names(self):
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if not self._mock_builder2_status["is_green"]:
433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return [self._mock_builder2_status["name"]]
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return []
435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def red_core_builders(self):
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if not self._mock_builder2_status["is_green"]:
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return [self._mock_builder2_status]
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return []
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def idle_red_core_builders(self):
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if not self._mock_builder2_status["is_green"]:
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return [self._mock_builder2_status]
444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return []
445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def last_green_revision(self):
447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 9479
448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def light_tree_on_fire(self):
450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._mock_builder2_status["is_green"] = False
451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
452bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def failure_map(self):
453bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return MockFailureMap(self)
454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
456e14391e94c850b8bd03680c23b38978db68687a8John Reck# FIXME: This should not inherit from Mock
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockSCM(Mock):
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    fake_checkout_root = os.path.realpath("/tmp") # realpath is needed to allow for Mac OS X's /private/tmp
460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    def __init__(self, filesystem=None):
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Mock.__init__(self)
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # FIXME: We should probably use real checkout-root detection logic here.
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # os.getcwd() can't work here because other parts of the code assume that "checkout_root"
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # will actually be the root.  Since getcwd() is wrong, use a globally fake root for now.
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.checkout_root = self.fake_checkout_root
4672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.added_paths = set()
4682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        self._filesystem = filesystem
4692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def add(self, destination_path, return_exit_code=False):
4712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.added_paths.add(destination_path)
4722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if return_exit_code:
4732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return 0
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
47528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    def changed_files(self, git_commit=None):
47628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return ["MockFile1"]
47728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
478a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def create_patch(self, git_commit, changed_files=None):
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "Patch1"
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def commit_ids_from_commitish_arguments(self, args):
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return ["Commitish1", "Commitish2"]
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def commit_message_for_local_commit(self, commit_id):
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if commit_id == "Commitish1":
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return CommitMessage("CommitMessage1\n" \
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                "https://bugs.example.org/show_bug.cgi?id=42\n")
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if commit_id == "Commitish2":
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return CommitMessage("CommitMessage2\n" \
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                "https://bugs.example.org/show_bug.cgi?id=75\n")
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        raise Exception("Bogus commit_id in commit_message_for_local_commit.")
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def diff_for_file(self, path, log=None):
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return path + '-diff'
4952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def diff_for_revision(self, revision):
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "DiffForRevision%s\n" \
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               "http://bugs.webkit.org/show_bug.cgi?id=12345" % revision
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def show_head(self, path):
5012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return path
5022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def svn_revision_from_commit_text(self, commit_text):
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "49824"
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    def delete(self, path):
5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if not self._filesystem:
5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return
5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if self._filesystem.exists(path):
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            self._filesystem.remove(path)
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass MockDEPS(object):
5142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def read_variable(self, name):
5152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 6564
5162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def write_variable(self, name, value):
5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        log("MOCK: MockDEPS.write_variable(%s, %s)" % (name, value))
519f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockCheckout(object):
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _committer_list = CommitterList()
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def commit_info_for_revision(self, svn_revision):
526a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        # The real Checkout would probably throw an exception, but this is the only way tests have to get None back at the moment.
527a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if not svn_revision:
528a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return None
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return CommitInfo(svn_revision, "eric@webkit.org", {
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "bug_id": 42,
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "author_name": "Adam Barth",
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "author_email": "abarth@webkit.org",
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "author": self._committer_list.committer_by_email("abarth@webkit.org"),
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "reviewer_text": "Darin Adler",
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "reviewer": self._committer_list.committer_by_name("Darin Adler"),
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        })
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def bug_id_for_revision(self, svn_revision):
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 12345
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
541a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def recent_commit_infos_for_files(self, paths):
542a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return [self.commit_info_for_revision(32)]
543a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
544a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def modified_changelogs(self, git_commit, changed_files=None):
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # Ideally we'd return something more interesting here.  The problem is
546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # that LandDiff will try to actually read the patch from disk!
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return []
548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
549e14391e94c850b8bd03680c23b38978db68687a8John Reck    def commit_message_for_this_commit(self, git_commit, changed_files=None):
550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        commit_message = Mock()
551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        commit_message.message = lambda:"This is a fake commit message that is at least 50 characters."
552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return commit_message
553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def chromium_deps(self):
5552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return MockDEPS()
5562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def apply_patch(self, patch, force=False):
558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        pass
559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
560f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    def apply_reverse_diffs(self, revision):
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        pass
562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
563e14391e94c850b8bd03680c23b38978db68687a8John Reck    def suggested_reviewers(self, git_commit, changed_files=None):
564e14391e94c850b8bd03680c23b38978db68687a8John Reck        return [_mock_reviewer]
565e14391e94c850b8bd03680c23b38978db68687a8John Reck
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockUser(object):
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
569cad810f21b803229eb11403f9209855525a25d57Steve Block    @classmethod
570cad810f21b803229eb11403f9209855525a25d57Steve Block    def prompt(cls, message, repeat=1, raw_input=raw_input):
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "Mock user response"
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
573cad810f21b803229eb11403f9209855525a25d57Steve Block    @classmethod
574cad810f21b803229eb11403f9209855525a25d57Steve Block    def prompt_with_list(cls, list_title, list_items, can_choose_multiple=False, raw_input=raw_input):
575cad810f21b803229eb11403f9209855525a25d57Steve Block        pass
576cad810f21b803229eb11403f9209855525a25d57Steve Block
5772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def __init__(self):
5782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.opened_urls = []
5792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def edit(self, files):
581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        pass
582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    def edit_changelog(self, files):
5845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        pass
5855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def page(self, message):
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        pass
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def confirm(self, message=None, default='y'):
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        log(message)
591bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return default == 'y'
592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
593545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    def can_open_url(self):
594545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return True
595545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def open_url(self, url):
5972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.opened_urls.append(url)
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if url.startswith("file://"):
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            log("MOCK: user.open_url: file://...")
600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return
601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("MOCK: user.open_url: %s" % url)
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockIRC(object):
605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def post(self, message):
607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("MOCK: irc.post: %s" % message)
608dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
609dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def disconnect(self):
610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        log("MOCK: irc.disconnect")
611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass MockStatusServer(object):
614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
615a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def __init__(self, bot_id=None, work_items=None):
616dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.host = "example.com"
617a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        self.bot_id = bot_id
61868513a70bcd92384395513322f1b801e7bf9c729Steve Block        self._work_items = work_items or []
619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def patch_status(self, queue_name, patch_id):
621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return None
622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def svn_revision(self, svn_revision):
624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return None
625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62668513a70bcd92384395513322f1b801e7bf9c729Steve Block    def next_work_item(self, queue_name):
62768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if not self._work_items:
62868513a70bcd92384395513322f1b801e7bf9c729Steve Block            return None
629e14391e94c850b8bd03680c23b38978db68687a8John Reck        return self._work_items.pop(0)
63068513a70bcd92384395513322f1b801e7bf9c729Steve Block
631a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def release_work_item(self, queue_name, patch):
632a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        log("MOCK: release_work_item: %s %s" % (queue_name, patch.id()))
633a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
634e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    def update_work_items(self, queue_name, work_items):
63568513a70bcd92384395513322f1b801e7bf9c729Steve Block        self._work_items = work_items
636e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        log("MOCK: update_work_items: %s %s" % (queue_name, work_items))
637e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
638a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def submit_to_ews(self, patch_id):
639a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        log("MOCK: submit_to_ews: %s" % (patch_id))
640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def update_status(self, queue_name, status, patch=None, results_file=None):
6426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        log("MOCK: update_status: %s %s" % (queue_name, status))
643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 187
644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def update_svn_revision(self, svn_revision, broken_bot):
646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 191
647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
648545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    def results_url_for_status(self, status_id):
649545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return "http://dummy_url"
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
651e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
652e14391e94c850b8bd03680c23b38978db68687a8John Reck# FIXME: This should not inherit from Mock
6536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner# FIXME: Unify with common.system.executive_mock.MockExecutive.
654e14391e94c850b8bd03680c23b38978db68687a8John Reckclass MockExecutive(Mock):
6556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    def __init__(self, should_log):
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        self.should_log = should_log
6576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def run_and_throw_if_fail(self, args, quiet=False):
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if self.should_log:
6606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            log("MOCK run_and_throw_if_fail: %s" % args)
661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "MOCK output of child process"
662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def run_command(self,
664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    args,
665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    cwd=None,
666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    input=None,
667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    error_handler=None,
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return_exit_code=False,
66921939df44de1705786c545cd1bf519d47250322dBen Murdoch                    return_stderr=True,
67021939df44de1705786c545cd1bf519d47250322dBen Murdoch                    decode_output=False):
67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if self.should_log:
6726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            log("MOCK run_command: %s" % args)
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "MOCK output of child process"
674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
676a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass MockOptions(object):
677a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    """Mock implementation of optparse.Values."""
678a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
679a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def __init__(self, **kwargs):
680a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        # The caller can set option values using keyword arguments. We don't
681a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        # set any values by default because we don't know how this
682a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        # object will be used. Generally speaking unit tests should
683a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        # subclass this or provider wrapper functions that set a common
684a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        # set of options.
685a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for key, value in kwargs.items():
686a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            self.__dict__[key] = value
687e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
688e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
689f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass MockPort(Mock):
690f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    def name(self):
691f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return "MockPort"
692f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
693f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    def layout_tests_results_path(self):
694f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return "/mock/results.html"
695f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    def check_webkit_style_command(self):
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return ["mock-check-webkit-style"]
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    def update_webkit_command(self):
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return ["mock-update-webkit"]
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
703e14391e94c850b8bd03680c23b38978db68687a8John Reckclass MockTestPort1(object):
7045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    def skips_layout_test(self, test_name):
7065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return test_name in ["media/foo/bar.html", "foo"]
7075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
709e14391e94c850b8bd03680c23b38978db68687a8John Reckclass MockTestPort2(object):
7105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    def skips_layout_test(self, test_name):
7125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return test_name == "media/foo/bar.html"
7135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
715e14391e94c850b8bd03680c23b38978db68687a8John Reckclass MockPortFactory(object):
7165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    def get_all(self, options=None):
7185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return {"test_port1": MockTestPort1(), "test_port2": MockTestPort2()}
7195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
721f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass MockPlatformInfo(object):
722f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    def display_name(self):
723f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return "MockPlatform 1.0"
724f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
725f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass MockWorkspace(object):
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    def find_unused_filename(self, directory, name, extension, search_limit=10):
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "%s/%s.%s" % (directory, name, extension)
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    def create_zip(self, zip_path, source_path):
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pass
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
734e14391e94c850b8bd03680c23b38978db68687a8John Reckclass MockTool(object):
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def __init__(self, log_executive=False):
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.wakeup_event = threading.Event()
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.bugs = MockBugzilla()
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.buildbot = MockBuildBot()
740e14391e94c850b8bd03680c23b38978db68687a8John Reck        self.executive = MockExecutive(should_log=log_executive)
741f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        self.filesystem = MockFileSystem()
74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        self.workspace = MockWorkspace()
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._irc = None
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.user = MockUser()
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._scm = MockSCM()
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self._checkout = MockCheckout()
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.status_server = MockStatusServer()
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self.irc_password = "MOCK irc password"
7495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        self.port_factory = MockPortFactory()
750f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        self.platform = MockPlatformInfo()
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def scm(self):
753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return self._scm
754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def checkout(self):
756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return self._checkout
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def ensure_irc_connected(self, delegate):
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if not self._irc:
760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            self._irc = MockIRC()
761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def irc(self):
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return self._irc
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def path(self):
766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return "echo"
767a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
768a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def port(self):
769f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return MockPort()
770a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
771a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
772a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass MockBrowser(object):
773a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    params = {}
774a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
775a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def open(self, url):
776a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        pass
777a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
778a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def select_form(self, name):
779a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        pass
780a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
781a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def __setitem__(self, key, value):
782a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        self.params[key] = value
783a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
784a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    def submit(self):
785a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return Mock(file)
786