OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/python |
| 2 # 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. |
| 5 |
| 6 """Unit tests for gclient.py.""" |
| 7 |
| 8 # Fixes include path. |
| 9 from super_mox import mox, SuperMoxTestBase |
| 10 |
| 11 import gclient |
| 12 |
| 13 |
| 14 class BaseTestCase(SuperMoxTestBase): |
| 15 # Like unittest's assertRaises, but checks for Gclient.Error. |
| 16 def assertRaisesError(self, msg, fn, *args, **kwargs): |
| 17 try: |
| 18 fn(*args, **kwargs) |
| 19 except gclient.gclient_utils.Error, e: |
| 20 self.assertEquals(e.args[0], msg) |
| 21 else: |
| 22 self.fail('%s not raised' % msg) |
| 23 |
| 24 |
| 25 class GClientBaseTestCase(BaseTestCase): |
| 26 def Options(self, *args, **kwargs): |
| 27 return self.OptionsObject(self, *args, **kwargs) |
| 28 |
| 29 def setUp(self): |
| 30 BaseTestCase.setUp(self) |
| 31 # These are not tested. |
| 32 self.mox.StubOutWithMock(gclient.gclient_utils, 'FileRead') |
| 33 self.mox.StubOutWithMock(gclient.gclient_utils, 'FileWrite') |
| 34 self.mox.StubOutWithMock(gclient.gclient_utils, 'SubprocessCall') |
| 35 self.mox.StubOutWithMock(gclient.gclient_utils, 'RemoveDirectory') |
| 36 # Mock them to be sure nothing bad happens. |
| 37 self.mox.StubOutWithMock(gclient.gclient_scm.scm.SVN, 'Capture') |
| 38 self.mox.StubOutWithMock(gclient.gclient_scm.scm.SVN, 'CaptureInfo') |
| 39 self.mox.StubOutWithMock(gclient.gclient_scm.scm.SVN, 'CaptureStatus') |
| 40 self.mox.StubOutWithMock(gclient.gclient_scm.scm.SVN, 'Run') |
| 41 self.mox.StubOutWithMock(gclient.gclient_scm.scm.SVN, 'RunAndGetFileList') |
| 42 self._gclient_gclient = gclient.GClient |
| 43 gclient.GClient = self.mox.CreateMockAnything() |
| 44 gclient.GClient.DEPS_FILE = self._gclient_gclient.DEPS_FILE |
| 45 gclient.GClient.DEFAULT_CLIENT_FILE_TEXT = ( |
| 46 self._gclient_gclient.DEFAULT_CLIENT_FILE_TEXT) |
| 47 self._scm_wrapper = gclient.gclient_scm.CreateSCM |
| 48 gclient.gclient_scm.CreateSCM = self.mox.CreateMockAnything() |
| 49 |
| 50 def tearDown(self): |
| 51 gclient.GClient = self._gclient_gclient |
| 52 gclient.gclient_scm.CreateSCM = self._scm_wrapper |
| 53 BaseTestCase.tearDown(self) |
| 54 |
| 55 |
| 56 class GclientTestCase(GClientBaseTestCase): |
| 57 class OptionsObject(object): |
| 58 def __init__(self, test_case, verbose=0, spec=None, |
| 59 config_filename='a_file_name', |
| 60 entries_filename='a_entry_file_name', |
| 61 force=False, nohooks=False): |
| 62 self.verbose = verbose |
| 63 self.config_filename = config_filename |
| 64 self.entries_filename = entries_filename |
| 65 self.spec = spec |
| 66 self.name = None |
| 67 self.force = force |
| 68 self.nohooks = nohooks |
| 69 self.revisions = [] |
| 70 self.manually_grab_svn_rev = True |
| 71 self.deps_os = None |
| 72 self.head = False |
| 73 |
| 74 def setUp(self): |
| 75 GClientBaseTestCase.setUp(self) |
| 76 self.args = self.Args() |
| 77 self.root_dir = self.Dir() |
| 78 self.url = self.Url() |
| 79 |
| 80 |
| 81 class GClientCommandsTestCase(GClientBaseTestCase): |
| 82 def testCommands(self): |
| 83 known_commands = [gclient.CMDcleanup, gclient.CMDconfig, gclient.CMDdiff, |
| 84 gclient.CMDexport, gclient.CMDhelp, gclient.CMDpack, |
| 85 gclient.CMDrevert, gclient.CMDrevinfo, |
| 86 gclient.CMDrunhooks, gclient.CMDstatus, gclient.CMDsync, |
| 87 gclient.CMDupdate] |
| 88 cmds = [getattr(gclient, x) for x in dir(gclient) if x.startswith('CMD')] |
| 89 self.assertEquals(len(known_commands), len(cmds)) |
| 90 for v in cmds: |
| 91 # If it fails, you need to add a test case for the new command. |
| 92 self.assert_(v in known_commands) |
| 93 self.mox.ReplayAll() |
| 94 |
| 95 class TestCMDconfig(GclientTestCase): |
| 96 def testMissingArgument(self): |
| 97 exception_msg = "required argument missing; see 'gclient help config'" |
| 98 |
| 99 self.mox.ReplayAll() |
| 100 self.assertRaisesError(exception_msg, gclient.CMDconfig, None, |
| 101 self.Options(), ()) |
| 102 |
| 103 def testExistingClientFile(self): |
| 104 options = self.Options() |
| 105 exception_msg = ('%s file already exists in the current directory' % |
| 106 options.config_filename) |
| 107 gclient.os.path.exists(options.config_filename).AndReturn(True) |
| 108 |
| 109 self.mox.ReplayAll() |
| 110 self.assertRaisesError(exception_msg, gclient.CMDconfig, None, options, |
| 111 (1,)) |
| 112 |
| 113 def testFromText(self): |
| 114 options = self.Options(spec='config_source_content') |
| 115 gclient.os.path.exists(options.config_filename).AndReturn(False) |
| 116 gclient.GClient('.', options).AndReturn(gclient.GClient) |
| 117 gclient.GClient.SetConfig(options.spec) |
| 118 gclient.GClient.SaveConfig() |
| 119 |
| 120 self.mox.ReplayAll() |
| 121 gclient.CMDconfig(None, options, (1,),) |
| 122 |
| 123 def testCreateClientFile(self): |
| 124 options = self.Options() |
| 125 gclient.os.path.exists(options.config_filename).AndReturn(False) |
| 126 gclient.GClient('.', options).AndReturn(gclient.GClient) |
| 127 gclient.GClient.SetDefaultConfig('the_name', 'http://svn/url/the_name', |
| 128 'other') |
| 129 gclient.GClient.SaveConfig() |
| 130 |
| 131 self.mox.ReplayAll() |
| 132 gclient.CMDconfig(None, options, |
| 133 ('http://svn/url/the_name', 'other', 'args', 'ignored')) |
| 134 |
| 135 |
| 136 class GenericCommandTestCase(GclientTestCase): |
| 137 def ReturnValue(self, command, return_value): |
| 138 options = self.Options() |
| 139 gclient.GClient.LoadCurrentConfig(options).AndReturn(gclient.GClient) |
| 140 gclient.GClient.RunOnDeps(command, self.args).AndReturn(return_value) |
| 141 |
| 142 self.mox.ReplayAll() |
| 143 function = getattr(gclient, 'CMD' + command) |
| 144 result = function(None, options, self.args) |
| 145 self.assertEquals(result, return_value) |
| 146 |
| 147 def BadClient(self, command): |
| 148 options = self.Options() |
| 149 gclient.GClient.LoadCurrentConfig(options).AndReturn(None) |
| 150 |
| 151 self.mox.ReplayAll() |
| 152 function = getattr(gclient, 'CMD' + command) |
| 153 self.assertRaisesError( |
| 154 "client not configured; see 'gclient config'", |
| 155 function, None, options, self.args) |
| 156 |
| 157 def Verbose(self, command): |
| 158 options = self.Options(verbose=True) |
| 159 gclient.GClient.LoadCurrentConfig(options).AndReturn(gclient.GClient) |
| 160 text = "# Dummy content\nclient = 'my client'" |
| 161 gclient.GClient.ConfigContent().AndReturn(text) |
| 162 print(text) |
| 163 gclient.GClient.RunOnDeps(command, self.args).AndReturn(0) |
| 164 |
| 165 self.mox.ReplayAll() |
| 166 function = getattr(gclient, 'CMD' + command) |
| 167 result = function(None, options, self.args) |
| 168 self.assertEquals(result, 0) |
| 169 |
| 170 |
| 171 class TestCMDcleanup(GenericCommandTestCase): |
| 172 def testGoodClient(self): |
| 173 self.ReturnValue('cleanup', 0) |
| 174 def testError(self): |
| 175 self.ReturnValue('cleanup', 42) |
| 176 def testBadClient(self): |
| 177 self.BadClient('cleanup') |
| 178 |
| 179 |
| 180 class TestCMDstatus(GenericCommandTestCase): |
| 181 def testGoodClient(self): |
| 182 self.ReturnValue('status', 0) |
| 183 def testError(self): |
| 184 self.ReturnValue('status', 42) |
| 185 def testBadClient(self): |
| 186 self.BadClient('status') |
| 187 |
| 188 |
| 189 class TestCMDrunhooks(GenericCommandTestCase): |
| 190 def Options(self, verbose=False, *args, **kwargs): |
| 191 return self.OptionsObject(self, verbose=verbose, *args, **kwargs) |
| 192 |
| 193 def testGoodClient(self): |
| 194 self.ReturnValue('runhooks', 0) |
| 195 def testError(self): |
| 196 self.ReturnValue('runhooks', 42) |
| 197 def testBadClient(self): |
| 198 self.BadClient('runhooks') |
| 199 |
| 200 |
| 201 class TestCMDupdate(GenericCommandTestCase): |
| 202 def ReturnValue(self, command, return_value): |
| 203 options = self.Options() |
| 204 gclient.GClient.LoadCurrentConfig(options).AndReturn(gclient.GClient) |
| 205 gclient.GClient.GetVar("solutions") |
| 206 gclient.GClient.RunOnDeps(command, self.args).AndReturn(return_value) |
| 207 |
| 208 self.mox.ReplayAll() |
| 209 function = getattr(gclient, 'CMD' + command) |
| 210 result = function(None, options, self.args) |
| 211 self.assertEquals(result, return_value) |
| 212 |
| 213 def Verbose(self, command): |
| 214 options = self.Options(verbose=True) |
| 215 gclient.GClient.LoadCurrentConfig(options).AndReturn(gclient.GClient) |
| 216 gclient.GClient.GetVar("solutions") |
| 217 text = "# Dummy content\nclient = 'my client'" |
| 218 gclient.GClient.ConfigContent().AndReturn(text) |
| 219 print(text) |
| 220 gclient.GClient.RunOnDeps(command, self.args).AndReturn(0) |
| 221 |
| 222 self.mox.ReplayAll() |
| 223 function = getattr(gclient, 'CMD' + command) |
| 224 result = function(None, options, self.args) |
| 225 self.assertEquals(result, 0) |
| 226 |
| 227 def Options(self, verbose=False, *args, **kwargs): |
| 228 return self.OptionsObject(self, verbose=verbose, *args, **kwargs) |
| 229 |
| 230 def testBasic(self): |
| 231 self.ReturnValue('update', 0) |
| 232 def testError(self): |
| 233 self.ReturnValue('update', 42) |
| 234 def testBadClient(self): |
| 235 self.BadClient('update') |
| 236 def testVerbose(self): |
| 237 self.Verbose('update') |
| 238 |
| 239 |
| 240 class TestCMDdiff(GenericCommandTestCase): |
| 241 def Options(self, *args, **kwargs): |
| 242 return self.OptionsObject(self, *args, **kwargs) |
| 243 |
| 244 def testBasic(self): |
| 245 self.ReturnValue('diff', 0) |
| 246 def testError(self): |
| 247 self.ReturnValue('diff', 42) |
| 248 def testBadClient(self): |
| 249 self.BadClient('diff') |
| 250 def testVerbose(self): |
| 251 self.Verbose('diff') |
| 252 |
| 253 |
| 254 class TestCMDexport(GenericCommandTestCase): |
| 255 def testBasic(self): |
| 256 self.args = ['dir'] |
| 257 self.ReturnValue('export', 0) |
| 258 def testError(self): |
| 259 self.args = ['dir'] |
| 260 self.ReturnValue('export', 42) |
| 261 def testBadClient(self): |
| 262 self.args = ['dir'] |
| 263 self.BadClient('export') |
| 264 |
| 265 |
| 266 class TestCMDpack(GenericCommandTestCase): |
| 267 def Options(self, *args, **kwargs): |
| 268 return self.OptionsObject(self, *args, **kwargs) |
| 269 |
| 270 def testBasic(self): |
| 271 self.ReturnValue('pack', 0) |
| 272 def testError(self): |
| 273 self.ReturnValue('pack', 42) |
| 274 def testBadClient(self): |
| 275 self.BadClient('pack') |
| 276 |
| 277 |
| 278 class TestCMDrevert(GenericCommandTestCase): |
| 279 def testBasic(self): |
| 280 self.ReturnValue('revert', 0) |
| 281 def testError(self): |
| 282 self.ReturnValue('revert', 42) |
| 283 def testBadClient(self): |
| 284 self.BadClient('revert') |
| 285 |
| 286 |
| 287 class GClientClassTestCase(GclientTestCase): |
| 288 def testDir(self): |
| 289 members = [ |
| 290 'ConfigContent', 'DEFAULT_CLIENT_FILE_TEXT', |
| 291 'DEFAULT_SNAPSHOT_FILE_TEXT', 'DEFAULT_SNAPSHOT_SOLUTION_TEXT', |
| 292 'DEPS_FILE', 'FileImpl', 'FromImpl', 'GetVar', 'LoadCurrentConfig', |
| 293 'PrintRevInfo', 'RunOnDeps', 'SaveConfig', 'SetConfig', |
| 294 'SetDefaultConfig', |
| 295 'deps_os_choices', 'supported_commands', |
| 296 ] |
| 297 |
| 298 # If you add a member, be sure to add the relevant test! |
| 299 self.compareMembers(self._gclient_gclient('root_dir', 'options'), members) |
| 300 |
| 301 def testSetConfig_ConfigContent_GetVar_SaveConfig_SetDefaultConfig(self): |
| 302 options = self.Options() |
| 303 text = "# Dummy content\nclient = 'my client'" |
| 304 gclient.gclient_utils.FileWrite( |
| 305 gclient.os.path.join(self.root_dir, options.config_filename), |
| 306 text) |
| 307 |
| 308 self.mox.ReplayAll() |
| 309 client = self._gclient_gclient(self.root_dir, options) |
| 310 client.SetConfig(text) |
| 311 self.assertEqual(client.ConfigContent(), text) |
| 312 self.assertEqual(client.GetVar('client'), 'my client') |
| 313 self.assertEqual(client.GetVar('foo'), None) |
| 314 client.SaveConfig() |
| 315 |
| 316 solution_name = 'solution name' |
| 317 solution_url = 'solution url' |
| 318 safesync_url = 'safesync url' |
| 319 default_text = gclient.GClient.DEFAULT_CLIENT_FILE_TEXT % { |
| 320 'solution_name' : solution_name, |
| 321 'solution_url' : solution_url, |
| 322 'safesync_url' : safesync_url |
| 323 } |
| 324 client.SetDefaultConfig(solution_name, solution_url, safesync_url) |
| 325 self.assertEqual(client.ConfigContent(), default_text) |
| 326 solutions = [{ |
| 327 'name': solution_name, |
| 328 'url': solution_url, |
| 329 'custom_deps': {}, |
| 330 'safesync_url': safesync_url |
| 331 }] |
| 332 self.assertEqual(client.GetVar('solutions'), solutions) |
| 333 self.assertEqual(client.GetVar('foo'), None) |
| 334 |
| 335 def testLoadCurrentConfig(self): |
| 336 options = self.Options() |
| 337 gclient.os.path.realpath(self.root_dir).AndReturn(self.root_dir) |
| 338 gclient.os.path.exists( |
| 339 gclient.os.path.join(self.root_dir, options.config_filename) |
| 340 ).AndReturn(True) |
| 341 gclient.GClient(self.root_dir, options).AndReturn(gclient.GClient) |
| 342 gclient.GClient._LoadConfig() |
| 343 |
| 344 self.mox.ReplayAll() |
| 345 client = self._gclient_gclient.LoadCurrentConfig(options, self.root_dir) |
| 346 |
| 347 def testRunOnDepsNoDeps(self): |
| 348 solution_name = 'testRunOnDepsNoDeps_solution_name' |
| 349 gclient_config = ( |
| 350 "solutions = [ {\n" |
| 351 " 'name': '%s',\n" |
| 352 " 'url': '%s',\n" |
| 353 " 'custom_deps': {},\n" |
| 354 "} ]\n" |
| 355 ) % (solution_name, self.url) |
| 356 |
| 357 # pprint.pformat() is non-deterministic in this case!! |
| 358 entries_content = ( |
| 359 "entries = \\\n" |
| 360 "{ '%s': '%s'}\n" |
| 361 ) % (solution_name, self.url) |
| 362 |
| 363 options = self.Options() |
| 364 |
| 365 checkout_path = gclient.os.path.join(self.root_dir, solution_name) |
| 366 gclient.os.path.exists(gclient.os.path.join(checkout_path, '.git') |
| 367 ).AndReturn(False) |
| 368 # Expect a check for the entries file and we say there is not one. |
| 369 gclient.os.path.exists( |
| 370 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 371 ).AndReturn(False) |
| 372 |
| 373 # An scm will be requested for the solution. |
| 374 scm_wrapper_sol = self.mox.CreateMockAnything() |
| 375 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, solution_name |
| 376 ).AndReturn(scm_wrapper_sol) |
| 377 # Then an update will be performed. |
| 378 scm_wrapper_sol.RunCommand('update', options, self.args, []) |
| 379 # Then an attempt will be made to read its DEPS file. |
| 380 gclient.gclient_utils.FileRead( |
| 381 gclient.os.path.join(self.root_dir, solution_name, |
| 382 gclient.GClient.DEPS_FILE) |
| 383 ).AndRaise(IOError(2, 'No DEPS file')) |
| 384 |
| 385 # After everything is done, an attempt is made to write an entries |
| 386 # file. |
| 387 gclient.gclient_utils.FileWrite( |
| 388 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 389 entries_content) |
| 390 |
| 391 self.mox.ReplayAll() |
| 392 client = self._gclient_gclient(self.root_dir, options) |
| 393 client.SetConfig(gclient_config) |
| 394 client.RunOnDeps('update', self.args) |
| 395 |
| 396 def testRunOnDepsRelativePaths(self): |
| 397 solution_name = 'testRunOnDepsRelativePaths_solution_name' |
| 398 gclient_config = ( |
| 399 "solutions = [ {\n" |
| 400 " 'name': '%s',\n" |
| 401 " 'url': '%s',\n" |
| 402 " 'custom_deps': {},\n" |
| 403 "} ]\n" |
| 404 ) % (solution_name, self.url) |
| 405 |
| 406 deps = ( |
| 407 "use_relative_paths = True\n" |
| 408 "deps = {\n" |
| 409 " 'src/t': 'svn://scm.t/trunk',\n" |
| 410 "}\n") |
| 411 entry_path = gclient.os.path.join(solution_name, 'src', 't' |
| 412 ).replace('\\', '\\\\') |
| 413 entries_content = ( |
| 414 "entries = \\\n" |
| 415 "{ '%s': '%s',\n" |
| 416 " '%s': 'svn://scm.t/trunk'}\n" |
| 417 ) % (solution_name, self.url, entry_path) |
| 418 |
| 419 scm_wrapper_sol = self.mox.CreateMockAnything() |
| 420 scm_wrapper_t = self.mox.CreateMockAnything() |
| 421 |
| 422 options = self.Options() |
| 423 |
| 424 gclient.os.path.exists( |
| 425 gclient.os.path.join(self.root_dir, solution_name, 'src', 't', '.git') |
| 426 ).AndReturn(False) |
| 427 gclient.os.path.exists( |
| 428 gclient.os.path.join(self.root_dir, solution_name, '.git') |
| 429 ).AndReturn(False) |
| 430 # Expect a check for the entries file and we say there is not one. |
| 431 gclient.os.path.exists( |
| 432 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 433 ).AndReturn(False) |
| 434 |
| 435 # An scm will be requested for the solution. |
| 436 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, solution_name |
| 437 ).AndReturn(scm_wrapper_sol) |
| 438 # Then an update will be performed. |
| 439 scm_wrapper_sol.RunCommand('update', options, self.args, []) |
| 440 # Then an attempt will be made to read its DEPS file. |
| 441 gclient.gclient_utils.FileRead( |
| 442 gclient.os.path.join(self.root_dir, solution_name, |
| 443 gclient.GClient.DEPS_FILE) |
| 444 ).AndReturn(deps) |
| 445 |
| 446 # Next we expect an scm to be request for dep src/t but it should |
| 447 # use the url specified in deps and the relative path should now |
| 448 # be relative to the DEPS file. |
| 449 gclient.gclient_scm.CreateSCM( |
| 450 'svn://scm.t/trunk', |
| 451 self.root_dir, |
| 452 gclient.os.path.join(solution_name, "src", "t") |
| 453 ).AndReturn(scm_wrapper_t) |
| 454 scm_wrapper_t.RunCommand('update', options, self.args, []) |
| 455 |
| 456 # After everything is done, an attempt is made to write an entries |
| 457 # file. |
| 458 gclient.gclient_utils.FileWrite( |
| 459 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 460 entries_content) |
| 461 |
| 462 self.mox.ReplayAll() |
| 463 client = self._gclient_gclient(self.root_dir, options) |
| 464 client.SetConfig(gclient_config) |
| 465 client.RunOnDeps('update', self.args) |
| 466 |
| 467 def testRunOnDepsCustomDeps(self): |
| 468 solution_name = 'testRunOnDepsCustomDeps_solution_name' |
| 469 gclient_config = ( |
| 470 "solutions = [ {\n" |
| 471 " 'name': '%s',\n" |
| 472 " 'url': '%s',\n" |
| 473 " 'custom_deps': {\n" |
| 474 " 'src/b': None,\n" |
| 475 " 'src/n': 'svn://custom.n/trunk',\n" |
| 476 " 'src/t': 'svn://custom.t/trunk',\n" |
| 477 " }\n} ]\n" |
| 478 ) % (solution_name, self.url) |
| 479 |
| 480 deps = ( |
| 481 "deps = {\n" |
| 482 " 'src/b': 'svn://original.b/trunk',\n" |
| 483 " 'src/t': 'svn://original.t/trunk',\n" |
| 484 "}\n" |
| 485 ) |
| 486 |
| 487 entries_content = ( |
| 488 "entries = \\\n" |
| 489 "{ 'src/n': 'svn://custom.n/trunk',\n" |
| 490 " 'src/t': 'svn://custom.t/trunk',\n" |
| 491 " '%s': '%s'}\n" |
| 492 ) % (solution_name, self.url) |
| 493 |
| 494 scm_wrapper_sol = self.mox.CreateMockAnything() |
| 495 scm_wrapper_t = self.mox.CreateMockAnything() |
| 496 scm_wrapper_n = self.mox.CreateMockAnything() |
| 497 |
| 498 options = self.Options() |
| 499 |
| 500 checkout_path = gclient.os.path.join(self.root_dir, solution_name) |
| 501 gclient.os.path.exists( |
| 502 gclient.os.path.join(checkout_path, '.git')).AndReturn(False) |
| 503 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'src/n', '.git') |
| 504 ).AndReturn(False) |
| 505 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'src/t', '.git') |
| 506 ).AndReturn(False) |
| 507 |
| 508 # Expect a check for the entries file and we say there is not one. |
| 509 gclient.os.path.exists( |
| 510 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 511 ).AndReturn(False) |
| 512 |
| 513 # An scm will be requested for the solution. |
| 514 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, solution_name |
| 515 ).AndReturn(scm_wrapper_sol) |
| 516 # Then an update will be performed. |
| 517 scm_wrapper_sol.RunCommand('update', options, self.args, []) |
| 518 # Then an attempt will be made to read its DEPS file. |
| 519 gclient.gclient_utils.FileRead( |
| 520 gclient.os.path.join(checkout_path, gclient.GClient.DEPS_FILE) |
| 521 ).AndReturn(deps) |
| 522 |
| 523 # Next we expect an scm to be request for dep src/n even though it does not |
| 524 # exist in the DEPS file. |
| 525 gclient.gclient_scm.CreateSCM('svn://custom.n/trunk', |
| 526 self.root_dir, |
| 527 "src/n").AndReturn(scm_wrapper_n) |
| 528 |
| 529 # Next we expect an scm to be request for dep src/t but it should |
| 530 # use the url specified in custom_deps. |
| 531 gclient.gclient_scm.CreateSCM('svn://custom.t/trunk', |
| 532 self.root_dir, |
| 533 "src/t").AndReturn(scm_wrapper_t) |
| 534 |
| 535 scm_wrapper_n.RunCommand('update', options, self.args, []) |
| 536 scm_wrapper_t.RunCommand('update', options, self.args, []) |
| 537 |
| 538 # NOTE: the dep src/b should not create an scm at all. |
| 539 |
| 540 # After everything is done, an attempt is made to write an entries |
| 541 # file. |
| 542 gclient.gclient_utils.FileWrite( |
| 543 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 544 entries_content) |
| 545 |
| 546 self.mox.ReplayAll() |
| 547 client = self._gclient_gclient(self.root_dir, options) |
| 548 client.SetConfig(gclient_config) |
| 549 client.RunOnDeps('update', self.args) |
| 550 |
| 551 # Regression test for Issue #11. |
| 552 # http://code.google.com/p/gclient/issues/detail?id=11 |
| 553 def testRunOnDepsSharedDependency(self): |
| 554 name_a = 'testRunOnDepsSharedDependency_a' |
| 555 name_b = 'testRunOnDepsSharedDependency_b' |
| 556 |
| 557 url_a = self.url + '/a' |
| 558 url_b = self.url + '/b' |
| 559 |
| 560 # config declares two solutions and each has a dependency to place |
| 561 # http://svn.t/trunk at src/t. |
| 562 gclient_config = ( |
| 563 "solutions = [ {\n" |
| 564 " 'name': '%s',\n" |
| 565 " 'url': '%s',\n" |
| 566 " 'custom_deps': {},\n" |
| 567 "}, {\n" |
| 568 " 'name': '%s',\n" |
| 569 " 'url': '%s',\n" |
| 570 " 'custom_deps': {},\n" |
| 571 "}\n]\n") % (name_a, url_a, name_b, url_b) |
| 572 |
| 573 deps_b = deps_a = ( |
| 574 "deps = {\n" |
| 575 " 'src/t' : 'http://svn.t/trunk',\n" |
| 576 "}\n") |
| 577 |
| 578 entries_content = ( |
| 579 "entries = \\\n" |
| 580 "{ 'src/t': 'http://svn.t/trunk',\n" |
| 581 " '%s': '%s',\n" |
| 582 " '%s': '%s'}\n" |
| 583 ) % (name_a, url_a, name_b, url_b) |
| 584 |
| 585 scm_wrapper_a = self.mox.CreateMockAnything() |
| 586 scm_wrapper_b = self.mox.CreateMockAnything() |
| 587 scm_wrapper_dep = self.mox.CreateMockAnything() |
| 588 |
| 589 options = self.Options() |
| 590 |
| 591 gclient.os.path.exists(gclient.os.path.join(self.root_dir, name_a, '.git') |
| 592 ).AndReturn(False) |
| 593 gclient.os.path.exists(gclient.os.path.join(self.root_dir, name_b, '.git') |
| 594 ).AndReturn(False) |
| 595 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'src/t', '.git') |
| 596 ).AndReturn(False) |
| 597 |
| 598 # Expect a check for the entries file and we say there is not one. |
| 599 gclient.os.path.exists( |
| 600 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 601 ).AndReturn(False) |
| 602 |
| 603 # An scm will be requested for the first solution. |
| 604 gclient.gclient_scm.CreateSCM(url_a, self.root_dir, name_a).AndReturn( |
| 605 scm_wrapper_a) |
| 606 # Then an attempt will be made to read it's DEPS file. |
| 607 gclient.gclient_utils.FileRead( |
| 608 gclient.os.path.join(self.root_dir, name_a, gclient.GClient.DEPS_FILE) |
| 609 ).AndReturn(deps_a) |
| 610 # Then an update will be performed. |
| 611 scm_wrapper_a.RunCommand('update', options, self.args, []) |
| 612 |
| 613 # An scm will be requested for the second solution. |
| 614 gclient.gclient_scm.CreateSCM(url_b, self.root_dir, name_b).AndReturn( |
| 615 scm_wrapper_b) |
| 616 # Then an attempt will be made to read its DEPS file. |
| 617 gclient.gclient_utils.FileRead( |
| 618 gclient.os.path.join(self.root_dir, name_b, gclient.GClient.DEPS_FILE) |
| 619 ).AndReturn(deps_b) |
| 620 # Then an update will be performed. |
| 621 scm_wrapper_b.RunCommand('update', options, self.args, []) |
| 622 |
| 623 # Finally, an scm is requested for the shared dep. |
| 624 gclient.gclient_scm.CreateSCM('http://svn.t/trunk', self.root_dir, 'src/t' |
| 625 ).AndReturn(scm_wrapper_dep) |
| 626 # And an update is run on it. |
| 627 scm_wrapper_dep.RunCommand('update', options, self.args, []) |
| 628 |
| 629 # After everything is done, an attempt is made to write an entries file. |
| 630 gclient.gclient_utils.FileWrite( |
| 631 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 632 entries_content) |
| 633 |
| 634 self.mox.ReplayAll() |
| 635 client = self._gclient_gclient(self.root_dir, options) |
| 636 client.SetConfig(gclient_config) |
| 637 client.RunOnDeps('update', self.args) |
| 638 |
| 639 def testRunOnDepsSuccess(self): |
| 640 # Fake .gclient file. |
| 641 name = 'testRunOnDepsSuccess_solution_name' |
| 642 gclient_config = """solutions = [ { |
| 643 'name': '%s', |
| 644 'url': '%s', |
| 645 'custom_deps': {}, |
| 646 }, ]""" % (name, self.url) |
| 647 |
| 648 # pprint.pformat() is non-deterministic in this case!! |
| 649 entries_content = ( |
| 650 "entries = \\\n" |
| 651 "{ '%s': '%s'}\n" |
| 652 ) % (name, self.url) |
| 653 |
| 654 options = self.Options() |
| 655 gclient.os.path.exists(gclient.os.path.join(self.root_dir, name, '.git') |
| 656 ).AndReturn(False) |
| 657 gclient.os.path.exists( |
| 658 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 659 ).AndReturn(False) |
| 660 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 661 gclient.gclient_scm.CreateSCM) |
| 662 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 663 gclient.gclient_utils.FileRead( |
| 664 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 665 ).AndReturn("Boo = 'a'") |
| 666 gclient.gclient_utils.FileWrite( |
| 667 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 668 entries_content) |
| 669 |
| 670 self.mox.ReplayAll() |
| 671 client = self._gclient_gclient(self.root_dir, options) |
| 672 client.SetConfig(gclient_config) |
| 673 client.RunOnDeps('update', self.args) |
| 674 |
| 675 def testRunOnDepsRevisions(self): |
| 676 def OptIsRev(options, rev): |
| 677 if not options.revision == str(rev): |
| 678 print("options.revision = %s" % options.revision) |
| 679 return options.revision == str(rev) |
| 680 def OptIsRevNone(options): |
| 681 if options.revision: |
| 682 print("options.revision = %s" % options.revision) |
| 683 return options.revision == None |
| 684 def OptIsRev42(options): |
| 685 return OptIsRev(options, 42) |
| 686 def OptIsRev123(options): |
| 687 return OptIsRev(options, 123) |
| 688 def OptIsRev333(options): |
| 689 return OptIsRev(options, 333) |
| 690 |
| 691 # Fake .gclient file. |
| 692 gclient_config = """solutions = [ { |
| 693 'name': 'src', |
| 694 'url': '%s', |
| 695 'custom_deps': {}, |
| 696 }, ]""" % self.url |
| 697 # Fake DEPS file. |
| 698 deps_content = """deps = { |
| 699 'src/breakpad/bar': 'http://google-breakpad.googlecode.com/svn/trunk/src@285', |
| 700 'foo/third_party/WebKit': '/trunk/deps/third_party/WebKit', |
| 701 'src/third_party/cygwin': '/trunk/deps/third_party/cygwin@3248', |
| 702 } |
| 703 deps_os = { |
| 704 'win': { |
| 705 'src/foosad/asdf': 'svn://random_server:123/asd/python_24@5580', |
| 706 }, |
| 707 'mac': { |
| 708 'src/third_party/python_24': 'svn://random_server:123/trunk/python_24@5580', |
| 709 }, |
| 710 }""" |
| 711 |
| 712 cygwin_path = 'dummy path cygwin' |
| 713 webkit_path = 'dummy path webkit' |
| 714 |
| 715 entries_content = ( |
| 716 "entries = \\\n" |
| 717 "{ 'foo/third_party/WebKit': '%s',\n" |
| 718 " 'src': '%s',\n" |
| 719 " 'src/breakpad/bar':" |
| 720 " 'http://google-breakpad.googlecode.com/svn/trunk/src@285',\n" |
| 721 " 'src/third_party/cygwin': '%s',\n" |
| 722 " 'src/third_party/python_24':" |
| 723 " 'svn://random_server:123/trunk/python_24@5580'}\n" |
| 724 ) % (webkit_path, self.url, cygwin_path) |
| 725 |
| 726 scm_wrapper_bleh = self.mox.CreateMockAnything() |
| 727 scm_wrapper_src = self.mox.CreateMockAnything() |
| 728 scm_wrapper_src2 = self.mox.CreateMockAnything() |
| 729 scm_wrapper_webkit = self.mox.CreateMockAnything() |
| 730 scm_wrapper_breakpad = self.mox.CreateMockAnything() |
| 731 scm_wrapper_cygwin = self.mox.CreateMockAnything() |
| 732 scm_wrapper_python = self.mox.CreateMockAnything() |
| 733 options = self.Options() |
| 734 options.revisions = [ 'src@123', 'foo/third_party/WebKit@42', |
| 735 'src/third_party/cygwin@333' ] |
| 736 options.deps_os = 'mac' |
| 737 # Also, pymox doesn't verify the order of function calling w.r.t. different |
| 738 # mock objects. Pretty lame. So reorder as we wish to make it clearer. |
| 739 gclient.gclient_utils.FileRead( |
| 740 gclient.os.path.join(self.root_dir, 'src', gclient.GClient.DEPS_FILE) |
| 741 ).AndReturn(deps_content) |
| 742 gclient.gclient_utils.FileWrite( |
| 743 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 744 entries_content) |
| 745 |
| 746 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'src', '.git') |
| 747 ).AndReturn(False) |
| 748 gclient.os.path.exists( |
| 749 gclient.os.path.join(self.root_dir, 'foo/third_party/WebKit', '.git') |
| 750 ).AndReturn(False) |
| 751 gclient.os.path.exists( |
| 752 gclient.os.path.join(self.root_dir, 'src/third_party/cygwin', '.git') |
| 753 ).AndReturn(False) |
| 754 gclient.os.path.exists( |
| 755 gclient.os.path.join(self.root_dir, 'src/third_party/python_24', '.git') |
| 756 ).AndReturn(False) |
| 757 gclient.os.path.exists( |
| 758 gclient.os.path.join(self.root_dir, 'src/breakpad/bar', '.git') |
| 759 ).AndReturn(False) |
| 760 gclient.os.path.exists( |
| 761 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 762 ).AndReturn(False) |
| 763 |
| 764 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, 'src').AndReturn( |
| 765 scm_wrapper_src) |
| 766 scm_wrapper_src.RunCommand('update', mox.Func(OptIsRev123), self.args, []) |
| 767 |
| 768 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, |
| 769 None).AndReturn(scm_wrapper_src2) |
| 770 scm_wrapper_src2.FullUrlForRelativeUrl('/trunk/deps/third_party/cygwin@3248' |
| 771 ).AndReturn(cygwin_path) |
| 772 |
| 773 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, |
| 774 None).AndReturn(scm_wrapper_src2) |
| 775 scm_wrapper_src2.FullUrlForRelativeUrl('/trunk/deps/third_party/WebKit' |
| 776 ).AndReturn(webkit_path) |
| 777 |
| 778 gclient.gclient_scm.CreateSCM( |
| 779 webkit_path, self.root_dir, 'foo/third_party/WebKit' |
| 780 ).AndReturn(scm_wrapper_webkit) |
| 781 scm_wrapper_webkit.RunCommand('update', mox.Func(OptIsRev42), self.args, []) |
| 782 |
| 783 gclient.gclient_scm.CreateSCM( |
| 784 'http://google-breakpad.googlecode.com/svn/trunk/src@285', |
| 785 self.root_dir, 'src/breakpad/bar').AndReturn(scm_wrapper_breakpad) |
| 786 scm_wrapper_breakpad.RunCommand('update', mox.Func(OptIsRevNone), |
| 787 self.args, []) |
| 788 |
| 789 gclient.gclient_scm.CreateSCM( |
| 790 cygwin_path, self.root_dir, 'src/third_party/cygwin' |
| 791 ).AndReturn(scm_wrapper_cygwin) |
| 792 scm_wrapper_cygwin.RunCommand('update', mox.Func(OptIsRev333), self.args, |
| 793 []) |
| 794 |
| 795 gclient.gclient_scm.CreateSCM( |
| 796 'svn://random_server:123/trunk/python_24@5580', |
| 797 self.root_dir, |
| 798 'src/third_party/python_24' |
| 799 ).AndReturn(scm_wrapper_python) |
| 800 scm_wrapper_python.RunCommand('update', mox.Func(OptIsRevNone), self.args, |
| 801 []) |
| 802 |
| 803 self.mox.ReplayAll() |
| 804 client = self._gclient_gclient(self.root_dir, options) |
| 805 client.SetConfig(gclient_config) |
| 806 client.RunOnDeps('update', self.args) |
| 807 |
| 808 def testRunOnDepsConflictingRevisions(self): |
| 809 # Fake .gclient file. |
| 810 name = 'testRunOnDepsConflictingRevisions_solution_name' |
| 811 gclient_config = """solutions = [ { |
| 812 'name': '%s', |
| 813 'url': '%s', |
| 814 'custom_deps': {}, |
| 815 'custom_vars': {}, |
| 816 }, ]""" % (name, self.url) |
| 817 # Fake DEPS file. |
| 818 deps_content = """deps = { |
| 819 'foo/third_party/WebKit': '/trunk/deps/third_party/WebKit', |
| 820 }""" |
| 821 |
| 822 options = self.Options() |
| 823 options.revisions = [ 'foo/third_party/WebKit@42', |
| 824 'foo/third_party/WebKit@43' ] |
| 825 client = self._gclient_gclient(self.root_dir, options) |
| 826 client.SetConfig(gclient_config) |
| 827 exception = "Conflicting revision numbers specified." |
| 828 try: |
| 829 client.RunOnDeps('update', self.args) |
| 830 except gclient.gclient_utils.Error, e: |
| 831 self.assertEquals(e.args[0], exception) |
| 832 else: |
| 833 self.fail('%s not raised' % exception) |
| 834 |
| 835 def testRunOnDepsSuccessVars(self): |
| 836 # Fake .gclient file. |
| 837 name = 'testRunOnDepsSuccessVars_solution_name' |
| 838 gclient_config = """solutions = [ { |
| 839 'name': '%s', |
| 840 'url': '%s', |
| 841 'custom_deps': {}, |
| 842 'custom_vars': {}, |
| 843 }, ]""" % (name, self.url) |
| 844 # Fake DEPS file. |
| 845 deps_content = """vars = { |
| 846 'webkit': '/trunk/bar/', |
| 847 } |
| 848 deps = { |
| 849 'foo/third_party/WebKit': Var('webkit') + 'WebKit', |
| 850 }""" |
| 851 |
| 852 webkit_path = 'dummy path webkit' |
| 853 |
| 854 entries_content = ( |
| 855 "entries = \\\n" |
| 856 "{ 'foo/third_party/WebKit': '%s',\n" |
| 857 " '%s': '%s'}\n" |
| 858 ) % (webkit_path, name, self.url) |
| 859 |
| 860 scm_wrapper_webkit = self.mox.CreateMockAnything() |
| 861 scm_wrapper_src = self.mox.CreateMockAnything() |
| 862 |
| 863 options = self.Options() |
| 864 gclient.gclient_utils.FileRead( |
| 865 gclient.os.path.join(self.root_dir, name, |
| 866 gclient.GClient.DEPS_FILE) |
| 867 ).AndReturn(deps_content) |
| 868 gclient.gclient_utils.FileWrite( |
| 869 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 870 entries_content) |
| 871 |
| 872 gclient.os.path.exists( |
| 873 gclient.os.path.join(self.root_dir, 'foo/third_party/WebKit', '.git') |
| 874 ).AndReturn(False) |
| 875 gclient.os.path.exists( |
| 876 gclient.os.path.join(self.root_dir, name, '.git') |
| 877 ).AndReturn(False) |
| 878 gclient.os.path.exists( |
| 879 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 880 ).AndReturn(False) |
| 881 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 882 gclient.gclient_scm.CreateSCM) |
| 883 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 884 |
| 885 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, None |
| 886 ).AndReturn(scm_wrapper_src) |
| 887 scm_wrapper_src.FullUrlForRelativeUrl('/trunk/bar/WebKit' |
| 888 ).AndReturn(webkit_path) |
| 889 |
| 890 gclient.gclient_scm.CreateSCM( |
| 891 webkit_path, self.root_dir, 'foo/third_party/WebKit' |
| 892 ).AndReturn(gclient.gclient_scm.CreateSCM) |
| 893 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 894 |
| 895 self.mox.ReplayAll() |
| 896 client = self._gclient_gclient(self.root_dir, options) |
| 897 client.SetConfig(gclient_config) |
| 898 client.RunOnDeps('update', self.args) |
| 899 |
| 900 def testRunOnDepsSuccessCustomVars(self): |
| 901 # Fake .gclient file. |
| 902 name = 'testRunOnDepsSuccessCustomVars_solution_name' |
| 903 gclient_config = """solutions = [ { |
| 904 'name': '%s', |
| 905 'url': '%s', |
| 906 'custom_deps': {}, |
| 907 'custom_vars': {'webkit': '/trunk/bar_custom/'}, |
| 908 }, ]""" % (name, self.url) |
| 909 # Fake DEPS file. |
| 910 deps_content = """vars = { |
| 911 'webkit': '/trunk/bar/', |
| 912 } |
| 913 deps = { |
| 914 'foo/third_party/WebKit': Var('webkit') + 'WebKit', |
| 915 }""" |
| 916 |
| 917 webkit_path = 'dummy path webkit' |
| 918 |
| 919 entries_content = ( |
| 920 "entries = \\\n" |
| 921 "{ 'foo/third_party/WebKit': '%s',\n" |
| 922 " '%s': '%s'}\n" |
| 923 ) % (webkit_path, name, self.url) |
| 924 |
| 925 scm_wrapper_webkit = self.mox.CreateMockAnything() |
| 926 scm_wrapper_src = self.mox.CreateMockAnything() |
| 927 |
| 928 options = self.Options() |
| 929 gclient.gclient_utils.FileRead( |
| 930 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 931 ).AndReturn(deps_content) |
| 932 gclient.gclient_utils.FileWrite( |
| 933 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 934 entries_content) |
| 935 |
| 936 gclient.os.path.exists( |
| 937 gclient.os.path.join(self.root_dir, 'foo/third_party/WebKit', '.git') |
| 938 ).AndReturn(False) |
| 939 gclient.os.path.exists( |
| 940 gclient.os.path.join(self.root_dir, name, '.git') |
| 941 ).AndReturn(False) |
| 942 gclient.os.path.exists( |
| 943 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 944 ).AndReturn(False) |
| 945 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 946 gclient.gclient_scm.CreateSCM) |
| 947 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 948 |
| 949 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, |
| 950 None).AndReturn(scm_wrapper_src) |
| 951 scm_wrapper_src.FullUrlForRelativeUrl('/trunk/bar_custom/WebKit' |
| 952 ).AndReturn(webkit_path) |
| 953 |
| 954 gclient.gclient_scm.CreateSCM(webkit_path, self.root_dir, |
| 955 'foo/third_party/WebKit').AndReturn(gclient.gclient_scm.CreateSCM) |
| 956 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 957 |
| 958 self.mox.ReplayAll() |
| 959 client = self._gclient_gclient(self.root_dir, options) |
| 960 client.SetConfig(gclient_config) |
| 961 client.RunOnDeps('update', self.args) |
| 962 |
| 963 def testRunOnDepsFailureVars(self): |
| 964 # Fake .gclient file. |
| 965 name = 'testRunOnDepsFailureVars_solution_name' |
| 966 gclient_config = """solutions = [ { |
| 967 'name': '%s', |
| 968 'url': '%s', |
| 969 'custom_deps': {}, |
| 970 'custom_vars': {}, |
| 971 }, ]""" % (name, self.url) |
| 972 # Fake DEPS file. |
| 973 deps_content = """deps = { |
| 974 'foo/third_party/WebKit': Var('webkit') + 'WebKit', |
| 975 }""" |
| 976 |
| 977 options = self.Options() |
| 978 gclient.gclient_utils.FileRead( |
| 979 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 980 ).AndReturn(deps_content) |
| 981 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 982 gclient.gclient_scm.CreateSCM) |
| 983 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 984 |
| 985 self.mox.ReplayAll() |
| 986 client = self._gclient_gclient(self.root_dir, options) |
| 987 client.SetConfig(gclient_config) |
| 988 exception = "Var is not defined: webkit" |
| 989 try: |
| 990 client.RunOnDeps('update', self.args) |
| 991 except gclient.gclient_utils.Error, e: |
| 992 self.assertEquals(e.args[0], exception) |
| 993 else: |
| 994 self.fail('%s not raised' % exception) |
| 995 |
| 996 def testRunOnDepsFailureInvalidCommand(self): |
| 997 options = self.Options() |
| 998 |
| 999 self.mox.ReplayAll() |
| 1000 client = self._gclient_gclient(self.root_dir, options) |
| 1001 exception = "'foo' is an unsupported command" |
| 1002 self.assertRaisesError(exception, self._gclient_gclient.RunOnDeps, client, |
| 1003 'foo', self.args) |
| 1004 |
| 1005 def testRunOnDepsFailureEmpty(self): |
| 1006 options = self.Options() |
| 1007 |
| 1008 self.mox.ReplayAll() |
| 1009 client = self._gclient_gclient(self.root_dir, options) |
| 1010 exception = "No solution specified" |
| 1011 self.assertRaisesError(exception, self._gclient_gclient.RunOnDeps, client, |
| 1012 'update', self.args) |
| 1013 |
| 1014 def testFromImplOne(self): |
| 1015 base_url = 'svn://base@123' |
| 1016 deps_content = ( |
| 1017 "deps = {\n" |
| 1018 " 'base': '%s',\n" |
| 1019 " 'main': From('base'),\n" |
| 1020 "}\n" % base_url |
| 1021 ) |
| 1022 main_url = 'svn://main@456' |
| 1023 base_deps_content = ( |
| 1024 "deps = {\n" |
| 1025 " 'main': '%s',\n" |
| 1026 "}\n" % main_url |
| 1027 ) |
| 1028 # Fake .gclient file. |
| 1029 name = 'testFromImplOne_solution_name' |
| 1030 gclient_config = ( |
| 1031 "solutions = [ {\n" |
| 1032 "'name': '%s',\n" |
| 1033 "'url': '%s',\n" |
| 1034 "'custom_deps': {},\n" |
| 1035 "}, ]" % (name, self.url)) |
| 1036 |
| 1037 options = self.Options() |
| 1038 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'main', '.git') |
| 1039 ).AndReturn(False) |
| 1040 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'base', '.git') |
| 1041 ).AndReturn(False) |
| 1042 gclient.os.path.exists(gclient.os.path.join(self.root_dir, name, '.git') |
| 1043 ).AndReturn(False) |
| 1044 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 1045 gclient.gclient_scm.CreateSCM) |
| 1046 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1047 gclient.gclient_utils.FileRead( |
| 1048 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 1049 ).AndReturn(deps_content) |
| 1050 |
| 1051 # base gets updated. |
| 1052 gclient.gclient_scm.CreateSCM(base_url, self.root_dir, 'base').AndReturn( |
| 1053 gclient.gclient_scm.CreateSCM) |
| 1054 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1055 gclient.gclient_utils.FileRead( |
| 1056 gclient.os.path.join(self.root_dir, 'base', gclient.GClient.DEPS_FILE) |
| 1057 ).AndReturn(base_deps_content) |
| 1058 |
| 1059 # main gets updated. |
| 1060 gclient.gclient_scm.CreateSCM(main_url, self.root_dir, 'main').AndReturn( |
| 1061 gclient.gclient_scm.CreateSCM) |
| 1062 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1063 |
| 1064 # Process is done and will write an .gclient_entries. |
| 1065 gclient.os.path.exists( |
| 1066 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 1067 ).AndReturn(False) |
| 1068 gclient.gclient_utils.FileWrite( |
| 1069 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 1070 mox.IgnoreArg()) |
| 1071 |
| 1072 self.mox.ReplayAll() |
| 1073 client = self._gclient_gclient(self.root_dir, options) |
| 1074 client.SetConfig(gclient_config) |
| 1075 client.RunOnDeps('update', self.args) |
| 1076 |
| 1077 def testFromImplTwo(self): |
| 1078 base_url = 'svn://base@123' |
| 1079 deps_content = ( |
| 1080 "deps = {\n" |
| 1081 " 'base': '%s',\n" |
| 1082 " 'main': From('base', 'src/main'),\n" |
| 1083 "}\n" % base_url |
| 1084 ) |
| 1085 main_url = 'svn://main@456' |
| 1086 base_deps_content = ( |
| 1087 "deps = {\n" |
| 1088 " 'src/main': '%s',\n" |
| 1089 "}\n" % main_url |
| 1090 ) |
| 1091 # Fake .gclient file. |
| 1092 name = 'testFromImplTwo_solution_name' |
| 1093 gclient_config = ( |
| 1094 "solutions = [ {\n" |
| 1095 "'name': '%s',\n" |
| 1096 "'url': '%s',\n" |
| 1097 "'custom_deps': {},\n" |
| 1098 "}, ]" % (name, self.url)) |
| 1099 |
| 1100 options = self.Options() |
| 1101 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'main', '.git') |
| 1102 ).AndReturn(False) |
| 1103 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'base', '.git') |
| 1104 ).AndReturn(False) |
| 1105 gclient.os.path.exists(gclient.os.path.join(self.root_dir, name, '.git') |
| 1106 ).AndReturn(False) |
| 1107 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 1108 gclient.gclient_scm.CreateSCM) |
| 1109 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1110 gclient.gclient_utils.FileRead( |
| 1111 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 1112 ).AndReturn(deps_content) |
| 1113 |
| 1114 # base gets updated. |
| 1115 gclient.gclient_scm.CreateSCM(base_url, self.root_dir, 'base').AndReturn( |
| 1116 gclient.gclient_scm.CreateSCM) |
| 1117 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1118 gclient.gclient_utils.FileRead( |
| 1119 gclient.os.path.join(self.root_dir, 'base', gclient.GClient.DEPS_FILE) |
| 1120 ).AndReturn(base_deps_content) |
| 1121 |
| 1122 # main gets updated. |
| 1123 gclient.gclient_scm.CreateSCM(main_url, self.root_dir, 'main').AndReturn( |
| 1124 gclient.gclient_scm.CreateSCM) |
| 1125 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1126 |
| 1127 # Process is done and will write an .gclient_entries. |
| 1128 gclient.os.path.exists( |
| 1129 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 1130 ).AndReturn(False) |
| 1131 gclient.gclient_utils.FileWrite( |
| 1132 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 1133 mox.IgnoreArg()) |
| 1134 |
| 1135 self.mox.ReplayAll() |
| 1136 client = self._gclient_gclient(self.root_dir, options) |
| 1137 client.SetConfig(gclient_config) |
| 1138 client.RunOnDeps('update', self.args) |
| 1139 |
| 1140 def testFromImplTwoRelatvie(self): |
| 1141 base_url = 'svn://base@123' |
| 1142 deps_content = ( |
| 1143 "deps = {\n" |
| 1144 " 'base': '%s',\n" |
| 1145 " 'main': From('base', 'src/main'),\n" |
| 1146 "}\n" % base_url |
| 1147 ) |
| 1148 main_url = '/relative@456' |
| 1149 base_deps_content = ( |
| 1150 "deps = {\n" |
| 1151 " 'src/main': '%s',\n" |
| 1152 "}\n" % main_url |
| 1153 ) |
| 1154 # Fake .gclient file. |
| 1155 name = 'testFromImplTwo_solution_name' |
| 1156 gclient_config = ( |
| 1157 "solutions = [ {\n" |
| 1158 "'name': '%s',\n" |
| 1159 "'url': '%s',\n" |
| 1160 "'custom_deps': {},\n" |
| 1161 "}, ]" % (name, self.url)) |
| 1162 |
| 1163 options = self.Options() |
| 1164 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'main', '.git') |
| 1165 ).AndReturn(False) |
| 1166 gclient.os.path.exists(gclient.os.path.join(self.root_dir, 'base', '.git') |
| 1167 ).AndReturn(False) |
| 1168 gclient.os.path.exists(gclient.os.path.join(self.root_dir, name, '.git') |
| 1169 ).AndReturn(False) |
| 1170 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 1171 gclient.gclient_scm.CreateSCM) |
| 1172 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1173 gclient.gclient_utils.FileRead( |
| 1174 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 1175 ).AndReturn(deps_content) |
| 1176 |
| 1177 # base gets updated. |
| 1178 gclient.gclient_scm.CreateSCM(base_url, self.root_dir, 'base').AndReturn( |
| 1179 gclient.gclient_scm.CreateSCM) |
| 1180 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1181 gclient.gclient_utils.FileRead( |
| 1182 gclient.os.path.join(self.root_dir, 'base', gclient.GClient.DEPS_FILE) |
| 1183 ).AndReturn(base_deps_content) |
| 1184 |
| 1185 # main gets updated after resolving the relative url. |
| 1186 gclient.gclient_scm.CreateSCM(base_url, self.root_dir, None).AndReturn( |
| 1187 gclient.gclient_scm.CreateSCM) |
| 1188 gclient.gclient_scm.CreateSCM.FullUrlForRelativeUrl(main_url |
| 1189 ).AndReturn('svn://base' + main_url) |
| 1190 gclient.gclient_scm.CreateSCM('svn://base' + main_url, self.root_dir, |
| 1191 'main').AndReturn(gclient.gclient_scm.CreateSCM) |
| 1192 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1193 |
| 1194 # Process is done and will write an .gclient_entries. |
| 1195 gclient.os.path.exists( |
| 1196 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 1197 ).AndReturn(False) |
| 1198 gclient.gclient_utils.FileWrite( |
| 1199 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 1200 mox.IgnoreArg()) |
| 1201 |
| 1202 self.mox.ReplayAll() |
| 1203 client = self._gclient_gclient(self.root_dir, options) |
| 1204 client.SetConfig(gclient_config) |
| 1205 client.RunOnDeps('update', self.args) |
| 1206 |
| 1207 def testFileImpl(self): |
| 1208 # Fake .gclient file. |
| 1209 name = "testFileImpl" |
| 1210 gclient_config = ( |
| 1211 "solutions = [ { 'name': '%s'," |
| 1212 "'url': '%s', } ]" % (name, self.url) |
| 1213 ) |
| 1214 # Fake DEPS file. |
| 1215 target = "chromium_deps" |
| 1216 deps_content = ( |
| 1217 "deps = {" |
| 1218 " '%s': File('%s/DEPS') }" % (target, self.url) |
| 1219 ) |
| 1220 |
| 1221 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, name).AndReturn( |
| 1222 gclient.gclient_scm.CreateSCM) |
| 1223 options = self.Options() |
| 1224 gclient.gclient_scm.CreateSCM.RunCommand('update', options, self.args, []) |
| 1225 gclient.gclient_utils.FileRead( |
| 1226 gclient.os.path.join(self.root_dir, name, gclient.GClient.DEPS_FILE) |
| 1227 ).AndReturn(deps_content) |
| 1228 gclient.os.path.exists( |
| 1229 gclient.os.path.join(self.root_dir, name, '.git') |
| 1230 ).AndReturn(False) |
| 1231 gclient.os.path.exists( |
| 1232 gclient.os.path.join(self.root_dir, options.entries_filename) |
| 1233 ).AndReturn(False) |
| 1234 |
| 1235 # This is where gclient tries to do the initial checkout. |
| 1236 gclient.gclient_scm.CreateSCM(self.url, self.root_dir, target).AndReturn( |
| 1237 gclient.gclient_scm.CreateSCM) |
| 1238 gclient.gclient_scm.CreateSCM.RunCommand('updatesingle', options, |
| 1239 self.args + ["DEPS"], []) |
| 1240 gclient.gclient_utils.FileWrite( |
| 1241 gclient.os.path.join(self.root_dir, options.entries_filename), |
| 1242 "entries = \\\n{ '%s': '%s'}\n" % (name, self.url)) |
| 1243 |
| 1244 self.mox.ReplayAll() |
| 1245 client = self._gclient_gclient(self.root_dir, options) |
| 1246 client.SetConfig(gclient_config) |
| 1247 client.RunOnDeps('update', self.args) |
| 1248 |
| 1249 def test_PrintRevInfo(self): |
| 1250 # TODO(aharper): no test yet for revinfo, lock it down once we've verified |
| 1251 # implementation for Pulse plugin |
| 1252 pass |
| 1253 |
| 1254 # No test for internal functions. |
| 1255 def test_GetAllDeps(self): |
| 1256 pass |
| 1257 def test_GetDefaultSolutionDeps(self): |
| 1258 pass |
| 1259 def test_LoadConfig(self): |
| 1260 pass |
| 1261 def test_ReadEntries(self): |
| 1262 pass |
| 1263 def test_SaveEntries(self): |
| 1264 pass |
| 1265 def test_VarImpl(self): |
| 1266 pass |
| 1267 |
| 1268 |
| 1269 if __name__ == '__main__': |
| 1270 import unittest |
| 1271 unittest.main() |
| 1272 |
| 1273 # vim: ts=2:sw=2:tw=80:et: |
OLD | NEW |