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 gcl.py.""" | 6 """Unit tests for gcl.py.""" |
7 | 7 |
8 # pylint is too confused. | 8 # pylint is too confused. |
9 # pylint: disable=E1101,E1103,E1120,W0212,W0403 | 9 # pylint: disable=E1101,E1103,E1120,W0212,W0403 |
10 | 10 |
(...skipping 16 matching lines...) Expand all Loading... |
27 self.mox.StubOutWithMock(gcl.upload, 'RealMain') | 27 self.mox.StubOutWithMock(gcl.upload, 'RealMain') |
28 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileRead') | 28 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileRead') |
29 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileWrite') | 29 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileWrite') |
30 gcl.REPOSITORY_ROOT = None | 30 gcl.REPOSITORY_ROOT = None |
31 self.old_review_settings = gcl.CODEREVIEW_SETTINGS | 31 self.old_review_settings = gcl.CODEREVIEW_SETTINGS |
32 self.assertEquals(gcl.CODEREVIEW_SETTINGS, {}) | 32 self.assertEquals(gcl.CODEREVIEW_SETTINGS, {}) |
33 | 33 |
34 def tearDown(self): | 34 def tearDown(self): |
35 gcl.CODEREVIEW_SETTINGS = self.old_review_settings | 35 gcl.CODEREVIEW_SETTINGS = self.old_review_settings |
36 | 36 |
| 37 def fakeChange(self, files=None): |
| 38 if files == None: |
| 39 files = [('A', 'aa'), ('M', 'bb')] |
| 40 |
| 41 change_info = self.mox.CreateMock(gcl.ChangeInfo) |
| 42 change_info.name = 'naame' |
| 43 change_info.issue = 1 |
| 44 change_info.patchset = 0 |
| 45 change_info.description = 'deescription' |
| 46 change_info.files = files |
| 47 change_info.GetFiles = lambda : change_info.files |
| 48 change_info.GetIssueDescription = lambda : change_info.description |
| 49 change_info.GetFileNames = lambda : [f[1] for f in change_info.files] |
| 50 change_info.GetLocalRoot = lambda : 'proout' |
| 51 change_info.patch = None |
| 52 change_info.rietveld = 'my_server' |
| 53 change_info.reviewers = None |
| 54 change_info._closed = False |
| 55 change_info._deleted = False |
| 56 |
| 57 def Delete(): |
| 58 change_info._deleted = True |
| 59 change_info.Delete = Delete |
| 60 |
| 61 def CloseIssue(): |
| 62 change_info._closed = True |
| 63 change_info.CloseIssue = CloseIssue |
| 64 |
| 65 return change_info |
| 66 |
37 | 67 |
38 class GclUnittest(GclTestsBase): | 68 class GclUnittest(GclTestsBase): |
39 """General gcl.py tests.""" | 69 """General gcl.py tests.""" |
40 def tearDown(self): | 70 def tearDown(self): |
41 gcl.CODEREVIEW_SETTINGS = {} | 71 gcl.CODEREVIEW_SETTINGS = {} |
42 | 72 |
43 def testMembersChanged(self): | 73 def testMembersChanged(self): |
44 self.mox.ReplayAll() | 74 self.mox.ReplayAll() |
45 members = [ | 75 members = [ |
46 'CODEREVIEW_SETTINGS', 'CODEREVIEW_SETTINGS_FILE', | 76 'CODEREVIEW_SETTINGS', 'CODEREVIEW_SETTINGS_FILE', |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True | 443 gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True |
414 ).AndReturn(change_info) | 444 ).AndReturn(change_info) |
415 self.mox.ReplayAll() | 445 self.mox.ReplayAll() |
416 | 446 |
417 gcl.CMDupload(['naame']) | 447 gcl.CMDupload(['naame']) |
418 self.checkstdout('*** Upload does not submit a try; use gcl try to submit ' | 448 self.checkstdout('*** Upload does not submit a try; use gcl try to submit ' |
419 'a try. ***\n' | 449 'a try. ***\n' |
420 '*** Upload does not submit a try; use gcl try to submit a try. ***\n') | 450 '*** Upload does not submit a try; use gcl try to submit a try. ***\n') |
421 | 451 |
422 def testSuggestReviewers(self): | 452 def testSuggestReviewers(self): |
423 change_info = self.mox.CreateMock(gcl.ChangeInfo) | 453 change_info = self.fakeChange() |
424 change_info.name = 'naame' | |
425 change_info.issue = 1 | |
426 change_info.patchset = 0 | |
427 change_info.description = 'deescription', | |
428 change_info.files = [('A', 'aa'), ('M', 'bb')] | |
429 change_info.patch = None | |
430 change_info.rietveld = 'my_server' | |
431 change_info.reviewers = None | |
432 files = [item[1] for item in change_info.files] | |
433 output = presubmit_support.PresubmitOutput() | 454 output = presubmit_support.PresubmitOutput() |
434 output.reviewers = ['foo@example.com', 'bar@example.com'] | 455 output.reviewers = ['foo@example.com', 'bar@example.com'] |
435 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output) | 456 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(output) |
436 #gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 457 #gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
437 gcl.os.getcwd().AndReturn('somewhere') | 458 gcl.os.getcwd().AndReturn('somewhere') |
438 change_info.GetFiles().AndReturn(change_info.files) | |
439 change_info.GetLocalRoot().AndReturn('proout') | |
440 gcl.os.chdir('proout') | 459 gcl.os.chdir('proout') |
441 change_info.GetFileNames().AndReturn(files) | 460 gcl.GenerateDiff(change_info.GetFileNames()) |
442 gcl.GenerateDiff(files) | |
443 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', | 461 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', |
444 '--reviewers=foo@example.com,bar@example.com', | 462 '--reviewers=foo@example.com,bar@example.com', |
445 '--message=\'\'', '--issue=1'], | 463 '--message=\'\'', '--issue=1'], |
446 change_info.patch).AndReturn(("1", "2")) | 464 change_info.patch).AndReturn(("1", "2")) |
447 change_info.Save() | 465 change_info.Save() |
448 change_info.PrimeLint() | 466 change_info.PrimeLint() |
449 gcl.os.chdir('somewhere') | 467 gcl.os.chdir('somewhere') |
450 gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to" | 468 gcl.sys.stdout.write("*** Upload does not submit a try; use gcl try to" |
451 " submit a try. ***") | 469 " submit a try. ***") |
452 gcl.sys.stdout.write("\n") | 470 gcl.sys.stdout.write("\n") |
453 gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir) | 471 gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir) |
454 gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True | 472 gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True |
455 ).AndReturn(change_info) | 473 ).AndReturn(change_info) |
456 self.mox.ReplayAll() | 474 self.mox.ReplayAll() |
457 | 475 |
458 gcl.CMDupload(['naame']) | 476 gcl.CMDupload(['naame']) |
459 self.checkstdout('*** Upload does not submit a try; use gcl try to submit ' | 477 self.checkstdout('*** Upload does not submit a try; use gcl try to submit ' |
460 'a try. ***\n' | 478 'a try. ***\n' |
461 '*** Upload does not submit a try; use gcl try to submit a try. ***\n') | 479 '*** Upload does not submit a try; use gcl try to submit a try. ***\n') |
462 | 480 |
463 | 481 |
| 482 class CMDCommitUnittest(GclTestsBase): |
| 483 def mockLoad(self, files=None): |
| 484 self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot') |
| 485 self.mox.StubOutWithMock(gcl.ChangeInfo, 'Load') |
| 486 gcl.GetRepositoryRoot().AndReturn(self.fake_root_dir) |
| 487 change_info = self.fakeChange(files) |
| 488 gcl.ChangeInfo.Load('naame', self.fake_root_dir, True, True |
| 489 ).AndReturn(change_info) |
| 490 return change_info |
| 491 |
| 492 def mockPresubmit(self, change_info, fail): |
| 493 self.mox.StubOutWithMock(gcl, 'OptionallyDoPresubmitChecks') |
| 494 output = presubmit_support.PresubmitOutput() |
| 495 if fail: |
| 496 output.fail() |
| 497 gcl.OptionallyDoPresubmitChecks(change_info, True, []).AndReturn(output) |
| 498 |
| 499 def mockCommit(self, change_info, commit_message, shell_output): |
| 500 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'commit')) |
| 501 gcl.os.write(42, commit_message) |
| 502 gcl.os.close(42) |
| 503 gcl.tempfile.mkstemp(text=True).AndReturn((43, 'files')) |
| 504 gcl.os.write(43, '\n'.join(change_info.GetFileNames())) |
| 505 gcl.os.close(43) |
| 506 |
| 507 gcl.os.getcwd().AndReturn('prev') |
| 508 gcl.os.chdir(change_info.GetLocalRoot()) |
| 509 gcl.RunShell(['svn', 'commit', '--file=commit', '--targets=files'], |
| 510 True).AndReturn(shell_output) |
| 511 if 'Committed' in shell_output: |
| 512 self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting') |
| 513 gcl.GetCodeReviewSetting('VIEW_VC').AndReturn('http://view/') |
| 514 |
| 515 gcl.os.remove('commit') |
| 516 gcl.os.remove('files') |
| 517 gcl.os.chdir('prev') |
| 518 |
| 519 def testPresubmitEmpty(self): |
| 520 self.mockLoad(files=[]) |
| 521 self.mox.ReplayAll() |
| 522 |
| 523 retval = gcl.CMDcommit(['naame']) |
| 524 |
| 525 self.assertEquals(retval, 1) |
| 526 |
| 527 def testPresubmitFails(self): |
| 528 change_info = self.mockLoad() |
| 529 self.mockPresubmit(change_info, fail=True) |
| 530 self.mox.ReplayAll() |
| 531 |
| 532 retval = gcl.CMDcommit(['naame']) |
| 533 |
| 534 self.assertEquals(retval, 1) |
| 535 |
| 536 def testPresubmitSucceeds(self): |
| 537 change_info = self.mockLoad() |
| 538 self.mockPresubmit(change_info, fail=False) |
| 539 self.mockCommit(change_info, 'deescription\nReview URL: http://my_server/1', |
| 540 '') |
| 541 |
| 542 self.mox.ReplayAll() |
| 543 |
| 544 retval = gcl.CMDcommit(['naame']) |
| 545 |
| 546 self.assertEquals(retval, 0) |
| 547 self.assertEquals(change_info.description, 'deescription') |
| 548 self.assertFalse(change_info._deleted) |
| 549 self.assertFalse(change_info._closed) |
| 550 |
| 551 def testPresubmitSucceedsWithCommittedMessage(self): |
| 552 change_info = self.mockLoad() |
| 553 self.mockPresubmit(change_info, fail=False) |
| 554 self.mockCommit(change_info, 'deescription\nReview URL: http://my_server/1', |
| 555 '\nCommitted revision 12345') |
| 556 |
| 557 self.mox.ReplayAll() |
| 558 |
| 559 retval = gcl.CMDcommit(['naame']) |
| 560 self.assertEquals(retval, 0) |
| 561 self.assertEquals(change_info.description, |
| 562 'deescription\n\nCommitted: http://view/12345') |
| 563 self.assertTrue(change_info._deleted) |
| 564 self.assertTrue(change_info._closed) |
| 565 |
| 566 |
464 if __name__ == '__main__': | 567 if __name__ == '__main__': |
465 import unittest | 568 import unittest |
466 unittest.main() | 569 unittest.main() |
OLD | NEW |