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 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 unittest |
15 import __builtin__ | 15 import __builtin__ |
16 | 16 |
17 # Fixes include path. | 17 # Fixes include path. |
18 from super_mox import mox, TestCaseUtils, SuperMoxTestBase | 18 from super_mox import mox, StdoutCheck, TestCaseUtils, SuperMoxTestBase |
19 | 19 |
20 import gclient_scm | 20 import gclient_scm |
21 | 21 |
22 | 22 |
23 class GCBaseTestCase(object): | 23 class GCBaseTestCase(object): |
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 """Like unittest's assertRaises() but checks for Gclient.Error.""" |
26 try: | 26 try: |
27 fn(*args, **kwargs) | 27 fn(*args, **kwargs) |
28 except gclient_scm.gclient_utils.Error, e: | 28 except gclient_scm.gclient_utils.Error, e: |
29 self.assertEquals(e.args[0], msg) | 29 self.assertEquals(e.args[0], msg) |
30 else: | 30 else: |
31 self.fail('%s not raised' % msg) | 31 self.fail('%s not raised' % msg) |
32 | 32 |
33 def setUp(self): | |
34 self.stdout = StringIO.StringIO() | |
35 | |
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 | 33 |
49 class BaseTestCase(GCBaseTestCase, SuperMoxTestBase): | 34 class BaseTestCase(GCBaseTestCase, SuperMoxTestBase): |
50 def setUp(self): | 35 def setUp(self): |
51 GCBaseTestCase.setUp(self) | |
52 SuperMoxTestBase.setUp(self) | 36 SuperMoxTestBase.setUp(self) |
53 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall') | 37 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall') |
54 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter') | 38 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter') |
55 self.mox.StubOutWithMock(gclient_scm.gclient_utils, | 39 self.mox.StubOutWithMock(gclient_scm.gclient_utils, |
56 'CheckCallAndFilterAndHeader') | 40 'CheckCallAndFilterAndHeader') |
57 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead') | 41 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead') |
58 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite') | 42 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite') |
59 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen') | 43 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen') |
60 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory') | 44 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory') |
61 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo | 45 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo |
62 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture') | 46 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture') |
63 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo') | 47 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo') |
64 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus') | 48 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus') |
65 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList') | 49 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList') |
66 self._scm_wrapper = gclient_scm.CreateSCM | 50 self._scm_wrapper = gclient_scm.CreateSCM |
67 gclient_scm.sys.stdout.flush = lambda: None | |
68 gclient_scm.scm.SVN.current_version = None | 51 gclient_scm.scm.SVN.current_version = None |
69 | 52 |
70 def tearDown(self): | 53 def tearDown(self): |
71 GCBaseTestCase.tearDown(self) | |
72 SuperMoxTestBase.tearDown(self) | 54 SuperMoxTestBase.tearDown(self) |
73 | 55 |
74 | 56 |
75 class SVNWrapperTestCase(BaseTestCase): | 57 class SVNWrapperTestCase(BaseTestCase): |
76 class OptionsObject(object): | 58 class OptionsObject(object): |
77 def __init__(self, test_case, verbose=False, revision=None): | 59 def __init__(self, test_case, verbose=False, revision=None): |
78 self.verbose = verbose | 60 self.verbose = verbose |
79 self.revision = revision | 61 self.revision = revision |
80 self.manually_grab_svn_rev = True | 62 self.manually_grab_svn_rev = True |
81 self.deps_os = None | 63 self.deps_os = None |
82 self.force = False | 64 self.force = False |
83 self.reset = False | 65 self.reset = False |
84 self.nohooks = False | 66 self.nohooks = False |
85 self.stdout = test_case.stdout | 67 self.stdout = gclient_scm.sys.stdout |
86 | 68 |
87 def Options(self, *args, **kwargs): | 69 def Options(self, *args, **kwargs): |
88 return self.OptionsObject(self, *args, **kwargs) | 70 return self.OptionsObject(self, *args, **kwargs) |
89 | 71 |
90 def setUp(self): | 72 def setUp(self): |
91 BaseTestCase.setUp(self) | 73 BaseTestCase.setUp(self) |
92 self.url = self.SvnUrl() | 74 self.url = self.SvnUrl() |
93 | 75 |
94 def testDir(self): | 76 def testDir(self): |
95 members = [ | 77 members = [ |
96 'FullUrlForRelativeUrl', 'RunCommand', | 78 'FullUrlForRelativeUrl', 'RunCommand', |
97 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert', | 79 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert', |
98 'revinfo', 'runhooks', 'status', 'update', | 80 'revinfo', 'runhooks', 'status', 'update', |
99 'updatesingle', 'url', | 81 'updatesingle', 'url', |
100 ] | 82 ] |
101 | 83 |
102 # If you add a member, be sure to add the relevant test! | 84 # If you add a member, be sure to add the relevant test! |
103 self.compareMembers(self._scm_wrapper('svn://a'), members) | 85 self.compareMembers(self._scm_wrapper('svn://a'), members) |
104 self.checkstdout('') | |
105 | 86 |
106 def testUnsupportedSCM(self): | 87 def testUnsupportedSCM(self): |
107 args = ['gopher://foo', self.root_dir, self.relpath] | 88 args = ['gopher://foo', self.root_dir, self.relpath] |
108 exception_msg = 'No SCM found for url gopher://foo' | 89 exception_msg = 'No SCM found for url gopher://foo' |
109 self.assertRaisesError(exception_msg, self._scm_wrapper, *args) | 90 self.assertRaisesError(exception_msg, self._scm_wrapper, *args) |
110 self.checkstdout('') | |
111 | 91 |
112 def testSVNFullUrlForRelativeUrl(self): | 92 def testSVNFullUrlForRelativeUrl(self): |
113 self.url = 'svn://a/b/c/d' | 93 self.url = 'svn://a/b/c/d' |
114 | 94 |
115 self.mox.ReplayAll() | 95 self.mox.ReplayAll() |
116 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 96 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
117 relpath=self.relpath) | 97 relpath=self.relpath) |
118 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap') | 98 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap') |
119 self.checkstdout('') | |
120 | 99 |
121 def testGITFullUrlForRelativeUrl(self): | 100 def testGITFullUrlForRelativeUrl(self): |
122 self.url = 'git://a/b/c/d' | 101 self.url = 'git://a/b/c/d' |
123 | 102 |
124 self.mox.ReplayAll() | 103 self.mox.ReplayAll() |
125 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 104 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
126 relpath=self.relpath) | 105 relpath=self.relpath) |
127 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap') | 106 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap') |
128 self.checkstdout('') | |
129 | 107 |
130 def testRunCommandException(self): | 108 def testRunCommandException(self): |
131 options = self.Options(verbose=False) | 109 options = self.Options(verbose=False) |
132 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git') | 110 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git') |
133 gclient_scm.os.path.exists(file_path).AndReturn(False) | 111 gclient_scm.os.path.exists(file_path).AndReturn(False) |
134 | 112 |
135 self.mox.ReplayAll() | 113 self.mox.ReplayAll() |
136 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 114 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
137 relpath=self.relpath) | 115 relpath=self.relpath) |
138 exception = "Unsupported argument(s): %s" % ','.join(self.args) | 116 exception = "Unsupported argument(s): %s" % ','.join(self.args) |
139 self.assertRaisesError(exception, scm.RunCommand, | 117 self.assertRaisesError(exception, scm.RunCommand, |
140 'update', options, self.args) | 118 'update', options, self.args) |
141 self.checkstdout('') | |
142 | 119 |
143 def testRunCommandUnknown(self): | 120 def testRunCommandUnknown(self): |
144 # TODO(maruel): if ever used. | 121 # TODO(maruel): if ever used. |
145 self.checkstdout('') | 122 pass |
146 | 123 |
147 def testRevertMissing(self): | 124 def testRevertMissing(self): |
148 options = self.Options(verbose=True) | 125 options = self.Options(verbose=True) |
149 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 126 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
150 gclient_scm.os.path.isdir(base_path).AndReturn(False) | 127 gclient_scm.os.path.isdir(base_path).AndReturn(False) |
151 gclient_scm.scm.SVN.Capture(['--version'] | 128 gclient_scm.scm.SVN.Capture(['--version'] |
152 ).AndReturn('svn, version 1.5.1 (r32289)') | 129 ).AndReturn('svn, version 1.5.1 (r32289)') |
153 # It'll to a checkout instead. | 130 # It'll to a checkout instead. |
154 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') | 131 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') |
155 ).AndReturn(False) | 132 ).AndReturn(False) |
(...skipping 23 matching lines...) Expand all Loading... |
179 ['update', '--revision', 'BASE'], | 156 ['update', '--revision', 'BASE'], |
180 cwd=base_path, | 157 cwd=base_path, |
181 file_list=mox.IgnoreArg(), | 158 file_list=mox.IgnoreArg(), |
182 stdout=options.stdout) | 159 stdout=options.stdout) |
183 | 160 |
184 self.mox.ReplayAll() | 161 self.mox.ReplayAll() |
185 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 162 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
186 relpath=self.relpath) | 163 relpath=self.relpath) |
187 file_list = [] | 164 file_list = [] |
188 scm.revert(options, self.args, file_list) | 165 scm.revert(options, self.args, file_list) |
189 self.checkstdout('') | |
190 | 166 |
191 def testRevert2Files(self): | 167 def testRevert2Files(self): |
192 options = self.Options(verbose=True) | 168 options = self.Options(verbose=True) |
193 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 169 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
194 gclient_scm.os.path.isdir(base_path).AndReturn(True) | 170 gclient_scm.os.path.isdir(base_path).AndReturn(True) |
195 items = [ | 171 items = [ |
196 ('M ', 'a'), | 172 ('M ', 'a'), |
197 ('A ', 'b'), | 173 ('A ', 'b'), |
198 ] | 174 ] |
199 file_path1 = gclient_scm.os.path.join(base_path, 'a') | 175 file_path1 = gclient_scm.os.path.join(base_path, 'a') |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, | 231 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, |
256 ['status'] + self.args, | 232 ['status'] + self.args, |
257 cwd=base_path, file_list=[], | 233 cwd=base_path, file_list=[], |
258 stdout=options.stdout).AndReturn(None) | 234 stdout=options.stdout).AndReturn(None) |
259 | 235 |
260 self.mox.ReplayAll() | 236 self.mox.ReplayAll() |
261 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 237 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
262 relpath=self.relpath) | 238 relpath=self.relpath) |
263 file_list = [] | 239 file_list = [] |
264 self.assertEqual(scm.status(options, self.args, file_list), None) | 240 self.assertEqual(scm.status(options, self.args, file_list), None) |
265 self.checkstdout('') | |
266 | 241 |
267 # TODO(maruel): TEST REVISIONS!!! | 242 # TODO(maruel): TEST REVISIONS!!! |
268 # TODO(maruel): TEST RELOCATE!!! | 243 # TODO(maruel): TEST RELOCATE!!! |
269 def testUpdateCheckout(self): | 244 def testUpdateCheckout(self): |
270 options = self.Options(verbose=True) | 245 options = self.Options(verbose=True) |
271 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 246 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
272 file_info = gclient_scm.gclient_utils.PrintableObject() | 247 file_info = gclient_scm.gclient_utils.PrintableObject() |
273 file_info.root = 'blah' | 248 file_info.root = 'blah' |
274 file_info.url = self.url | 249 file_info.url = self.url |
275 file_info.uuid = 'ABC' | 250 file_info.uuid = 'ABC' |
276 file_info.revision = 42 | 251 file_info.revision = 42 |
277 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') | 252 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') |
278 ).AndReturn(False) | 253 ).AndReturn(False) |
279 # Checkout. | 254 # Checkout. |
280 gclient_scm.os.path.exists(base_path).AndReturn(False) | 255 gclient_scm.os.path.exists(base_path).AndReturn(False) |
281 files_list = self.mox.CreateMockAnything() | 256 files_list = self.mox.CreateMockAnything() |
282 gclient_scm.scm.SVN.Capture(['--version'] | 257 gclient_scm.scm.SVN.Capture(['--version'] |
283 ).AndReturn('svn, version 1.5.1 (r32289)') | 258 ).AndReturn('svn, version 1.5.1 (r32289)') |
284 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, | 259 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, |
285 ['checkout', self.url, base_path, | 260 ['checkout', self.url, base_path, |
286 '--force'], | 261 '--force'], |
287 cwd=self.root_dir, | 262 cwd=self.root_dir, |
288 file_list=files_list, | 263 file_list=files_list, |
289 stdout=options.stdout) | 264 stdout=options.stdout) |
290 self.mox.ReplayAll() | 265 self.mox.ReplayAll() |
291 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 266 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
292 relpath=self.relpath) | 267 relpath=self.relpath) |
293 scm.update(options, (), files_list) | 268 scm.update(options, (), files_list) |
294 self.checkstdout('') | |
295 | 269 |
296 def testUpdateUpdate(self): | 270 def testUpdateUpdate(self): |
297 options = self.Options(verbose=True) | 271 options = self.Options(verbose=True) |
298 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 272 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
299 options.force = True | 273 options.force = True |
300 options.nohooks = False | 274 options.nohooks = False |
301 file_info = { | 275 file_info = { |
302 'Repository Root': 'blah', | 276 'Repository Root': 'blah', |
303 'URL': self.url, | 277 'URL': self.url, |
304 'UUID': 'ABC', | 278 'UUID': 'ABC', |
(...skipping 21 matching lines...) Expand all Loading... |
326 files_list = [] | 300 files_list = [] |
327 gclient_scm.scm.SVN.RunAndGetFileList( | 301 gclient_scm.scm.SVN.RunAndGetFileList( |
328 options.verbose, | 302 options.verbose, |
329 ['update', base_path] + additional_args, | 303 ['update', base_path] + additional_args, |
330 cwd=self.root_dir, file_list=files_list, stdout=options.stdout) | 304 cwd=self.root_dir, file_list=files_list, stdout=options.stdout) |
331 | 305 |
332 self.mox.ReplayAll() | 306 self.mox.ReplayAll() |
333 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 307 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
334 relpath=self.relpath) | 308 relpath=self.relpath) |
335 scm.update(options, (), files_list) | 309 scm.update(options, (), files_list) |
336 self.checkstdout('') | |
337 | 310 |
338 def testUpdateSingleCheckout(self): | 311 def testUpdateSingleCheckout(self): |
339 options = self.Options(verbose=True) | 312 options = self.Options(verbose=True) |
340 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 313 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
341 file_info = { | 314 file_info = { |
342 'URL': self.url, | 315 'URL': self.url, |
343 'Revision': 42, | 316 'Revision': 42, |
344 } | 317 } |
345 | 318 |
346 # Checks to make sure that we support svn co --depth. | 319 # Checks to make sure that we support svn co --depth. |
(...skipping 17 matching lines...) Expand all Loading... |
364 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'], | 337 gclient_scm.scm.SVN.RunAndGetFileList(options.verbose, ['update', 'DEPS'], |
365 cwd=base_path, file_list=files_list, stdout=options.stdout) | 338 cwd=base_path, file_list=files_list, stdout=options.stdout) |
366 | 339 |
367 # Now we fall back on scm.update(). | 340 # Now we fall back on scm.update(). |
368 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') | 341 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git') |
369 ).AndReturn(False) | 342 ).AndReturn(False) |
370 gclient_scm.os.path.exists(base_path).AndReturn(True) | 343 gclient_scm.os.path.exists(base_path).AndReturn(True) |
371 gclient_scm.scm.SVN.CaptureInfo( | 344 gclient_scm.scm.SVN.CaptureInfo( |
372 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info) | 345 gclient_scm.os.path.join(base_path, ".")).AndReturn(file_info) |
373 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info) | 346 gclient_scm.scm.SVN.CaptureInfo(file_info['URL']).AndReturn(file_info) |
374 options.stdout.write("\n_____ %s at 42" % self.relpath) | |
375 options.stdout.write('\n') | |
376 | 347 |
377 self.mox.ReplayAll() | 348 self.mox.ReplayAll() |
378 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 349 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
379 relpath=self.relpath) | 350 relpath=self.relpath) |
380 scm.updatesingle(options, ['DEPS'], files_list) | 351 scm.updatesingle(options, ['DEPS'], files_list) |
381 self.checkstdout( | 352 self.checkstdout('\n_____ %s at 42\n' % self.relpath) |
382 2 * ('\n_____ %s at 42\n' % self.relpath)) | |
383 | 353 |
384 def testUpdateSingleCheckoutSVN14(self): | 354 def testUpdateSingleCheckoutSVN14(self): |
385 options = self.Options(verbose=True) | 355 options = self.Options(verbose=True) |
386 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 356 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
387 file_info = { | 357 file_info = { |
388 'URL': self.url, | 358 'URL': self.url, |
389 'Revision': 42, | 359 'Revision': 42, |
390 } | 360 } |
391 | 361 |
392 # Checks to make sure that we support svn co --depth. | 362 # Checks to make sure that we support svn co --depth. |
393 gclient_scm.scm.SVN.current_version = None | 363 gclient_scm.scm.SVN.current_version = None |
394 gclient_scm.scm.SVN.Capture(['--version'] | 364 gclient_scm.scm.SVN.Capture(['--version'] |
395 ).AndReturn('svn, version 1.4.4 (r25188)') | 365 ).AndReturn('svn, version 1.4.4 (r25188)') |
396 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path) | 366 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path) |
397 ).AndReturn(True) | 367 ).AndReturn(True) |
398 | 368 |
399 # When checking out a single file with svn 1.4, we use svn export | 369 # When checking out a single file with svn 1.4, we use svn export |
400 files_list = self.mox.CreateMockAnything() | 370 files_list = self.mox.CreateMockAnything() |
401 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader( | 371 gclient_scm.gclient_utils.CheckCallAndFilterAndHeader( |
402 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'), | 372 ['svn', 'export', gclient_scm.os.path.join(self.url, 'DEPS'), |
403 gclient_scm.os.path.join(base_path, 'DEPS')], | 373 gclient_scm.os.path.join(base_path, 'DEPS')], |
404 always=True, cwd=self.root_dir, stdout=options.stdout) | 374 always=True, cwd=self.root_dir, stdout=options.stdout) |
405 | 375 |
406 self.mox.ReplayAll() | 376 self.mox.ReplayAll() |
407 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 377 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
408 relpath=self.relpath) | 378 relpath=self.relpath) |
409 scm.updatesingle(options, ['DEPS'], files_list) | 379 scm.updatesingle(options, ['DEPS'], files_list) |
410 self.checkstdout('') | |
411 | 380 |
412 def testUpdateSingleCheckoutSVNUpgrade(self): | 381 def testUpdateSingleCheckoutSVNUpgrade(self): |
413 options = self.Options(verbose=True) | 382 options = self.Options(verbose=True) |
414 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 383 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
415 file_info = { | 384 file_info = { |
416 'URL': self.url, | 385 'URL': self.url, |
417 'Revision': 42, | 386 'Revision': 42, |
418 } | 387 } |
419 | 388 |
420 # Checks to make sure that we support svn co --depth. | 389 # Checks to make sure that we support svn co --depth. |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 | 465 |
497 self.mox.ReplayAll() | 466 self.mox.ReplayAll() |
498 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 467 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, |
499 relpath=self.relpath) | 468 relpath=self.relpath) |
500 file_list = [] | 469 file_list = [] |
501 scm.update(options, self.args, file_list) | 470 scm.update(options, self.args, file_list) |
502 self.checkstdout( | 471 self.checkstdout( |
503 ('________ found .git directory; skipping %s\n' % self.relpath)) | 472 ('________ found .git directory; skipping %s\n' % self.relpath)) |
504 | 473 |
505 | 474 |
506 class GitWrapperTestCase(GCBaseTestCase, TestCaseUtils, unittest.TestCase): | 475 class GitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils, |
| 476 unittest.TestCase): |
507 """This class doesn't use pymox.""" | 477 """This class doesn't use pymox.""" |
508 class OptionsObject(object): | 478 class OptionsObject(object): |
509 def __init__(self, test_case, verbose=False, revision=None): | 479 def __init__(self, test_case, verbose=False, revision=None): |
510 self.verbose = verbose | 480 self.verbose = verbose |
511 self.revision = revision | 481 self.revision = revision |
512 self.manually_grab_svn_rev = True | 482 self.manually_grab_svn_rev = True |
513 self.deps_os = None | 483 self.deps_os = None |
514 self.force = False | 484 self.force = False |
515 self.reset = False | 485 self.reset = False |
516 self.nohooks = False | 486 self.nohooks = False |
517 self.stdout = test_case.stdout | 487 self.stdout = gclient_scm.sys.stdout |
518 | 488 |
519 sample_git_import = """blob | 489 sample_git_import = """blob |
520 mark :1 | 490 mark :1 |
521 data 6 | 491 data 6 |
522 Hello | 492 Hello |
523 | 493 |
524 blob | 494 blob |
525 mark :2 | 495 mark :2 |
526 data 4 | 496 data 4 |
527 Bye | 497 Bye |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 stderr=STDOUT, cwd=path).communicate() | 550 stderr=STDOUT, cwd=path).communicate() |
581 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE, | 551 Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE, |
582 stderr=STDOUT, cwd=path).communicate() | 552 stderr=STDOUT, cwd=path).communicate() |
583 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'], | 553 Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'], |
584 stdout=PIPE, stderr=STDOUT, cwd=path).communicate() | 554 stdout=PIPE, stderr=STDOUT, cwd=path).communicate() |
585 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE, | 555 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE, |
586 stderr=STDOUT, cwd=path).communicate() | 556 stderr=STDOUT, cwd=path).communicate() |
587 return True | 557 return True |
588 | 558 |
589 def setUp(self): | 559 def setUp(self): |
590 GCBaseTestCase.setUp(self) | |
591 TestCaseUtils.setUp(self) | 560 TestCaseUtils.setUp(self) |
592 unittest.TestCase.setUp(self) | 561 unittest.TestCase.setUp(self) |
593 self.url = 'git://foo' | 562 self.url = 'git://foo' |
594 self.root_dir = tempfile.mkdtemp() | 563 self.root_dir = tempfile.mkdtemp() |
595 self.relpath = '.' | 564 self.relpath = '.' |
596 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) | 565 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
597 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path) | 566 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path) |
| 567 StdoutCheck.setUp(self) |
598 | 568 |
599 def tearDown(self): | 569 def tearDown(self): |
600 if not self.enabled: | 570 StdoutCheck.tearDown(self) |
601 self.checkstdout('') | |
602 GCBaseTestCase.tearDown(self) | |
603 TestCaseUtils.tearDown(self) | 571 TestCaseUtils.tearDown(self) |
604 unittest.TestCase.tearDown(self) | 572 unittest.TestCase.tearDown(self) |
605 rmtree(self.root_dir) | 573 rmtree(self.root_dir) |
606 | 574 |
607 def testDir(self): | 575 def testDir(self): |
608 members = [ | 576 members = [ |
609 'FullUrlForRelativeUrl', 'RunCommand', | 577 'FullUrlForRelativeUrl', 'RunCommand', |
610 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert', | 578 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert', |
611 'revinfo', 'runhooks', 'status', 'update', 'url', | 579 'revinfo', 'runhooks', 'status', 'update', 'url', |
612 ] | 580 ] |
613 | 581 |
614 # If you add a member, be sure to add the relevant test! | 582 # If you add a member, be sure to add the relevant test! |
615 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members) | 583 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members) |
616 if self.enabled: | |
617 self.checkstdout('') | |
618 | 584 |
619 def testRevertMissing(self): | 585 def testRevertMissing(self): |
620 if not self.enabled: | 586 if not self.enabled: |
621 return | 587 return |
622 options = self.Options() | 588 options = self.Options() |
623 file_path = gclient_scm.os.path.join(self.base_path, 'a') | 589 file_path = gclient_scm.os.path.join(self.base_path, 'a') |
624 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, | 590 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
625 relpath=self.relpath) | 591 relpath=self.relpath) |
626 file_list = [] | 592 file_list = [] |
627 scm.update(options, None, file_list) | 593 scm.update(options, None, file_list) |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 exception = ('\n____ . at refs/heads/master\n' | 798 exception = ('\n____ . at refs/heads/master\n' |
833 '\tYou have unstaged changes.\n' | 799 '\tYou have unstaged changes.\n' |
834 '\tPlease commit, stash, or reset.\n') | 800 '\tPlease commit, stash, or reset.\n') |
835 self.assertRaisesError(exception, scm.update, options, (), []) | 801 self.assertRaisesError(exception, scm.update, options, (), []) |
836 # The hash always changes. Use a cheap trick. | 802 # The hash always changes. Use a cheap trick. |
837 start = ('\n________ running \'git commit -am test\' in \'%s\'\n' | 803 start = ('\n________ running \'git commit -am test\' in \'%s\'\n' |
838 '[new ') % gclient_scm.os.path.join(self.root_dir, '.') | 804 '[new ') % gclient_scm.os.path.join(self.root_dir, '.') |
839 end = ('] test\n 1 files changed, 1 insertions(+), ' | 805 end = ('] test\n 1 files changed, 1 insertions(+), ' |
840 '1 deletions(-)\n\n_____ . at refs/heads/master\n' | 806 '1 deletions(-)\n\n_____ . at refs/heads/master\n' |
841 'Attempting rebase onto refs/remotes/origin/master...\n') | 807 'Attempting rebase onto refs/remotes/origin/master...\n') |
842 self.assertTrue(self.stdout.getvalue().startswith(start)) | 808 self.assertTrue(gclient_scm.sys.stdout.getvalue().startswith(start)) |
843 self.assertTrue(self.stdout.getvalue().endswith(end)) | 809 self.assertTrue(gclient_scm.sys.stdout.getvalue().endswith(end)) |
844 self.assertEquals(len(self.stdout.getvalue()), len(start) + len(end) + 7) | 810 self.assertEquals(len(gclient_scm.sys.stdout.getvalue()), |
845 self.stdout.close() | 811 len(start) + len(end) + 7) |
| 812 gclient_scm.sys.stdout.close() |
846 | 813 |
847 def testUpdateNotGit(self): | 814 def testUpdateNotGit(self): |
848 if not self.enabled: | 815 if not self.enabled: |
849 return | 816 return |
850 options = self.Options() | 817 options = self.Options() |
851 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, | 818 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
852 relpath=self.relpath) | 819 relpath=self.relpath) |
853 git_path = gclient_scm.os.path.join(self.base_path, '.git') | 820 git_path = gclient_scm.os.path.join(self.base_path, '.git') |
854 rename(git_path, git_path + 'foo') | 821 rename(git_path, git_path + 'foo') |
855 exception = ('\n____ . at refs/heads/master\n' | 822 exception = ('\n____ . at refs/heads/master\n' |
856 '\tPath is not a git repo. No .git dir.\n' | 823 '\tPath is not a git repo. No .git dir.\n' |
857 '\tTo resolve:\n' | 824 '\tTo resolve:\n' |
858 '\t\trm -rf .\n' | 825 '\t\trm -rf .\n' |
859 '\tAnd run gclient sync again\n') | 826 '\tAnd run gclient sync again\n') |
860 self.assertRaisesError(exception, scm.update, options, (), []) | 827 self.assertRaisesError(exception, scm.update, options, (), []) |
861 self.checkstdout('') | |
862 | 828 |
863 def testRevinfo(self): | 829 def testRevinfo(self): |
864 if not self.enabled: | 830 if not self.enabled: |
865 return | 831 return |
866 options = self.Options() | 832 options = self.Options() |
867 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, | 833 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir, |
868 relpath=self.relpath) | 834 relpath=self.relpath) |
869 rev_info = scm.revinfo(options, (), None) | 835 rev_info = scm.revinfo(options, (), None) |
870 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458') | 836 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458') |
871 self.checkstdout('') | |
872 | 837 |
873 | 838 |
874 if __name__ == '__main__': | 839 if __name__ == '__main__': |
875 unittest.main() | 840 unittest.main() |
876 | 841 |
877 # vim: ts=2:sw=2:tw=80:et: | 842 # vim: ts=2:sw=2:tw=80:et: |
OLD | NEW |