blob: 11033424bb86bf8425f01029f39ed7c26dea5157 [file] [log] [blame]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001#!/usr/bin/python
maruel@chromium.orgba551772010-02-03 18:21:42 +00002# 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
4# found in the LICENSE file.
msb@chromium.orge28e4982009-09-25 20:51:45 +00005
6"""Unit tests for gclient_scm.py."""
7
maruel@chromium.orgba551772010-02-03 18:21:42 +00008# Import before super_mox to keep valid references.
9from os import rename
10from shutil import rmtree
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000011from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000012import tempfile
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000013import __builtin__
msb@chromium.orge28e4982009-09-25 20:51:45 +000014
maruel@chromium.orgba551772010-02-03 18:21:42 +000015# Fixes include path.
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +000016from super_mox import mox, SuperMoxBaseTestBase, SuperMoxTestBase
maruel@chromium.orgba551772010-02-03 18:21:42 +000017
msb@chromium.orge28e4982009-09-25 20:51:45 +000018import gclient_scm
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000019from gclient_test import BaseTestCase as GCBaseTestCase
msb@chromium.orge28e4982009-09-25 20:51:45 +000020
21
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000022class BaseTestCase(GCBaseTestCase):
23 def setUp(self):
24 GCBaseTestCase.setUp(self)
25 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
26 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
27 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'SubprocessCall')
28 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000029 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
30 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
31 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
32 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
33 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Run')
34 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000035 self._scm_wrapper = gclient_scm.CreateSCM
36
37
38class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000039 class OptionsObject(object):
40 def __init__(self, test_case, verbose=False, revision=None):
41 self.verbose = verbose
42 self.revision = revision
43 self.manually_grab_svn_rev = True
44 self.deps_os = None
45 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000046 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000047 self.nohooks = False
48
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000049 def Options(self, *args, **kwargs):
50 return self.OptionsObject(self, *args, **kwargs)
51
msb@chromium.orge28e4982009-09-25 20:51:45 +000052 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000053 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000054 self.root_dir = self.Dir()
55 self.args = self.Args()
56 self.url = self.Url()
57 self.relpath = 'asf'
58
59 def testDir(self):
60 members = [
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000061 'COMMAND', 'Capture', 'CaptureHeadRevision', 'CaptureInfo',
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +000062 'CaptureStatus', 'DiffItem', 'GenerateDiff', 'GetCheckoutRoot',
msb@chromium.orge6f78352010-01-13 17:05:33 +000063 'GetEmail', 'GetFileProperty', 'FullUrlForRelativeUrl', 'IsMoved',
64 'ReadSimpleAuth', 'Run', 'RunAndFilterOutput', 'RunAndGetFileList',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000065 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
66 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000067 ]
68
69 # If you add a member, be sure to add the relevant test!
70 self.compareMembers(self._scm_wrapper(), members)
71
72 def testUnsupportedSCM(self):
73 args = [self.url, self.root_dir, self.relpath]
74 kwargs = {'scm_name' : 'foo'}
75 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
76 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
77
msb@chromium.orge6f78352010-01-13 17:05:33 +000078 def testSVNFullUrlForRelativeUrl(self):
79 self.url = 'svn://a/b/c/d'
80
81 self.mox.ReplayAll()
82 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
83 relpath=self.relpath)
84 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
85
86 def testGITFullUrlForRelativeUrl(self):
87 self.url = 'git://a/b/c/d'
88
89 self.mox.ReplayAll()
90 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
91 relpath=self.relpath)
92 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
93
msb@chromium.orge28e4982009-09-25 20:51:45 +000094 def testRunCommandException(self):
95 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000096 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
97 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +000098
99 self.mox.ReplayAll()
100 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
101 relpath=self.relpath)
102 exception = "Unsupported argument(s): %s" % ','.join(self.args)
103 self.assertRaisesError(exception, scm.RunCommand,
104 'update', options, self.args)
105
106 def testRunCommandUnknown(self):
107 # TODO(maruel): if ever used.
108 pass
109
110 def testRevertMissing(self):
111 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000112 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
113 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000114 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000115 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
116 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000117 print("\n_____ %s is missing, synching instead" % self.relpath)
118 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000119 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000120 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000121 gclient_scm.scm.SVN.RunAndGetFileList(options,
122 ['checkout', self.url, base_path],
123 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000124
125 self.mox.ReplayAll()
126 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
127 relpath=self.relpath)
128 scm.revert(options, self.args, files_list)
129
130 def testRevertNone(self):
131 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000132 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
133 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000134 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
135 gclient_scm.scm.SVN.RunAndGetFileList(options,
136 ['update', '--revision', 'BASE'],
137 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000138
139 self.mox.ReplayAll()
140 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
141 relpath=self.relpath)
142 file_list = []
143 scm.revert(options, self.args, file_list)
144
145 def testRevert2Files(self):
146 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000147 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
148 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000149 items = [
150 ('M ', 'a'),
151 ('A ', 'b'),
152 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000153 file_path1 = gclient_scm.os.path.join(base_path, 'a')
154 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000155 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000156 gclient_scm.os.path.exists(file_path1).AndReturn(True)
157 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
158 gclient_scm.os.remove(file_path1)
159 gclient_scm.os.path.exists(file_path2).AndReturn(True)
160 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
161 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000162 gclient_scm.scm.SVN.RunAndGetFileList(options,
163 ['update', '--revision', 'BASE'],
164 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000165 print(gclient_scm.os.path.join(base_path, 'a'))
166 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000167
168 self.mox.ReplayAll()
169 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
170 relpath=self.relpath)
171 file_list = []
172 scm.revert(options, self.args, file_list)
173
174 def testRevertDirectory(self):
175 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000176 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
177 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000178 items = [
179 ('~ ', 'a'),
180 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000181 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000182 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000183 print(file_path)
184 gclient_scm.os.path.exists(file_path).AndReturn(True)
185 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000186 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000187 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000188 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000189 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000190 gclient_scm.scm.SVN.RunAndGetFileList(options,
191 ['update', '--revision', 'BASE'],
192 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000193
194 self.mox.ReplayAll()
195 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
196 relpath=self.relpath)
197 file_list2 = []
198 scm.revert(options, self.args, file_list2)
199
200 def testStatus(self):
201 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000202 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
203 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000204 gclient_scm.scm.SVN.RunAndGetFileList(options,
205 ['status'] + self.args,
206 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000207
208 self.mox.ReplayAll()
209 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
210 relpath=self.relpath)
211 file_list = []
212 self.assertEqual(scm.status(options, self.args, file_list), None)
213
214
215 # TODO(maruel): TEST REVISIONS!!!
216 # TODO(maruel): TEST RELOCATE!!!
217 def testUpdateCheckout(self):
218 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000219 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
220 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000221 file_info.root = 'blah'
222 file_info.url = self.url
223 file_info.uuid = 'ABC'
224 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000225 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
226 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000227 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000228 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000229 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000230 gclient_scm.scm.SVN.RunAndGetFileList(options,
231 ['checkout', self.url, base_path],
232 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000233 self.mox.ReplayAll()
234 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
235 relpath=self.relpath)
236 scm.update(options, (), files_list)
237
238 def testUpdateUpdate(self):
239 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000240 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000241 options.force = True
242 options.nohooks = False
243 file_info = {
244 'Repository Root': 'blah',
245 'URL': self.url,
246 'UUID': 'ABC',
247 'Revision': 42,
248 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000249 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
250 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000251 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000252 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000253 gclient_scm.scm.SVN.CaptureInfo(
254 gclient_scm.os.path.join(base_path, "."), '.'
255 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000256 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000257 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000258 additional_args = []
259 if options.manually_grab_svn_rev:
260 additional_args = ['--revision', str(file_info['Revision'])]
261 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000262 gclient_scm.scm.SVN.RunAndGetFileList(
263 options,
264 ['update', base_path] + additional_args,
265 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000266
267 self.mox.ReplayAll()
268 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
269 relpath=self.relpath)
270 scm.update(options, (), files_list)
271
272 def testUpdateGit(self):
273 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000274 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
275 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000276 print("________ found .git directory; skipping %s" % self.relpath)
277
278 self.mox.ReplayAll()
279 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
280 relpath=self.relpath)
281 file_list = []
282 scm.update(options, self.args, file_list)
283
msb@chromium.orge28e4982009-09-25 20:51:45 +0000284
msb@chromium.org5bde4852009-12-14 16:47:12 +0000285class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000286 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000287 class OptionsObject(object):
288 def __init__(self, test_case, verbose=False, revision=None):
289 self.verbose = verbose
290 self.revision = revision
291 self.manually_grab_svn_rev = True
292 self.deps_os = None
293 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000294 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000295 self.nohooks = False
296
297 sample_git_import = """blob
298mark :1
299data 6
300Hello
301
302blob
303mark :2
304data 4
305Bye
306
307reset refs/heads/master
308commit refs/heads/master
309mark :3
310author Bob <bob@example.com> 1253744361 -0700
311committer Bob <bob@example.com> 1253744361 -0700
312data 8
313A and B
314M 100644 :1 a
315M 100644 :2 b
316
317blob
318mark :4
319data 10
320Hello
321You
322
323blob
324mark :5
325data 8
326Bye
327You
328
329commit refs/heads/origin
330mark :6
331author Alice <alice@example.com> 1253744424 -0700
332committer Alice <alice@example.com> 1253744424 -0700
333data 13
334Personalized
335from :3
336M 100644 :4 a
337M 100644 :5 b
338
339reset refs/heads/master
340from :3
341"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000342 def Options(self, *args, **kwargs):
343 return self.OptionsObject(self, *args, **kwargs)
344
345 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000346 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000347 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000348 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
349 cwd=path).communicate()
350 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000351 # git is not available, skip this test.
352 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000353 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
354 cwd=path).communicate(input=git_import)
355 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
356 cwd=path).communicate()
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000357 Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE,
358 stderr=STDOUT, cwd=path).communicate()
359 Popen(['git', 'checkout', '-b', 'new', 'origin/master'], stdout=PIPE,
360 stderr=STDOUT, cwd=path).communicate()
361 Popen(['git', 'push', 'origin', 'origin/origin:origin/master'], stdout=PIPE,
362 stderr=STDOUT, cwd=path).communicate()
363 Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE,
364 stderr=STDOUT, cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000365 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000366
msb@chromium.orge28e4982009-09-25 20:51:45 +0000367 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000368 self.args = self.Args()
369 self.url = 'git://foo'
370 self.root_dir = tempfile.mkdtemp()
371 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000372 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000373 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000374 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000375
376 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000377 SuperMoxBaseTestBase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000378 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000379
380 def testDir(self):
381 members = [
maruel@chromium.orgd0f854a2010-03-11 19:35:53 +0000382 'COMMAND', 'AssertVersion', 'Capture', 'CaptureStatus',
383 'FetchUpstreamTuple',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000384 'FullUrlForRelativeUrl', 'GenerateDiff', 'GetBranch', 'GetBranchRef',
385 'GetCheckoutRoot', 'GetDifferentFiles', 'GetEmail', 'GetPatchName',
386 'GetSVNBranch', 'GetUpstream', 'IsGitSvn', 'RunAndFilterOutput',
387 'ShortBranchName', 'RunCommand',
388 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000389 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000390 ]
391
392 # If you add a member, be sure to add the relevant test!
393 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
394
395 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000396 if not self.enabled:
397 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000398 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000399 file_path = gclient_scm.os.path.join(self.base_path, 'a')
400 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000401 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
402 relpath=self.relpath)
403 file_list = []
404 scm.revert(options, self.args, file_list)
405 self.assertEquals(file_list, [file_path])
406 file_list = []
407 scm.diff(options, self.args, file_list)
408 self.assertEquals(file_list, [])
409
410 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000411 if not self.enabled:
412 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000413 options = self.Options()
414 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
415 relpath=self.relpath)
416 file_list = []
417 scm.revert(options, self.args, file_list)
418 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000419 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000420 '069c602044c5388d2d15c3f875b057c852003458')
421
422
423 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000424 if not self.enabled:
425 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000426 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000427 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000428 open(file_path, 'a').writelines('touched\n')
429 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
430 relpath=self.relpath)
431 file_list = []
432 scm.revert(options, self.args, file_list)
433 self.assertEquals(file_list, [file_path])
434 file_list = []
435 scm.diff(options, self.args, file_list)
436 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000437 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000438 '069c602044c5388d2d15c3f875b057c852003458')
439
440 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000441 if not self.enabled:
442 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000443 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000444 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000445 f = open(file_path, 'w')
446 f.writelines('new\n')
447 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000448 Popen(['git', 'add', 'c'], stdout=PIPE,
449 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000450 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
451 relpath=self.relpath)
452 file_list = []
453 scm.revert(options, self.args, file_list)
454 self.assertEquals(file_list, [file_path])
455 file_list = []
456 scm.diff(options, self.args, file_list)
457 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000458 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000459 '069c602044c5388d2d15c3f875b057c852003458')
460
461 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000462 if not self.enabled:
463 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000464 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000465 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000466 open(file_path, 'a').writelines('touched\n')
467 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
468 relpath=self.relpath)
469 file_list = []
470 scm.status(options, self.args, file_list)
471 self.assertEquals(file_list, [file_path])
472
473 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000474 if not self.enabled:
475 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000476 options = self.Options()
477 expected_file_list = []
478 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000479 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000480 open(file_path, 'a').writelines('touched\n')
481 expected_file_list.extend([file_path])
482 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
483 relpath=self.relpath)
484 file_list = []
485 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000486 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
487 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000488 self.assertEquals(sorted(file_list), expected_file_list)
489
490 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000491 if not self.enabled:
492 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000493 options = self.Options(verbose=True)
494 root_dir = tempfile.mkdtemp()
495 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000496 base_path = gclient_scm.os.path.join(root_dir, relpath)
497 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000498 try:
499 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
500 relpath=relpath)
501 file_list = []
502 scm.update(options, (), file_list)
503 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000504 self.assert_(gclient_scm.os.path.isfile(
505 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000506 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000507 '069c602044c5388d2d15c3f875b057c852003458')
508 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000509 rmtree(root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000510
511 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000512 if not self.enabled:
513 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000514 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000515 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
516 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000517 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
518 relpath=self.relpath)
519 file_list = []
520 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000521 self.assertEquals(file_list, expected_file_list)
522 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000523 'a7142dc9f0009350b96a11f372b6ea658592aa95')
524
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000525 def testUpdateUnstagedConflict(self):
526 if not self.enabled:
527 return
528 options = self.Options()
529 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
530 relpath=self.relpath)
531 file_path = gclient_scm.os.path.join(self.base_path, 'b')
532 f = open(file_path, 'w').writelines('conflict\n')
533 exception = (
534 "error: Your local changes to 'b' would be overwritten by merge. "
535 "Aborting.\n"
536 "Please, commit your changes or stash them before you can merge.\n")
537 self.assertRaisesError(exception, scm.update, options, (), [])
538
msb@chromium.org5bde4852009-12-14 16:47:12 +0000539 def testUpdateConflict(self):
540 if not self.enabled:
541 return
542 options = self.Options()
543 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
544 relpath=self.relpath)
545 file_path = gclient_scm.os.path.join(self.base_path, 'b')
546 f = open(file_path, 'w').writelines('conflict\n')
547 scm._Run(['commit', '-am', 'test'])
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000548 self.mox.StubOutWithMock(__builtin__, 'raw_input')
549 __builtin__.raw_input.__call__(mox.StrContains('Cannot fast-forward merge, '
550 'attempt to rebase? (y)es / '
551 '(q)uit / (s)kip : ')
552 ).AndReturn('y')
553 self.mox.ReplayAll()
msb@chromium.org5bde4852009-12-14 16:47:12 +0000554 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000555 'Conflict while rebasing this branch.\n' \
msb@chromium.org5bde4852009-12-14 16:47:12 +0000556 'Fix the conflict and run gclient again.\n' \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000557 "See 'man git-rebase' for details.\n"
msb@chromium.org5bde4852009-12-14 16:47:12 +0000558 self.assertRaisesError(exception, scm.update, options, (), [])
559 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000560 '\n____ . at refs/heads/master\n' \
msb@chromium.org5bde4852009-12-14 16:47:12 +0000561 '\tAlready in a conflict, i.e. (no branch).\n' \
562 '\tFix the conflict and run gclient again.\n' \
563 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
564 '\tSee man git-rebase for details.\n'
565 self.assertRaisesError(exception, scm.update, options, (), [])
566
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000567 def testUpdateNotGit(self):
568 if not self.enabled:
569 return
570 options = self.Options()
571 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
572 relpath=self.relpath)
573 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000574 rename(git_path, git_path + 'foo')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000575 exception = \
nasser@codeaurora.orgd90ba3f2010-02-23 14:42:57 +0000576 '\n____ . at refs/heads/master\n' \
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000577 '\tPath is not a git repo. No .git dir.\n' \
578 '\tTo resolve:\n' \
579 '\t\trm -rf .\n' \
580 '\tAnd run gclient sync again\n'
581 self.assertRaisesError(exception, scm.update, options, (), [])
582
msb@chromium.org0f282062009-11-06 20:14:02 +0000583 def testRevinfo(self):
584 if not self.enabled:
585 return
586 options = self.Options()
587 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
588 relpath=self.relpath)
589 rev_info = scm.revinfo(options, (), None)
590 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
591
msb@chromium.orge28e4982009-09-25 20:51:45 +0000592
msb@chromium.orge28e4982009-09-25 20:51:45 +0000593if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000594 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000595 unittest.main()
596
597# vim: ts=2:sw=2:tw=80:et: