Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: tests/gclient_scm_test.py

Issue 3294017: Improve tests (Closed)
Patch Set: Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/scm_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 gclient_scm.py.""" 6 """Unit tests for gclient_scm.py."""
7 7
8 # Import before super_mox to keep valid references. 8 # Import before super_mox to keep valid references.
9 from os import rename 9 from os import rename
10 from shutil import rmtree 10 from shutil import rmtree
11 import StringIO 11 import StringIO
12 from subprocess import Popen, PIPE, STDOUT 12 from subprocess import Popen, PIPE, STDOUT
13 import tempfile 13 import tempfile
14 import unittest
14 import __builtin__ 15 import __builtin__
15 16
16 # Fixes include path. 17 # Fixes include path.
17 from super_mox import mox, SuperMoxBaseTestBase, SuperMoxTestBase 18 from super_mox import mox, TestCaseUtils, SuperMoxTestBase
18 19
19 import gclient_scm 20 import gclient_scm
20 21
21 22
22 class GCBaseTestCase(SuperMoxTestBase): 23 class GCBaseTestCase(object):
23 # Like unittest's assertRaises, but checks for Gclient.Error.
24 def assertRaisesError(self, msg, fn, *args, **kwargs): 24 def assertRaisesError(self, msg, fn, *args, **kwargs):
25 """Like unittest's assertRaises() but checks for Gclient.Error."""
25 try: 26 try:
26 fn(*args, **kwargs) 27 fn(*args, **kwargs)
27 except gclient_scm.gclient_utils.Error, e: 28 except gclient_scm.gclient_utils.Error, e:
28 self.assertEquals(e.args[0], msg) 29 self.assertEquals(e.args[0], msg)
29 else: 30 else:
30 self.fail('%s not raised' % msg) 31 self.fail('%s not raised' % msg)
31 32
33 def setUp(self):
34 self.stdout = StringIO.StringIO()
32 35
33 class BaseTestCase(GCBaseTestCase): 36 def tearDown(self):
37 try:
38 self.stdout.getvalue()
39 self.fail()
40 except AttributeError:
41 pass
42
43 def checkstdout(self, expected):
44 value = self.stdout.getvalue()
45 self.stdout.close()
46 self.assertEquals(expected, value)
47
48
49 class BaseTestCase(GCBaseTestCase, SuperMoxTestBase):
34 def setUp(self): 50 def setUp(self):
35 GCBaseTestCase.setUp(self) 51 GCBaseTestCase.setUp(self)
52 SuperMoxTestBase.setUp(self)
53 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall')
36 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter') 54 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter')
37 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 55 self.mox.StubOutWithMock(gclient_scm.gclient_utils,
38 'CheckCallAndFilterAndHeader') 56 'CheckCallAndFilterAndHeader')
39 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead') 57 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
40 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite') 58 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
59 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen')
41 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory') 60 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
42 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo 61 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
43 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture') 62 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
44 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo') 63 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
45 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus') 64 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
46 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList') 65 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
47 self._scm_wrapper = gclient_scm.CreateSCM 66 self._scm_wrapper = gclient_scm.CreateSCM
48 gclient_scm.sys.stdout.flush = lambda: None 67 gclient_scm.sys.stdout.flush = lambda: None
49 gclient_scm.scm.SVN.current_version = None 68 gclient_scm.scm.SVN.current_version = None
50 self.stdout = StringIO.StringIO()
51 69
52 def tearDown(self): 70 def tearDown(self):
53 GCBaseTestCase.tearDown(self) 71 GCBaseTestCase.tearDown(self)
54 try: 72 SuperMoxTestBase.tearDown(self)
55 self.stdout.getvalue()
56 self.fail()
57 except AttributeError:
58 pass
59
60 def checkstdout(self, expected):
61 value = self.stdout.getvalue()
62 self.stdout.close()
63 self.assertEquals(expected, value)
64 73
65 74
66 class SVNWrapperTestCase(BaseTestCase): 75 class SVNWrapperTestCase(BaseTestCase):
67 class OptionsObject(object): 76 class OptionsObject(object):
68 def __init__(self, test_case, verbose=False, revision=None): 77 def __init__(self, test_case, verbose=False, revision=None):
69 self.verbose = verbose 78 self.verbose = verbose
70 self.revision = revision 79 self.revision = revision
71 self.manually_grab_svn_rev = True 80 self.manually_grab_svn_rev = True
72 self.deps_os = None 81 self.deps_os = None
73 self.force = False 82 self.force = False
74 self.reset = False 83 self.reset = False
75 self.nohooks = False 84 self.nohooks = False
76 self.stdout = test_case.stdout 85 self.stdout = test_case.stdout
77 86
78 def Options(self, *args, **kwargs): 87 def Options(self, *args, **kwargs):
79 return self.OptionsObject(self, *args, **kwargs) 88 return self.OptionsObject(self, *args, **kwargs)
80 89
81 def setUp(self): 90 def setUp(self):
82 BaseTestCase.setUp(self) 91 BaseTestCase.setUp(self)
83 self.root_dir = self.Dir() 92 self.url = self.SvnUrl()
84 self.args = self.Args()
85 self.url = self.Url()
86 self.relpath = 'asf'
87 93
88 def testDir(self): 94 def testDir(self):
89 members = [ 95 members = [
90 'FullUrlForRelativeUrl', 'RunCommand', 96 'FullUrlForRelativeUrl', 'RunCommand',
91 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert', 97 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
92 'revinfo', 'runhooks', 'status', 'update', 98 'revinfo', 'runhooks', 'status', 'update',
93 'updatesingle', 'url', 99 'updatesingle', 'url',
94 ] 100 ]
95 101
96 # If you add a member, be sure to add the relevant test! 102 # If you add a member, be sure to add the relevant test!
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 496
491 self.mox.ReplayAll() 497 self.mox.ReplayAll()
492 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, 498 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
493 relpath=self.relpath) 499 relpath=self.relpath)
494 file_list = [] 500 file_list = []
495 scm.update(options, self.args, file_list) 501 scm.update(options, self.args, file_list)
496 self.checkstdout( 502 self.checkstdout(
497 ('________ found .git directory; skipping %s\n' % self.relpath)) 503 ('________ found .git directory; skipping %s\n' % self.relpath))
498 504
499 505
500 class GitWrapperTestCase(BaseTestCase): 506 class GitWrapperTestCase(GCBaseTestCase, TestCaseUtils, unittest.TestCase):
501 """This class doesn't use pymox.""" 507 """This class doesn't use pymox."""
502 class OptionsObject(object): 508 class OptionsObject(object):
503 def __init__(self, test_case, verbose=False, revision=None): 509 def __init__(self, test_case, verbose=False, revision=None):
504 self.verbose = verbose 510 self.verbose = verbose
505 self.revision = revision 511 self.revision = revision
506 self.manually_grab_svn_rev = True 512 self.manually_grab_svn_rev = True
507 self.deps_os = None 513 self.deps_os = None
508 self.force = False 514 self.force = False
509 self.reset = False 515 self.reset = False
510 self.nohooks = False 516 self.nohooks = False
511 self.stdout = StringIO.StringIO() 517 self.stdout = test_case.stdout
512 518
513 sample_git_import = """blob 519 sample_git_import = """blob
514 mark :1 520 mark :1
515 data 6 521 data 6
516 Hello 522 Hello
517 523
518 blob 524 blob
519 mark :2 525 mark :2
520 data 4 526 data 4
521 Bye 527 Bye
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 560
555 reset refs/heads/master 561 reset refs/heads/master
556 from :3 562 from :3
557 """ 563 """
558 def Options(self, *args, **kwargs): 564 def Options(self, *args, **kwargs):
559 return self.OptionsObject(self, *args, **kwargs) 565 return self.OptionsObject(self, *args, **kwargs)
560 566
561 def CreateGitRepo(self, git_import, path): 567 def CreateGitRepo(self, git_import, path):
562 """Do it for real.""" 568 """Do it for real."""
563 try: 569 try:
564 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT, 570 Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT,
565 cwd=path).communicate() 571 cwd=path).communicate()
566 except OSError: 572 except OSError:
567 # git is not available, skip this test. 573 # git is not available, skip this test.
568 return False 574 return False
569 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT, 575 Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE,
570 cwd=path).communicate(input=git_import) 576 stderr=STDOUT, cwd=path).communicate(input=git_import)
571 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT, 577 Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT,
572 cwd=path).communicate() 578 cwd=path).communicate()
573 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE, 579 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
574 stderr=STDOUT, cwd=path).communicate() 580 stderr=STDOUT, cwd=path).communicate()
575 Popen(['git', 'checkout', '-b', 'new', 'origin/master'], stdout=PIPE, 581 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE,
576 stderr=STDOUT, cwd=path).communicate() 582 stderr=STDOUT, cwd=path).communicate()
577 Popen(['git', 'push', 'origin', 'origin/origin:origin/master'], stdout=PIPE, 583 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'],
578 stderr=STDOUT, cwd=path).communicate() 584 stdout=PIPE, stderr=STDOUT, cwd=path).communicate()
579 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE, 585 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
580 stderr=STDOUT, cwd=path).communicate() 586 stderr=STDOUT, cwd=path).communicate()
581 return True 587 return True
582 588
583 def setUp(self): 589 def setUp(self):
584 self.args = self.Args() 590 GCBaseTestCase.setUp(self)
591 TestCaseUtils.setUp(self)
592 unittest.TestCase.setUp(self)
585 self.url = 'git://foo' 593 self.url = 'git://foo'
586 self.root_dir = tempfile.mkdtemp() 594 self.root_dir = tempfile.mkdtemp()
587 self.relpath = '.' 595 self.relpath = '.'
588 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) 596 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
589 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path) 597 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
590 BaseTestBase.setUp(self)
591 598
592 def tearDown(self): 599 def tearDown(self):
593 BaseTestBase.tearDown(self) 600 GCBaseTestCase.tearDown(self)
601 TestCaseUtils.tearDown(self)
602 unittest.TestCase.tearDown(self)
594 rmtree(self.root_dir) 603 rmtree(self.root_dir)
595 604
596 def testDir(self): 605 def testDir(self):
597 members = [ 606 members = [
598 'FullUrlForRelativeUrl', 'RunCommand', 607 'FullUrlForRelativeUrl', 'RunCommand',
599 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert', 608 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
600 'revinfo', 'runhooks', 'status', 'update', 'url', 609 'revinfo', 'runhooks', 'status', 'update', 'url',
601 ] 610 ]
602 611
603 # If you add a member, be sure to add the relevant test! 612 # If you add a member, be sure to add the relevant test!
604 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members) 613 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
614 self.checkstdout('')
605 615
606 def testRevertMissing(self): 616 def testRevertMissing(self):
607 if not self.enabled: 617 if not self.enabled:
608 return 618 return
609 options = self.Options() 619 options = self.Options()
610 file_path = gclient_scm.os.path.join(self.base_path, 'a') 620 file_path = gclient_scm.os.path.join(self.base_path, 'a')
611 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 621 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
612 relpath=self.relpath) 622 relpath=self.relpath)
613 file_list = [] 623 file_list = []
614 scm.update(options, None, file_list) 624 scm.update(options, None, file_list)
615 gclient_scm.os.remove(file_path) 625 gclient_scm.os.remove(file_path)
616 file_list = [] 626 file_list = []
617 scm.revert(options, self.args, file_list) 627 scm.revert(options, self.args, file_list)
618 self.assertEquals(file_list, [file_path]) 628 self.assertEquals(file_list, [file_path])
619 file_list = [] 629 file_list = []
620 scm.diff(options, self.args, file_list) 630 scm.diff(options, self.args, file_list)
621 self.assertEquals(file_list, []) 631 self.assertEquals(file_list, [])
632 self.checkstdout(
633 ('\n_____ . at refs/heads/master\n\n\n'
634 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
635 'HEAD is now at a7142dc Personalized\n') %
636 gclient_scm.os.path.join(self.root_dir, '.'))
622 637
623 def testRevertNone(self): 638 def testRevertNone(self):
624 if not self.enabled: 639 if not self.enabled:
625 return 640 return
626 options = self.Options() 641 options = self.Options()
627 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 642 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
628 relpath=self.relpath) 643 relpath=self.relpath)
629 file_list = [] 644 file_list = []
630 scm.update(options, None, file_list) 645 scm.update(options, None, file_list)
631 file_list = [] 646 file_list = []
632 scm.revert(options, self.args, file_list) 647 scm.revert(options, self.args, file_list)
633 self.assertEquals(file_list, []) 648 self.assertEquals(file_list, [])
634 self.assertEquals(scm.revinfo(options, self.args, None), 649 self.assertEquals(scm.revinfo(options, self.args, None),
635 'a7142dc9f0009350b96a11f372b6ea658592aa95') 650 'a7142dc9f0009350b96a11f372b6ea658592aa95')
636 651 self.checkstdout(
652 ('\n_____ . at refs/heads/master\n\n\n'
653 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
654 'HEAD is now at a7142dc Personalized\n') %
655 gclient_scm.os.path.join(self.root_dir, '.'))
637 656
638 def testRevertModified(self): 657 def testRevertModified(self):
639 if not self.enabled: 658 if not self.enabled:
640 return 659 return
641 options = self.Options() 660 options = self.Options()
642 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 661 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
643 relpath=self.relpath) 662 relpath=self.relpath)
644 file_list = [] 663 file_list = []
645 scm.update(options, None, file_list) 664 scm.update(options, None, file_list)
646 file_path = gclient_scm.os.path.join(self.base_path, 'a') 665 file_path = gclient_scm.os.path.join(self.base_path, 'a')
647 open(file_path, 'a').writelines('touched\n') 666 open(file_path, 'a').writelines('touched\n')
648 file_list = [] 667 file_list = []
649 scm.revert(options, self.args, file_list) 668 scm.revert(options, self.args, file_list)
650 self.assertEquals(file_list, [file_path]) 669 self.assertEquals(file_list, [file_path])
651 file_list = [] 670 file_list = []
652 scm.diff(options, self.args, file_list) 671 scm.diff(options, self.args, file_list)
653 self.assertEquals(file_list, []) 672 self.assertEquals(file_list, [])
654 self.assertEquals(scm.revinfo(options, self.args, None), 673 self.assertEquals(scm.revinfo(options, self.args, None),
655 'a7142dc9f0009350b96a11f372b6ea658592aa95') 674 'a7142dc9f0009350b96a11f372b6ea658592aa95')
675 self.checkstdout(
676 ('\n_____ . at refs/heads/master\n\n\n'
677 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
678 'HEAD is now at a7142dc Personalized\n') %
679 gclient_scm.os.path.join(self.root_dir, '.'))
656 680
657 def testRevertNew(self): 681 def testRevertNew(self):
658 if not self.enabled: 682 if not self.enabled:
659 return 683 return
660 options = self.Options() 684 options = self.Options()
661 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 685 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
662 relpath=self.relpath) 686 relpath=self.relpath)
663 file_list = [] 687 file_list = []
664 scm.update(options, None, file_list) 688 scm.update(options, None, file_list)
665 file_path = gclient_scm.os.path.join(self.base_path, 'c') 689 file_path = gclient_scm.os.path.join(self.base_path, 'c')
666 f = open(file_path, 'w') 690 f = open(file_path, 'w')
667 f.writelines('new\n') 691 f.writelines('new\n')
668 f.close() 692 f.close()
669 Popen(['git', 'add', 'c'], stdout=PIPE, 693 Popen(['git', 'add', 'c'], stdout=PIPE,
670 stderr=STDOUT, cwd=self.base_path).communicate() 694 stderr=STDOUT, cwd=self.base_path).communicate()
671 file_list = [] 695 file_list = []
672 scm.revert(options, self.args, file_list) 696 scm.revert(options, self.args, file_list)
673 self.assertEquals(file_list, [file_path]) 697 self.assertEquals(file_list, [file_path])
674 file_list = [] 698 file_list = []
675 scm.diff(options, self.args, file_list) 699 scm.diff(options, self.args, file_list)
676 self.assertEquals(file_list, []) 700 self.assertEquals(file_list, [])
677 self.assertEquals(scm.revinfo(options, self.args, None), 701 self.assertEquals(scm.revinfo(options, self.args, None),
678 'a7142dc9f0009350b96a11f372b6ea658592aa95') 702 'a7142dc9f0009350b96a11f372b6ea658592aa95')
703 self.checkstdout(
704 ('\n_____ . at refs/heads/master\n\n\n'
705 '________ running \'git reset --hard origin/master\' in \'%s\'\n'
706 'HEAD is now at a7142dc Personalized\n') %
707 gclient_scm.os.path.join(self.root_dir, '.'))
679 708
680 def testStatusNew(self): 709 def testStatusNew(self):
681 if not self.enabled: 710 if not self.enabled:
682 return 711 return
683 options = self.Options() 712 options = self.Options()
684 file_path = gclient_scm.os.path.join(self.base_path, 'a') 713 file_path = gclient_scm.os.path.join(self.base_path, 'a')
685 open(file_path, 'a').writelines('touched\n') 714 open(file_path, 'a').writelines('touched\n')
686 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 715 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
687 relpath=self.relpath) 716 relpath=self.relpath)
688 file_list = [] 717 file_list = []
689 scm.status(options, self.args, file_list) 718 scm.status(options, self.args, file_list)
690 self.assertEquals(file_list, [file_path]) 719 self.assertEquals(file_list, [file_path])
720 self.checkstdout(
721 ('\n________ running \'git diff --name-status '
722 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') %
723 gclient_scm.os.path.join(self.root_dir, '.'))
691 724
692 def testStatus2New(self): 725 def testStatus2New(self):
693 if not self.enabled: 726 if not self.enabled:
694 return 727 return
695 options = self.Options() 728 options = self.Options()
696 expected_file_list = [] 729 expected_file_list = []
697 for f in ['a', 'b']: 730 for f in ['a', 'b']:
698 file_path = gclient_scm.os.path.join(self.base_path, f) 731 file_path = gclient_scm.os.path.join(self.base_path, f)
699 open(file_path, 'a').writelines('touched\n') 732 open(file_path, 'a').writelines('touched\n')
700 expected_file_list.extend([file_path]) 733 expected_file_list.extend([file_path])
701 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 734 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
702 relpath=self.relpath) 735 relpath=self.relpath)
703 file_list = [] 736 file_list = []
704 scm.status(options, self.args, file_list) 737 scm.status(options, self.args, file_list)
705 expected_file_list = [gclient_scm.os.path.join(self.base_path, x) 738 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
706 for x in ['a', 'b']] 739 for x in ['a', 'b']]
707 self.assertEquals(sorted(file_list), expected_file_list) 740 self.assertEquals(sorted(file_list), expected_file_list)
741 self.checkstdout(
742 ('\n________ running \'git diff --name-status '
743 '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') %
744 gclient_scm.os.path.join(self.root_dir, '.'))
708 745
709 def testUpdateCheckout(self): 746 def testUpdateCheckout(self):
710 if not self.enabled: 747 if not self.enabled:
711 return 748 return
712 options = self.Options(verbose=True) 749 options = self.Options(verbose=True)
713 root_dir = tempfile.mkdtemp() 750 root_dir = tempfile.mkdtemp()
714 relpath = 'foo' 751 relpath = 'foo'
715 base_path = gclient_scm.os.path.join(root_dir, relpath) 752 base_path = gclient_scm.os.path.join(root_dir, relpath)
716 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git') 753 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
717 try: 754 try:
718 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir, 755 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
719 relpath=relpath) 756 relpath=relpath)
720 file_list = [] 757 file_list = []
721 scm.update(options, (), file_list) 758 scm.update(options, (), file_list)
722 self.assertEquals(len(file_list), 2) 759 self.assertEquals(len(file_list), 2)
723 self.assert_(gclient_scm.os.path.isfile( 760 self.assert_(gclient_scm.os.path.isfile(
724 gclient_scm.os.path.join(base_path, 'a'))) 761 gclient_scm.os.path.join(base_path, 'a')))
725 self.assertEquals(scm.revinfo(options, (), None), 762 self.assertEquals(scm.revinfo(options, (), None),
726 '069c602044c5388d2d15c3f875b057c852003458') 763 '069c602044c5388d2d15c3f875b057c852003458')
727 finally: 764 finally:
728 rmtree(root_dir) 765 rmtree(root_dir)
766 join = gclient_scm.os.path.join
767 self.checkstdout(
768 ('\n_____ foo at refs/heads/master\n\n'
769 '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n'
770 'Initialized empty Git repository in %s\n') %
771 (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir,
772 join(root_dir, 'foo', '.git') + '/'))
729 773
730 def testUpdateUpdate(self): 774 def testUpdateUpdate(self):
731 if not self.enabled: 775 if not self.enabled:
732 return 776 return
733 options = self.Options() 777 options = self.Options()
734 expected_file_list = [gclient_scm.os.path.join(self.base_path, x) 778 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
735 for x in ['a', 'b']] 779 for x in ['a', 'b']]
736 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 780 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
737 relpath=self.relpath) 781 relpath=self.relpath)
738 file_list = [] 782 file_list = []
739 scm.update(options, (), file_list) 783 scm.update(options, (), file_list)
740 self.assertEquals(file_list, expected_file_list) 784 self.assertEquals(file_list, expected_file_list)
741 self.assertEquals(scm.revinfo(options, (), None), 785 self.assertEquals(scm.revinfo(options, (), None),
742 'a7142dc9f0009350b96a11f372b6ea658592aa95') 786 'a7142dc9f0009350b96a11f372b6ea658592aa95')
787 self.checkstdout('\n_____ . at refs/heads/master\n\n')
743 788
744 def testUpdateUnstagedConflict(self): 789 def testUpdateUnstagedConflict(self):
745 if not self.enabled: 790 if not self.enabled:
746 return 791 return
747 options = self.Options() 792 options = self.Options()
748 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 793 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
749 relpath=self.relpath) 794 relpath=self.relpath)
750 file_path = gclient_scm.os.path.join(self.base_path, 'b') 795 file_path = gclient_scm.os.path.join(self.base_path, 'b')
751 f = open(file_path, 'w').writelines('conflict\n') 796 f = open(file_path, 'w').writelines('conflict\n')
752 exception = ( 797 exception = (
753 "error: Your local changes to 'b' would be overwritten by merge. " 798 "error: Your local changes to 'b' would be overwritten by merge. "
754 "Aborting.\n" 799 "Aborting.\n"
755 "Please, commit your changes or stash them before you can merge.\n") 800 "Please, commit your changes or stash them before you can merge.\n")
756 self.assertRaisesError(exception, scm.update, options, (), []) 801 self.assertRaisesError(exception, scm.update, options, (), [])
802 self.checkstdout('\n_____ . at refs/heads/master\n')
757 803
758 def testUpdateConflict(self): 804 def testUpdateConflict(self):
759 if not self.enabled: 805 if not self.enabled:
760 return 806 return
761 options = self.Options() 807 options = self.Options()
762 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 808 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
763 relpath=self.relpath) 809 relpath=self.relpath)
764 file_path = gclient_scm.os.path.join(self.base_path, 'b') 810 file_path = gclient_scm.os.path.join(self.base_path, 'b')
765 f = open(file_path, 'w').writelines('conflict\n') 811 f = open(file_path, 'w').writelines('conflict\n')
766 scm._Run(['commit', '-am', 'test']) 812 scm._Run(['commit', '-am', 'test'], options)
767 self.mox.StubOutWithMock(__builtin__, 'raw_input') 813 __builtin__.raw_input = lambda x: 'y'
768 __builtin__.raw_input.__call__(mox.StrContains('Cannot fast-forward merge, ' 814 exception = ('Conflict while rebasing this branch.\n'
769 'attempt to rebase? (y)es / ' 815 'Fix the conflict and run gclient again.\n'
770 '(q)uit / (s)kip : ') 816 'See \'man git-rebase\' for details.\n')
771 ).AndReturn('y')
772 self.mox.ReplayAll()
773 exception = \
774 'Conflict while rebasing this branch.\n' \
775 'Fix the conflict and run gclient again.\n' \
776 "See 'man git-rebase' for details.\n"
777 self.assertRaisesError(exception, scm.update, options, (), []) 817 self.assertRaisesError(exception, scm.update, options, (), [])
778 exception = \ 818 exception = ('\n____ . at refs/heads/master\n'
779 '\n____ . at refs/heads/master\n' \ 819 '\tYou have unstaged changes.\n'
780 '\tYou have unstaged changes.\n' \ 820 '\tPlease commit, stash, or reset.\n')
781 '\tPlease commit, stash, or reset.\n'
782 self.assertRaisesError(exception, scm.update, options, (), []) 821 self.assertRaisesError(exception, scm.update, options, (), [])
822 # The hash always changes. Use a cheap trick.
823 start = ('\n________ running \'git commit -am test\' in \'%s\'\n'
824 '[new ') % gclient_scm.os.path.join(self.root_dir, '.')
825 end = ('] test\n 1 files changed, 1 insertions(+), '
826 '1 deletions(-)\n\n_____ . at refs/heads/master\n'
827 'Attempting rebase onto refs/remotes/origin/master...\n')
828 self.assertTrue(self.stdout.getvalue().startswith(start))
829 self.assertTrue(self.stdout.getvalue().endswith(end))
830 self.assertEquals(len(self.stdout.getvalue()), len(start) + len(end) + 7)
831 self.stdout.close()
783 832
784 def testUpdateNotGit(self): 833 def testUpdateNotGit(self):
785 if not self.enabled: 834 if not self.enabled:
786 return 835 return
787 options = self.Options() 836 options = self.Options()
788 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 837 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
789 relpath=self.relpath) 838 relpath=self.relpath)
790 git_path = gclient_scm.os.path.join(self.base_path, '.git') 839 git_path = gclient_scm.os.path.join(self.base_path, '.git')
791 rename(git_path, git_path + 'foo') 840 rename(git_path, git_path + 'foo')
792 exception = \ 841 exception = ('\n____ . at refs/heads/master\n'
793 '\n____ . at refs/heads/master\n' \ 842 '\tPath is not a git repo. No .git dir.\n'
794 '\tPath is not a git repo. No .git dir.\n' \ 843 '\tTo resolve:\n'
795 '\tTo resolve:\n' \ 844 '\t\trm -rf .\n'
796 '\t\trm -rf .\n' \ 845 '\tAnd run gclient sync again\n')
797 '\tAnd run gclient sync again\n'
798 self.assertRaisesError(exception, scm.update, options, (), []) 846 self.assertRaisesError(exception, scm.update, options, (), [])
847 self.checkstdout('')
799 848
800 def testRevinfo(self): 849 def testRevinfo(self):
801 if not self.enabled: 850 if not self.enabled:
802 return 851 return
803 options = self.Options() 852 options = self.Options()
804 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, 853 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
805 relpath=self.relpath) 854 relpath=self.relpath)
806 rev_info = scm.revinfo(options, (), None) 855 rev_info = scm.revinfo(options, (), None)
807 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458') 856 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
857 self.checkstdout('')
808 858
809 859
810 if __name__ == '__main__': 860 if __name__ == '__main__':
811 import unittest
812 unittest.main() 861 unittest.main()
813 862
814 # vim: ts=2:sw=2:tw=80:et: 863 # vim: ts=2:sw=2:tw=80:et:
OLDNEW
« no previous file with comments | « no previous file | tests/scm_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698