blob: f03b9ee2c5562fa5d7f8e162d0c8706129e48502 [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
msb@chromium.orge28e4982009-09-25 20:51:45 +000013
maruel@chromium.orgba551772010-02-03 18:21:42 +000014# Fixes include path.
15from super_mox import mox, SuperMoxBaseTestBase
16
msb@chromium.orge28e4982009-09-25 20:51:45 +000017import gclient_scm
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000018from gclient_test import BaseTestCase as GCBaseTestCase
msb@chromium.orge28e4982009-09-25 20:51:45 +000019
20
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000021class BaseTestCase(GCBaseTestCase):
22 def setUp(self):
23 GCBaseTestCase.setUp(self)
24 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
25 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
26 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'SubprocessCall')
27 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000028 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
29 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
30 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
31 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
32 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Run')
33 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000034 self._scm_wrapper = gclient_scm.CreateSCM
35
36
37class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000038 class OptionsObject(object):
39 def __init__(self, test_case, verbose=False, revision=None):
40 self.verbose = verbose
41 self.revision = revision
42 self.manually_grab_svn_rev = True
43 self.deps_os = None
44 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +000045 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +000046 self.nohooks = False
47
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000048 def Options(self, *args, **kwargs):
49 return self.OptionsObject(self, *args, **kwargs)
50
msb@chromium.orge28e4982009-09-25 20:51:45 +000051 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000052 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000053 self.root_dir = self.Dir()
54 self.args = self.Args()
55 self.url = self.Url()
56 self.relpath = 'asf'
57
58 def testDir(self):
59 members = [
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000060 'COMMAND', 'Capture', 'CaptureHeadRevision', 'CaptureInfo',
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +000061 'CaptureStatus', 'DiffItem', 'GenerateDiff', 'GetCheckoutRoot',
msb@chromium.orge6f78352010-01-13 17:05:33 +000062 'GetEmail', 'GetFileProperty', 'FullUrlForRelativeUrl', 'IsMoved',
63 'ReadSimpleAuth', 'Run', 'RunAndFilterOutput', 'RunAndGetFileList',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000064 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
65 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000066 ]
67
68 # If you add a member, be sure to add the relevant test!
69 self.compareMembers(self._scm_wrapper(), members)
70
71 def testUnsupportedSCM(self):
72 args = [self.url, self.root_dir, self.relpath]
73 kwargs = {'scm_name' : 'foo'}
74 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
75 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
76
msb@chromium.orge6f78352010-01-13 17:05:33 +000077 def testSVNFullUrlForRelativeUrl(self):
78 self.url = 'svn://a/b/c/d'
79
80 self.mox.ReplayAll()
81 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
82 relpath=self.relpath)
83 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
84
85 def testGITFullUrlForRelativeUrl(self):
86 self.url = 'git://a/b/c/d'
87
88 self.mox.ReplayAll()
89 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
90 relpath=self.relpath)
91 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'git://a/b/c/crap')
92
msb@chromium.orge28e4982009-09-25 20:51:45 +000093 def testRunCommandException(self):
94 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000095 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
96 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +000097
98 self.mox.ReplayAll()
99 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
100 relpath=self.relpath)
101 exception = "Unsupported argument(s): %s" % ','.join(self.args)
102 self.assertRaisesError(exception, scm.RunCommand,
103 'update', options, self.args)
104
105 def testRunCommandUnknown(self):
106 # TODO(maruel): if ever used.
107 pass
108
109 def testRevertMissing(self):
110 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000111 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
112 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000113 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000114 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
115 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000116 print("\n_____ %s is missing, synching instead" % self.relpath)
117 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000118 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000119 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000120 gclient_scm.scm.SVN.RunAndGetFileList(options,
121 ['checkout', self.url, base_path],
122 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000123
124 self.mox.ReplayAll()
125 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
126 relpath=self.relpath)
127 scm.revert(options, self.args, files_list)
128
129 def testRevertNone(self):
130 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000131 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
132 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000133 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
134 gclient_scm.scm.SVN.RunAndGetFileList(options,
135 ['update', '--revision', 'BASE'],
136 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000137
138 self.mox.ReplayAll()
139 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
140 relpath=self.relpath)
141 file_list = []
142 scm.revert(options, self.args, file_list)
143
144 def testRevert2Files(self):
145 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000146 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
147 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000148 items = [
149 ('M ', 'a'),
150 ('A ', 'b'),
151 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000152 file_path1 = gclient_scm.os.path.join(base_path, 'a')
153 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000154 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000155 gclient_scm.os.path.exists(file_path1).AndReturn(True)
156 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
157 gclient_scm.os.remove(file_path1)
158 gclient_scm.os.path.exists(file_path2).AndReturn(True)
159 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
160 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000161 gclient_scm.scm.SVN.RunAndGetFileList(options,
162 ['update', '--revision', 'BASE'],
163 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000164 print(gclient_scm.os.path.join(base_path, 'a'))
165 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000166
167 self.mox.ReplayAll()
168 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
169 relpath=self.relpath)
170 file_list = []
171 scm.revert(options, self.args, file_list)
172
173 def testRevertDirectory(self):
174 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000175 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
176 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000177 items = [
178 ('~ ', 'a'),
179 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000180 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000181 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000182 print(file_path)
183 gclient_scm.os.path.exists(file_path).AndReturn(True)
184 gclient_scm.os.path.isfile(file_path).AndReturn(False)
msb@chromium.org32906d12010-01-12 18:22:09 +0000185 gclient_scm.os.path.islink(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000186 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000187 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000188 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000189 gclient_scm.scm.SVN.RunAndGetFileList(options,
190 ['update', '--revision', 'BASE'],
191 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000192
193 self.mox.ReplayAll()
194 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
195 relpath=self.relpath)
196 file_list2 = []
197 scm.revert(options, self.args, file_list2)
198
199 def testStatus(self):
200 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000201 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
202 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000203 gclient_scm.scm.SVN.RunAndGetFileList(options,
204 ['status'] + self.args,
205 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000206
207 self.mox.ReplayAll()
208 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
209 relpath=self.relpath)
210 file_list = []
211 self.assertEqual(scm.status(options, self.args, file_list), None)
212
213
214 # TODO(maruel): TEST REVISIONS!!!
215 # TODO(maruel): TEST RELOCATE!!!
216 def testUpdateCheckout(self):
217 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000218 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
219 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000220 file_info.root = 'blah'
221 file_info.url = self.url
222 file_info.uuid = 'ABC'
223 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000224 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
225 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000226 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000227 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000228 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000229 gclient_scm.scm.SVN.RunAndGetFileList(options,
230 ['checkout', self.url, base_path],
231 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000232 self.mox.ReplayAll()
233 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
234 relpath=self.relpath)
235 scm.update(options, (), files_list)
236
237 def testUpdateUpdate(self):
238 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000239 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000240 options.force = True
241 options.nohooks = False
242 file_info = {
243 'Repository Root': 'blah',
244 'URL': self.url,
245 'UUID': 'ABC',
246 'Revision': 42,
247 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000248 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
249 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000250 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000251 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000252 gclient_scm.scm.SVN.CaptureInfo(
253 gclient_scm.os.path.join(base_path, "."), '.'
254 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000255 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000256 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000257 additional_args = []
258 if options.manually_grab_svn_rev:
259 additional_args = ['--revision', str(file_info['Revision'])]
260 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000261 gclient_scm.scm.SVN.RunAndGetFileList(
262 options,
263 ['update', base_path] + additional_args,
264 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000265
266 self.mox.ReplayAll()
267 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
268 relpath=self.relpath)
269 scm.update(options, (), files_list)
270
271 def testUpdateGit(self):
272 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000273 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
274 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000275 print("________ found .git directory; skipping %s" % self.relpath)
276
277 self.mox.ReplayAll()
278 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
279 relpath=self.relpath)
280 file_list = []
281 scm.update(options, self.args, file_list)
282
msb@chromium.orge28e4982009-09-25 20:51:45 +0000283
msb@chromium.org5bde4852009-12-14 16:47:12 +0000284class GitWrapperTestCase(BaseTestCase):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000285 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000286 class OptionsObject(object):
287 def __init__(self, test_case, verbose=False, revision=None):
288 self.verbose = verbose
289 self.revision = revision
290 self.manually_grab_svn_rev = True
291 self.deps_os = None
292 self.force = False
davemoore@chromium.org8bf27312010-02-19 17:29:44 +0000293 self.reset = False
msb@chromium.orge28e4982009-09-25 20:51:45 +0000294 self.nohooks = False
295
296 sample_git_import = """blob
297mark :1
298data 6
299Hello
300
301blob
302mark :2
303data 4
304Bye
305
306reset refs/heads/master
307commit refs/heads/master
308mark :3
309author Bob <bob@example.com> 1253744361 -0700
310committer Bob <bob@example.com> 1253744361 -0700
311data 8
312A and B
313M 100644 :1 a
314M 100644 :2 b
315
316blob
317mark :4
318data 10
319Hello
320You
321
322blob
323mark :5
324data 8
325Bye
326You
327
328commit refs/heads/origin
329mark :6
330author Alice <alice@example.com> 1253744424 -0700
331committer Alice <alice@example.com> 1253744424 -0700
332data 13
333Personalized
334from :3
335M 100644 :4 a
336M 100644 :5 b
337
338reset refs/heads/master
339from :3
340"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000341 def Options(self, *args, **kwargs):
342 return self.OptionsObject(self, *args, **kwargs)
343
344 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000345 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000346 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000347 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
348 cwd=path).communicate()
349 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000350 # git is not available, skip this test.
351 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000352 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
353 cwd=path).communicate(input=git_import)
354 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
355 cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000356 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000357
msb@chromium.orge28e4982009-09-25 20:51:45 +0000358 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000359 self.args = self.Args()
360 self.url = 'git://foo'
361 self.root_dir = tempfile.mkdtemp()
362 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000363 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000364 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000365 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000366
367 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000368 SuperMoxBaseTestBase.tearDown(self)
maruel@chromium.orgba551772010-02-03 18:21:42 +0000369 rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000370
371 def testDir(self):
372 members = [
maruel@chromium.orgf2f9d552009-12-22 00:12:57 +0000373 'COMMAND', 'Capture', 'CaptureStatus', 'FetchUpstreamTuple',
msb@chromium.orge6f78352010-01-13 17:05:33 +0000374 'FullUrlForRelativeUrl', 'GenerateDiff', 'GetBranch', 'GetBranchRef',
375 'GetCheckoutRoot', 'GetDifferentFiles', 'GetEmail', 'GetPatchName',
376 'GetSVNBranch', 'GetUpstream', 'IsGitSvn', 'RunAndFilterOutput',
377 'ShortBranchName', 'RunCommand',
378 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000379 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000380 ]
381
382 # If you add a member, be sure to add the relevant test!
383 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
384
385 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000386 if not self.enabled:
387 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000388 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000389 file_path = gclient_scm.os.path.join(self.base_path, 'a')
390 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000391 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
392 relpath=self.relpath)
393 file_list = []
394 scm.revert(options, self.args, file_list)
395 self.assertEquals(file_list, [file_path])
396 file_list = []
397 scm.diff(options, self.args, file_list)
398 self.assertEquals(file_list, [])
399
400 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000401 if not self.enabled:
402 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000403 options = self.Options()
404 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
405 relpath=self.relpath)
406 file_list = []
407 scm.revert(options, self.args, file_list)
408 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000409 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000410 '069c602044c5388d2d15c3f875b057c852003458')
411
412
413 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000414 if not self.enabled:
415 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000416 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000417 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000418 open(file_path, 'a').writelines('touched\n')
419 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
420 relpath=self.relpath)
421 file_list = []
422 scm.revert(options, self.args, file_list)
423 self.assertEquals(file_list, [file_path])
424 file_list = []
425 scm.diff(options, self.args, file_list)
426 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000427 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000428 '069c602044c5388d2d15c3f875b057c852003458')
429
430 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000431 if not self.enabled:
432 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000433 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000434 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000435 f = open(file_path, 'w')
436 f.writelines('new\n')
437 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000438 Popen(['git', 'add', 'c'], stdout=PIPE,
439 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000440 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
441 relpath=self.relpath)
442 file_list = []
443 scm.revert(options, self.args, file_list)
444 self.assertEquals(file_list, [file_path])
445 file_list = []
446 scm.diff(options, self.args, file_list)
447 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000448 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000449 '069c602044c5388d2d15c3f875b057c852003458')
450
451 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000452 if not self.enabled:
453 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000454 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000455 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000456 open(file_path, 'a').writelines('touched\n')
457 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
458 relpath=self.relpath)
459 file_list = []
460 scm.status(options, self.args, file_list)
461 self.assertEquals(file_list, [file_path])
462
463 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000464 if not self.enabled:
465 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000466 options = self.Options()
467 expected_file_list = []
468 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000469 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000470 open(file_path, 'a').writelines('touched\n')
471 expected_file_list.extend([file_path])
472 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
473 relpath=self.relpath)
474 file_list = []
475 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000476 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
477 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000478 self.assertEquals(sorted(file_list), expected_file_list)
479
480 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000481 if not self.enabled:
482 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000483 options = self.Options(verbose=True)
484 root_dir = tempfile.mkdtemp()
485 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000486 base_path = gclient_scm.os.path.join(root_dir, relpath)
487 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000488 try:
489 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
490 relpath=relpath)
491 file_list = []
492 scm.update(options, (), file_list)
493 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000494 self.assert_(gclient_scm.os.path.isfile(
495 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000496 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000497 '069c602044c5388d2d15c3f875b057c852003458')
498 finally:
maruel@chromium.orgba551772010-02-03 18:21:42 +0000499 rmtree(root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000500
501 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000502 if not self.enabled:
503 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000504 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000505 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
506 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000507 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
508 relpath=self.relpath)
509 file_list = []
510 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000511 self.assertEquals(file_list, expected_file_list)
512 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000513 'a7142dc9f0009350b96a11f372b6ea658592aa95')
514
msb@chromium.org5bde4852009-12-14 16:47:12 +0000515 def testUpdateConflict(self):
516 if not self.enabled:
517 return
518 options = self.Options()
519 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
520 relpath=self.relpath)
521 file_path = gclient_scm.os.path.join(self.base_path, 'b')
522 f = open(file_path, 'w').writelines('conflict\n')
523 scm._Run(['commit', '-am', 'test'])
524 exception = \
525 '\n____ .\n' \
526 '\nConflict while rebasing this branch.\n' \
527 'Fix the conflict and run gclient again.\n' \
528 'See man git-rebase for details.\n'
529 self.assertRaisesError(exception, scm.update, options, (), [])
530 exception = \
531 '\n____ .\n' \
532 '\tAlready in a conflict, i.e. (no branch).\n' \
533 '\tFix the conflict and run gclient again.\n' \
534 '\tOr to abort run:\n\t\tgit-rebase --abort\n' \
535 '\tSee man git-rebase for details.\n'
536 self.assertRaisesError(exception, scm.update, options, (), [])
537
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000538 def testUpdateNotGit(self):
539 if not self.enabled:
540 return
541 options = self.Options()
542 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
543 relpath=self.relpath)
544 git_path = gclient_scm.os.path.join(self.base_path, '.git')
maruel@chromium.orgba551772010-02-03 18:21:42 +0000545 rename(git_path, git_path + 'foo')
msb@chromium.orge4af1ab2010-01-13 21:26:09 +0000546 exception = \
547 '\n____ .\n' \
548 '\tPath is not a git repo. No .git dir.\n' \
549 '\tTo resolve:\n' \
550 '\t\trm -rf .\n' \
551 '\tAnd run gclient sync again\n'
552 self.assertRaisesError(exception, scm.update, options, (), [])
553
msb@chromium.org0f282062009-11-06 20:14:02 +0000554 def testRevinfo(self):
555 if not self.enabled:
556 return
557 options = self.Options()
558 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
559 relpath=self.relpath)
560 rev_info = scm.revinfo(options, (), None)
561 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
562
msb@chromium.orge28e4982009-09-25 20:51:45 +0000563
msb@chromium.orge28e4982009-09-25 20:51:45 +0000564if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000565 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000566 unittest.main()
567
568# vim: ts=2:sw=2:tw=80:et: