blob: 8d37678ddcebe2f6e62328349da7e96f040d5a2d [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.org5aeb7dd2009-11-17 18:09:01 +000036 self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo
37 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture')
38 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureInfo')
39 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'CaptureStatus')
40 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Run')
41 self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'RunAndGetFileList')
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.org5aeb7dd2009-11-17 18:09:01 +000067 'COMMAND', 'Capture', 'CaptureHeadRevision', 'CaptureInfo',
maruel@chromium.orgc78f2462009-11-21 01:20:57 +000068 'CaptureStatus', 'DiffItem', 'FullUrlForRelativeUrl', 'GetEmail',
chase@chromium.org37c629a2009-11-24 23:34:43 +000069 'GetFileProperty', 'IsMoved', 'ReadSimpleAuth', 'Run',
maruel@chromium.orgc78f2462009-11-21 01:20:57 +000070 'RunAndFilterOutput', 'RunAndGetFileList',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +000071 'RunCommand', 'cleanup', 'diff', 'export', 'pack', 'relpath', 'revert',
72 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +000073 ]
74
75 # If you add a member, be sure to add the relevant test!
76 self.compareMembers(self._scm_wrapper(), members)
77
78 def testUnsupportedSCM(self):
79 args = [self.url, self.root_dir, self.relpath]
80 kwargs = {'scm_name' : 'foo'}
81 exception_msg = 'Unsupported scm %(scm_name)s' % kwargs
82 self.assertRaisesError(exception_msg, self._scm_wrapper, *args, **kwargs)
83
84 def testFullUrlForRelativeUrl(self):
85 self.url = 'svn://a/b/c/d'
86
87 self.mox.ReplayAll()
88 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
89 relpath=self.relpath)
90 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
91
92 def testRunCommandException(self):
93 options = self.Options(verbose=False)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +000094 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
95 gclient_scm.os.path.exists(file_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +000096
97 self.mox.ReplayAll()
98 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
99 relpath=self.relpath)
100 exception = "Unsupported argument(s): %s" % ','.join(self.args)
101 self.assertRaisesError(exception, scm.RunCommand,
102 'update', options, self.args)
103
104 def testRunCommandUnknown(self):
105 # TODO(maruel): if ever used.
106 pass
107
108 def testRevertMissing(self):
109 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000110 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
111 gclient_scm.os.path.isdir(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000112 # It'll to a checkout instead.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000113 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
114 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000115 print("\n_____ %s is missing, synching instead" % self.relpath)
116 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000117 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000118 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000119 gclient_scm.scm.SVN.RunAndGetFileList(options,
120 ['checkout', self.url, base_path],
121 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000122
123 self.mox.ReplayAll()
124 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
125 relpath=self.relpath)
126 scm.revert(options, self.args, files_list)
127
128 def testRevertNone(self):
129 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000130 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
131 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000132 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn([])
133 gclient_scm.scm.SVN.RunAndGetFileList(options,
134 ['update', '--revision', 'BASE'],
135 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000136
137 self.mox.ReplayAll()
138 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
139 relpath=self.relpath)
140 file_list = []
141 scm.revert(options, self.args, file_list)
142
143 def testRevert2Files(self):
144 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000145 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
146 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000147 items = [
148 ('M ', 'a'),
149 ('A ', 'b'),
150 ]
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000151 file_path1 = gclient_scm.os.path.join(base_path, 'a')
152 file_path2 = gclient_scm.os.path.join(base_path, 'b')
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000153 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000154 gclient_scm.os.path.exists(file_path1).AndReturn(True)
155 gclient_scm.os.path.isfile(file_path1).AndReturn(True)
156 gclient_scm.os.remove(file_path1)
157 gclient_scm.os.path.exists(file_path2).AndReturn(True)
158 gclient_scm.os.path.isfile(file_path2).AndReturn(True)
159 gclient_scm.os.remove(file_path2)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000160 gclient_scm.scm.SVN.RunAndGetFileList(options,
161 ['update', '--revision', 'BASE'],
162 base_path, mox.IgnoreArg())
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000163 print(gclient_scm.os.path.join(base_path, 'a'))
164 print(gclient_scm.os.path.join(base_path, 'b'))
msb@chromium.orge28e4982009-09-25 20:51:45 +0000165
166 self.mox.ReplayAll()
167 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
168 relpath=self.relpath)
169 file_list = []
170 scm.revert(options, self.args, file_list)
171
172 def testRevertDirectory(self):
173 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000174 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
175 gclient_scm.os.path.isdir(base_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000176 items = [
177 ('~ ', 'a'),
178 ]
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000179 gclient_scm.scm.SVN.CaptureStatus(base_path).AndReturn(items)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000180 file_path = gclient_scm.os.path.join(base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000181 print(file_path)
182 gclient_scm.os.path.exists(file_path).AndReturn(True)
183 gclient_scm.os.path.isfile(file_path).AndReturn(False)
184 gclient_scm.os.path.isdir(file_path).AndReturn(True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000185 gclient_scm.gclient_utils.RemoveDirectory(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000186 file_list1 = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000187 gclient_scm.scm.SVN.RunAndGetFileList(options,
188 ['update', '--revision', 'BASE'],
189 base_path, mox.IgnoreArg())
msb@chromium.orge28e4982009-09-25 20:51:45 +0000190
191 self.mox.ReplayAll()
192 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
193 relpath=self.relpath)
194 file_list2 = []
195 scm.revert(options, self.args, file_list2)
196
197 def testStatus(self):
198 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000199 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
200 gclient_scm.os.path.isdir(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000201 gclient_scm.scm.SVN.RunAndGetFileList(options,
202 ['status'] + self.args,
203 base_path, []).AndReturn(None)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000204
205 self.mox.ReplayAll()
206 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
207 relpath=self.relpath)
208 file_list = []
209 self.assertEqual(scm.status(options, self.args, file_list), None)
210
211
212 # TODO(maruel): TEST REVISIONS!!!
213 # TODO(maruel): TEST RELOCATE!!!
214 def testUpdateCheckout(self):
215 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000216 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
217 file_info = gclient_scm.gclient_utils.PrintableObject()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000218 file_info.root = 'blah'
219 file_info.url = self.url
220 file_info.uuid = 'ABC'
221 file_info.revision = 42
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000222 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
223 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000224 # Checkout.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000225 gclient_scm.os.path.exists(base_path).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000226 files_list = self.mox.CreateMockAnything()
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000227 gclient_scm.scm.SVN.RunAndGetFileList(options,
228 ['checkout', self.url, base_path],
229 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000230 self.mox.ReplayAll()
231 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
232 relpath=self.relpath)
233 scm.update(options, (), files_list)
234
235 def testUpdateUpdate(self):
236 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000237 base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000238 options.force = True
239 options.nohooks = False
240 file_info = {
241 'Repository Root': 'blah',
242 'URL': self.url,
243 'UUID': 'ABC',
244 'Revision': 42,
245 }
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000246 gclient_scm.os.path.exists(gclient_scm.os.path.join(base_path, '.git')
247 ).AndReturn(False)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000248 # Checkout or update.
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000249 gclient_scm.os.path.exists(base_path).AndReturn(True)
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000250 gclient_scm.scm.SVN.CaptureInfo(
251 gclient_scm.os.path.join(base_path, "."), '.'
252 ).AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000253 # Cheat a bit here.
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000254 gclient_scm.scm.SVN.CaptureInfo(file_info['URL'], '.').AndReturn(file_info)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000255 additional_args = []
256 if options.manually_grab_svn_rev:
257 additional_args = ['--revision', str(file_info['Revision'])]
258 files_list = []
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000259 gclient_scm.scm.SVN.RunAndGetFileList(
260 options,
261 ['update', base_path] + additional_args,
262 self.root_dir, files_list)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000263
264 self.mox.ReplayAll()
265 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
266 relpath=self.relpath)
267 scm.update(options, (), files_list)
268
269 def testUpdateGit(self):
270 options = self.Options(verbose=True)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000271 file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
272 gclient_scm.os.path.exists(file_path).AndReturn(True)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000273 print("________ found .git directory; skipping %s" % self.relpath)
274
275 self.mox.ReplayAll()
276 scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
277 relpath=self.relpath)
278 file_list = []
279 scm.update(options, self.args, file_list)
280
msb@chromium.orge28e4982009-09-25 20:51:45 +0000281
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000282class GitWrapperTestCase(SuperMoxBaseTestBase):
283 """This class doesn't use pymox."""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000284 class OptionsObject(object):
285 def __init__(self, test_case, verbose=False, revision=None):
286 self.verbose = verbose
287 self.revision = revision
288 self.manually_grab_svn_rev = True
289 self.deps_os = None
290 self.force = False
291 self.nohooks = False
292
293 sample_git_import = """blob
294mark :1
295data 6
296Hello
297
298blob
299mark :2
300data 4
301Bye
302
303reset refs/heads/master
304commit refs/heads/master
305mark :3
306author Bob <bob@example.com> 1253744361 -0700
307committer Bob <bob@example.com> 1253744361 -0700
308data 8
309A and B
310M 100644 :1 a
311M 100644 :2 b
312
313blob
314mark :4
315data 10
316Hello
317You
318
319blob
320mark :5
321data 8
322Bye
323You
324
325commit refs/heads/origin
326mark :6
327author Alice <alice@example.com> 1253744424 -0700
328committer Alice <alice@example.com> 1253744424 -0700
329data 13
330Personalized
331from :3
332M 100644 :4 a
333M 100644 :5 b
334
335reset refs/heads/master
336from :3
337"""
msb@chromium.orge28e4982009-09-25 20:51:45 +0000338 def Options(self, *args, **kwargs):
339 return self.OptionsObject(self, *args, **kwargs)
340
341 def CreateGitRepo(self, git_import, path):
maruel@chromium.orgd5800f12009-11-12 20:03:43 +0000342 """Do it for real."""
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000343 try:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000344 Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT,
345 cwd=path).communicate()
346 except OSError:
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000347 # git is not available, skip this test.
348 return False
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000349 Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT,
350 cwd=path).communicate(input=git_import)
351 Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT,
352 cwd=path).communicate()
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000353 return True
msb@chromium.orge28e4982009-09-25 20:51:45 +0000354
msb@chromium.orge28e4982009-09-25 20:51:45 +0000355 def setUp(self):
msb@chromium.orge28e4982009-09-25 20:51:45 +0000356 self.args = self.Args()
357 self.url = 'git://foo'
358 self.root_dir = tempfile.mkdtemp()
359 self.relpath = '.'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000360 self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath)
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000361 self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000362 SuperMoxBaseTestBase.setUp(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000363
364 def tearDown(self):
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000365 SuperMoxBaseTestBase.tearDown(self)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000366 shutil.rmtree(self.root_dir)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000367
368 def testDir(self):
369 members = [
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000370 'COMMAND', 'Capture', 'CaptureStatus', 'FullUrlForRelativeUrl',
maruel@chromium.orgc78f2462009-11-21 01:20:57 +0000371 'GetEmail',
maruel@chromium.org5aeb7dd2009-11-17 18:09:01 +0000372 'RunCommand', 'cleanup', 'diff', 'export', 'relpath', 'revert',
373 'revinfo', 'runhooks', 'scm_name', 'status', 'update', 'url',
msb@chromium.orge28e4982009-09-25 20:51:45 +0000374 ]
375
376 # If you add a member, be sure to add the relevant test!
377 self.compareMembers(gclient_scm.CreateSCM(url=self.url), members)
378
379 def testRevertMissing(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000380 if not self.enabled:
381 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000382 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000383 file_path = gclient_scm.os.path.join(self.base_path, 'a')
384 gclient_scm.os.remove(file_path)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000385 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
386 relpath=self.relpath)
387 file_list = []
388 scm.revert(options, self.args, file_list)
389 self.assertEquals(file_list, [file_path])
390 file_list = []
391 scm.diff(options, self.args, file_list)
392 self.assertEquals(file_list, [])
393
394 def testRevertNone(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000395 if not self.enabled:
396 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000397 options = self.Options()
398 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
399 relpath=self.relpath)
400 file_list = []
401 scm.revert(options, self.args, file_list)
402 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000403 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000404 '069c602044c5388d2d15c3f875b057c852003458')
405
406
407 def testRevertModified(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000408 if not self.enabled:
409 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000410 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000411 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000412 open(file_path, 'a').writelines('touched\n')
413 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
414 relpath=self.relpath)
415 file_list = []
416 scm.revert(options, self.args, file_list)
417 self.assertEquals(file_list, [file_path])
418 file_list = []
419 scm.diff(options, self.args, file_list)
420 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000421 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000422 '069c602044c5388d2d15c3f875b057c852003458')
423
424 def testRevertNew(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000425 if not self.enabled:
426 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000427 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000428 file_path = gclient_scm.os.path.join(self.base_path, 'c')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000429 f = open(file_path, 'w')
430 f.writelines('new\n')
431 f.close()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000432 Popen(['git', 'add', 'c'], stdout=PIPE,
433 stderr=STDOUT, cwd=self.base_path).communicate()
msb@chromium.orge28e4982009-09-25 20:51:45 +0000434 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
435 relpath=self.relpath)
436 file_list = []
437 scm.revert(options, self.args, file_list)
438 self.assertEquals(file_list, [file_path])
439 file_list = []
440 scm.diff(options, self.args, file_list)
441 self.assertEquals(file_list, [])
msb@chromium.org0f282062009-11-06 20:14:02 +0000442 self.assertEquals(scm.revinfo(options, self.args, None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000443 '069c602044c5388d2d15c3f875b057c852003458')
444
445 def testStatusNew(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()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000449 file_path = gclient_scm.os.path.join(self.base_path, 'a')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000450 open(file_path, 'a').writelines('touched\n')
451 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
452 relpath=self.relpath)
453 file_list = []
454 scm.status(options, self.args, file_list)
455 self.assertEquals(file_list, [file_path])
456
457 def testStatus2New(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000458 if not self.enabled:
459 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000460 options = self.Options()
461 expected_file_list = []
462 for f in ['a', 'b']:
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000463 file_path = gclient_scm.os.path.join(self.base_path, f)
msb@chromium.orge28e4982009-09-25 20:51:45 +0000464 open(file_path, 'a').writelines('touched\n')
465 expected_file_list.extend([file_path])
466 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
467 relpath=self.relpath)
468 file_list = []
469 scm.status(options, self.args, file_list)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000470 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
471 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000472 self.assertEquals(sorted(file_list), expected_file_list)
473
474 def testUpdateCheckout(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000475 if not self.enabled:
476 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000477 options = self.Options(verbose=True)
478 root_dir = tempfile.mkdtemp()
479 relpath = 'foo'
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000480 base_path = gclient_scm.os.path.join(root_dir, relpath)
481 url = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
msb@chromium.orge28e4982009-09-25 20:51:45 +0000482 try:
483 scm = gclient_scm.CreateSCM(url=url, root_dir=root_dir,
484 relpath=relpath)
485 file_list = []
486 scm.update(options, (), file_list)
487 self.assertEquals(len(file_list), 2)
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000488 self.assert_(gclient_scm.os.path.isfile(
489 gclient_scm.os.path.join(base_path, 'a')))
msb@chromium.org0f282062009-11-06 20:14:02 +0000490 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000491 '069c602044c5388d2d15c3f875b057c852003458')
492 finally:
493 shutil.rmtree(root_dir)
494
495 def testUpdateUpdate(self):
maruel@chromium.orgea6c2c52009-10-09 20:38:14 +0000496 if not self.enabled:
497 return
msb@chromium.orge28e4982009-09-25 20:51:45 +0000498 options = self.Options()
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000499 expected_file_list = [gclient_scm.os.path.join(self.base_path, x)
500 for x in ['a', 'b']]
msb@chromium.orge28e4982009-09-25 20:51:45 +0000501 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
502 relpath=self.relpath)
503 file_list = []
504 scm.update(options, (), file_list)
msb@chromium.org0f282062009-11-06 20:14:02 +0000505 self.assertEquals(file_list, expected_file_list)
506 self.assertEquals(scm.revinfo(options, (), None),
msb@chromium.orge28e4982009-09-25 20:51:45 +0000507 'a7142dc9f0009350b96a11f372b6ea658592aa95')
508
msb@chromium.org0f282062009-11-06 20:14:02 +0000509 def testRevinfo(self):
510 if not self.enabled:
511 return
512 options = self.Options()
513 scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
514 relpath=self.relpath)
515 rev_info = scm.revinfo(options, (), None)
516 self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458')
517
msb@chromium.orge28e4982009-09-25 20:51:45 +0000518
msb@chromium.orge28e4982009-09-25 20:51:45 +0000519if __name__ == '__main__':
maruel@chromium.org8ef5f542009-11-12 02:05:02 +0000520 import unittest
msb@chromium.orge28e4982009-09-25 20:51:45 +0000521 unittest.main()
522
523# vim: ts=2:sw=2:tw=80:et: