| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Smoke tests for gclient.py. | 6 """Smoke tests for gclient.py. |
| 7 | 7 |
| 8 Shell out 'gclient' and run basic conformance tests. | 8 Shell out 'gclient' and run basic conformance tests. |
| 9 | 9 |
| 10 This test assumes GClientSmokeBase.URL_BASE is valid. | 10 This test assumes GClientSmokeBase.URL_BASE is valid. |
| 11 """ | 11 """ |
| 12 | 12 |
| 13 import logging | 13 import logging |
| 14 import os | 14 import os |
| 15 import re | 15 import re |
| 16 import subprocess | 16 import subprocess |
| 17 import sys | 17 import sys |
| 18 import unittest | 18 import unittest |
| 19 | 19 |
| 20 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 20 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| 21 sys.path.insert(0, ROOT_DIR) | 21 sys.path.insert(0, ROOT_DIR) |
| 22 | 22 |
| 23 from testing_support.fake_repos import join, write | |
| 24 from testing_support.fake_repos import FakeReposTestBase, FakeRepoTransitive, \ | |
| 25 FakeRepoSkiaDEPS, FakeRepoBlinkDEPS | |
| 26 | |
| 27 import gclient_utils | 23 import gclient_utils |
| 28 import scm as gclient_scm | 24 import scm as gclient_scm |
| 29 | |
| 30 import subprocess2 | 25 import subprocess2 |
| 26 from testing_support import fake_repos |
| 27 from testing_support.fake_repos import join, write |
| 31 | 28 |
| 32 GCLIENT_PATH = os.path.join(ROOT_DIR, 'gclient') | 29 GCLIENT_PATH = os.path.join(ROOT_DIR, 'gclient') |
| 33 COVERAGE = False | 30 COVERAGE = False |
| 34 | 31 |
| 35 | 32 |
| 36 class GClientSmokeBase(FakeReposTestBase): | 33 class GClientSmokeBase(fake_repos.FakeReposTestBase): |
| 37 def setUp(self): | 34 def setUp(self): |
| 38 super(GClientSmokeBase, self).setUp() | 35 super(GClientSmokeBase, self).setUp() |
| 39 # Make sure it doesn't try to auto update when testing! | 36 # Make sure it doesn't try to auto update when testing! |
| 40 self.env = os.environ.copy() | 37 self.env = os.environ.copy() |
| 41 self.env['DEPOT_TOOLS_UPDATE'] = '0' | 38 self.env['DEPOT_TOOLS_UPDATE'] = '0' |
| 42 | 39 |
| 43 def gclient(self, cmd, cwd=None): | 40 def gclient(self, cmd, cwd=None): |
| 44 if not cwd: | 41 if not cwd: |
| 45 cwd = self.root_dir | 42 cwd = self.root_dir |
| 46 if COVERAGE: | 43 if COVERAGE: |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 deps = join(self.root_dir, 'src.DEPS') | 291 deps = join(self.root_dir, 'src.DEPS') |
| 295 os.mkdir(deps) | 292 os.mkdir(deps) |
| 296 write(join(deps, 'DEPS'), | 293 write(join(deps, 'DEPS'), |
| 297 'deps = { "src": "%strunk/src" }' % (self.svn_base)) | 294 'deps = { "src": "%strunk/src" }' % (self.svn_base)) |
| 298 src = join(self.root_dir, 'src') | 295 src = join(self.root_dir, 'src') |
| 299 os.mkdir(src) | 296 os.mkdir(src) |
| 300 res = self.gclient(['status', '--jobs', '1'], src) | 297 res = self.gclient(['status', '--jobs', '1'], src) |
| 301 self.checkBlock(res[0], [('running', deps), ('running', src)]) | 298 self.checkBlock(res[0], [('running', deps), ('running', src)]) |
| 302 | 299 |
| 303 | 300 |
| 304 class GClientSmokeSVN(GClientSmokeBase): | |
| 305 def setUp(self): | |
| 306 super(GClientSmokeSVN, self).setUp() | |
| 307 self.enabled = self.FAKE_REPOS.set_up_svn() | |
| 308 | |
| 309 def testSync(self): | |
| 310 # TODO(maruel): safesync. | |
| 311 if not self.enabled: | |
| 312 return | |
| 313 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 314 # Test unversioned checkout. | |
| 315 self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], | |
| 316 ['running', 'running', | |
| 317 # This is due to the way svn update is called for a | |
| 318 # single file when File() is used in a DEPS file. | |
| 319 ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), | |
| 320 'running', 'running', 'running', 'running']) | |
| 321 tree = self.mangle_svn_tree( | |
| 322 ('trunk/src@2', 'src'), | |
| 323 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 324 ('trunk/other@2', 'src/other')) | |
| 325 tree['src/file/other/DEPS'] = ( | |
| 326 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 327 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 328 self.assertTree(tree) | |
| 329 | |
| 330 # Manually remove svn_hooked1 before synching to make sure it's not | |
| 331 # recreated. | |
| 332 os.remove(join(self.root_dir, 'src', 'svn_hooked1')) | |
| 333 | |
| 334 # Test incremental versioned sync: sync backward. | |
| 335 self.parseGclient( | |
| 336 ['sync', '--revision', 'src@1', '--deps', 'mac', | |
| 337 '--delete_unversioned_trees', '--jobs', '1'], | |
| 338 ['running', 'running', 'running', 'running', 'deleting']) | |
| 339 tree = self.mangle_svn_tree( | |
| 340 ('trunk/src@1', 'src'), | |
| 341 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 342 ('trunk/other@1', 'src/other'), | |
| 343 ('trunk/third_party/foo@2', 'src/third_party/prout')) | |
| 344 tree['src/file/other/DEPS'] = ( | |
| 345 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 346 self.assertTree(tree) | |
| 347 # Test incremental sync: delete-unversioned_trees isn't there. | |
| 348 self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], | |
| 349 ['running', 'running', 'running', 'running', 'running']) | |
| 350 tree = self.mangle_svn_tree( | |
| 351 ('trunk/src@2', 'src'), | |
| 352 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 353 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 354 ('trunk/other@2', 'src/other'), | |
| 355 ('trunk/third_party/foo@2', 'src/third_party/prout')) | |
| 356 tree['src/file/other/DEPS'] = ( | |
| 357 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 358 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 359 self.assertTree(tree) | |
| 360 | |
| 361 def testSyncIgnoredSolutionName(self): | |
| 362 """TODO(maruel): This will become an error soon.""" | |
| 363 if not self.enabled: | |
| 364 return | |
| 365 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 366 results = self.gclient( | |
| 367 ['sync', '--deps', 'mac', '-r', 'invalid@1', '--jobs', '1']) | |
| 368 self.checkBlock(results[0], [ | |
| 369 'running', 'running', | |
| 370 # This is due to the way svn update is called for a single file when | |
| 371 # File() is used in a DEPS file. | |
| 372 ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), | |
| 373 'running', 'running', 'running', 'running']) | |
| 374 self.checkString('Please fix your script, having invalid --revision flags ' | |
| 375 'will soon considered an error.\n', results[1]) | |
| 376 self.assertEquals(0, results[2]) | |
| 377 tree = self.mangle_svn_tree( | |
| 378 ('trunk/src@2', 'src'), | |
| 379 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 380 ('trunk/other@2', 'src/other')) | |
| 381 tree['src/file/other/DEPS'] = ( | |
| 382 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 383 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 384 self.assertTree(tree) | |
| 385 | |
| 386 def testSyncNoSolutionName(self): | |
| 387 # When no solution name is provided, gclient uses the first solution listed. | |
| 388 if not self.enabled: | |
| 389 return | |
| 390 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 391 self.parseGclient(['sync', '--deps', 'mac', '-r', '1', '--jobs', '1'], | |
| 392 ['running', 'running', 'running', 'running']) | |
| 393 tree = self.mangle_svn_tree( | |
| 394 ('trunk/src@1', 'src'), | |
| 395 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 396 ('trunk/other@1', 'src/other'), | |
| 397 ('trunk/third_party/foo@2', 'src/third_party/prout')) | |
| 398 self.assertTree(tree) | |
| 399 | |
| 400 def testSyncJobs(self): | |
| 401 if not self.enabled: | |
| 402 return | |
| 403 # TODO(maruel): safesync. | |
| 404 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 405 # Test unversioned checkout. | |
| 406 # Use --jobs 1 otherwise the order is not deterministic. | |
| 407 self.parseGclient( | |
| 408 ['sync', '--deps', 'mac', '--jobs', '1'], | |
| 409 [ | |
| 410 'running', | |
| 411 'running', | |
| 412 # This is due to the way svn update is called for a | |
| 413 # single file when File() is used in a DEPS file. | |
| 414 ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), | |
| 415 'running', | |
| 416 'running', | |
| 417 'running', | |
| 418 'running', | |
| 419 ], | |
| 420 untangle=True) | |
| 421 tree = self.mangle_svn_tree( | |
| 422 ('trunk/src@2', 'src'), | |
| 423 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 424 ('trunk/other@2', 'src/other')) | |
| 425 tree['src/file/other/DEPS'] = ( | |
| 426 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 427 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 428 self.assertTree(tree) | |
| 429 | |
| 430 # Manually remove svn_hooked1 before synching to make sure it's not | |
| 431 # recreated. | |
| 432 os.remove(join(self.root_dir, 'src', 'svn_hooked1')) | |
| 433 | |
| 434 # Test incremental versioned sync: sync backward. | |
| 435 self.parseGclient( | |
| 436 ['sync', '--revision', 'src@1', '--deps', 'mac', | |
| 437 '--delete_unversioned_trees', '--jobs', '8'], | |
| 438 ['running', 'running', 'running', 'running', 'deleting'], | |
| 439 untangle=True) | |
| 440 tree = self.mangle_svn_tree( | |
| 441 ('trunk/src@1', 'src'), | |
| 442 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 443 ('trunk/other@1', 'src/other'), | |
| 444 ('trunk/third_party/foo@2', 'src/third_party/prout')) | |
| 445 tree['src/file/other/DEPS'] = ( | |
| 446 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 447 self.assertTree(tree) | |
| 448 # Test incremental sync: delete-unversioned_trees isn't there. | |
| 449 self.parseGclient(['sync', '--deps', 'mac', '--jobs', '8'], | |
| 450 ['running', 'running', 'running', 'running', 'running'], | |
| 451 untangle=True) | |
| 452 tree = self.mangle_svn_tree( | |
| 453 ('trunk/src@2', 'src'), | |
| 454 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 455 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 456 ('trunk/other@2', 'src/other'), | |
| 457 ('trunk/third_party/foo@2', 'src/third_party/prout')) | |
| 458 tree['src/file/other/DEPS'] = ( | |
| 459 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 460 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 461 self.assertTree(tree) | |
| 462 | |
| 463 def testSyncCustomDeps(self): | |
| 464 if not self.enabled: | |
| 465 return | |
| 466 out = ( | |
| 467 'solutions = [\n' | |
| 468 ' { "name" : "src",\n' | |
| 469 ' "url" : "%(base)s/src",\n' | |
| 470 ' "custom_deps" : {\n' | |
| 471 # Remove 2 deps, change 1, add 1. | |
| 472 ' "src/other": None,\n' | |
| 473 ' "src/third_party/foo": \'%(base)s/third_party/prout\',\n' | |
| 474 ' "src/file/other": None,\n' | |
| 475 ' "new_deps": "/trunk/src/third_party",\n' | |
| 476 ' },\n' | |
| 477 ' "safesync_url": "",\n' | |
| 478 ' },\n' | |
| 479 ']\n\n' % | |
| 480 { 'base': self.svn_base + 'trunk' }) | |
| 481 fileobj = open(os.path.join(self.root_dir, '.gclient'), 'w') | |
| 482 fileobj.write(out) | |
| 483 fileobj.close() | |
| 484 self.parseGclient( | |
| 485 ['sync', '--deps', 'mac', '--jobs', '1'], | |
| 486 ['running', 'running', 'running', 'running'], | |
| 487 untangle=True) | |
| 488 tree = self.mangle_svn_tree( | |
| 489 ('trunk/src@2', 'src'), | |
| 490 ('trunk/third_party/prout@2', 'src/third_party/foo'), | |
| 491 ('trunk/src/third_party@2', 'new_deps')) | |
| 492 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 493 self.assertTree(tree) | |
| 494 | |
| 495 def testSyncCustomDepsNoDeps(self): | |
| 496 if not self.enabled: | |
| 497 return | |
| 498 out = ( | |
| 499 'solutions = [\n' | |
| 500 # This directory has no DEPS file. | |
| 501 ' { "name" : "src/third_party",\n' | |
| 502 ' "url" : "%(base)s/src/third_party",\n' | |
| 503 ' "custom_deps" : {\n' | |
| 504 # Add 1. | |
| 505 ' "src/other": \'/trunk/other\',\n' | |
| 506 ' },\n' | |
| 507 ' "safesync_url": "",\n' | |
| 508 ' },\n' | |
| 509 ']\n\n' % | |
| 510 { 'base': self.svn_base + 'trunk' }) | |
| 511 fileobj = open(os.path.join(self.root_dir, '.gclient'), 'w') | |
| 512 fileobj.write(out) | |
| 513 fileobj.close() | |
| 514 self.parseGclient( | |
| 515 ['sync', '--deps', 'mac', '--jobs', '1'], | |
| 516 ['running', 'running'], | |
| 517 untangle=True) | |
| 518 tree = self.mangle_svn_tree( | |
| 519 ('trunk/src/third_party@2', 'src/third_party'), | |
| 520 ('trunk/other@2', 'src/other')) | |
| 521 self.assertTree(tree) | |
| 522 | |
| 523 def testRevertAndStatus(self): | |
| 524 if not self.enabled: | |
| 525 return | |
| 526 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 527 # Tested in testSync. | |
| 528 self.gclient(['sync', '--deps', 'mac']) | |
| 529 write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') | |
| 530 | |
| 531 out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], | |
| 532 [['running', join(self.root_dir, 'src')], | |
| 533 ['running', join(self.root_dir, 'src', 'other')]]) | |
| 534 out = self.svnBlockCleanup(out) | |
| 535 self.checkString('file', out[0][1]) | |
| 536 self.checkString('other', out[0][2]) | |
| 537 self.checkString('svn_hooked1', out[0][3]) | |
| 538 self.checkString(join('third_party', 'foo'), out[0][4]) | |
| 539 self.checkString('hi', out[1][1]) | |
| 540 self.assertEquals(5, len(out[0])) | |
| 541 self.assertEquals(2, len(out[1])) | |
| 542 | |
| 543 # Revert implies --force implies running hooks without looking at pattern | |
| 544 # matching. | |
| 545 results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1']) | |
| 546 out = self.splitBlock(results[0]) | |
| 547 # src, src/other is missing, src/other, src/third_party/foo is missing, | |
| 548 # src/third_party/foo, 2 svn hooks, 3 related to File(). | |
| 549 self.assertEquals( 8, len(out)) | |
| 550 self.checkString('', results[1]) | |
| 551 self.assertEquals(0, results[2]) | |
| 552 tree = self.mangle_svn_tree( | |
| 553 ('trunk/src@2', 'src'), | |
| 554 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 555 ('trunk/other@2', 'src/other')) | |
| 556 tree['src/file/other/DEPS'] = ( | |
| 557 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 558 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 559 tree['src/svn_hooked2'] = 'svn_hooked2' | |
| 560 self.assertTree(tree) | |
| 561 | |
| 562 out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], | |
| 563 [['running', join(self.root_dir, 'src')]]) | |
| 564 out = self.svnBlockCleanup(out) | |
| 565 self.checkString('file', out[0][1]) | |
| 566 self.checkString('other', out[0][2]) | |
| 567 self.checkString('svn_hooked1', out[0][3]) | |
| 568 self.checkString('svn_hooked2', out[0][4]) | |
| 569 self.checkString(join('third_party', 'foo'), out[0][5]) | |
| 570 self.assertEquals(6, len(out[0])) | |
| 571 self.assertEquals(1, len(out)) | |
| 572 | |
| 573 def testRevertAndStatusDepsOs(self): | |
| 574 if not self.enabled: | |
| 575 return | |
| 576 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 577 # Tested in testSync. | |
| 578 self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) | |
| 579 write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') | |
| 580 | |
| 581 # Without --verbose, gclient won't output the directories without | |
| 582 # modification. | |
| 583 out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], | |
| 584 [['running', join(self.root_dir, 'src')], | |
| 585 ['running', join(self.root_dir, 'src', 'other')]]) | |
| 586 out = self.svnBlockCleanup(out) | |
| 587 self.checkString('other', out[0][1]) | |
| 588 self.checkString(join('third_party', 'fpp'), out[0][2]) | |
| 589 self.checkString(join('third_party', 'prout'), out[0][3]) | |
| 590 self.checkString('hi', out[1][1]) | |
| 591 self.assertEquals(4, len(out[0])) | |
| 592 self.assertEquals(2, len(out[1])) | |
| 593 | |
| 594 # So verify it works with --verbose. | |
| 595 out = self.parseGclient( | |
| 596 ['status', '--deps', 'mac', '--verbose', '--jobs', '1'], | |
| 597 [['running', join(self.root_dir, 'src')], | |
| 598 ['running', join(self.root_dir, 'src', 'other')], | |
| 599 ['running', join(self.root_dir, 'src', 'third_party', 'fpp')], | |
| 600 ['running', join(self.root_dir, 'src', 'third_party', 'prout')]]) | |
| 601 out = self.svnBlockCleanup(out) | |
| 602 self.checkString('other', out[0][5]) | |
| 603 self.checkString(join('third_party', 'fpp'), out[0][7]) | |
| 604 self.checkString(join('third_party', 'prout'), out[0][8]) | |
| 605 self.checkString('hi', out[1][5]) | |
| 606 self.assertEquals(9, len(out[0])) | |
| 607 self.assertEquals(7, len(out[1])) | |
| 608 self.assertEquals(6, len(out[2])) | |
| 609 self.assertEquals(6, len(out[3])) | |
| 610 self.assertEquals(4, len(out)) | |
| 611 | |
| 612 # Revert implies --force implies running hooks without looking at pattern | |
| 613 # matching. | |
| 614 # TODO(maruel): In general, gclient revert output is wrong. It should output | |
| 615 # the file list after some ___ running 'svn status' | |
| 616 results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1']) | |
| 617 out = self.splitBlock(results[0]) | |
| 618 self.assertEquals(4, len(out)) | |
| 619 self.checkString('', results[1]) | |
| 620 self.assertEquals(0, results[2]) | |
| 621 tree = self.mangle_svn_tree( | |
| 622 ('trunk/src@1', 'src'), | |
| 623 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 624 ('trunk/other@1', 'src/other'), | |
| 625 ('trunk/third_party/prout@2', 'src/third_party/prout')) | |
| 626 self.assertTree(tree) | |
| 627 | |
| 628 out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], | |
| 629 [['running', join(self.root_dir, 'src')]]) | |
| 630 out = self.svnBlockCleanup(out) | |
| 631 self.checkString('other', out[0][1]) | |
| 632 self.checkString(join('third_party', 'fpp'), out[0][2]) | |
| 633 self.checkString(join('third_party', 'prout'), out[0][3]) | |
| 634 self.assertEquals(4, len(out[0])) | |
| 635 | |
| 636 def testRunHooks(self): | |
| 637 if not self.enabled: | |
| 638 return | |
| 639 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 640 self.gclient(['sync', '--deps', 'mac']) | |
| 641 out = self.parseGclient(['runhooks', '--deps', 'mac'], | |
| 642 ['running', 'running']) | |
| 643 self.checkString(1, len(out[0])) | |
| 644 self.checkString(1, len(out[1])) | |
| 645 | |
| 646 def testRunHooksDepsOs(self): | |
| 647 if not self.enabled: | |
| 648 return | |
| 649 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 650 self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) | |
| 651 out = self.parseGclient(['runhooks', '--deps', 'mac'], []) | |
| 652 self.assertEquals([], out) | |
| 653 | |
| 654 def testRevInfo(self): | |
| 655 if not self.enabled: | |
| 656 return | |
| 657 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 658 self.gclient(['sync', '--deps', 'mac']) | |
| 659 results = self.gclient(['revinfo', '--deps', 'mac']) | |
| 660 out = ('src: %(base)s/src\n' | |
| 661 'src/file/other: File("%(base)s/other/DEPS")\n' | |
| 662 'src/other: %(base)s/other\n' | |
| 663 'src/third_party/foo: %(base)s/third_party/foo@1\n' % | |
| 664 { 'base': self.svn_base + 'trunk' }) | |
| 665 self.check((out, '', 0), results) | |
| 666 results = self.gclient(['revinfo', '--deps', 'mac', '--actual']) | |
| 667 out = ('src: %(base)s/src@2\n' | |
| 668 'src/file/other: %(base)s/other/DEPS@2\n' | |
| 669 'src/other: %(base)s/other@2\n' | |
| 670 'src/third_party/foo: %(base)s/third_party/foo@1\n' % | |
| 671 { 'base': self.svn_base + 'trunk' }) | |
| 672 self.check((out, '', 0), results) | |
| 673 results = self.gclient(['revinfo', '--deps', 'mac', '--snapshot']) | |
| 674 out = ('# Snapshot generated with gclient revinfo --snapshot\n' | |
| 675 'solutions = [\n' | |
| 676 ' { "name" : "src",\n' | |
| 677 ' "url" : "%(base)s/src",\n' | |
| 678 ' "deps_file" : "DEPS",\n' | |
| 679 ' "managed" : True,\n' | |
| 680 ' "custom_deps" : {\n' | |
| 681 ' "foo/bar": None,\n' | |
| 682 ' "invalid": None,\n' | |
| 683 ' "src/file/other": \'%(base)s/other/DEPS@2\',\n' | |
| 684 ' "src/other": \'%(base)s/other@2\',\n' | |
| 685 ' "src/third_party/foo": ' | |
| 686 '\'%(base)s/third_party/foo@1\',\n' | |
| 687 ' },\n' | |
| 688 ' "safesync_url": "",\n' | |
| 689 ' },\n' | |
| 690 ']\n\n' % | |
| 691 { 'base': self.svn_base + 'trunk' }) | |
| 692 self.check((out, '', 0), results) | |
| 693 | |
| 694 def testRevInfoAltDeps(self): | |
| 695 if not self.enabled: | |
| 696 return | |
| 697 self.gclient(['config', self.svn_base + 'trunk/src/', '--deps-file', | |
| 698 'DEPS.alt']) | |
| 699 self.gclient(['sync']) | |
| 700 results = self.gclient(['revinfo', '--snapshot']) | |
| 701 out = ('# Snapshot generated with gclient revinfo --snapshot\n' | |
| 702 'solutions = [\n' | |
| 703 ' { "name" : "src",\n' | |
| 704 ' "url" : "%(base)s/src",\n' | |
| 705 ' "deps_file" : "DEPS.alt",\n' | |
| 706 ' "managed" : True,\n' | |
| 707 ' "custom_deps" : {\n' | |
| 708 ' "foo/bar": None,\n' | |
| 709 ' "invalid": None,\n' | |
| 710 ' "src/other2": \'%(base)s/other@2\',\n' | |
| 711 ' },\n' | |
| 712 ' "safesync_url": "",\n' | |
| 713 ' },\n' | |
| 714 ']\n\n' % | |
| 715 { 'base': self.svn_base + 'trunk' }) | |
| 716 self.check((out, '', 0), results) | |
| 717 | |
| 718 | |
| 719 def testWrongDirectory(self): | |
| 720 # Check that we're not using a .gclient configuration which only talks | |
| 721 # about a subdirectory src when we're in a different subdirectory src-other. | |
| 722 if not self.enabled: | |
| 723 return | |
| 724 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 725 self.gclient(['sync']) | |
| 726 other_src = join(self.root_dir, 'src-other') | |
| 727 os.mkdir(other_src) | |
| 728 res = ('', 'Error: client not configured; see \'gclient config\'\n', 1) | |
| 729 self.check(res, self.gclient(['status'], other_src)) | |
| 730 | |
| 731 def testCorrectDirectory(self): | |
| 732 # Check that when we're in the subdirectory src, the .gclient configuration | |
| 733 # is used. | |
| 734 if not self.enabled: | |
| 735 return | |
| 736 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 737 self.gclient(['sync']) | |
| 738 src = join(self.root_dir, 'src') | |
| 739 res = self.gclient(['status', '--jobs', '1'], src) | |
| 740 self.checkBlock(res[0], [('running', src)]) | |
| 741 | |
| 742 def testInitialCheckoutNotYetDone(self): | |
| 743 # Check that gclient can be executed when the initial checkout hasn't been | |
| 744 # done yet. | |
| 745 if not self.enabled: | |
| 746 return | |
| 747 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 748 self.parseGclient( | |
| 749 ['sync', '--jobs', '1'], | |
| 750 ['running', 'running', | |
| 751 # This is due to the way svn update is called for a | |
| 752 # single file when File() is used in a DEPS file. | |
| 753 ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), | |
| 754 'running', 'running', 'running', 'running']) | |
| 755 | |
| 756 def testInitialCheckoutFailed(self): | |
| 757 # Check that gclient can be executed from an arbitrary sub directory if the | |
| 758 # initial checkout has failed. | |
| 759 if not self.enabled: | |
| 760 return | |
| 761 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 762 self.gclient(['sync']) | |
| 763 # Cripple the checkout. | |
| 764 os.remove(join(self.root_dir, '.gclient_entries')) | |
| 765 src = join(self.root_dir, 'src') | |
| 766 res = self.gclient(['sync', '--jobs', '1'], src) | |
| 767 self.checkBlock(res[0], | |
| 768 ['running', 'running', 'running']) | |
| 769 | |
| 770 def testUnversionedRepository(self): | |
| 771 # Check that gclient automatically deletes crippled SVN repositories. | |
| 772 if not self.enabled: | |
| 773 return | |
| 774 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 775 cmd = ['sync', '--jobs', '1', '--delete_unversioned_trees', '--reset'] | |
| 776 self.assertEquals(0, self.gclient(cmd)[-1]) | |
| 777 third_party = join(self.root_dir, 'src', 'third_party') | |
| 778 subprocess2.check_call(['svn', 'propset', '-q', 'svn:ignore', 'foo', '.'], | |
| 779 cwd=third_party) | |
| 780 | |
| 781 # Cripple src/third_party/foo and make sure gclient still succeeds. | |
| 782 gclient_utils.rmtree(join(third_party, 'foo', '.svn')) | |
| 783 self.assertEquals(0, self.gclient(cmd)[-1]) | |
| 784 | |
| 785 | |
| 786 class GClientSmokeSVNTransitive(GClientSmokeBase): | |
| 787 FAKE_REPOS_CLASS = FakeRepoTransitive | |
| 788 | |
| 789 def setUp(self): | |
| 790 super(GClientSmokeSVNTransitive, self).setUp() | |
| 791 self.enabled = self.FAKE_REPOS.set_up_svn() | |
| 792 | |
| 793 def testSyncTransitive(self): | |
| 794 if not self.enabled: | |
| 795 return | |
| 796 | |
| 797 self.gclient(['config', self.svn_base + 'trunk/src/']) | |
| 798 | |
| 799 def test_case(parent, timestamp, fixed, output): | |
| 800 # We check out revision 'parent' and expect the following: | |
| 801 # - src/ is checked out at r'parent' | |
| 802 # - src/same_repo is checked out at r'parent' (due to --transitive) | |
| 803 # - src/same_repo_fixed is checked out at r'fixed' | |
| 804 # - src/different_repo is checked out at r'timestamp' | |
| 805 # (due to --transitive) | |
| 806 # - src/different_repo_fixed is checked out at r'fixed' | |
| 807 | |
| 808 revisions = self.FAKE_REPOS.svn_revs | |
| 809 self.parseGclient( | |
| 810 ['sync', '--transitive', '--revision', 'src@%d' % parent, | |
| 811 '--jobs', '1'], output) | |
| 812 self.assertTree({ | |
| 813 'src/origin': revisions[parent]['trunk/src/origin'], | |
| 814 'src/DEPS': revisions[parent]['trunk/src/DEPS'], | |
| 815 'src/same_repo/origin': revisions[parent]['trunk/third_party/origin'], | |
| 816 'src/same_repo_fixed/origin': | |
| 817 revisions[fixed]['trunk/third_party/origin'], | |
| 818 'src/different_repo/origin': | |
| 819 revisions[timestamp]['trunk/third_party/origin'], | |
| 820 'src/different_repo_fixed/origin': | |
| 821 revisions[fixed]['trunk/third_party/origin'], | |
| 822 }) | |
| 823 | |
| 824 # Here are the test cases for checking out 'trunk/src' at r1, r2 and r3 | |
| 825 # r1: Everything is normal | |
| 826 test_case(parent=1, timestamp=1, fixed=1, | |
| 827 output=['running', 'running', 'running', 'running', 'running']) | |
| 828 # r2: Svn will scan from r1 upwards until it finds a revision matching the | |
| 829 # given timestamp or it takes the next smallest one (which is r2 in this | |
| 830 # case). | |
| 831 test_case(parent=2, timestamp=2, fixed=1, | |
| 832 output=['running', 'running', 'running']) | |
| 833 # r3: Svn will scan from r1 upwards until it finds a revision matching the | |
| 834 # given timestamp or it takes the next smallest one. Since | |
| 835 # timestamp(r3) < timestamp(r2) svn will checkout r1. | |
| 836 # This happens often on http://googlecode.com but is unexpected to happen | |
| 837 # with svnserve (unless you manually change 'svn:date') | |
| 838 test_case(parent=3, timestamp=1, fixed=1, | |
| 839 output=['running', 'running', 'running']) | |
| 840 | |
| 841 | |
| 842 class GClientSmokeGIT(GClientSmokeBase): | 301 class GClientSmokeGIT(GClientSmokeBase): |
| 843 def setUp(self): | 302 def setUp(self): |
| 844 super(GClientSmokeGIT, self).setUp() | 303 super(GClientSmokeGIT, self).setUp() |
| 845 self.enabled = self.FAKE_REPOS.set_up_git() | 304 self.enabled = self.FAKE_REPOS.set_up_git() |
| 846 | 305 |
| 847 def testSync(self): | 306 def testSync(self): |
| 848 if not self.enabled: | 307 if not self.enabled: |
| 849 return | 308 return |
| 850 # TODO(maruel): safesync. | 309 # TODO(maruel): safesync. |
| 851 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) | 310 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1213 | 672 |
| 1214 # Check that repo_2 is actually shallow and its log has only one entry. | 673 # Check that repo_2 is actually shallow and its log has only one entry. |
| 1215 rev_lists = subprocess2.check_output(['git', 'rev-list', 'HEAD'], | 674 rev_lists = subprocess2.check_output(['git', 'rev-list', 'HEAD'], |
| 1216 cwd=repo2_root) | 675 cwd=repo2_root) |
| 1217 self.assertEquals(repo_2_hash_new, rev_lists.strip('\r\n')) | 676 self.assertEquals(repo_2_hash_new, rev_lists.strip('\r\n')) |
| 1218 | 677 |
| 1219 # Check that we have actually checked out the right commit. | 678 # Check that we have actually checked out the right commit. |
| 1220 self.assertTrue(os.path.exists(join(repo2_root, 'last_file'))) | 679 self.assertTrue(os.path.exists(join(repo2_root, 'last_file'))) |
| 1221 | 680 |
| 1222 | 681 |
| 1223 class GClientSmokeBoth(GClientSmokeBase): | |
| 1224 def setUp(self): | |
| 1225 super(GClientSmokeBoth, self).setUp() | |
| 1226 self.enabled = self.FAKE_REPOS.set_up_svn() and self.FAKE_REPOS.set_up_git() | |
| 1227 | |
| 1228 def testMultiSolutions(self): | |
| 1229 if not self.enabled: | |
| 1230 return | |
| 1231 self.gclient(['config', '--spec', | |
| 1232 'solutions=[' | |
| 1233 '{"name": "src",' | |
| 1234 ' "url": "' + self.svn_base + 'trunk/src/"},' | |
| 1235 '{"name": "src-git",' | |
| 1236 '"url": "' + self.git_base + 'repo_1"}]']) | |
| 1237 self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], | |
| 1238 ['running', 'running', | |
| 1239 # This is due to the way svn update is called for a single | |
| 1240 # file when File() is used in a DEPS file. | |
| 1241 ('running', self.root_dir + '/src/file/other'), | |
| 1242 'running', 'running', 'running', 'running', | |
| 1243 'running', 'running']) | |
| 1244 tree = self.mangle_git_tree(('repo_1@2', 'src-git'), | |
| 1245 ('repo_2@1', 'src/repo2'), | |
| 1246 ('repo_3@2', 'src/repo2/repo_renamed')) | |
| 1247 tree.update(self.mangle_svn_tree( | |
| 1248 ('trunk/src@2', 'src'), | |
| 1249 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 1250 ('trunk/other@2', 'src/other'))) | |
| 1251 tree['src/file/other/DEPS'] = ( | |
| 1252 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 1253 tree['src/git_hooked1'] = 'git_hooked1' | |
| 1254 tree['src/git_hooked2'] = 'git_hooked2' | |
| 1255 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 1256 self.assertTree(tree) | |
| 1257 | |
| 1258 def testMultiSolutionsJobs(self): | |
| 1259 if not self.enabled: | |
| 1260 return | |
| 1261 self.gclient(['config', '--spec', | |
| 1262 'solutions=[' | |
| 1263 '{"name": "src",' | |
| 1264 ' "url": "' + self.svn_base + 'trunk/src/"},' | |
| 1265 '{"name": "src-git",' | |
| 1266 '"url": "' + self.git_base + 'repo_1"}]']) | |
| 1267 # There is no guarantee that the ordering will be consistent. | |
| 1268 (stdout, stderr, returncode) = self.gclient( | |
| 1269 ['sync', '--deps', 'mac', '--jobs', '8']) | |
| 1270 stdout = self.untangle(stdout) | |
| 1271 self.checkString('', stderr) | |
| 1272 self.assertEquals(0, returncode) | |
| 1273 results = self.splitBlock(stdout) | |
| 1274 self.assertEquals(9, len(results)) | |
| 1275 tree = self.mangle_git_tree(('repo_1@2', 'src-git'), | |
| 1276 ('repo_2@1', 'src/repo2'), | |
| 1277 ('repo_3@2', 'src/repo2/repo_renamed')) | |
| 1278 tree.update(self.mangle_svn_tree( | |
| 1279 ('trunk/src@2', 'src'), | |
| 1280 ('trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 1281 ('trunk/other@2', 'src/other'))) | |
| 1282 tree['src/file/other/DEPS'] = ( | |
| 1283 self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) | |
| 1284 tree['src/git_hooked1'] = 'git_hooked1' | |
| 1285 tree['src/git_hooked2'] = 'git_hooked2' | |
| 1286 tree['src/svn_hooked1'] = 'svn_hooked1' | |
| 1287 self.assertTree(tree) | |
| 1288 | |
| 1289 def testMultiSolutionsMultiRev(self): | |
| 1290 if not self.enabled: | |
| 1291 return | |
| 1292 self.gclient(['config', '--spec', | |
| 1293 'solutions=[' | |
| 1294 '{"name": "src",' | |
| 1295 ' "url": "' + self.svn_base + 'trunk/src/"},' | |
| 1296 '{"name": "src-git",' | |
| 1297 '"url": "' + self.git_base + 'repo_1"}]']) | |
| 1298 self.parseGclient( | |
| 1299 ['sync', '--deps', 'mac', '--jobs', '1', '--revision', '1', | |
| 1300 '-r', 'src-git@' + self.githash('repo_1', 1)], | |
| 1301 ['running', 'running', 'running', 'running'], | |
| 1302 expected_stderr= | |
| 1303 'You must specify the full solution name like --revision src@1\n' | |
| 1304 'when you have multiple solutions setup in your .gclient file.\n' | |
| 1305 'Other solutions present are: src-git.\n') | |
| 1306 tree = self.mangle_git_tree(('repo_1@1', 'src-git'), | |
| 1307 ('repo_2@2', 'src/repo2'), | |
| 1308 ('repo_3@1', 'src/repo2/repo3'), | |
| 1309 ('repo_4@2', 'src/repo4')) | |
| 1310 tree.update(self.mangle_svn_tree( | |
| 1311 ('trunk/src@1', 'src'), | |
| 1312 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | |
| 1313 ('trunk/other@1', 'src/other'), | |
| 1314 ('trunk/third_party/foo@2', 'src/third_party/prout'))) | |
| 1315 self.assertTree(tree) | |
| 1316 | |
| 1317 def testRevInfo(self): | |
| 1318 if not self.enabled: | |
| 1319 return | |
| 1320 self.gclient(['config', '--spec', | |
| 1321 'solutions=[' | |
| 1322 '{"name": "src",' | |
| 1323 ' "url": "' + self.svn_base + 'trunk/src/"},' | |
| 1324 '{"name": "src-git",' | |
| 1325 '"url": "' + self.git_base + 'repo_1"}]']) | |
| 1326 self.gclient(['sync', '--deps', 'mac']) | |
| 1327 results = self.gclient(['revinfo', '--deps', 'mac']) | |
| 1328 out = ('src: %(svn_base)s/src/\n' | |
| 1329 'src-git: %(git_base)srepo_1\n' | |
| 1330 'src/file/other: File("%(svn_base)s/other/DEPS")\n' | |
| 1331 'src/other: %(svn_base)s/other\n' | |
| 1332 'src/repo2: %(git_base)srepo_2@%(hash2)s\n' | |
| 1333 'src/repo2/repo_renamed: %(git_base)srepo_3\n' | |
| 1334 'src/third_party/foo: %(svn_base)s/third_party/foo@1\n') % { | |
| 1335 'svn_base': self.svn_base + 'trunk', | |
| 1336 'git_base': self.git_base, | |
| 1337 'hash2': self.githash('repo_2', 1)[:7], | |
| 1338 } | |
| 1339 self.check((out, '', 0), results) | |
| 1340 results = self.gclient(['revinfo', '--deps', 'mac', '--actual']) | |
| 1341 out = ('src: %(svn_base)s/src/@2\n' | |
| 1342 'src-git: %(git_base)srepo_1@%(hash1)s\n' | |
| 1343 'src/file/other: %(svn_base)s/other/DEPS@2\n' | |
| 1344 'src/other: %(svn_base)s/other@2\n' | |
| 1345 'src/repo2: %(git_base)srepo_2@%(hash2)s\n' | |
| 1346 'src/repo2/repo_renamed: %(git_base)srepo_3@%(hash3)s\n' | |
| 1347 'src/third_party/foo: %(svn_base)s/third_party/foo@1\n') % { | |
| 1348 'svn_base': self.svn_base + 'trunk', | |
| 1349 'git_base': self.git_base, | |
| 1350 'hash1': self.githash('repo_1', 2), | |
| 1351 'hash2': self.githash('repo_2', 1), | |
| 1352 'hash3': self.githash('repo_3', 2), | |
| 1353 } | |
| 1354 self.check((out, '', 0), results) | |
| 1355 | |
| 1356 def testRecurse(self): | |
| 1357 if not self.enabled: | |
| 1358 return | |
| 1359 self.gclient(['config', '--spec', | |
| 1360 'solutions=[' | |
| 1361 '{"name": "src",' | |
| 1362 ' "url": "' + self.svn_base + 'trunk/src/"},' | |
| 1363 '{"name": "src-git",' | |
| 1364 '"url": "' + self.git_base + 'repo_1"}]']) | |
| 1365 self.gclient(['sync', '--deps', 'mac']) | |
| 1366 results = self.gclient(['recurse', '-j1', 'sh', '-c', | |
| 1367 'echo $GCLIENT_SCM,$GCLIENT_URL,`pwd`']) | |
| 1368 | |
| 1369 entries = [tuple(line.split(',')) | |
| 1370 for line in results[0].strip().split('\n')] | |
| 1371 logging.debug(entries) | |
| 1372 | |
| 1373 bases = {'svn': self.svn_base, 'git': self.git_base} | |
| 1374 expected_source = [ | |
| 1375 ('svn', 'trunk/src/', 'src'), | |
| 1376 ('git', 'repo_1', 'src-git'), | |
| 1377 ('svn', 'trunk/other', 'src/other'), | |
| 1378 ('git', 'repo_2@' + self.githash('repo_2', 1)[:7], 'src/repo2'), | |
| 1379 ('git', 'repo_3', 'src/repo2/repo_renamed'), | |
| 1380 ('svn', 'trunk/third_party/foo@1', 'src/third_party/foo'), | |
| 1381 ] | |
| 1382 expected = [(scm, bases[scm] + url, os.path.join(self.root_dir, path)) | |
| 1383 for (scm, url, path) in expected_source] | |
| 1384 | |
| 1385 self.assertEquals(sorted(entries), sorted(expected)) | |
| 1386 | |
| 1387 | |
| 1388 class SkiaDEPSTransitionSmokeTest(GClientSmokeBase): | 682 class SkiaDEPSTransitionSmokeTest(GClientSmokeBase): |
| 1389 """Simulate the behavior of bisect bots as they transition across the Skia | 683 """Simulate the behavior of bisect bots as they transition across the Skia |
| 1390 DEPS change.""" | 684 DEPS change.""" |
| 1391 | 685 |
| 1392 FAKE_REPOS_CLASS = FakeRepoSkiaDEPS | 686 FAKE_REPOS_CLASS = fake_repos.FakeRepoSkiaDEPS |
| 1393 | 687 |
| 1394 def setUp(self): | 688 def setUp(self): |
| 1395 super(SkiaDEPSTransitionSmokeTest, self).setUp() | 689 super(SkiaDEPSTransitionSmokeTest, self).setUp() |
| 1396 self.enabled = self.FAKE_REPOS.set_up_git() and self.FAKE_REPOS.set_up_svn() | 690 self.enabled = self.FAKE_REPOS.set_up_git() |
| 1397 | |
| 1398 def testSkiaDEPSChangeSVN(self): | |
| 1399 if not self.enabled: | |
| 1400 return | |
| 1401 | |
| 1402 # Create an initial checkout: | |
| 1403 # - Single checkout at the root. | |
| 1404 # - Multiple checkouts in a shared subdirectory. | |
| 1405 self.gclient(['config', '--spec', | |
| 1406 'solutions=[' | |
| 1407 '{"name": "src",' | |
| 1408 ' "url": "' + self.svn_base + 'trunk/src/",' | |
| 1409 '}]']) | |
| 1410 | |
| 1411 checkout_path = os.path.join(self.root_dir, 'src') | |
| 1412 skia = os.path.join(checkout_path, 'third_party', 'skia') | |
| 1413 skia_gyp = os.path.join(skia, 'gyp') | |
| 1414 skia_include = os.path.join(skia, 'include') | |
| 1415 skia_src = os.path.join(skia, 'src') | |
| 1416 | |
| 1417 gyp_svn_url = self.svn_base + 'skia/gyp' | |
| 1418 include_svn_url = self.svn_base + 'skia/include' | |
| 1419 src_svn_url = self.svn_base + 'skia/src' | |
| 1420 skia_git_url = self.git_base + 'repo_1' | |
| 1421 | |
| 1422 # Initial sync. Verify that we get the expected checkout. | |
| 1423 res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2']) | |
| 1424 self.assertEqual(res[2], 0, 'Initial sync failed.') | |
| 1425 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'], | |
| 1426 gyp_svn_url) | |
| 1427 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'], | |
| 1428 include_svn_url) | |
| 1429 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'], | |
| 1430 src_svn_url) | |
| 1431 | |
| 1432 # Verify that the sync succeeds. Verify that we have the expected merged | |
| 1433 # checkout. | |
| 1434 res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@3']) | |
| 1435 self.assertEqual(res[2], 0, 'DEPS change sync failed.') | |
| 1436 self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], | |
| 1437 skia), skia_git_url) | |
| 1438 | |
| 1439 # Sync again. Verify that we still have the expected merged checkout. | |
| 1440 res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@3']) | |
| 1441 self.assertEqual(res[2], 0, 'Subsequent sync failed.') | |
| 1442 self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], | |
| 1443 skia), skia_git_url) | |
| 1444 | |
| 1445 # Sync back to the original DEPS. Verify that we get the original structure. | |
| 1446 res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2']) | |
| 1447 self.assertEqual(res[2], 0, 'Reverse sync failed.') | |
| 1448 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'], | |
| 1449 gyp_svn_url) | |
| 1450 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'], | |
| 1451 include_svn_url) | |
| 1452 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'], | |
| 1453 src_svn_url) | |
| 1454 | |
| 1455 # Sync again. Verify that we still have the original structure. | |
| 1456 res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2']) | |
| 1457 self.assertEqual(res[2], 0, 'Subsequent sync #2 failed.') | |
| 1458 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'], | |
| 1459 gyp_svn_url) | |
| 1460 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'], | |
| 1461 include_svn_url) | |
| 1462 self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'], | |
| 1463 src_svn_url) | |
| 1464 | 691 |
| 1465 def testSkiaDEPSChangeGit(self): | 692 def testSkiaDEPSChangeGit(self): |
| 1466 if not self.enabled: | 693 if not self.enabled: |
| 1467 return | 694 return |
| 1468 | 695 |
| 1469 # Create an initial checkout: | 696 # Create an initial checkout: |
| 1470 # - Single checkout at the root. | 697 # - Single checkout at the root. |
| 1471 # - Multiple checkouts in a shared subdirectory. | 698 # - Multiple checkouts in a shared subdirectory. |
| 1472 self.gclient(['config', '--spec', | 699 self.gclient(['config', '--spec', |
| 1473 'solutions=[' | 700 'solutions=[' |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1535 self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], | 762 self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], |
| 1536 skia_include), include_git_url) | 763 skia_include), include_git_url) |
| 1537 self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], | 764 self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], |
| 1538 skia_src), src_git_url) | 765 skia_src), src_git_url) |
| 1539 | 766 |
| 1540 | 767 |
| 1541 class BlinkDEPSTransitionSmokeTest(GClientSmokeBase): | 768 class BlinkDEPSTransitionSmokeTest(GClientSmokeBase): |
| 1542 """Simulate the behavior of bisect bots as they transition across the Blink | 769 """Simulate the behavior of bisect bots as they transition across the Blink |
| 1543 DEPS change.""" | 770 DEPS change.""" |
| 1544 | 771 |
| 1545 FAKE_REPOS_CLASS = FakeRepoBlinkDEPS | 772 FAKE_REPOS_CLASS = fake_repos.FakeRepoBlinkDEPS |
| 1546 | 773 |
| 1547 def setUp(self): | 774 def setUp(self): |
| 1548 super(BlinkDEPSTransitionSmokeTest, self).setUp() | 775 super(BlinkDEPSTransitionSmokeTest, self).setUp() |
| 1549 self.enabled = self.FAKE_REPOS.set_up_git() | 776 self.enabled = self.FAKE_REPOS.set_up_git() |
| 1550 self.checkout_path = os.path.join(self.root_dir, 'src') | 777 self.checkout_path = os.path.join(self.root_dir, 'src') |
| 1551 self.blink = os.path.join(self.checkout_path, 'third_party', 'WebKit') | 778 self.blink = os.path.join(self.checkout_path, 'third_party', 'WebKit') |
| 1552 self.blink_git_url = self.FAKE_REPOS.git_base + 'repo_2' | 779 self.blink_git_url = self.FAKE_REPOS.git_base + 'repo_2' |
| 1553 self.pre_merge_sha = self.githash('repo_1', 1) | 780 self.pre_merge_sha = self.githash('repo_1', 1) |
| 1554 self.post_merge_sha = self.githash('repo_1', 2) | 781 self.post_merge_sha = self.githash('repo_1', 2) |
| 1555 | 782 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1666 self.gclient(['sync', '--revision', 'src@%s' % self.post_merge_sha]) | 893 self.gclient(['sync', '--revision', 'src@%s' % self.post_merge_sha]) |
| 1667 self.CheckStatusPostMergePoint() | 894 self.CheckStatusPostMergePoint() |
| 1668 | 895 |
| 1669 # Go backwards and check that we still have the foo branch. | 896 # Go backwards and check that we still have the foo branch. |
| 1670 self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha]) | 897 self.gclient(['sync', '--revision', 'src@%s' % self.pre_merge_sha]) |
| 1671 self.CheckStatusPreMergePoint() | 898 self.CheckStatusPreMergePoint() |
| 1672 subprocess2.check_call( | 899 subprocess2.check_call( |
| 1673 ['git', 'show-ref', '-q', '--verify', 'refs/heads/foo'], cwd=self.blink) | 900 ['git', 'show-ref', '-q', '--verify', 'refs/heads/foo'], cwd=self.blink) |
| 1674 | 901 |
| 1675 | 902 |
| 1676 class GClientSmokeFromCheckout(GClientSmokeBase): | |
| 1677 # WebKit abuses this. It has a .gclient and a DEPS from a checkout. | |
| 1678 def setUp(self): | |
| 1679 super(GClientSmokeFromCheckout, self).setUp() | |
| 1680 self.enabled = self.FAKE_REPOS.set_up_svn() | |
| 1681 os.rmdir(self.root_dir) | |
| 1682 if self.enabled: | |
| 1683 usr, pwd = self.FAKE_REPOS.USERS[0] | |
| 1684 subprocess2.check_call( | |
| 1685 ['svn', 'checkout', self.svn_base + '/trunk/webkit', | |
| 1686 self.root_dir, '-q', | |
| 1687 '--non-interactive', '--no-auth-cache', | |
| 1688 '--username', usr, '--password', pwd]) | |
| 1689 | |
| 1690 def testSync(self): | |
| 1691 if not self.enabled: | |
| 1692 return | |
| 1693 self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], | |
| 1694 ['running', 'running']) | |
| 1695 tree = self.mangle_svn_tree( | |
| 1696 ('trunk/webkit@2', ''), | |
| 1697 ('trunk/third_party/foo@1', 'foo/bar')) | |
| 1698 self.assertTree(tree) | |
| 1699 | |
| 1700 def testRevertAndStatus(self): | |
| 1701 if not self.enabled: | |
| 1702 return | |
| 1703 self.gclient(['sync']) | |
| 1704 | |
| 1705 # TODO(maruel): This is incorrect. | |
| 1706 out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], []) | |
| 1707 | |
| 1708 # Revert implies --force implies running hooks without looking at pattern | |
| 1709 # matching. | |
| 1710 results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1']) | |
| 1711 out = self.splitBlock(results[0]) | |
| 1712 self.assertEquals(2, len(out)) | |
| 1713 # This value varies depending on the version of svn being run. | |
| 1714 # New vesions (the one in Trust) print "Updating '.':" and "At revision 1.". | |
| 1715 # Older versions (the one in Precise) print just "At revision 1.". | |
| 1716 #self.assertEquals(3, len(out[0])) | |
| 1717 self.assertEquals(2, len(out[1])) | |
| 1718 self.checkString('foo', out[1][1]) | |
| 1719 self.checkString('', results[1]) | |
| 1720 self.assertEquals(0, results[2]) | |
| 1721 tree = self.mangle_svn_tree( | |
| 1722 ('trunk/webkit@2', ''), | |
| 1723 ('trunk/third_party/foo@1', 'foo/bar')) | |
| 1724 self.assertTree(tree) | |
| 1725 | |
| 1726 # TODO(maruel): This is incorrect. | |
| 1727 out = self.parseGclient(['status', '--deps', 'mac'], []) | |
| 1728 | |
| 1729 def testRunHooks(self): | |
| 1730 if not self.enabled: | |
| 1731 return | |
| 1732 # Hooks aren't really tested for now since there is no hook defined. | |
| 1733 self.gclient(['sync', '--deps', 'mac']) | |
| 1734 out = self.parseGclient(['runhooks', '--deps', 'mac'], ['running']) | |
| 1735 self.assertEquals(1, len(out)) | |
| 1736 self.assertEquals(2, len(out[0])) | |
| 1737 self.assertEquals(3, len(out[0][0])) | |
| 1738 self.checkString('foo', out[0][1]) | |
| 1739 tree = self.mangle_svn_tree( | |
| 1740 ('trunk/webkit@2', ''), | |
| 1741 ('trunk/third_party/foo@1', 'foo/bar')) | |
| 1742 self.assertTree(tree) | |
| 1743 | |
| 1744 def testRevInfo(self): | |
| 1745 if not self.enabled: | |
| 1746 return | |
| 1747 self.gclient(['sync', '--deps', 'mac']) | |
| 1748 results = self.gclient(['revinfo', '--deps', 'mac']) | |
| 1749 expected = ( | |
| 1750 './: None\nfoo/bar: %strunk/third_party/foo@1\n' % self.svn_base, | |
| 1751 '', 0) | |
| 1752 self.check(expected, results) | |
| 1753 # TODO(maruel): To be added after the refactor. | |
| 1754 #results = self.gclient(['revinfo', '--snapshot']) | |
| 1755 #expected = ( | |
| 1756 # './: None\nfoo/bar: %strunk/third_party/foo@1\n' % self.svn_base, | |
| 1757 # '', 0) | |
| 1758 #self.check(expected, results) | |
| 1759 | |
| 1760 def testRest(self): | |
| 1761 if not self.enabled: | |
| 1762 return | |
| 1763 self.gclient(['sync']) | |
| 1764 # TODO(maruel): This is incorrect, it should run on ./ too. | |
| 1765 self.parseGclient( | |
| 1766 ['cleanup', '--deps', 'mac', '--verbose', '--jobs', '1'], | |
| 1767 [('running', join(self.root_dir, 'foo', 'bar'))]) | |
| 1768 self.parseGclient( | |
| 1769 ['diff', '--deps', 'mac', '--verbose', '--jobs', '1'], | |
| 1770 [('running', join(self.root_dir, 'foo', 'bar'))]) | |
| 1771 | |
| 1772 | |
| 1773 if __name__ == '__main__': | 903 if __name__ == '__main__': |
| 1774 if '-v' in sys.argv: | 904 if '-v' in sys.argv: |
| 1775 logging.basicConfig(level=logging.DEBUG) | 905 logging.basicConfig(level=logging.DEBUG) |
| 1776 | 906 |
| 1777 if '-c' in sys.argv: | 907 if '-c' in sys.argv: |
| 1778 COVERAGE = True | 908 COVERAGE = True |
| 1779 sys.argv.remove('-c') | 909 sys.argv.remove('-c') |
| 1780 if os.path.exists('.coverage'): | 910 if os.path.exists('.coverage'): |
| 1781 os.remove('.coverage') | 911 os.remove('.coverage') |
| 1782 os.environ['COVERAGE_FILE'] = os.path.join( | 912 os.environ['COVERAGE_FILE'] = os.path.join( |
| 1783 os.path.dirname(os.path.dirname(os.path.abspath(__file__))), | 913 os.path.dirname(os.path.dirname(os.path.abspath(__file__))), |
| 1784 '.coverage') | 914 '.coverage') |
| 1785 unittest.main() | 915 unittest.main() |
| OLD | NEW |