OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Unit tests for pending_manager.py.""" | 6 """Unit tests for pending_manager.py.""" |
7 | 7 |
8 import logging | 8 import logging |
9 import os | 9 import os |
| 10 import re |
10 import sys | 11 import sys |
11 import unittest | 12 import unittest |
12 import urllib2 | 13 import urllib2 |
13 | 14 |
14 ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) | 15 ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) |
15 sys.path.insert(0, os.path.join(ROOT_DIR, '..')) | 16 sys.path.insert(0, os.path.join(ROOT_DIR, '..')) |
16 | 17 |
| 18 import find_depot_tools # pylint: disable=W0611 |
| 19 import patch |
| 20 |
17 import pending_manager | 21 import pending_manager |
18 from verification import base | 22 from verification import base |
19 from verification import fake | 23 from verification import fake |
| 24 from verification import project_base |
20 | 25 |
21 | 26 |
22 # Access to a protected member xxx of a client class | 27 # Access to a protected member xxx of a client class |
23 # pylint: disable=W0212 | 28 # pylint: disable=W0212 |
24 | 29 |
25 def _SendStackFail(last_tb, stack, url=None, maxlen=50): | 30 SVN_PATCH = ( |
| 31 'Index: chrome/file.cc\n' |
| 32 '===================================================================\n' |
| 33 '--- chrome/file.cc\t(revision 74690)\n' |
| 34 '+++ chrome/file.cc\t(working copy)\n' |
| 35 '@@ -80,10 +80,13 @@\n' |
| 36 ' // Foo\n' |
| 37 ' // Bar\n' |
| 38 ' void foo() {\n' |
| 39 '- return bar;\n' |
| 40 '+ return foo;\n' |
| 41 ' }\n' |
| 42 ' \n' |
| 43 ' \n') |
| 44 |
| 45 |
| 46 def _SendStackFail(last_tb, stack, *args, **kwargs): |
26 """Fails a test that calls SendStack. | 47 """Fails a test that calls SendStack. |
27 | 48 |
28 In practice it doesn't happen when a test pass but will when a test fails so | 49 In practice it doesn't happen when a test pass but will when a test fails so |
29 hook it here so breakpad doesn't send too many stack traces to maintainers. | 50 hook it here so breakpad doesn't send too many stack traces to maintainers. |
30 """ | 51 """ |
| 52 print '_SendStackFail() was called' |
31 print last_tb | 53 print last_tb |
32 print stack | 54 print stack |
33 assert False | 55 assert False |
34 | 56 |
35 | 57 |
36 def read(filename): | 58 def read(filename): |
37 f = open(filename, 'rb') | 59 f = open(filename, 'rb') |
38 content = f.read() | 60 content = f.read() |
39 f.close() | 61 f.close() |
40 return content | 62 return content |
41 | 63 |
42 | 64 |
43 def write(filename, content): | 65 def write(filename, content): |
44 f = open(filename, 'wb') | 66 f = open(filename, 'wb') |
45 f.write(content) | 67 f.write(content) |
46 f.close() | 68 f.close() |
47 | 69 |
48 | 70 |
49 def trim(x): | 71 def trim(x): |
50 return x.replace(' ', '').replace('\n', '') | 72 return x.replace(' ', '').replace('\n', '') |
51 | 73 |
52 | 74 |
53 class FakeRietveld(object): | 75 class FakeRietveld(object): |
54 url = 'http://nowhere' | 76 url = 'http://nowhere' |
55 | 77 |
56 def __init__(self, test): | 78 def __init__(self): |
57 self.test = test | 79 self.issues = { |
58 | 80 31337: { |
59 def get_issue_properties(self, issue_id, _): | |
60 self.test.assertEquals(issue_id, 31337) | |
61 return { | |
62 "description": "foo", | 81 "description": "foo", |
63 "created": "2010-12-27 03:23:31.149045", | 82 "created": "2010-12-27 03:23:31.149045", |
64 "cc": ["cc@example.com",], | 83 "cc": ["cc@example.com",], |
65 "reviewers": ["rev@example.com"], | 84 "reviewers": ["rev@example.com"], |
66 "owner_email": "author@example.com", | 85 "owner_email": "author@example.com", |
67 "patchsets": [1], | 86 "patchsets": [1], |
68 "modified": "2011-01-10 20:52:39.127231", | 87 "modified": "2011-01-10 20:52:39.127231", |
69 "private": False, | 88 "private": False, |
70 "base_url": "svn://fake/repo", | 89 "base_url": "svn://fake/repo", |
71 "closed": False, | 90 "closed": False, |
72 "owner": "Author", | 91 "owner": "Author", |
73 "issue": issue_id, | 92 "issue": 31337, |
74 "subject": 'foo', | 93 "subject": 'foo', |
75 "messages": [ | 94 "messages": [ |
76 { | 95 { |
77 "date": "2010-12-27 03:23:32.489999", | 96 "date": "2010-12-27 03:23:32.489999", |
78 "text": "hi!", | 97 "text": "hi!", |
79 "sender": "author@example.com", | 98 "sender": "author@example.com", |
80 "recipients": ["rev@example.com", "cc@example.com"], | 99 "recipients": ["rev@example.com", "cc@example.com"], |
81 }, | 100 }, |
82 ], | 101 ], |
83 "commit": True, | 102 "commit": True, |
| 103 }, |
84 } | 104 } |
85 | 105 |
| 106 def get_pending_issues(self): |
| 107 return self.issues.keys() |
| 108 |
| 109 def get_issue_properties(self, issue_id, _): |
| 110 return self.issues[issue_id] |
| 111 |
86 def close_issue(self, issue): | 112 def close_issue(self, issue): |
87 pass | 113 pass |
88 | 114 |
89 def update_description(self, issue, text): | 115 def update_description(self, issue, text): |
90 pass | 116 pass |
91 | 117 |
92 def set_flag(self, issue, patchset, flag, value): | 118 def set_flag(self, issue, patchset, flag, value): |
93 pass | 119 pass |
94 | 120 |
95 def add_comment(self, issue, text): | 121 def add_comment(self, issue, text): |
96 pass | 122 pass |
97 | 123 |
| 124 def get_patch(self, issue, patchset): |
| 125 return patch.PatchSet([ |
| 126 patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []), |
| 127 patch.FilePatchDelete('other/place/foo', True), |
| 128 patch.FilePatchBinary('foo', 'data', []), |
| 129 ]) |
| 130 |
98 | 131 |
99 class FakeCheckout(object): | 132 class FakeCheckout(object): |
100 project_path = os.getcwd() | 133 project_path = os.getcwd() |
101 | 134 |
102 def __init__(self): | 135 def __init__(self): |
103 self._prepare = False | 136 self._prepare = 0 |
104 self._commit = False | 137 self._commit = [] |
| 138 self._apply_patch = [] |
105 | 139 |
106 def prepare(self): | 140 def prepare(self): |
107 self._prepare = True | 141 self._prepare += 1 |
| 142 |
| 143 def apply_patch(self, patchset): |
| 144 self._apply_patch.append(patchset) |
108 | 145 |
109 def commit(self, message, author): | 146 def commit(self, message, author): |
110 self._commit = True | 147 self._commit.append((message, author)) |
111 | 148 |
112 def get_settings(self, key): | 149 def get_settings(self, key): |
113 return None | 150 return None |
114 | 151 |
115 | 152 |
116 class PendingManager(unittest.TestCase): | 153 class PendingManager(unittest.TestCase): |
117 def setUp(self): | 154 def setUp(self): |
118 super(PendingManager, self).setUp() | 155 super(PendingManager, self).setUp() |
119 self.root_dir = ROOT_DIR | 156 self.root_dir = ROOT_DIR |
120 self._old_send_stack = pending_manager.breakpad.SendStack | 157 self._old_send_stack = pending_manager.breakpad.SendStack |
(...skipping 19 matching lines...) Expand all Loading... |
140 self.assertEquals(pc.queue.pending_commits, []) | 177 self.assertEquals(pc.queue.pending_commits, []) |
141 pc.save(filename) | 178 pc.save(filename) |
142 self.assertEquals(trim(empty), trim(read(filename))) | 179 self.assertEquals(trim(empty), trim(read(filename))) |
143 finally: | 180 finally: |
144 os.remove(filename) | 181 os.remove(filename) |
145 if os.path.exists(filename + '.old'): | 182 if os.path.exists(filename + '.old'): |
146 os.remove(filename + '.old') | 183 os.remove(filename + '.old') |
147 | 184 |
148 def _get_pc(self, verifiers_no_patch, verifiers): | 185 def _get_pc(self, verifiers_no_patch, verifiers): |
149 pc = pending_manager.PendingManager( | 186 pc = pending_manager.PendingManager( |
150 FakeRietveld(self), FakeCheckout(), verifiers_no_patch, verifiers) | 187 FakeRietveld(), FakeCheckout(), verifiers_no_patch, verifiers) |
151 | 188 |
152 def fake_issues(): | |
153 return [31337] | |
154 def apply_patch(pending, revision): | 189 def apply_patch(pending, revision): |
155 pc._patch_applied = True | 190 pc._patch_applied = True |
156 | 191 |
157 pc._fetch_pending_issues = fake_issues | |
158 pc._apply_patch = apply_patch | 192 pc._apply_patch = apply_patch |
159 pc._patch_applied = False | 193 pc._patch_applied = False |
160 return pc | 194 return pc |
161 | 195 |
162 def testNoVerification(self): | 196 def testNoVerification(self): |
163 try: | 197 try: |
164 pending_manager.PendingManager( | 198 pending_manager.PendingManager( |
165 FakeRietveld(self), FakeCheckout(), [], []) | 199 FakeRietveld(), FakeCheckout(), [], []) |
166 self.fail() | 200 self.fail() |
167 except AssertionError: | 201 except AssertionError: |
168 pass | 202 pass |
169 try: | 203 try: |
170 pending_manager.PendingManager( | 204 pending_manager.PendingManager( |
171 FakeRietveld(self), | 205 FakeRietveld(), |
172 FakeCheckout(), | 206 FakeCheckout(), |
173 [fake.FakeVerifier(base.SUCCEEDED)], | 207 [fake.FakeVerifier(base.SUCCEEDED)], |
174 [fake.FakeVerifier(base.SUCCEEDED)]) | 208 [fake.FakeVerifier(base.SUCCEEDED)]) |
175 self.fail() | 209 self.fail() |
176 except AssertionError: | 210 except AssertionError: |
177 pass | 211 pass |
178 | 212 |
179 def _check_1(self, pc, result): | 213 def _check_1(self, pc, result): |
180 self.assertEquals(len(pc.queue.pending_commits), 0) | 214 self.assertEquals(len(pc.queue.pending_commits), 0) |
181 pc.look_for_new_pending_commit() | 215 pc.look_for_new_pending_commit() |
182 self.assertEquals(len(pc.queue.pending_commits), 1) | 216 self.assertEquals(len(pc.queue.pending_commits), 1) |
183 commit = pc.queue.pending_commits[0] | 217 commit = pc.queue.pending_commits[0] |
184 self.assertEquals(len(commit.verifications), 0) | 218 self.assertEquals(len(commit.verifications), 0) |
185 pc.process_new_pending_commit() | 219 pc.process_new_pending_commit() |
186 commit = pc.queue.pending_commits[0] | 220 commit = pc.queue.pending_commits[0] |
187 self.assertEquals(commit.verifications['fake'].get_state(), result) | 221 self.assertEquals(commit.verifications['fake'].get_state(), result) |
188 self.assertEquals(len(commit.verifications), 1) | 222 self.assertEquals(len(commit.verifications), 1) |
189 pc.update_status() | 223 pc.update_status() |
190 commit = pc.queue.pending_commits[0] | 224 commit = pc.queue.pending_commits[0] |
191 self.assertEquals(commit.verifications['fake'].get_state(), result) | 225 self.assertEquals(commit.verifications['fake'].get_state(), result) |
| 226 self.assertEquals('', commit.relpath) |
192 self.assertEquals(len(commit.verifications), 1) | 227 self.assertEquals(len(commit.verifications), 1) |
193 pc.scan_results() | 228 pc.scan_results() |
194 self.assertEquals(len(pc.queue.pending_commits), 0) | 229 self.assertEquals(len(pc.queue.pending_commits), 0) |
195 self.assertEquals(pc.checkout._commit, result == base.SUCCEEDED) | 230 self.assertEquals(len(pc.checkout._commit), result == base.SUCCEEDED) |
196 | 231 |
197 def testNoPatchVerification(self): | 232 def testNoPatchVerification(self): |
198 pc = self._get_pc([fake.FakeVerifier(base.SUCCEEDED)], []) | 233 pc = self._get_pc([fake.FakeVerifier(base.SUCCEEDED)], []) |
199 self._check_1(pc, base.SUCCEEDED) | 234 self._check_1(pc, base.SUCCEEDED) |
200 | 235 |
201 def testPatchVerification(self): | 236 def testPatchVerification(self): |
202 pc = self._get_pc([], [fake.FakeVerifier(base.SUCCEEDED)]) | 237 pc = self._get_pc([], [fake.FakeVerifier(base.SUCCEEDED)]) |
203 self._check_1(pc, base.SUCCEEDED) | 238 self._check_1(pc, base.SUCCEEDED) |
204 | 239 |
205 def testNoPatchVerificationFail(self): | 240 def testNoPatchVerificationFail(self): |
(...skipping 22 matching lines...) Expand all Loading... |
228 self.assertEquals([True], result) | 263 self.assertEquals([True], result) |
229 | 264 |
230 def _check_defer_1(self, pc, result): | 265 def _check_defer_1(self, pc, result): |
231 self.assertEquals(len(pc.queue.pending_commits), 0) | 266 self.assertEquals(len(pc.queue.pending_commits), 0) |
232 pc.look_for_new_pending_commit() | 267 pc.look_for_new_pending_commit() |
233 self.assertEquals(len(pc.queue.pending_commits), 1) | 268 self.assertEquals(len(pc.queue.pending_commits), 1) |
234 commit = pc.queue.pending_commits[0] | 269 commit = pc.queue.pending_commits[0] |
235 self.assertEquals(len(commit.verifications), 0) | 270 self.assertEquals(len(commit.verifications), 0) |
236 pc.process_new_pending_commit() | 271 pc.process_new_pending_commit() |
237 commit = pc.queue.pending_commits[0] | 272 commit = pc.queue.pending_commits[0] |
| 273 self.assertEquals('', commit.relpath) |
238 self.assertEquals(commit.verifications['fake'].get_state(), base.PROCESSING) | 274 self.assertEquals(commit.verifications['fake'].get_state(), base.PROCESSING) |
239 self.assertEquals(len(commit.verifications), 1) | 275 self.assertEquals(len(commit.verifications), 1) |
240 pc.update_status() | 276 pc.update_status() |
241 commit = pc.queue.pending_commits[0] | 277 commit = pc.queue.pending_commits[0] |
| 278 self.assertEquals('', commit.relpath) |
242 self.assertEquals(commit.verifications['fake'].get_state(), result) | 279 self.assertEquals(commit.verifications['fake'].get_state(), result) |
243 self.assertEquals(len(commit.verifications), 1) | 280 self.assertEquals(len(commit.verifications), 1) |
244 pc.scan_results() | 281 pc.scan_results() |
245 self.assertEquals(len(pc.queue.pending_commits), 0) | 282 self.assertEquals(len(pc.queue.pending_commits), 0) |
246 self.assertEquals(pc.checkout._commit, result == base.SUCCEEDED) | 283 self.assertEquals(len(pc.checkout._commit), result == base.SUCCEEDED) |
247 | 284 |
248 def testDeferNoPatchVerification(self): | 285 def testDeferNoPatchVerification(self): |
249 pc = self._get_pc([fake.DeferredFakeVerifier(base.SUCCEEDED)], []) | 286 pc = self._get_pc([fake.DeferredFakeVerifier(base.SUCCEEDED)], []) |
250 self._check_defer_1(pc, base.SUCCEEDED) | 287 self._check_defer_1(pc, base.SUCCEEDED) |
251 | 288 |
252 def testDeferPatchVerification(self): | 289 def testDeferPatchVerification(self): |
253 pc = self._get_pc([], [fake.DeferredFakeVerifier(base.SUCCEEDED)]) | 290 pc = self._get_pc([], [fake.DeferredFakeVerifier(base.SUCCEEDED)]) |
254 self._check_defer_1(pc, base.SUCCEEDED) | 291 self._check_defer_1(pc, base.SUCCEEDED) |
255 | 292 |
256 def testDeferNoPatchVerificationFail(self): | 293 def testDeferNoPatchVerificationFail(self): |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 if nb >= 2: | 335 if nb >= 2: |
299 self.assertEquals(commit.verifications['fake2'].get_state(), f2) | 336 self.assertEquals(commit.verifications['fake2'].get_state(), f2) |
300 if nb >= 3: | 337 if nb >= 3: |
301 self.assertEquals(commit.verifications['fake3'].get_state(), f3) | 338 self.assertEquals(commit.verifications['fake3'].get_state(), f3) |
302 if nb >= 4: | 339 if nb >= 4: |
303 self.assertEquals(commit.verifications['fake4'].get_state(), f4) | 340 self.assertEquals(commit.verifications['fake4'].get_state(), f4) |
304 self.assertEquals(len(commit.verifications), nb) | 341 self.assertEquals(len(commit.verifications), nb) |
305 pc.scan_results() | 342 pc.scan_results() |
306 self.assertEquals(len(pc.queue.pending_commits), 0) | 343 self.assertEquals(len(pc.queue.pending_commits), 0) |
307 self.assertEquals( | 344 self.assertEquals( |
308 pc.checkout._commit, | 345 len(pc.checkout._commit), |
309 all(x == base.SUCCEEDED for x in (f1, f2, f3, f4))) | 346 all(x == base.SUCCEEDED for x in (f1, f2, f3, f4))) |
310 | 347 |
311 def test4thVerificationFail(self): | 348 def test4thVerificationFail(self): |
312 self._check_4(base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.FAILED) | 349 self._check_4(base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.FAILED) |
313 | 350 |
314 def test4Verification(self): | 351 def test4Verification(self): |
315 self._check_4( | 352 self._check_4( |
316 base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED) | 353 base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED) |
317 | 354 |
318 def test4Verification3rdFail(self): | 355 def test4Verification3rdFail(self): |
(...skipping 23 matching lines...) Expand all Loading... |
342 self.assertEquals( | 379 self.assertEquals( |
343 commit.verifications['fake3'].get_state(), base.PROCESSING) | 380 commit.verifications['fake3'].get_state(), base.PROCESSING) |
344 self.assertEquals( | 381 self.assertEquals( |
345 commit.verifications['fake4'].get_state(), base.PROCESSING) | 382 commit.verifications['fake4'].get_state(), base.PROCESSING) |
346 self.assertEquals(len(commit.verifications), 4) | 383 self.assertEquals(len(commit.verifications), 4) |
347 pc.update_status() | 384 pc.update_status() |
348 self.assertEquals(commit.verifications['fake1'].get_state(), f1) | 385 self.assertEquals(commit.verifications['fake1'].get_state(), f1) |
349 self.assertEquals(commit.verifications['fake2'].get_state(), f2) | 386 self.assertEquals(commit.verifications['fake2'].get_state(), f2) |
350 self.assertEquals(commit.verifications['fake3'].get_state(), f3) | 387 self.assertEquals(commit.verifications['fake3'].get_state(), f3) |
351 self.assertEquals(commit.verifications['fake4'].get_state(), f4) | 388 self.assertEquals(commit.verifications['fake4'].get_state(), f4) |
| 389 self.assertEquals('', commit.relpath) |
352 pc.scan_results() | 390 pc.scan_results() |
353 self.assertEquals(len(pc.queue.pending_commits), 0) | 391 self.assertEquals(len(pc.queue.pending_commits), 0) |
354 self.assertEquals( | 392 self.assertEquals( |
355 pc.checkout._commit, | 393 len(pc.checkout._commit), |
356 all(x == base.SUCCEEDED for x in (f1, f2, f3, f4))) | 394 all(x == base.SUCCEEDED for x in (f1, f2, f3, f4))) |
357 | 395 |
358 def testDefer4thVerificationFail(self): | 396 def testDefer4thVerificationFail(self): |
359 self._check_defer_4( | 397 self._check_defer_4( |
360 base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.FAILED) | 398 base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.FAILED) |
361 | 399 |
362 def testDefer4Verification(self): | 400 def testDefer4Verification(self): |
363 self._check_defer_4( | 401 self._check_defer_4( |
364 base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED) | 402 base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED, base.SUCCEEDED) |
365 | 403 |
366 def testDefer4Verification3rdFail(self): | 404 def testDefer4Verification3rdFail(self): |
367 self._check_defer_4( | 405 self._check_defer_4( |
368 base.SUCCEEDED, base.SUCCEEDED, base.FAILED, base.SUCCEEDED) | 406 base.SUCCEEDED, base.SUCCEEDED, base.FAILED, base.SUCCEEDED) |
369 | 407 |
| 408 def testRelPath(self): |
| 409 verifiers = [ |
| 410 project_base.ProjectBaseUrlVerifier( |
| 411 [r'^%s(.*)$' % re.escape(r'http://example.com/')]), |
| 412 ] |
| 413 pc = pending_manager.PendingManager( |
| 414 FakeRietveld(), FakeCheckout(), verifiers, []) |
| 415 pc.rietveld.issues[31337]['base_url'] = 'http://example.com/sub/dir' |
| 416 pc.look_for_new_pending_commit() |
| 417 self.assertEquals(1, len(pc.queue.pending_commits)) |
| 418 pc.process_new_pending_commit() |
| 419 self.assertEquals('sub/dir', pc.queue.pending_commits[0].relpath) |
| 420 self.assertEquals(1, pc.checkout._prepare) |
| 421 self.assertEquals(1, len(pc.checkout._apply_patch)) |
| 422 self.assertEquals([], pc.checkout._commit) |
| 423 pc.update_status() |
| 424 self.assertEquals(1, pc.checkout._prepare) |
| 425 self.assertEquals(1, len(pc.checkout._apply_patch)) |
| 426 self.assertEquals([], pc.checkout._commit) |
| 427 patches = pc.checkout._apply_patch[0] |
| 428 self.assertEquals( |
| 429 ['sub/dir/chrome/file.cc', 'sub/dir/other/place/foo', 'sub/dir/foo'], |
| 430 patches.filenames) |
| 431 pc.scan_results() |
| 432 self.assertEquals(2, pc.checkout._prepare) |
| 433 self.assertEquals(2, len(pc.checkout._apply_patch)) |
| 434 self.assertEquals( |
| 435 [('foo\n\nReview URL: http://nowhere/31337', 'author@example.com')], |
| 436 pc.checkout._commit) |
| 437 |
370 | 438 |
371 if __name__ == '__main__': | 439 if __name__ == '__main__': |
372 logging.basicConfig(level=logging.ERROR) | 440 logging.basicConfig(level=logging.ERROR) |
373 unittest.main() | 441 unittest.main() |
OLD | NEW |