Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: tests/gclient_test.py

Issue 113278: Simplify some functions by removing the options.stdout mock. Fix the unit tes... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools/
Patch Set: Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gclient.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # 2 #
3 # Copyright 2008-2009 Google Inc. All Rights Reserved. 3 # Copyright 2008-2009 Google Inc. All Rights Reserved.
4 # 4 #
5 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with 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 7 # You may obtain a copy of the License at
8 # 8 #
9 # http://www.apache.org/licenses/LICENSE-2.0 9 # http://www.apache.org/licenses/LICENSE-2.0
10 # 10 #
11 # Unless required by applicable law or agreed to in writing, software 11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, 12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and 14 # See the License for the specific language governing permissions and
15 # limitations under the License. 15 # limitations under the License.
16 16
17 """Unit tests for gclient.py.""" 17 """Unit tests for gclient.py."""
18 18
19 __author__ = 'stephen5.ng@gmail.com (Stephen Ng)' 19 __author__ = 'stephen5.ng@gmail.com (Stephen Ng)'
20 20
21 import __builtin__ 21 import __builtin__
22 import copy 22 import copy
23 import os 23 import os
24 import random 24 import random
25 import string 25 import string
26 import StringIO
26 import subprocess 27 import subprocess
27 import sys 28 import sys
28 import unittest 29 import unittest
29 30
30 directory, _file = os.path.split(__file__) 31 directory, _file = os.path.split(__file__)
31 if directory: 32 if directory:
32 directory += os.sep 33 directory += os.sep
33 sys.path.append(os.path.abspath(directory + '../pymox')) 34 sys.path.append(os.path.abspath(directory + '../pymox'))
34 35
35 import gclient 36 import gclient
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 class BaseTestCase(unittest.TestCase): 71 class BaseTestCase(unittest.TestCase):
71 # Like unittest's assertRaises, but checks for Gclient.Error. 72 # Like unittest's assertRaises, but checks for Gclient.Error.
72 def assertRaisesError(self, msg, fn, *args, **kwargs): 73 def assertRaisesError(self, msg, fn, *args, **kwargs):
73 try: 74 try:
74 fn(*args, **kwargs) 75 fn(*args, **kwargs)
75 except gclient.Error, e: 76 except gclient.Error, e:
76 self.assertEquals(e.args[0], msg) 77 self.assertEquals(e.args[0], msg)
77 else: 78 else:
78 self.fail('%s not raised' % msg) 79 self.fail('%s not raised' % msg)
79 80
81 def compareMembers(self, object, members):
82 """If you add a member, be sure to add the relevant test!"""
83 # Skip over members starting with '_' since they are usually not meant to
84 # be for public use.
85 actual_members = [x for x in sorted(dir(object))
86 if not x.startswith('_')]
87 expected_members = sorted(members)
88 if actual_members != expected_members:
89 diff = ([i for i in actual_members if i not in expected_members] +
90 [i for i in expected_members if i not in actual_members])
91 print diff
92 self.assertEqual(actual_members, expected_members)
93
94
95 class GClientBaseTestCase(BaseTestCase):
80 def Options(self, *args, **kwargs): 96 def Options(self, *args, **kwargs):
81 return self.OptionsObject(self, *args, **kwargs) 97 return self.OptionsObject(self, *args, **kwargs)
82 98
83 def setUp(self): 99 def setUp(self):
84 self.mox = mox.Mox() 100 self.mox = mox.Mox()
85 # Mock them to be sure nothing bad happens. 101 # Mock them to be sure nothing bad happens.
86 self._CaptureSVN = gclient.CaptureSVN 102 self._CaptureSVN = gclient.CaptureSVN
87 gclient.CaptureSVN = self.mox.CreateMockAnything() 103 gclient.CaptureSVN = self.mox.CreateMockAnything()
88 self._CaptureSVNInfo = gclient.CaptureSVNInfo 104 self._CaptureSVNInfo = gclient.CaptureSVNInfo
89 gclient.CaptureSVNInfo = self.mox.CreateMockAnything() 105 gclient.CaptureSVNInfo = self.mox.CreateMockAnything()
90 self._CaptureSVNStatus = gclient.CaptureSVNStatus 106 self._CaptureSVNStatus = gclient.CaptureSVNStatus
91 gclient.CaptureSVNStatus = self.mox.CreateMockAnything() 107 gclient.CaptureSVNStatus = self.mox.CreateMockAnything()
92 self._FileRead = gclient.FileRead 108 self._FileRead = gclient.FileRead
93 gclient.FileRead = self.mox.CreateMockAnything() 109 gclient.FileRead = self.mox.CreateMockAnything()
94 self._FileWrite = gclient.FileWrite 110 self._FileWrite = gclient.FileWrite
95 gclient.FileWrite = self.mox.CreateMockAnything() 111 gclient.FileWrite = self.mox.CreateMockAnything()
96 self._RemoveDirectory = gclient.RemoveDirectory 112 self._RemoveDirectory = gclient.RemoveDirectory
97 gclient.RemoveDirectory = self.mox.CreateMockAnything() 113 gclient.RemoveDirectory = self.mox.CreateMockAnything()
98 self._RunSVN = gclient.RunSVN 114 self._RunSVN = gclient.RunSVN
99 gclient.RunSVN = self.mox.CreateMockAnything() 115 gclient.RunSVN = self.mox.CreateMockAnything()
100 self._RunSVNAndGetFileList = gclient.RunSVNAndGetFileList 116 self._RunSVNAndGetFileList = gclient.RunSVNAndGetFileList
101 gclient.RunSVNAndGetFileList = self.mox.CreateMockAnything() 117 gclient.RunSVNAndGetFileList = self.mox.CreateMockAnything()
102 # Doesn't seem to work very well: 118 self._sys_stdout = gclient.sys.stdout
103 self._os = gclient.os 119 gclient.sys.stdout = self.mox.CreateMock(self._sys_stdout)
104 gclient.os = self.mox.CreateMock(os)
105 self._sys = gclient.sys
106 gclient.sys = self.mox.CreateMock(sys)
107 self._subprocess = gclient.subprocess 120 self._subprocess = gclient.subprocess
108 gclient.subprocess = self.mox.CreateMock(subprocess) 121 gclient.subprocess = self.mox.CreateMock(self._subprocess)
109 122
110 def tearDown(self): 123 def tearDown(self):
111 gclient.CaptureSVN = self._CaptureSVN 124 gclient.CaptureSVN = self._CaptureSVN
112 gclient.CaptureSVNInfo = self._CaptureSVNInfo 125 gclient.CaptureSVNInfo = self._CaptureSVNInfo
113 gclient.CaptureSVNStatus = self._CaptureSVNStatus 126 gclient.CaptureSVNStatus = self._CaptureSVNStatus
114 gclient.FileRead = self._FileRead 127 gclient.FileRead = self._FileRead
115 gclient.FileWrite = self._FileWrite 128 gclient.FileWrite = self._FileWrite
116 gclient.RemoveDirectory = self._RemoveDirectory 129 gclient.RemoveDirectory = self._RemoveDirectory
117 gclient.RunSVN = self._RunSVN 130 gclient.RunSVN = self._RunSVN
118 gclient.RunSVNAndGetFileList = self._RunSVNAndGetFileList 131 gclient.RunSVNAndGetFileList = self._RunSVNAndGetFileList
119 # Doesn't seem to work very well: 132 gclient.sys.stdout = self._sys_stdout
120 gclient.os = self._os
121 gclient.sys = self._sys
122 gclient.subprocess = self._subprocess 133 gclient.subprocess = self._subprocess
123 134
124 135
125 class GclientTestCase(BaseTestCase): 136 class GclientTestCase(GClientBaseTestCase):
126 class OptionsObject(object): 137 class OptionsObject(object):
127 def __init__(self, test_case, verbose=False, spec=None, 138 def __init__(self, test_case, verbose=False, spec=None,
128 config_filename='a_file_name', 139 config_filename='a_file_name',
129 entries_filename='a_entry_file_name', 140 entries_filename='a_entry_file_name',
130 deps_file='a_deps_file_name', force=False): 141 deps_file='a_deps_file_name', force=False):
131 self.verbose = verbose 142 self.verbose = verbose
132 self.spec = spec 143 self.spec = spec
133 self.config_filename = config_filename 144 self.config_filename = config_filename
134 self.entries_filename = entries_filename 145 self.entries_filename = entries_filename
135 self.deps_file = deps_file 146 self.deps_file = deps_file
136 self.force = force 147 self.force = force
137 self.revisions = [] 148 self.revisions = []
138 self.manually_grab_svn_rev = True 149 self.manually_grab_svn_rev = True
139 self.deps_os = None 150 self.deps_os = None
140 self.head = False 151 self.head = False
141 152
142 # Mox 153 # Mox
143 self.stdout = test_case.stdout
144 self.path_exists = test_case.path_exists 154 self.path_exists = test_case.path_exists
145 self.platform = test_case.platform 155 self.platform = test_case.platform
146 self.gclient = test_case.gclient 156 self.gclient = test_case.gclient
147 self.scm_wrapper = test_case.scm_wrapper 157 self.scm_wrapper = test_case.scm_wrapper
148 158
149 def setUp(self): 159 def setUp(self):
150 BaseTestCase.setUp(self) 160 GClientBaseTestCase.setUp(self)
151 self.stdout = self.mox.CreateMock(sys.stdout)
152 #self.subprocess = self.mox.CreateMock(subprocess) 161 #self.subprocess = self.mox.CreateMock(subprocess)
153 # Stub os.path.exists. 162 # Stub os.path.exists.
154 self.path_exists = self.mox.CreateMockAnything() 163 self.path_exists = self.mox.CreateMockAnything()
155 self.sys = self.mox.CreateMock(sys)
156 self.platform = 'darwin' 164 self.platform = 'darwin'
157 165
158 self.gclient = self.mox.CreateMock(gclient.GClient) 166 self.gclient = self.mox.CreateMock(gclient.GClient)
159 self.scm_wrapper = self.mox.CreateMock(gclient.SCMWrapper) 167 self.scm_wrapper = self.mox.CreateMock(gclient.SCMWrapper)
160 168
161 self.args = Args() 169 self.args = Args()
162 self.root_dir = Dir() 170 self.root_dir = Dir()
163 self.url = Url() 171 self.url = Url()
164 172
165 173
166 class GClientCommandsTestCase(BaseTestCase): 174 class GClientCommandsTestCase(GClientBaseTestCase):
167 def testCommands(self): 175 def testCommands(self):
168 known_commands = [gclient.DoCleanup, gclient.DoConfig, gclient.DoDiff, 176 known_commands = [gclient.DoCleanup, gclient.DoConfig, gclient.DoDiff,
169 gclient.DoHelp, gclient.DoStatus, gclient.DoUpdate, 177 gclient.DoHelp, gclient.DoStatus, gclient.DoUpdate,
170 gclient.DoRevert, gclient.DoRunHooks, gclient.DoRevInfo] 178 gclient.DoRevert, gclient.DoRunHooks, gclient.DoRevInfo]
171 for (k,v) in gclient.gclient_command_map.iteritems(): 179 for (k,v) in gclient.gclient_command_map.iteritems():
172 # If it fails, you need to add a test case for the new command. 180 # If it fails, you need to add a test case for the new command.
173 self.assert_(v in known_commands) 181 self.assert_(v in known_commands)
174 self.mox.ReplayAll() 182 self.mox.ReplayAll()
175 self.mox.VerifyAll() 183 self.mox.VerifyAll()
176 184
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 options.gclient.SaveConfig() 225 options.gclient.SaveConfig()
218 226
219 self.mox.ReplayAll() 227 self.mox.ReplayAll()
220 gclient.DoConfig(options, 228 gclient.DoConfig(options,
221 ('http://svn/url/the_name', 'other', 'args', 'ignored')) 229 ('http://svn/url/the_name', 'other', 'args', 'ignored'))
222 self.mox.VerifyAll() 230 self.mox.VerifyAll()
223 231
224 232
225 class TestDoHelp(GclientTestCase): 233 class TestDoHelp(GclientTestCase):
226 def testGetUsage(self): 234 def testGetUsage(self):
235 print(gclient.COMMAND_USAGE_TEXT['config'])
236 self.mox.ReplayAll()
227 options = self.Options() 237 options = self.Options()
228 print >> options.stdout, gclient.COMMAND_USAGE_TEXT['config']
229
230 self.mox.ReplayAll()
231 gclient.DoHelp(options, ('config',)) 238 gclient.DoHelp(options, ('config',))
232 self.mox.VerifyAll() 239 self.mox.VerifyAll()
233 240
234 def testTooManyArgs(self): 241 def testTooManyArgs(self):
242 self.mox.ReplayAll()
235 options = self.Options() 243 options = self.Options()
236 self.mox.ReplayAll()
237 self.assertRaisesError("unknown subcommand 'config'; see 'gclient help'", 244 self.assertRaisesError("unknown subcommand 'config'; see 'gclient help'",
238 gclient.DoHelp, options, ('config', 245 gclient.DoHelp, options, ('config',
239 'another argument')) 246 'another argument'))
240 self.mox.VerifyAll() 247 self.mox.VerifyAll()
241 248
242 def testUnknownSubcommand(self): 249 def testUnknownSubcommand(self):
250 self.mox.ReplayAll()
243 options = self.Options() 251 options = self.Options()
244 self.mox.ReplayAll()
245 self.assertRaisesError("unknown subcommand 'xyzzy'; see 'gclient help'", 252 self.assertRaisesError("unknown subcommand 'xyzzy'; see 'gclient help'",
246 gclient.DoHelp, options, ('xyzzy',)) 253 gclient.DoHelp, options, ('xyzzy',))
247 self.mox.VerifyAll() 254 self.mox.VerifyAll()
248 255
249 256
250 class GenericCommandTestCase(GclientTestCase): 257 class GenericCommandTestCase(GclientTestCase):
251 def ReturnValue(self, command, function, return_value): 258 def ReturnValue(self, command, function, return_value):
252 options = self.Options() 259 options = self.Options()
253 self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient) 260 self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient)
254 self.gclient.RunOnDeps(command, self.args).AndReturn(return_value) 261 self.gclient.RunOnDeps(command, self.args).AndReturn(return_value)
(...skipping 11 matching lines...) Expand all
266 self.assertRaisesError( 273 self.assertRaisesError(
267 "client not configured; see 'gclient config'", 274 "client not configured; see 'gclient config'",
268 function, options, self.args) 275 function, options, self.args)
269 self.mox.VerifyAll() 276 self.mox.VerifyAll()
270 277
271 def Verbose(self, command, function): 278 def Verbose(self, command, function):
272 options = self.Options(verbose=True) 279 options = self.Options(verbose=True)
273 self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient) 280 self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient)
274 text = "# Dummy content\nclient = 'my client'" 281 text = "# Dummy content\nclient = 'my client'"
275 self.gclient.ConfigContent().AndReturn(text) 282 self.gclient.ConfigContent().AndReturn(text)
276 print >>self.stdout, text 283 print(text)
277 self.gclient.RunOnDeps(command, self.args).AndReturn(0) 284 self.gclient.RunOnDeps(command, self.args).AndReturn(0)
278 285
279 self.mox.ReplayAll() 286 self.mox.ReplayAll()
280 result = function(options, self.args) 287 result = function(options, self.args)
281 self.assertEquals(result, 0) 288 self.assertEquals(result, 0)
282 self.mox.VerifyAll() 289 self.mox.VerifyAll()
283 290
284 class TestDoCleanup(GenericCommandTestCase): 291 class TestDoCleanup(GenericCommandTestCase):
285 def testGoodClient(self): 292 def testGoodClient(self):
286 self.ReturnValue('cleanup', gclient.DoCleanup, 0) 293 self.ReturnValue('cleanup', gclient.DoCleanup, 0)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 result = function(options, self.args) 331 result = function(options, self.args)
325 self.assertEquals(result, return_value) 332 self.assertEquals(result, return_value)
326 self.mox.VerifyAll() 333 self.mox.VerifyAll()
327 334
328 def Verbose(self, command, function): 335 def Verbose(self, command, function):
329 options = self.Options(verbose=True) 336 options = self.Options(verbose=True)
330 self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient) 337 self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient)
331 self.gclient.GetVar("solutions") 338 self.gclient.GetVar("solutions")
332 text = "# Dummy content\nclient = 'my client'" 339 text = "# Dummy content\nclient = 'my client'"
333 self.gclient.ConfigContent().AndReturn(text) 340 self.gclient.ConfigContent().AndReturn(text)
334 print >>self.stdout, text 341 print(text)
335 self.gclient.RunOnDeps(command, self.args).AndReturn(0) 342 self.gclient.RunOnDeps(command, self.args).AndReturn(0)
336 343
337 self.mox.ReplayAll() 344 self.mox.ReplayAll()
338 result = function(options, self.args) 345 result = function(options, self.args)
339 self.assertEquals(result, 0) 346 self.assertEquals(result, 0)
340 self.mox.VerifyAll() 347 self.mox.VerifyAll()
341 348
342 def Options(self, verbose=False, *args, **kwargs): 349 def Options(self, verbose=False, *args, **kwargs):
343 return self.OptionsObject(self, verbose=verbose, *args, **kwargs) 350 return self.OptionsObject(self, verbose=verbose, *args, **kwargs)
344 351
(...skipping 25 matching lines...) Expand all
370 def testBasic(self): 377 def testBasic(self):
371 self.ReturnValue('revert', gclient.DoRevert, 0) 378 self.ReturnValue('revert', gclient.DoRevert, 0)
372 def testError(self): 379 def testError(self):
373 self.ReturnValue('revert', gclient.DoRevert, 42) 380 self.ReturnValue('revert', gclient.DoRevert, 42)
374 def testBadClient(self): 381 def testBadClient(self):
375 self.BadClient(gclient.DoRevert) 382 self.BadClient(gclient.DoRevert)
376 383
377 384
378 class GClientClassTestCase(GclientTestCase): 385 class GClientClassTestCase(GclientTestCase):
379 def testDir(self): 386 def testDir(self):
380 members = ['ConfigContent', 'FromImpl', '_VarImpl', '_ParseAllDeps', 387 members = [
381 '_ParseSolutionDeps', 'GetVar', '_LoadConfig', 'LoadCurrentConfig', 388 'ConfigContent', 'FromImpl', 'GetVar', 'LoadCurrentConfig',
382 '_ReadEntries', '_RunHookAction', '_RunHooks', 'RunOnDeps', 'SaveConfig', 389 'RunOnDeps', 'SaveConfig', 'SetConfig', 'SetDefaultConfig',
383 '_SaveEntries', 'SetConfig', 'SetDefaultConfig', 'supported_commands', 390 'supported_commands', 'PrintRevInfo',
384 'PrintRevInfo'] 391 ]
385 392
386 # If you add a member, be sure to add the relevant test! 393 # If you add a member, be sure to add the relevant test!
387 actual_members = [x for x in sorted(dir(gclient.GClient)) 394 self.compareMembers(gclient.GClient('root_dir', 'options'), members)
388 if not x.startswith('__')]
389 self.assertEqual(actual_members, sorted(members))
390 self.mox.ReplayAll()
391 self.mox.VerifyAll()
392 395
393 def testSetConfig_ConfigContent_GetVar_SaveConfig_SetDefaultConfig(self): 396 def testSetConfig_ConfigContent_GetVar_SaveConfig_SetDefaultConfig(self):
394 options = self.Options() 397 options = self.Options()
395 text = "# Dummy content\nclient = 'my client'" 398 text = "# Dummy content\nclient = 'my client'"
396 gclient.FileWrite(os.path.join(self.root_dir, options.config_filename), 399 gclient.FileWrite(os.path.join(self.root_dir, options.config_filename),
397 text) 400 text)
398 401
399 self.mox.ReplayAll() 402 self.mox.ReplayAll()
400 client = gclient.GClient(self.root_dir, options) 403 client = gclient.GClient(self.root_dir, options)
401 client.SetConfig(text) 404 client.SetConfig(text)
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 727
725 self.mox.ReplayAll() 728 self.mox.ReplayAll()
726 client = gclient.GClient(self.root_dir, options) 729 client = gclient.GClient(self.root_dir, options)
727 client.SetConfig(gclient_config) 730 client.SetConfig(gclient_config)
728 client.RunOnDeps('update', self.args) 731 client.RunOnDeps('update', self.args)
729 self.mox.VerifyAll() 732 self.mox.VerifyAll()
730 733
731 def testRunOnDepsRevisions(self): 734 def testRunOnDepsRevisions(self):
732 def OptIsRev(options, rev): 735 def OptIsRev(options, rev):
733 if not options.revision == str(rev): 736 if not options.revision == str(rev):
734 print "options.revision = %s" % options.revision 737 print("options.revision = %s" % options.revision)
735 return options.revision == str(rev) 738 return options.revision == str(rev)
736 def OptIsRevNone(options): 739 def OptIsRevNone(options):
737 if options.revision: 740 if options.revision:
738 print "options.revision = %s" % options.revision 741 print("options.revision = %s" % options.revision)
739 return options.revision == None 742 return options.revision == None
740 def OptIsRev42(options): 743 def OptIsRev42(options):
741 return OptIsRev(options, 42) 744 return OptIsRev(options, 42)
742 def OptIsRev123(options): 745 def OptIsRev123(options):
743 return OptIsRev(options, 123) 746 return OptIsRev(options, 123)
744 def OptIsRev333(options): 747 def OptIsRev333(options):
745 return OptIsRev(options, 333) 748 return OptIsRev(options, 333)
746 749
747 # Fake .gclient file. 750 # Fake .gclient file.
748 gclient_config = """solutions = [ { 751 gclient_config = """solutions = [ {
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 def test_LoadConfig(self): 1054 def test_LoadConfig(self):
1052 pass 1055 pass
1053 def test_ReadEntries(self): 1056 def test_ReadEntries(self):
1054 pass 1057 pass
1055 def test_SaveEntries(self): 1058 def test_SaveEntries(self):
1056 pass 1059 pass
1057 def test_VarImpl(self): 1060 def test_VarImpl(self):
1058 pass 1061 pass
1059 1062
1060 1063
1061 class SCMWrapperTestCase(BaseTestCase): 1064 class SCMWrapperTestCase(GClientBaseTestCase):
1062 class OptionsObject(object): 1065 class OptionsObject(object):
1063 def __init__(self, test_case, verbose=False, revision=None): 1066 def __init__(self, test_case, verbose=False, revision=None):
1064 self.verbose = verbose 1067 self.verbose = verbose
1065 self.revision = revision 1068 self.revision = revision
1066 self.manually_grab_svn_rev = True 1069 self.manually_grab_svn_rev = True
1067 self.deps_os = None 1070 self.deps_os = None
1068 self.force = False 1071 self.force = False
1069 1072
1070 # Mox 1073 # Mox
1071 self.stdout = test_case.stdout
1072 self.path_exists = test_case.path_exists 1074 self.path_exists = test_case.path_exists
1073 1075
1074 def setUp(self): 1076 def setUp(self):
1075 BaseTestCase.setUp(self) 1077 GClientBaseTestCase.setUp(self)
1076 self.root_dir = Dir() 1078 self.root_dir = Dir()
1077 self.args = Args() 1079 self.args = Args()
1078 self.url = Url() 1080 self.url = Url()
1079 self.relpath = 'asf' 1081 self.relpath = 'asf'
1080 self.stdout = self.mox.CreateMock(sys.stdout)
1081 # Stub os.path.exists. 1082 # Stub os.path.exists.
1082 self.path_exists = self.mox.CreateMockAnything() 1083 self.path_exists = self.mox.CreateMockAnything()
1083 1084
1084 def testDir(self): 1085 def testDir(self):
1085 members = ['FullUrlForRelativeUrl', 'RunCommand', 1086 members = [
1086 'cleanup', 'diff', 'revert', 'status', 'update'] 1087 'FullUrlForRelativeUrl', 'RunCommand', 'cleanup', 'diff', 'relpath',
1088 'revert', 'scm_name', 'status', 'update', 'url',
1089 ]
1087 1090
1088 # If you add a member, be sure to add the relevant test! 1091 # If you add a member, be sure to add the relevant test!
1089 actual_members = [x for x in sorted(dir(gclient.SCMWrapper)) 1092 self.compareMembers(gclient.SCMWrapper(), members)
1090 if not x.startswith('__')]
1091 self.assertEqual(actual_members, sorted(members))
1092 self.mox.ReplayAll()
1093 self.mox.VerifyAll()
1094 1093
1095 def testFullUrlForRelativeUrl(self): 1094 def testFullUrlForRelativeUrl(self):
1096 self.url = 'svn://a/b/c/d' 1095 self.url = 'svn://a/b/c/d'
1097 1096
1098 self.mox.ReplayAll() 1097 self.mox.ReplayAll()
1099 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1098 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1100 relpath=self.relpath) 1099 relpath=self.relpath)
1101 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap') 1100 self.assertEqual(scm.FullUrlForRelativeUrl('/crap'), 'svn://a/b/crap')
1102 self.mox.VerifyAll() 1101 self.mox.VerifyAll()
1103 1102
(...skipping 14 matching lines...) Expand all
1118 # TODO(maruel): if ever used. 1117 # TODO(maruel): if ever used.
1119 pass 1118 pass
1120 1119
1121 def testRevertMissing(self): 1120 def testRevertMissing(self):
1122 options = self.Options(verbose=True) 1121 options = self.Options(verbose=True)
1123 gclient.os.path.isdir = self.mox.CreateMockAnything() 1122 gclient.os.path.isdir = self.mox.CreateMockAnything()
1124 base_path = os.path.join(self.root_dir, self.relpath) 1123 base_path = os.path.join(self.root_dir, self.relpath)
1125 gclient.os.path.isdir(base_path).AndReturn(False) 1124 gclient.os.path.isdir(base_path).AndReturn(False)
1126 # It'll to a checkout instead. 1125 # It'll to a checkout instead.
1127 options.path_exists(os.path.join(base_path, '.git')).AndReturn(False) 1126 options.path_exists(os.path.join(base_path, '.git')).AndReturn(False)
1128 print >>options.stdout, ("\n_____ %s is missing, synching instead" % 1127 print("\n_____ %s is missing, synching instead" % self.relpath)
1129 self.relpath)
1130 # Checkout. 1128 # Checkout.
1131 options.path_exists(base_path).AndReturn(False) 1129 options.path_exists(base_path).AndReturn(False)
1132 files_list = self.mox.CreateMockAnything() 1130 files_list = self.mox.CreateMockAnything()
1133 gclient.RunSVNAndGetFileList(options, ['checkout', self.url, base_path], 1131 gclient.RunSVNAndGetFileList(['checkout', self.url, base_path],
1134 self.root_dir, files_list) 1132 self.root_dir, files_list)
1135 1133
1136 self.mox.ReplayAll() 1134 self.mox.ReplayAll()
1137 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1135 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1138 relpath=self.relpath) 1136 relpath=self.relpath)
1139 scm.revert(options, self.args, files_list) 1137 scm.revert(options, self.args, files_list)
1140 self.mox.VerifyAll() 1138 self.mox.VerifyAll()
1141 gclient.os.path.isdir = os.path.isdir 1139 gclient.os.path.isdir = os.path.isdir
1142 1140
1143 def testRevertNone(self): 1141 def testRevertNone(self):
1144 options = self.Options(verbose=True) 1142 options = self.Options(verbose=True)
1145 base_path = os.path.join(self.root_dir, self.relpath) 1143 base_path = os.path.join(self.root_dir, self.relpath)
1146 gclient.os.path.isdir = self.mox.CreateMockAnything() 1144 gclient.os.path.isdir = self.mox.CreateMockAnything()
1147 gclient.os.path.isdir(base_path).AndReturn(True) 1145 gclient.os.path.isdir(base_path).AndReturn(True)
1148 gclient.CaptureSVNStatus(options, base_path).AndReturn([]) 1146 gclient.CaptureSVNStatus(base_path).AndReturn([])
1149 1147
1150 self.mox.ReplayAll() 1148 self.mox.ReplayAll()
1151 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1149 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1152 relpath=self.relpath) 1150 relpath=self.relpath)
1153 file_list = [] 1151 file_list = []
1154 scm.revert(options, self.args, file_list) 1152 scm.revert(options, self.args, file_list)
1155 self.mox.VerifyAll() 1153 self.mox.VerifyAll()
1156 gclient.os.path.isdir = os.path.isdir 1154 gclient.os.path.isdir = os.path.isdir
1157 1155
1158 def testRevert2Files(self): 1156 def testRevert2Files(self):
1159 options = self.Options(verbose=True) 1157 options = self.Options(verbose=True)
1160 base_path = os.path.join(self.root_dir, self.relpath) 1158 base_path = os.path.join(self.root_dir, self.relpath)
1161 gclient.os.path.isdir = self.mox.CreateMockAnything() 1159 gclient.os.path.isdir = self.mox.CreateMockAnything()
1162 gclient.os.path.isdir(base_path).AndReturn(True) 1160 gclient.os.path.isdir(base_path).AndReturn(True)
1163 items = [ 1161 items = [
1164 gclient.FileStatus('a', 'M', ' ', ' ', ' '), 1162 gclient.FileStatus('a', 'M', ' ', ' ', ' '),
1165 gclient.FileStatus('b', 'A', ' ', ' ', ' '), 1163 gclient.FileStatus('b', 'A', ' ', ' ', ' '),
1166 ] 1164 ]
1167 gclient.CaptureSVNStatus(options, base_path).AndReturn(items) 1165 gclient.CaptureSVNStatus(base_path).AndReturn(items)
1168 1166
1169 print >>options.stdout, os.path.join(base_path, 'a') 1167 print(os.path.join(base_path, 'a'))
1170 print >>options.stdout, os.path.join(base_path, 'b') 1168 print(os.path.join(base_path, 'b'))
1171 gclient.RunSVN(options, ['revert', 'a', 'b'], base_path) 1169 gclient.RunSVN(['revert', 'a', 'b'], base_path)
1172 1170
1173 self.mox.ReplayAll() 1171 self.mox.ReplayAll()
1174 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1172 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1175 relpath=self.relpath) 1173 relpath=self.relpath)
1176 file_list = [] 1174 file_list = []
1177 scm.revert(options, self.args, file_list) 1175 scm.revert(options, self.args, file_list)
1178 self.mox.VerifyAll() 1176 self.mox.VerifyAll()
1179 gclient.os.path.isdir = os.path.isdir 1177 gclient.os.path.isdir = os.path.isdir
1180 1178
1181 def testStatus(self): 1179 def testStatus(self):
1182 options = self.Options(verbose=True) 1180 options = self.Options(verbose=True)
1183 base_path = os.path.join(self.root_dir, self.relpath) 1181 base_path = os.path.join(self.root_dir, self.relpath)
1184 gclient.os.path.isdir = self.mox.CreateMockAnything() 1182 gclient.os.path.isdir = self.mox.CreateMockAnything()
1185 gclient.os.path.isdir(base_path).AndReturn(True) 1183 gclient.os.path.isdir(base_path).AndReturn(True)
1186 gclient.RunSVNAndGetFileList(options, ['status'] + self.args, base_path, 1184 gclient.RunSVNAndGetFileList(['status'] + self.args, base_path,
1187 []).AndReturn(None) 1185 []).AndReturn(None)
1188 1186
1189 self.mox.ReplayAll() 1187 self.mox.ReplayAll()
1190 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1188 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1191 relpath=self.relpath) 1189 relpath=self.relpath)
1192 file_list = [] 1190 file_list = []
1193 self.assertEqual(scm.status(options, self.args, file_list), None) 1191 self.assertEqual(scm.status(options, self.args, file_list), None)
1194 self.mox.VerifyAll() 1192 self.mox.VerifyAll()
1195 1193
1196 1194
1197 # TODO(maruel): TEST REVISIONS!!! 1195 # TODO(maruel): TEST REVISIONS!!!
1198 # TODO(maruel): TEST RELOCATE!!! 1196 # TODO(maruel): TEST RELOCATE!!!
1199 def testUpdateCheckout(self): 1197 def testUpdateCheckout(self):
1200 options = self.Options(verbose=True) 1198 options = self.Options(verbose=True)
1201 base_path = os.path.join(self.root_dir, self.relpath) 1199 base_path = os.path.join(self.root_dir, self.relpath)
1202 file_info = gclient.PrintableObject() 1200 file_info = gclient.PrintableObject()
1203 file_info.root = 'blah' 1201 file_info.root = 'blah'
1204 file_info.url = self.url 1202 file_info.url = self.url
1205 file_info.uuid = 'ABC' 1203 file_info.uuid = 'ABC'
1206 file_info.revision = 42 1204 file_info.revision = 42
1207 options.path_exists(os.path.join(base_path, '.git')).AndReturn(False) 1205 options.path_exists(os.path.join(base_path, '.git')).AndReturn(False)
1208 # Checkout. 1206 # Checkout.
1209 options.path_exists(base_path).AndReturn(False) 1207 options.path_exists(base_path).AndReturn(False)
1210 files_list = self.mox.CreateMockAnything() 1208 files_list = self.mox.CreateMockAnything()
1211 gclient.RunSVNAndGetFileList(options, ['checkout', self.url, base_path], 1209 gclient.RunSVNAndGetFileList(['checkout', self.url, base_path],
1212 self.root_dir, files_list) 1210 self.root_dir, files_list)
1213 self.mox.ReplayAll() 1211 self.mox.ReplayAll()
1214 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1212 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1215 relpath=self.relpath) 1213 relpath=self.relpath)
1216 scm.update(options, (), files_list) 1214 scm.update(options, (), files_list)
1217 self.mox.VerifyAll() 1215 self.mox.VerifyAll()
1218 1216
1219 def testUpdateUpdate(self): 1217 def testUpdateUpdate(self):
1220 options = self.Options(verbose=True) 1218 options = self.Options(verbose=True)
1221 base_path = os.path.join(self.root_dir, self.relpath) 1219 base_path = os.path.join(self.root_dir, self.relpath)
1222 options.force = True 1220 options.force = True
1223 file_info = { 1221 file_info = {
1224 'Repository Root': 'blah', 1222 'Repository Root': 'blah',
1225 'URL': self.url, 1223 'URL': self.url,
1226 'UUID': 'ABC', 1224 'UUID': 'ABC',
1227 'Revision': 42, 1225 'Revision': 42,
1228 } 1226 }
1229 options.path_exists(os.path.join(base_path, '.git')).AndReturn(False) 1227 options.path_exists(os.path.join(base_path, '.git')).AndReturn(False)
1230 # Checkout or update. 1228 # Checkout or update.
1231 options.path_exists(base_path).AndReturn(True) 1229 options.path_exists(base_path).AndReturn(True)
1232 gclient.CaptureSVNInfo(options, os.path.join(base_path, "."), '.' 1230 gclient.CaptureSVNInfo(os.path.join(base_path, "."), '.'
1233 ).AndReturn(file_info) 1231 ).AndReturn(file_info)
1234 # Cheat a bit here. 1232 # Cheat a bit here.
1235 gclient.CaptureSVNInfo(options, file_info['URL'], '.').AndReturn(file_info) 1233 gclient.CaptureSVNInfo(file_info['URL'], '.').AndReturn(file_info)
1236 additional_args = [] 1234 additional_args = []
1237 if options.manually_grab_svn_rev: 1235 if options.manually_grab_svn_rev:
1238 additional_args = ['--revision', str(file_info['Revision'])] 1236 additional_args = ['--revision', str(file_info['Revision'])]
1239 files_list = [] 1237 files_list = []
1240 gclient.RunSVNAndGetFileList(options, ['update', base_path] + additional_arg s, 1238 gclient.RunSVNAndGetFileList(['update', base_path] + additional_args,
1241 self.root_dir, files_list) 1239 self.root_dir, files_list)
1242 1240
1243 self.mox.ReplayAll() 1241 self.mox.ReplayAll()
1244 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1242 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1245 relpath=self.relpath) 1243 relpath=self.relpath)
1246 scm.update(options, (), files_list) 1244 scm.update(options, (), files_list)
1247 self.mox.VerifyAll() 1245 self.mox.VerifyAll()
1248 1246
1249 def testUpdateGit(self): 1247 def testUpdateGit(self):
1250 options = self.Options(verbose=True) 1248 options = self.Options(verbose=True)
1251 options.path_exists(os.path.join(self.root_dir, self.relpath, '.git') 1249 options.path_exists(os.path.join(self.root_dir, self.relpath, '.git')
1252 ).AndReturn(True) 1250 ).AndReturn(True)
1253 print >> options.stdout, ( 1251 print("________ found .git directory; skipping %s" % self.relpath)
1254 "________ found .git directory; skipping %s" % self.relpath)
1255 1252
1256 self.mox.ReplayAll() 1253 self.mox.ReplayAll()
1257 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir, 1254 scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
1258 relpath=self.relpath) 1255 relpath=self.relpath)
1259 file_list = [] 1256 file_list = []
1260 scm.update(options, self.args, file_list) 1257 scm.update(options, self.args, file_list)
1261 self.mox.VerifyAll() 1258 self.mox.VerifyAll()
1262 1259
1263 def testGetSVNFileInfo(self): 1260 def testGetSVNFileInfo(self):
1264 xml_text = r"""<?xml version="1.0"?> 1261 xml_text = r"""<?xml version="1.0"?>
1265 <info> 1262 <info>
1266 <entry kind="file" path="%s" revision="14628"> 1263 <entry kind="file" path="%s" revision="14628">
1267 <url>http://src.chromium.org/svn/trunk/src/chrome/app/d</url> 1264 <url>http://src.chromium.org/svn/trunk/src/chrome/app/d</url>
1268 <repository><root>http://src.chromium.org/svn</root></repository> 1265 <repository><root>http://src.chromium.org/svn</root></repository>
1269 <wc-info> 1266 <wc-info>
1270 <schedule>add</schedule> 1267 <schedule>add</schedule>
1271 <depth>infinity</depth> 1268 <depth>infinity</depth>
1272 <copy-from-url>http://src.chromium.org/svn/trunk/src/chrome/app/DEPS</copy-from- url> 1269 <copy-from-url>http://src.chromium.org/svn/trunk/src/chrome/app/DEPS</copy-from- url>
1273 <copy-from-rev>14628</copy-from-rev> 1270 <copy-from-rev>14628</copy-from-rev>
1274 <checksum>369f59057ba0e6d9017e28f8bdfb1f43</checksum> 1271 <checksum>369f59057ba0e6d9017e28f8bdfb1f43</checksum>
1275 </wc-info> 1272 </wc-info>
1276 </entry> 1273 </entry>
1277 </info> 1274 </info>
1278 """ % self.url 1275 """ % self.url
1279 options = self.Options(verbose=True) 1276 gclient.CaptureSVN(['info', '--xml', self.url], '.').AndReturn(xml_text)
1280 gclient.CaptureSVN(options, ['info', '--xml', self.url],
1281 '.').AndReturn(xml_text)
1282 expected = { 1277 expected = {
1283 'URL': 'http://src.chromium.org/svn/trunk/src/chrome/app/d', 1278 'URL': 'http://src.chromium.org/svn/trunk/src/chrome/app/d',
1284 'UUID': None, 1279 'UUID': None,
1285 'Repository Root': 'http://src.chromium.org/svn', 1280 'Repository Root': 'http://src.chromium.org/svn',
1286 'Schedule': 'add', 1281 'Schedule': 'add',
1287 'Copied From URL': 'http://src.chromium.org/svn/trunk/src/chrome/app/DEPS' , 1282 'Copied From URL': 'http://src.chromium.org/svn/trunk/src/chrome/app/DEPS' ,
1288 'Copied From Rev': '14628', 1283 'Copied From Rev': '14628',
1289 'Path': self.url, 1284 'Path': self.url,
1290 'Revision': 14628, 1285 'Revision': 14628,
1291 'Node Kind': 'file', 1286 'Node Kind': 'file',
1292 } 1287 }
1293 self.mox.ReplayAll() 1288 self.mox.ReplayAll()
1294 file_info = self._CaptureSVNInfo(options, self.url, '.') 1289 file_info = self._CaptureSVNInfo(self.url, '.')
1295 self.assertEquals(sorted(file_info.items()), sorted(expected.items())) 1290 self.assertEquals(sorted(file_info.items()), sorted(expected.items()))
1296 self.mox.VerifyAll() 1291 self.mox.VerifyAll()
1297 1292
1298 def testCaptureSvnInfo(self): 1293 def testCaptureSvnInfo(self):
1299 xml_text = """<?xml version="1.0"?> 1294 xml_text = """<?xml version="1.0"?>
1300 <info> 1295 <info>
1301 <entry 1296 <entry
1302 kind="dir" 1297 kind="dir"
1303 path="." 1298 path="."
1304 revision="35"> 1299 revision="35">
1305 <url>%s</url> 1300 <url>%s</url>
1306 <repository> 1301 <repository>
1307 <root>%s</root> 1302 <root>%s</root>
1308 <uuid>7b9385f5-0452-0410-af26-ad4892b7a1fb</uuid> 1303 <uuid>7b9385f5-0452-0410-af26-ad4892b7a1fb</uuid>
1309 </repository> 1304 </repository>
1310 <wc-info> 1305 <wc-info>
1311 <schedule>normal</schedule> 1306 <schedule>normal</schedule>
1312 <depth>infinity</depth> 1307 <depth>infinity</depth>
1313 </wc-info> 1308 </wc-info>
1314 <commit 1309 <commit
1315 revision="35"> 1310 revision="35">
1316 <author>maruel</author> 1311 <author>maruel</author>
1317 <date>2008-12-04T20:12:19.685120Z</date> 1312 <date>2008-12-04T20:12:19.685120Z</date>
1318 </commit> 1313 </commit>
1319 </entry> 1314 </entry>
1320 </info> 1315 </info>
1321 """ % (self.url, self.root_dir) 1316 """ % (self.url, self.root_dir)
1322 options = self.Options(verbose=True) 1317 gclient.CaptureSVN(['info', '--xml', self.url], '.').AndReturn(xml_text)
1323 gclient.CaptureSVN(options, ['info', '--xml', self.url],
1324 '.').AndReturn(xml_text)
1325 self.mox.ReplayAll() 1318 self.mox.ReplayAll()
1326 file_info = self._CaptureSVNInfo(options, self.url, '.') 1319 file_info = self._CaptureSVNInfo(self.url, '.')
1327 expected = { 1320 expected = {
1328 'URL': self.url, 1321 'URL': self.url,
1329 'UUID': '7b9385f5-0452-0410-af26-ad4892b7a1fb', 1322 'UUID': '7b9385f5-0452-0410-af26-ad4892b7a1fb',
1330 'Revision': 35, 1323 'Revision': 35,
1331 'Repository Root': self.root_dir, 1324 'Repository Root': self.root_dir,
1332 'Schedule': 'normal', 1325 'Schedule': 'normal',
1333 'Copied From URL': None, 1326 'Copied From URL': None,
1334 'Copied From Rev': None, 1327 'Copied From Rev': None,
1335 'Path': '.', 1328 'Path': '.',
1336 'Node Kind': 'dir', 1329 'Node Kind': 'dir',
1337 } 1330 }
1338 self.assertEqual(file_info, expected) 1331 self.assertEqual(file_info, expected)
1339 self.mox.VerifyAll() 1332 self.mox.VerifyAll()
1340 1333
1341 1334
1335 class RunSVNTestCase(BaseTestCase):
1336 def setUp(self):
1337 self.mox = mox.Mox()
1338 self._OldSubprocessCall = gclient.SubprocessCall
1339 gclient.SubprocessCall = self.mox.CreateMockAnything()
1340
1341 def tearDown(self):
1342 gclient.SubprocessCall = self._OldSubprocessCall
1343
1344 def testRunSVN(self):
1345 param2 = 'bleh'
1346 gclient.SubprocessCall(['svn', 'foo', 'bar'], param2).AndReturn(None)
1347 self.mox.ReplayAll()
1348 gclient.RunSVN(['foo', 'bar'], param2)
1349 self.mox.VerifyAll()
1350
1351
1352 class SubprocessCallAndCaptureTestCase(BaseTestCase):
1353 def setUp(self):
1354 self.mox = mox.Mox()
1355 self._sys_stdout = gclient.sys.stdout
1356 gclient.sys.stdout = self.mox.CreateMock(self._sys_stdout)
1357 self._subprocess_Popen = gclient.subprocess.Popen
1358 gclient.subprocess.Popen = self.mox.CreateMockAnything()
1359
1360 def tearDown(self):
1361 gclient.sys.stdout = self._sys_stdout
1362 gclient.subprocess.Popen = self._subprocess_Popen
1363
1364 def testSubprocessCallAndCapture(self):
1365 command = ['boo', 'foo', 'bar']
1366 in_directory = 'bleh'
1367 fail_status = None
1368 pattern = 'a(.*)b'
1369 test_string = 'ahah\naccb\nallo\naddb\n'
1370 class Mock(object):
1371 stdout = StringIO.StringIO(test_string)
1372 def wait(self):
1373 pass
1374 kid = Mock()
1375 print("\n________ running 'boo foo bar' in 'bleh'")
1376 for i in test_string:
1377 sys.stdout.write(i)
1378 gclient.subprocess.Popen(command, bufsize=0, cwd=in_directory,
1379 shell=(sys.platform == 'win32'),
1380 stdout=gclient.subprocess.PIPE).AndReturn(kid)
1381 self.mox.ReplayAll()
1382 capture_list = []
1383 gclient.SubprocessCallAndCapture(command, in_directory, fail_status,
1384 pattern, capture_list)
1385 self.assertEquals(capture_list, ['cc', 'dd'])
1386 self.mox.VerifyAll()
1387
1388
1342 if __name__ == '__main__': 1389 if __name__ == '__main__':
1343 unittest.main() 1390 unittest.main()
1344 1391
1345 # vim: ts=2:sw=2:tw=80:et: 1392 # vim: ts=2:sw=2:tw=80:et:
OLDNEW
« no previous file with comments | « gclient.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698