blob: 11a2cd933c98f7274345d89c84cb3438138bd9f5 [file] [log] [blame]
msb@chromium.orge28e4982009-09-25 20:51:45 +00001#!/usr/bin/python
2#
3# Copyright 2008-2009 Google Inc. All Rights Reserved.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Unit tests for gclient_scm.py."""
18
msb@chromium.orge28e4982009-09-25 20:51:45 +000019import shutil
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000020# Import it before super_mox to keep a valid reference.
21from subprocess import Popen, PIPE, STDOUT
msb@chromium.orge28e4982009-09-25 20:51:45 +000022import tempfile
msb@chromium.orge28e4982009-09-25 20:51:45 +000023
msb@chromium.orge28e4982009-09-25 20:51:45 +000024import gclient_scm
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000025from gclient_test import BaseTestCase as GCBaseTestCase
26from super_mox import mox, SuperMoxBaseTestBase
msb@chromium.orge28e4982009-09-25 20:51:45 +000027
28
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000029class BaseTestCase(GCBaseTestCase):
30 def setUp(self):
31 GCBaseTestCase.setUp(self)
32 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead')
33 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite')
34 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'SubprocessCall')
35 self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory')
maruel@chromium.org261eeb52009-11-16 18:25:45 +000036 self._CaptureSVNInfo = gclient_scm.CaptureSVNInfo
37 self.mox.StubOutWithMock(gclient_scm, 'CaptureSVN')
38 self.mox.StubOutWithMock(gclient_scm, 'CaptureSVNInfo')
39 self.mox.StubOutWithMock(gclient_scm, 'CaptureSVNStatus')
40 self.mox.StubOutWithMock(gclient_scm, 'RunSVN')
41 self.mox.StubOutWithMock(gclient_scm, 'RunSVNAndGetFileList')
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000042 self._scm_wrapper = gclient_scm.CreateSCM
43
44
45class SVNWrapperTestCase(BaseTestCase):
msb@chromium.orge28e4982009-09-25 20:51:45 +000046 class OptionsObject(object):
47 def __init__(self, test_case, verbose=False, revision=None):
48 self.verbose = verbose
49 self.revision = revision
50 self.manually_grab_svn_rev = True
51 self.deps_os = None
52 self.force = False
53 self.nohooks = False
54
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000055 def Options(self, *args, **kwargs):
56 return self.OptionsObject(self, *args, **kwargs)
57
msb@chromium.orge28e4982009-09-25 20:51:45 +000058 def setUp(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000059 BaseTestCase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +000060 self.root_dir = self.Dir()
61 self.args = self.Args()
62 self.url = self.Url()
63 self.relpath = 'asf'
64
65 def testDir(self):
66 members = [
maruel@chromium.org261eeb52009-11-16 18:25:45 +000067 'FullUrlForRelativeUrl', 'RunCommand', 'cleanup', 'diff', 'export',
68 'pack', 'relpath', 'revert', 'revinfo', 'runhooks', 'scm_name', 'status',
69 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000070 ]
71
72 # If you add a member, be sure to add the relevant test!
73 self.compareMembers(self._scm_wrapper(), members)
74
75 def testUnsupportedSCM(self):
76 args = [self.url, self.root_dir, self.relpath]
77 kwargs = {'scm_name' : 'foo'}
78 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
79 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
80
81 def testFullUrlForRelativeUrl(self):
82 self.url = 'svn://a/b/c/d'
83
84 self.mox.ReplayAll()
85 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
86 relpath=self.relpath)
87 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
88
89 def testRunCommandException(self):
90 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000091 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
92 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +000093
94 self.mox.ReplayAll()
95 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
96 relpath=self.relpath)
97 exception = "Unsupported argument(s): %s" % ','.join(self.args)
98 self.assertRaisesError(exception, scm.RunCommand,
99 'update', options, self.args)
100
101 def testRunCommandUnknown(self):
102 # TODO(maruel): if ever used.
103 pass
104
105 def testRevertMissing(self):
106 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000107 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
108 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000109 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000110 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
111 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000112 print("\n_____ %s is missing, synching instead" % self.relpath)
113 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000114 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000115 files_list = self.mox.CreateMockAnything()
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000116 gclient_scm.RunSVNAndGetFileList(options, ['checkout', self.url, base_path],
117 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000118
119 self.mox.ReplayAll()
120 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
121 relpath=self.relpath)
122 scm.revert(options, self.args, files_list)
123
124 def testRevertNone(self):
125 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000126 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
127 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000128 gclient_scm.CaptureSVNStatus(base_path).AndReturn([])
129 gclient_scm.RunSVNAndGetFileList(options, ['update', '--revision', 'BASE'],
130 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000131
132 self.mox.ReplayAll()
133 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
134 relpath=self.relpath)
135 file_list = []
136 scm.revert(options, self.args, file_list)
137
138 def testRevert2Files(self):
139 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000140 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
141 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000142 items = [
143 ('M ', 'a'),
144 ('A ', 'b'),
145 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000146 file_path1 = gclient_scm.os.path.join(base_path, 'a')
147 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000148 gclient_scm.CaptureSVNStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000149 gclient_scm.os.path.exists(file_path1).AndReturn(True)
150 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
151 gclient_scm.os.remove(file_path1)
152 gclient_scm.os.path.exists(file_path2).AndReturn(True)
153 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
154 gclient_scm.os.remove(file_path2)
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000155 gclient_scm.RunSVNAndGetFileList(options, ['update', '--revision', 'BASE'],
156 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000157 print(gclient_scm.os.path.join(base_path, 'a'))
158 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000159
160 self.mox.ReplayAll()
161 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
162 relpath=self.relpath)
163 file_list = []
164 scm.revert(options, self.args, file_list)
165
166 def testRevertDirectory(self):
167 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000168 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
169 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000170 items = [
171 ('~ ', 'a'),
172 ]
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000173 gclient_scm.CaptureSVNStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000174 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000175 print(file_path)
176 gclient_scm.os.path.exists(file_path).AndReturn(True)
177 gclient_scm.os.path.isfile(file_path).AndReturn(False)
178 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000179 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000180 file_list1 = []
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000181 gclient_scm.RunSVNAndGetFileList(options, ['update', '--revision', 'BASE'],
182 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000183
184 self.mox.ReplayAll()
185 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
186 relpath=self.relpath)
187 file_list2 = []
188 scm.revert(options, self.args, file_list2)
189
190 def testStatus(self):
191 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000192 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
193 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000194 gclient_scm.RunSVNAndGetFileList(options, ['status'] + self.args,
195 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000196
197 self.mox.ReplayAll()
198 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
199 relpath=self.relpath)
200 file_list = []
201 self.assertEqual(scm.status(options, self.args, file_list), None)
202
203
204 # TODO(maruel): TEST REVISIONS!!!
205 # TODO(maruel): TEST RELOCATE!!!
206 def testUpdateCheckout(self):
207 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000208 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
209 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000210 file_info.root = 'blah'
211 file_info.url = self.url
212 file_info.uuid = 'ABC'
213 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000214 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
215 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000216 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000217 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000218 files_list = self.mox.CreateMockAnything()
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000219 gclient_scm.RunSVNAndGetFileList(options, ['checkout', self.url,
220 base_path], self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000221 self.mox.ReplayAll()
222 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
223 relpath=self.relpath)
224 scm.update(options, (), files_list)
225
226 def testUpdateUpdate(self):
227 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000228 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000229 options.force = True
230 options.nohooks = False
231 file_info = {
232 'Repository Root': 'blah',
233 'URL': self.url,
234 'UUID': 'ABC',
235 'Revision': 42,
236 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000237 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
238 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000239 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000240 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000241 gclient_scm.CaptureSVNInfo(gclient_scm.os.path.join(base_path, "."), '.'
242 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000243 # Cheat a bit here.
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000244 gclient_scm.CaptureSVNInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000245 additional_args = []
246 if options.manually_grab_svn_rev:
247 additional_args = ['--revision', str(file_info['Revision'])]
248 files_list = []
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000249 gclient_scm.RunSVNAndGetFileList(options,
250 ['update', base_path] + additional_args,
251 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000252
253 self.mox.ReplayAll()
254 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
255 relpath=self.relpath)
256 scm.update(options, (), files_list)
257
258 def testUpdateGit(self):
259 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000260 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
261 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000262 print("________ found .git directory; skipping %s" % self.relpath)
263
264 self.mox.ReplayAll()
265 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
266 relpath=self.relpath)
267 file_list = []
268 scm.update(options, self.args, file_list)
269
msb@chromium.orge28e4982009-09-25 20:51:45 +0000270
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000271class GitWrapperTestCase(SuperMoxBaseTestBase):
272 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273 class OptionsObject(object):
274 def __init__(self, test_case, verbose=False, revision=None):
275 self.verbose = verbose
276 self.revision = revision
277 self.manually_grab_svn_rev = True
278 self.deps_os = None
279 self.force = False
280 self.nohooks = False
281
282 sample_git_import = """blob
283mark :1
284data 6
285Hello
286
287blob
288mark :2
289data 4
290Bye
291
292reset refs/heads/master
293commit refs/heads/master
294mark :3
295author Bob <bob@example.com> 1253744361 -0700
296committer Bob <bob@example.com> 1253744361 -0700
297data 8
298A and B
299M 100644 :1 a
300M 100644 :2 b
301
302blob
303mark :4
304data 10
305Hello
306You
307
308blob
309mark :5
310data 8
311Bye
312You
313
314commit refs/heads/origin
315mark :6
316author Alice <alice@example.com> 1253744424 -0700
317committer Alice <alice@example.com> 1253744424 -0700
318data 13
319Personalized
320from :3
321M 100644 :4 a
322M 100644 :5 b
323
324reset refs/heads/master
325from :3
326"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000327 def Options(self, *args, **kwargs):
328 return self.OptionsObject(self, *args, **kwargs)
329
330 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000331 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000332 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000333 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
334 cwd=path).communicate()
335 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000336 # git is not available, skip this test.
337 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000338 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
339 cwd=path).communicate(input=git_import)
340 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
341 cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000342 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000343
msb@chromium.orge28e4982009-09-25 20:51:45 +0000344 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000345 self.args = self.Args()
346 self.url = 'git://foo'
347 self.root_dir = tempfile.mkdtemp()
348 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000349 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000350 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000351 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000352
353 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000354 SuperMoxBaseTestBase.tearDown(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000355 shutil.rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000356
357 def testDir(self):
358 members = [
maruel@chromium.org261eeb52009-11-16 18:25:45 +0000359 'FullUrlForRelativeUrl', 'RunCommand', 'cleanup', 'diff', 'export',
360 'relpath', 'revert', 'revinfo', 'runhooks', 'scm_name', 'status',
361 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000362 ]
363
364 # If you add a member, be sure to add the relevant test!
365 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
366
367 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000368 if not self.enabled:
369 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000370 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000371 file_path = gclient_scm.os.path.join(self.base_path, 'a')
372 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000373 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
374 relpath=self.relpath)
375 file_list = []
376 scm.revert(options, self.args, file_list)
377 self.assertEquals(file_list, [file_path])
378 file_list = []
379 scm.diff(options, self.args, file_list)
380 self.assertEquals(file_list, [])
381
382 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000383 if not self.enabled:
384 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000385 options = self.Options()
386 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
387 relpath=self.relpath)
388 file_list = []
389 scm.revert(options, self.args, file_list)
390 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000391 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000392 '069c602044c5388d2d15c3f875b057c852003458')
393
394
395 def testRevertModified(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')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000400 open(file_path, 'a').writelines('touched\n')
401 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, [])
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 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000413 if not self.enabled:
414 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000415 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000416 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000417 f = open(file_path, 'w')
418 f.writelines('new\n')
419 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000420 Popen(['git', 'add', 'c'], stdout=PIPE,
421 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000422 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
423 relpath=self.relpath)
424 file_list = []
425 scm.revert(options, self.args, file_list)
426 self.assertEquals(file_list, [file_path])
427 file_list = []
428 scm.diff(options, self.args, file_list)
429 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000430 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000431 '069c602044c5388d2d15c3f875b057c852003458')
432
433 def testStatusNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000434 if not self.enabled:
435 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000436 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000437 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000438 open(file_path, 'a').writelines('touched\n')
439 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
440 relpath=self.relpath)
441 file_list = []
442 scm.status(options, self.args, file_list)
443 self.assertEquals(file_list, [file_path])
444
445 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000446 if not self.enabled:
447 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000448 options = self.Options()
449 expected_file_list = []
450 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000451 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000452 open(file_path, 'a').writelines('touched\n')
453 expected_file_list.extend([file_path])
454 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
455 relpath=self.relpath)
456 file_list = []
457 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000458 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
459 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000460 self.assertEquals(sorted(file_list), expected_file_list)
461
462 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000463 if not self.enabled:
464 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000465 options = self.Options(verbose=True)
466 root_dir = tempfile.mkdtemp()
467 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000468 base_path = gclient_scm.os.path.join(root_dir, relpath)
469 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000470 try:
471 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
472 relpath=relpath)
473 file_list = []
474 scm.update(options, (), file_list)
475 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000476 self.assert_(gclient_scm.os.path.isfile(
477 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000478 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000479 '069c602044c5388d2d15c3f875b057c852003458')
480 finally:
481 shutil.rmtree(root_dir)
482
483 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000484 if not self.enabled:
485 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000486 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000487 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
488 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000489 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
490 relpath=self.relpath)
491 file_list = []
492 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000493 self.assertEquals(file_list, expected_file_list)
494 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000495 'a7142dc9f0009350b96a11f372b6ea658592aa95')
496
msb@chromium.org0f282062009-11-06 20:14:02 +0000497 def testRevinfo(self):
498 if not self.enabled:
499 return
500 options = self.Options()
501 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
502 relpath=self.relpath)
503 rev_info = scm.revinfo(options, (), None)
504 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
505
msb@chromium.orge28e4982009-09-25 20:51:45 +0000506
msb@chromium.orge28e4982009-09-25 20:51:45 +0000507if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000508 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000509 unittest.main()
510
511# vim: ts=2:sw=2:tw=80:et: