OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 # pylint: disable=E1103 | 8 # pylint: disable=E1103 |
9 | 9 |
10 # Import before super_mox to keep valid references. | 10 # Import before super_mox to keep valid references. |
11 from shutil import rmtree | 11 from shutil import rmtree |
12 from subprocess import Popen, PIPE, STDOUT | 12 from subprocess import Popen, PIPE, STDOUT |
13 | 13 |
14 import logging | 14 import logging |
15 import os | 15 import os |
16 import sys | 16 import sys |
17 import tempfile | 17 import tempfile |
18 import unittest | 18 import unittest |
19 import __builtin__ | |
20 | 19 |
21 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | 20 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
22 | 21 |
23 from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase | 22 from testing_support.super_mox import mox, StdoutCheck, SuperMoxTestBase |
24 from testing_support.super_mox import TestCaseUtils | 23 from testing_support.super_mox import TestCaseUtils |
25 | 24 |
26 import gclient_scm | 25 import gclient_scm |
27 import subprocess2 | 26 import subprocess2 |
28 | 27 |
29 # Shortcut since this function is used often | 28 # Shortcut since this function is used often |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 commit refs/heads/origin | 744 commit refs/heads/origin |
746 mark :6 | 745 mark :6 |
747 author Alice <alice@example.com> 1253744424 -0700 | 746 author Alice <alice@example.com> 1253744424 -0700 |
748 committer Alice <alice@example.com> 1253744424 -0700 | 747 committer Alice <alice@example.com> 1253744424 -0700 |
749 data 13 | 748 data 13 |
750 Personalized | 749 Personalized |
751 from :3 | 750 from :3 |
752 M 100644 :4 a | 751 M 100644 :4 a |
753 M 100644 :5 b | 752 M 100644 :5 b |
754 | 753 |
| 754 blob |
| 755 mark :7 |
| 756 data 5 |
| 757 Mooh |
| 758 |
| 759 commit refs/heads/feature |
| 760 mark :8 |
| 761 author Bob <bob@example.com> 1390311986 -0000 |
| 762 committer Bob <bob@example.com> 1390311986 -0000 |
| 763 data 6 |
| 764 Add C |
| 765 from :3 |
| 766 M 100644 :7 c |
| 767 |
755 reset refs/heads/master | 768 reset refs/heads/master |
756 from :3 | 769 from :3 |
757 """ | 770 """ |
758 def Options(self, *args, **kwargs): | 771 def Options(self, *args, **kwargs): |
759 return self.OptionsObject(*args, **kwargs) | 772 return self.OptionsObject(*args, **kwargs) |
760 | 773 |
761 @staticmethod | 774 @staticmethod |
762 def CreateGitRepo(git_import, path): | 775 def CreateGitRepo(git_import, path): |
763 """Do it for real.""" | 776 """Do it for real.""" |
764 try: | 777 try: |
(...skipping 13 matching lines...) Expand all Loading... |
778 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'], | 791 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'], |
779 stdout=PIPE, stderr=STDOUT, cwd=path).communicate() | 792 stdout=PIPE, stderr=STDOUT, cwd=path).communicate() |
780 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE, | 793 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE, |
781 stderr=STDOUT, cwd=path).communicate() | 794 stderr=STDOUT, cwd=path).communicate() |
782 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE, | 795 Popen(['git', 'config', 'user.email', 'someuser@chromium.org'], stdout=PIPE, |
783 stderr=STDOUT, cwd=path).communicate() | 796 stderr=STDOUT, cwd=path).communicate() |
784 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE, | 797 Popen(['git', 'config', 'user.name', 'Some User'], stdout=PIPE, |
785 stderr=STDOUT, cwd=path).communicate() | 798 stderr=STDOUT, cwd=path).communicate() |
786 return True | 799 return True |
787 | 800 |
| 801 def _GetAskForDataCallback(self, expected_prompt, return_value): |
| 802 def AskForData(prompt, options): |
| 803 self.assertEquals(prompt, expected_prompt) |
| 804 return return_value |
| 805 return AskForData |
| 806 |
788 def setUp(self): | 807 def setUp(self): |
789 TestCaseUtils.setUp(self) | 808 TestCaseUtils.setUp(self) |
790 unittest.TestCase.setUp(self) | 809 unittest.TestCase.setUp(self) |
791 self.url = 'git://foo' | 810 self.url = 'git://foo' |
792 self.root_dir = tempfile.mkdtemp() | 811 self.root_dir = tempfile.mkdtemp() |
793 self.relpath = '.' | 812 self.relpath = '.' |
794 self.base_path = join(self.root_dir, self.relpath) | 813 self.base_path = join(self.root_dir, self.relpath) |
795 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path) | 814 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path) |
796 StdoutCheck.setUp(self) | 815 StdoutCheck.setUp(self) |
797 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists | 816 self._original_GitBinaryExists = gclient_scm.GitWrapper.BinaryExists |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']] | 979 expected_file_list = [join(self.base_path, x) for x in ['a', 'b']] |
961 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, | 980 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
962 relpath=self.relpath) | 981 relpath=self.relpath) |
963 file_list = [] | 982 file_list = [] |
964 scm.update(options, (), file_list) | 983 scm.update(options, (), file_list) |
965 self.assertEquals(file_list, expected_file_list) | 984 self.assertEquals(file_list, expected_file_list) |
966 self.assertEquals(scm.revinfo(options, (), None), | 985 self.assertEquals(scm.revinfo(options, (), None), |
967 'a7142dc9f0009350b96a11f372b6ea658592aa95') | 986 'a7142dc9f0009350b96a11f372b6ea658592aa95') |
968 sys.stdout.close() | 987 sys.stdout.close() |
969 | 988 |
| 989 def testUpdateMerge(self): |
| 990 if not self.enabled: |
| 991 return |
| 992 options = self.Options() |
| 993 options.merge = True |
| 994 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
| 995 relpath=self.relpath) |
| 996 scm._Run(['checkout', '-q', 'feature'], options) |
| 997 rev = scm.revinfo(options, (), None) |
| 998 file_list = [] |
| 999 scm.update(options, (), file_list) |
| 1000 self.assertEquals(file_list, [join(self.base_path, x) |
| 1001 for x in ['a', 'b', 'c']]) |
| 1002 # The actual commit that is created is unstable, so we verify its tree and |
| 1003 # parents instead. |
| 1004 self.assertEquals(scm._Capture(['rev-parse', 'HEAD:']), |
| 1005 'd2e35c10ac24d6c621e14a1fcadceb533155627d') |
| 1006 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^1']), rev) |
| 1007 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^2']), |
| 1008 scm._Capture(['rev-parse', 'origin/master'])) |
| 1009 sys.stdout.close() |
| 1010 |
| 1011 def testUpdateRebase(self): |
| 1012 if not self.enabled: |
| 1013 return |
| 1014 options = self.Options() |
| 1015 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
| 1016 relpath=self.relpath) |
| 1017 scm._Run(['checkout', '-q', 'feature'], options) |
| 1018 file_list = [] |
| 1019 # Fake a 'y' key press. |
| 1020 scm._AskForData = self._GetAskForDataCallback( |
| 1021 'Cannot fast-forward merge, attempt to rebase? ' |
| 1022 '(y)es / (q)uit / (s)kip : ', 'y') |
| 1023 scm.update(options, (), file_list) |
| 1024 self.assertEquals(file_list, [join(self.base_path, x) |
| 1025 for x in ['a', 'b', 'c']]) |
| 1026 # The actual commit that is created is unstable, so we verify its tree and |
| 1027 # parent instead. |
| 1028 self.assertEquals(scm._Capture(['rev-parse', 'HEAD:']), |
| 1029 'd2e35c10ac24d6c621e14a1fcadceb533155627d') |
| 1030 self.assertEquals(scm._Capture(['rev-parse', 'HEAD^']), |
| 1031 scm._Capture(['rev-parse', 'origin/master'])) |
| 1032 sys.stdout.close() |
| 1033 |
970 def testUpdateReset(self): | 1034 def testUpdateReset(self): |
971 if not self.enabled: | 1035 if not self.enabled: |
972 return | 1036 return |
973 options = self.Options() | 1037 options = self.Options() |
974 options.reset = True | 1038 options.reset = True |
975 | 1039 |
976 dir_path = join(self.base_path, 'c') | 1040 dir_path = join(self.base_path, 'c') |
977 os.mkdir(dir_path) | 1041 os.mkdir(dir_path) |
978 open(join(dir_path, 'nested'), 'w').writelines('new\n') | 1042 open(join(dir_path, 'nested'), 'w').writelines('new\n') |
979 | 1043 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 | 1096 |
1033 def testUpdateConflict(self): | 1097 def testUpdateConflict(self): |
1034 if not self.enabled: | 1098 if not self.enabled: |
1035 return | 1099 return |
1036 options = self.Options() | 1100 options = self.Options() |
1037 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, | 1101 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
1038 relpath=self.relpath) | 1102 relpath=self.relpath) |
1039 file_path = join(self.base_path, 'b') | 1103 file_path = join(self.base_path, 'b') |
1040 open(file_path, 'w').writelines('conflict\n') | 1104 open(file_path, 'w').writelines('conflict\n') |
1041 scm._Run(['commit', '-am', 'test'], options) | 1105 scm._Run(['commit', '-am', 'test'], options) |
1042 __builtin__.raw_input = lambda x: 'y' | 1106 scm._AskForData = self._GetAskForDataCallback( |
| 1107 'Cannot fast-forward merge, attempt to rebase? ' |
| 1108 '(y)es / (q)uit / (s)kip : ', 'y') |
1043 exception = ('Conflict while rebasing this branch.\n' | 1109 exception = ('Conflict while rebasing this branch.\n' |
1044 'Fix the conflict and run gclient again.\n' | 1110 'Fix the conflict and run gclient again.\n' |
1045 'See \'man git-rebase\' for details.\n') | 1111 'See \'man git-rebase\' for details.\n') |
1046 self.assertRaisesError(exception, scm.update, options, (), []) | 1112 self.assertRaisesError(exception, scm.update, options, (), []) |
1047 exception = ('\n____ . at refs/remotes/origin/master\n' | 1113 exception = ('\n____ . at refs/remotes/origin/master\n' |
1048 '\tYou have unstaged changes.\n' | 1114 '\tYou have unstaged changes.\n' |
1049 '\tPlease commit, stash, or reset.\n') | 1115 '\tPlease commit, stash, or reset.\n') |
1050 self.assertRaisesError(exception, scm.update, options, (), []) | 1116 self.assertRaisesError(exception, scm.update, options, (), []) |
1051 sys.stdout.close() | 1117 sys.stdout.close() |
1052 | 1118 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 | 1271 |
1206 if __name__ == '__main__': | 1272 if __name__ == '__main__': |
1207 if '-v' in sys.argv: | 1273 if '-v' in sys.argv: |
1208 logging.basicConfig( | 1274 logging.basicConfig( |
1209 level=logging.DEBUG, | 1275 level=logging.DEBUG, |
1210 format='%(asctime).19s %(levelname)s %(filename)s:' | 1276 format='%(asctime).19s %(levelname)s %(filename)s:' |
1211 '%(lineno)s %(message)s') | 1277 '%(lineno)s %(message)s') |
1212 unittest.main() | 1278 unittest.main() |
1213 | 1279 |
1214 # vim: ts=2:sw=2:tw=80:et: | 1280 # vim: ts=2:sw=2:tw=80:et: |
OLD | NEW |