Index: tests/gclient_smoketest.py |
diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py |
index 6a8e3aaebd26feaf902e4c7964b60ddfd9f496db..96b507959b9a947dd7d1b58f5d320abcecff6b59 100755 |
--- a/tests/gclient_smoketest.py |
+++ b/tests/gclient_smoketest.py |
@@ -20,20 +20,17 @@ import unittest |
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
sys.path.insert(0, ROOT_DIR) |
-from testing_support.fake_repos import join, write |
-from testing_support.fake_repos import FakeReposTestBase, FakeRepoTransitive, \ |
- FakeRepoSkiaDEPS, FakeRepoBlinkDEPS |
- |
import gclient_utils |
import scm as gclient_scm |
- |
import subprocess2 |
+from testing_support import fake_repos |
+from testing_support.fake_repos import join, write |
GCLIENT_PATH = os.path.join(ROOT_DIR, 'gclient') |
COVERAGE = False |
-class GClientSmokeBase(FakeReposTestBase): |
+class GClientSmokeBase(fake_repos.FakeReposTestBase): |
def setUp(self): |
super(GClientSmokeBase, self).setUp() |
# Make sure it doesn't try to auto update when testing! |
@@ -301,544 +298,6 @@ class GClientSmoke(GClientSmokeBase): |
self.checkBlock(res[0], [('running', deps), ('running', src)]) |
-class GClientSmokeSVN(GClientSmokeBase): |
- def setUp(self): |
- super(GClientSmokeSVN, self).setUp() |
- self.enabled = self.FAKE_REPOS.set_up_svn() |
- |
- def testSync(self): |
- # TODO(maruel): safesync. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- # Test unversioned checkout. |
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], |
- ['running', 'running', |
- # This is due to the way svn update is called for a |
- # single file when File() is used in a DEPS file. |
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), |
- 'running', 'running', 'running', 'running']) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- # Manually remove svn_hooked1 before synching to make sure it's not |
- # recreated. |
- os.remove(join(self.root_dir, 'src', 'svn_hooked1')) |
- |
- # Test incremental versioned sync: sync backward. |
- self.parseGclient( |
- ['sync', '--revision', 'src@1', '--deps', 'mac', |
- '--delete_unversioned_trees', '--jobs', '1'], |
- ['running', 'running', 'running', 'running', 'deleting']) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@1', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/other@1', 'src/other'), |
- ('trunk/third_party/foo@2', 'src/third_party/prout')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- self.assertTree(tree) |
- # Test incremental sync: delete-unversioned_trees isn't there. |
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], |
- ['running', 'running', 'running', 'running', 'running']) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other'), |
- ('trunk/third_party/foo@2', 'src/third_party/prout')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- def testSyncIgnoredSolutionName(self): |
- """TODO(maruel): This will become an error soon.""" |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- results = self.gclient( |
- ['sync', '--deps', 'mac', '-r', 'invalid@1', '--jobs', '1']) |
- self.checkBlock(results[0], [ |
- 'running', 'running', |
- # This is due to the way svn update is called for a single file when |
- # File() is used in a DEPS file. |
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), |
- 'running', 'running', 'running', 'running']) |
- self.checkString('Please fix your script, having invalid --revision flags ' |
- 'will soon considered an error.\n', results[1]) |
- self.assertEquals(0, results[2]) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- def testSyncNoSolutionName(self): |
- # When no solution name is provided, gclient uses the first solution listed. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.parseGclient(['sync', '--deps', 'mac', '-r', '1', '--jobs', '1'], |
- ['running', 'running', 'running', 'running']) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@1', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/other@1', 'src/other'), |
- ('trunk/third_party/foo@2', 'src/third_party/prout')) |
- self.assertTree(tree) |
- |
- def testSyncJobs(self): |
- if not self.enabled: |
- return |
- # TODO(maruel): safesync. |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- # Test unversioned checkout. |
- # Use --jobs 1 otherwise the order is not deterministic. |
- self.parseGclient( |
- ['sync', '--deps', 'mac', '--jobs', '1'], |
- [ |
- 'running', |
- 'running', |
- # This is due to the way svn update is called for a |
- # single file when File() is used in a DEPS file. |
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), |
- 'running', |
- 'running', |
- 'running', |
- 'running', |
- ], |
- untangle=True) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- # Manually remove svn_hooked1 before synching to make sure it's not |
- # recreated. |
- os.remove(join(self.root_dir, 'src', 'svn_hooked1')) |
- |
- # Test incremental versioned sync: sync backward. |
- self.parseGclient( |
- ['sync', '--revision', 'src@1', '--deps', 'mac', |
- '--delete_unversioned_trees', '--jobs', '8'], |
- ['running', 'running', 'running', 'running', 'deleting'], |
- untangle=True) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@1', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/other@1', 'src/other'), |
- ('trunk/third_party/foo@2', 'src/third_party/prout')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- self.assertTree(tree) |
- # Test incremental sync: delete-unversioned_trees isn't there. |
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '8'], |
- ['running', 'running', 'running', 'running', 'running'], |
- untangle=True) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other'), |
- ('trunk/third_party/foo@2', 'src/third_party/prout')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- def testSyncCustomDeps(self): |
- if not self.enabled: |
- return |
- out = ( |
- 'solutions = [\n' |
- ' { "name" : "src",\n' |
- ' "url" : "%(base)s/src",\n' |
- ' "custom_deps" : {\n' |
- # Remove 2 deps, change 1, add 1. |
- ' "src/other": None,\n' |
- ' "src/third_party/foo": \'%(base)s/third_party/prout\',\n' |
- ' "src/file/other": None,\n' |
- ' "new_deps": "/trunk/src/third_party",\n' |
- ' },\n' |
- ' "safesync_url": "",\n' |
- ' },\n' |
- ']\n\n' % |
- { 'base': self.svn_base + 'trunk' }) |
- fileobj = open(os.path.join(self.root_dir, '.gclient'), 'w') |
- fileobj.write(out) |
- fileobj.close() |
- self.parseGclient( |
- ['sync', '--deps', 'mac', '--jobs', '1'], |
- ['running', 'running', 'running', 'running'], |
- untangle=True) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/prout@2', 'src/third_party/foo'), |
- ('trunk/src/third_party@2', 'new_deps')) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- def testSyncCustomDepsNoDeps(self): |
- if not self.enabled: |
- return |
- out = ( |
- 'solutions = [\n' |
- # This directory has no DEPS file. |
- ' { "name" : "src/third_party",\n' |
- ' "url" : "%(base)s/src/third_party",\n' |
- ' "custom_deps" : {\n' |
- # Add 1. |
- ' "src/other": \'/trunk/other\',\n' |
- ' },\n' |
- ' "safesync_url": "",\n' |
- ' },\n' |
- ']\n\n' % |
- { 'base': self.svn_base + 'trunk' }) |
- fileobj = open(os.path.join(self.root_dir, '.gclient'), 'w') |
- fileobj.write(out) |
- fileobj.close() |
- self.parseGclient( |
- ['sync', '--deps', 'mac', '--jobs', '1'], |
- ['running', 'running'], |
- untangle=True) |
- tree = self.mangle_svn_tree( |
- ('trunk/src/third_party@2', 'src/third_party'), |
- ('trunk/other@2', 'src/other')) |
- self.assertTree(tree) |
- |
- def testRevertAndStatus(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- # Tested in testSync. |
- self.gclient(['sync', '--deps', 'mac']) |
- write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') |
- |
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], |
- [['running', join(self.root_dir, 'src')], |
- ['running', join(self.root_dir, 'src', 'other')]]) |
- out = self.svnBlockCleanup(out) |
- self.checkString('file', out[0][1]) |
- self.checkString('other', out[0][2]) |
- self.checkString('svn_hooked1', out[0][3]) |
- self.checkString(join('third_party', 'foo'), out[0][4]) |
- self.checkString('hi', out[1][1]) |
- self.assertEquals(5, len(out[0])) |
- self.assertEquals(2, len(out[1])) |
- |
- # Revert implies --force implies running hooks without looking at pattern |
- # matching. |
- results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1']) |
- out = self.splitBlock(results[0]) |
- # src, src/other is missing, src/other, src/third_party/foo is missing, |
- # src/third_party/foo, 2 svn hooks, 3 related to File(). |
- self.assertEquals( 8, len(out)) |
- self.checkString('', results[1]) |
- self.assertEquals(0, results[2]) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other')) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- tree['src/svn_hooked2'] = 'svn_hooked2' |
- self.assertTree(tree) |
- |
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], |
- [['running', join(self.root_dir, 'src')]]) |
- out = self.svnBlockCleanup(out) |
- self.checkString('file', out[0][1]) |
- self.checkString('other', out[0][2]) |
- self.checkString('svn_hooked1', out[0][3]) |
- self.checkString('svn_hooked2', out[0][4]) |
- self.checkString(join('third_party', 'foo'), out[0][5]) |
- self.assertEquals(6, len(out[0])) |
- self.assertEquals(1, len(out)) |
- |
- def testRevertAndStatusDepsOs(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- # Tested in testSync. |
- self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) |
- write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') |
- |
- # Without --verbose, gclient won't output the directories without |
- # modification. |
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], |
- [['running', join(self.root_dir, 'src')], |
- ['running', join(self.root_dir, 'src', 'other')]]) |
- out = self.svnBlockCleanup(out) |
- self.checkString('other', out[0][1]) |
- self.checkString(join('third_party', 'fpp'), out[0][2]) |
- self.checkString(join('third_party', 'prout'), out[0][3]) |
- self.checkString('hi', out[1][1]) |
- self.assertEquals(4, len(out[0])) |
- self.assertEquals(2, len(out[1])) |
- |
- # So verify it works with --verbose. |
- out = self.parseGclient( |
- ['status', '--deps', 'mac', '--verbose', '--jobs', '1'], |
- [['running', join(self.root_dir, 'src')], |
- ['running', join(self.root_dir, 'src', 'other')], |
- ['running', join(self.root_dir, 'src', 'third_party', 'fpp')], |
- ['running', join(self.root_dir, 'src', 'third_party', 'prout')]]) |
- out = self.svnBlockCleanup(out) |
- self.checkString('other', out[0][5]) |
- self.checkString(join('third_party', 'fpp'), out[0][7]) |
- self.checkString(join('third_party', 'prout'), out[0][8]) |
- self.checkString('hi', out[1][5]) |
- self.assertEquals(9, len(out[0])) |
- self.assertEquals(7, len(out[1])) |
- self.assertEquals(6, len(out[2])) |
- self.assertEquals(6, len(out[3])) |
- self.assertEquals(4, len(out)) |
- |
- # Revert implies --force implies running hooks without looking at pattern |
- # matching. |
- # TODO(maruel): In general, gclient revert output is wrong. It should output |
- # the file list after some ___ running 'svn status' |
- results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1']) |
- out = self.splitBlock(results[0]) |
- self.assertEquals(4, len(out)) |
- self.checkString('', results[1]) |
- self.assertEquals(0, results[2]) |
- tree = self.mangle_svn_tree( |
- ('trunk/src@1', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/other@1', 'src/other'), |
- ('trunk/third_party/prout@2', 'src/third_party/prout')) |
- self.assertTree(tree) |
- |
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], |
- [['running', join(self.root_dir, 'src')]]) |
- out = self.svnBlockCleanup(out) |
- self.checkString('other', out[0][1]) |
- self.checkString(join('third_party', 'fpp'), out[0][2]) |
- self.checkString(join('third_party', 'prout'), out[0][3]) |
- self.assertEquals(4, len(out[0])) |
- |
- def testRunHooks(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.gclient(['sync', '--deps', 'mac']) |
- out = self.parseGclient(['runhooks', '--deps', 'mac'], |
- ['running', 'running']) |
- self.checkString(1, len(out[0])) |
- self.checkString(1, len(out[1])) |
- |
- def testRunHooksDepsOs(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) |
- out = self.parseGclient(['runhooks', '--deps', 'mac'], []) |
- self.assertEquals([], out) |
- |
- def testRevInfo(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.gclient(['sync', '--deps', 'mac']) |
- results = self.gclient(['revinfo', '--deps', 'mac']) |
- out = ('src: %(base)s/src\n' |
- 'src/file/other: File("%(base)s/other/DEPS")\n' |
- 'src/other: %(base)s/other\n' |
- 'src/third_party/foo: %(base)s/third_party/foo@1\n' % |
- { 'base': self.svn_base + 'trunk' }) |
- self.check((out, '', 0), results) |
- results = self.gclient(['revinfo', '--deps', 'mac', '--actual']) |
- out = ('src: %(base)s/src@2\n' |
- 'src/file/other: %(base)s/other/DEPS@2\n' |
- 'src/other: %(base)s/other@2\n' |
- 'src/third_party/foo: %(base)s/third_party/foo@1\n' % |
- { 'base': self.svn_base + 'trunk' }) |
- self.check((out, '', 0), results) |
- results = self.gclient(['revinfo', '--deps', 'mac', '--snapshot']) |
- out = ('# Snapshot generated with gclient revinfo --snapshot\n' |
- 'solutions = [\n' |
- ' { "name" : "src",\n' |
- ' "url" : "%(base)s/src",\n' |
- ' "deps_file" : "DEPS",\n' |
- ' "managed" : True,\n' |
- ' "custom_deps" : {\n' |
- ' "foo/bar": None,\n' |
- ' "invalid": None,\n' |
- ' "src/file/other": \'%(base)s/other/DEPS@2\',\n' |
- ' "src/other": \'%(base)s/other@2\',\n' |
- ' "src/third_party/foo": ' |
- '\'%(base)s/third_party/foo@1\',\n' |
- ' },\n' |
- ' "safesync_url": "",\n' |
- ' },\n' |
- ']\n\n' % |
- { 'base': self.svn_base + 'trunk' }) |
- self.check((out, '', 0), results) |
- |
- def testRevInfoAltDeps(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/', '--deps-file', |
- 'DEPS.alt']) |
- self.gclient(['sync']) |
- results = self.gclient(['revinfo', '--snapshot']) |
- out = ('# Snapshot generated with gclient revinfo --snapshot\n' |
- 'solutions = [\n' |
- ' { "name" : "src",\n' |
- ' "url" : "%(base)s/src",\n' |
- ' "deps_file" : "DEPS.alt",\n' |
- ' "managed" : True,\n' |
- ' "custom_deps" : {\n' |
- ' "foo/bar": None,\n' |
- ' "invalid": None,\n' |
- ' "src/other2": \'%(base)s/other@2\',\n' |
- ' },\n' |
- ' "safesync_url": "",\n' |
- ' },\n' |
- ']\n\n' % |
- { 'base': self.svn_base + 'trunk' }) |
- self.check((out, '', 0), results) |
- |
- |
- def testWrongDirectory(self): |
- # Check that we're not using a .gclient configuration which only talks |
- # about a subdirectory src when we're in a different subdirectory src-other. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.gclient(['sync']) |
- other_src = join(self.root_dir, 'src-other') |
- os.mkdir(other_src) |
- res = ('', 'Error: client not configured; see \'gclient config\'\n', 1) |
- self.check(res, self.gclient(['status'], other_src)) |
- |
- def testCorrectDirectory(self): |
- # Check that when we're in the subdirectory src, the .gclient configuration |
- # is used. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.gclient(['sync']) |
- src = join(self.root_dir, 'src') |
- res = self.gclient(['status', '--jobs', '1'], src) |
- self.checkBlock(res[0], [('running', src)]) |
- |
- def testInitialCheckoutNotYetDone(self): |
- # Check that gclient can be executed when the initial checkout hasn't been |
- # done yet. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.parseGclient( |
- ['sync', '--jobs', '1'], |
- ['running', 'running', |
- # This is due to the way svn update is called for a |
- # single file when File() is used in a DEPS file. |
- ('running', os.path.join(self.root_dir, 'src', 'file', 'other')), |
- 'running', 'running', 'running', 'running']) |
- |
- def testInitialCheckoutFailed(self): |
- # Check that gclient can be executed from an arbitrary sub directory if the |
- # initial checkout has failed. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- self.gclient(['sync']) |
- # Cripple the checkout. |
- os.remove(join(self.root_dir, '.gclient_entries')) |
- src = join(self.root_dir, 'src') |
- res = self.gclient(['sync', '--jobs', '1'], src) |
- self.checkBlock(res[0], |
- ['running', 'running', 'running']) |
- |
- def testUnversionedRepository(self): |
- # Check that gclient automatically deletes crippled SVN repositories. |
- if not self.enabled: |
- return |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- cmd = ['sync', '--jobs', '1', '--delete_unversioned_trees', '--reset'] |
- self.assertEquals(0, self.gclient(cmd)[-1]) |
- third_party = join(self.root_dir, 'src', 'third_party') |
- subprocess2.check_call(['svn', 'propset', '-q', 'svn:ignore', 'foo', '.'], |
- cwd=third_party) |
- |
- # Cripple src/third_party/foo and make sure gclient still succeeds. |
- gclient_utils.rmtree(join(third_party, 'foo', '.svn')) |
- self.assertEquals(0, self.gclient(cmd)[-1]) |
- |
- |
-class GClientSmokeSVNTransitive(GClientSmokeBase): |
- FAKE_REPOS_CLASS = FakeRepoTransitive |
- |
- def setUp(self): |
- super(GClientSmokeSVNTransitive, self).setUp() |
- self.enabled = self.FAKE_REPOS.set_up_svn() |
- |
- def testSyncTransitive(self): |
- if not self.enabled: |
- return |
- |
- self.gclient(['config', self.svn_base + 'trunk/src/']) |
- |
- def test_case(parent, timestamp, fixed, output): |
- # We check out revision 'parent' and expect the following: |
- # - src/ is checked out at r'parent' |
- # - src/same_repo is checked out at r'parent' (due to --transitive) |
- # - src/same_repo_fixed is checked out at r'fixed' |
- # - src/different_repo is checked out at r'timestamp' |
- # (due to --transitive) |
- # - src/different_repo_fixed is checked out at r'fixed' |
- |
- revisions = self.FAKE_REPOS.svn_revs |
- self.parseGclient( |
- ['sync', '--transitive', '--revision', 'src@%d' % parent, |
- '--jobs', '1'], output) |
- self.assertTree({ |
- 'src/origin': revisions[parent]['trunk/src/origin'], |
- 'src/DEPS': revisions[parent]['trunk/src/DEPS'], |
- 'src/same_repo/origin': revisions[parent]['trunk/third_party/origin'], |
- 'src/same_repo_fixed/origin': |
- revisions[fixed]['trunk/third_party/origin'], |
- 'src/different_repo/origin': |
- revisions[timestamp]['trunk/third_party/origin'], |
- 'src/different_repo_fixed/origin': |
- revisions[fixed]['trunk/third_party/origin'], |
- }) |
- |
- # Here are the test cases for checking out 'trunk/src' at r1, r2 and r3 |
- # r1: Everything is normal |
- test_case(parent=1, timestamp=1, fixed=1, |
- output=['running', 'running', 'running', 'running', 'running']) |
- # r2: Svn will scan from r1 upwards until it finds a revision matching the |
- # given timestamp or it takes the next smallest one (which is r2 in this |
- # case). |
- test_case(parent=2, timestamp=2, fixed=1, |
- output=['running', 'running', 'running']) |
- # r3: Svn will scan from r1 upwards until it finds a revision matching the |
- # given timestamp or it takes the next smallest one. Since |
- # timestamp(r3) < timestamp(r2) svn will checkout r1. |
- # This happens often on http://googlecode.com but is unexpected to happen |
- # with svnserve (unless you manually change 'svn:date') |
- test_case(parent=3, timestamp=1, fixed=1, |
- output=['running', 'running', 'running']) |
- |
- |
class GClientSmokeGIT(GClientSmokeBase): |
def setUp(self): |
super(GClientSmokeGIT, self).setUp() |
@@ -1220,247 +679,15 @@ class GClientSmokeGITMutates(GClientSmokeBase): |
self.assertTrue(os.path.exists(join(repo2_root, 'last_file'))) |
-class GClientSmokeBoth(GClientSmokeBase): |
- def setUp(self): |
- super(GClientSmokeBoth, self).setUp() |
- self.enabled = self.FAKE_REPOS.set_up_svn() and self.FAKE_REPOS.set_up_git() |
- |
- def testMultiSolutions(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', '--spec', |
- 'solutions=[' |
- '{"name": "src",' |
- ' "url": "' + self.svn_base + 'trunk/src/"},' |
- '{"name": "src-git",' |
- '"url": "' + self.git_base + 'repo_1"}]']) |
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], |
- ['running', 'running', |
- # This is due to the way svn update is called for a single |
- # file when File() is used in a DEPS file. |
- ('running', self.root_dir + '/src/file/other'), |
- 'running', 'running', 'running', 'running', |
- 'running', 'running']) |
- tree = self.mangle_git_tree(('repo_1@2', 'src-git'), |
- ('repo_2@1', 'src/repo2'), |
- ('repo_3@2', 'src/repo2/repo_renamed')) |
- tree.update(self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other'))) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/git_hooked1'] = 'git_hooked1' |
- tree['src/git_hooked2'] = 'git_hooked2' |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- def testMultiSolutionsJobs(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', '--spec', |
- 'solutions=[' |
- '{"name": "src",' |
- ' "url": "' + self.svn_base + 'trunk/src/"},' |
- '{"name": "src-git",' |
- '"url": "' + self.git_base + 'repo_1"}]']) |
- # There is no guarantee that the ordering will be consistent. |
- (stdout, stderr, returncode) = self.gclient( |
- ['sync', '--deps', 'mac', '--jobs', '8']) |
- stdout = self.untangle(stdout) |
- self.checkString('', stderr) |
- self.assertEquals(0, returncode) |
- results = self.splitBlock(stdout) |
- self.assertEquals(9, len(results)) |
- tree = self.mangle_git_tree(('repo_1@2', 'src-git'), |
- ('repo_2@1', 'src/repo2'), |
- ('repo_3@2', 'src/repo2/repo_renamed')) |
- tree.update(self.mangle_svn_tree( |
- ('trunk/src@2', 'src'), |
- ('trunk/third_party/foo@1', 'src/third_party/foo'), |
- ('trunk/other@2', 'src/other'))) |
- tree['src/file/other/DEPS'] = ( |
- self.FAKE_REPOS.svn_revs[2]['trunk/other/DEPS']) |
- tree['src/git_hooked1'] = 'git_hooked1' |
- tree['src/git_hooked2'] = 'git_hooked2' |
- tree['src/svn_hooked1'] = 'svn_hooked1' |
- self.assertTree(tree) |
- |
- def testMultiSolutionsMultiRev(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', '--spec', |
- 'solutions=[' |
- '{"name": "src",' |
- ' "url": "' + self.svn_base + 'trunk/src/"},' |
- '{"name": "src-git",' |
- '"url": "' + self.git_base + 'repo_1"}]']) |
- self.parseGclient( |
- ['sync', '--deps', 'mac', '--jobs', '1', '--revision', '1', |
- '-r', 'src-git@' + self.githash('repo_1', 1)], |
- ['running', 'running', 'running', 'running'], |
- expected_stderr= |
- 'You must specify the full solution name like --revision src@1\n' |
- 'when you have multiple solutions setup in your .gclient file.\n' |
- 'Other solutions present are: src-git.\n') |
- tree = self.mangle_git_tree(('repo_1@1', 'src-git'), |
- ('repo_2@2', 'src/repo2'), |
- ('repo_3@1', 'src/repo2/repo3'), |
- ('repo_4@2', 'src/repo4')) |
- tree.update(self.mangle_svn_tree( |
- ('trunk/src@1', 'src'), |
- ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
- ('trunk/other@1', 'src/other'), |
- ('trunk/third_party/foo@2', 'src/third_party/prout'))) |
- self.assertTree(tree) |
- |
- def testRevInfo(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', '--spec', |
- 'solutions=[' |
- '{"name": "src",' |
- ' "url": "' + self.svn_base + 'trunk/src/"},' |
- '{"name": "src-git",' |
- '"url": "' + self.git_base + 'repo_1"}]']) |
- self.gclient(['sync', '--deps', 'mac']) |
- results = self.gclient(['revinfo', '--deps', 'mac']) |
- out = ('src: %(svn_base)s/src/\n' |
- 'src-git: %(git_base)srepo_1\n' |
- 'src/file/other: File("%(svn_base)s/other/DEPS")\n' |
- 'src/other: %(svn_base)s/other\n' |
- 'src/repo2: %(git_base)srepo_2@%(hash2)s\n' |
- 'src/repo2/repo_renamed: %(git_base)srepo_3\n' |
- 'src/third_party/foo: %(svn_base)s/third_party/foo@1\n') % { |
- 'svn_base': self.svn_base + 'trunk', |
- 'git_base': self.git_base, |
- 'hash2': self.githash('repo_2', 1)[:7], |
- } |
- self.check((out, '', 0), results) |
- results = self.gclient(['revinfo', '--deps', 'mac', '--actual']) |
- out = ('src: %(svn_base)s/src/@2\n' |
- 'src-git: %(git_base)srepo_1@%(hash1)s\n' |
- 'src/file/other: %(svn_base)s/other/DEPS@2\n' |
- 'src/other: %(svn_base)s/other@2\n' |
- 'src/repo2: %(git_base)srepo_2@%(hash2)s\n' |
- 'src/repo2/repo_renamed: %(git_base)srepo_3@%(hash3)s\n' |
- 'src/third_party/foo: %(svn_base)s/third_party/foo@1\n') % { |
- 'svn_base': self.svn_base + 'trunk', |
- 'git_base': self.git_base, |
- 'hash1': self.githash('repo_1', 2), |
- 'hash2': self.githash('repo_2', 1), |
- 'hash3': self.githash('repo_3', 2), |
- } |
- self.check((out, '', 0), results) |
- |
- def testRecurse(self): |
- if not self.enabled: |
- return |
- self.gclient(['config', '--spec', |
- 'solutions=[' |
- '{"name": "src",' |
- ' "url": "' + self.svn_base + 'trunk/src/"},' |
- '{"name": "src-git",' |
- '"url": "' + self.git_base + 'repo_1"}]']) |
- self.gclient(['sync', '--deps', 'mac']) |
- results = self.gclient(['recurse', '-j1', 'sh', '-c', |
- 'echo $GCLIENT_SCM,$GCLIENT_URL,`pwd`']) |
- |
- entries = [tuple(line.split(',')) |
- for line in results[0].strip().split('\n')] |
- logging.debug(entries) |
- |
- bases = {'svn': self.svn_base, 'git': self.git_base} |
- expected_source = [ |
- ('svn', 'trunk/src/', 'src'), |
- ('git', 'repo_1', 'src-git'), |
- ('svn', 'trunk/other', 'src/other'), |
- ('git', 'repo_2@' + self.githash('repo_2', 1)[:7], 'src/repo2'), |
- ('git', 'repo_3', 'src/repo2/repo_renamed'), |
- ('svn', 'trunk/third_party/foo@1', 'src/third_party/foo'), |
- ] |
- expected = [(scm, bases[scm] + url, os.path.join(self.root_dir, path)) |
- for (scm, url, path) in expected_source] |
- |
- self.assertEquals(sorted(entries), sorted(expected)) |
- |
- |
class SkiaDEPSTransitionSmokeTest(GClientSmokeBase): |
"""Simulate the behavior of bisect bots as they transition across the Skia |
DEPS change.""" |
- FAKE_REPOS_CLASS = FakeRepoSkiaDEPS |
+ FAKE_REPOS_CLASS = fake_repos.FakeRepoSkiaDEPS |
def setUp(self): |
super(SkiaDEPSTransitionSmokeTest, self).setUp() |
- self.enabled = self.FAKE_REPOS.set_up_git() and self.FAKE_REPOS.set_up_svn() |
- |
- def testSkiaDEPSChangeSVN(self): |
- if not self.enabled: |
- return |
- |
- # Create an initial checkout: |
- # - Single checkout at the root. |
- # - Multiple checkouts in a shared subdirectory. |
- self.gclient(['config', '--spec', |
- 'solutions=[' |
- '{"name": "src",' |
- ' "url": "' + self.svn_base + 'trunk/src/",' |
- '}]']) |
- |
- checkout_path = os.path.join(self.root_dir, 'src') |
- skia = os.path.join(checkout_path, 'third_party', 'skia') |
- skia_gyp = os.path.join(skia, 'gyp') |
- skia_include = os.path.join(skia, 'include') |
- skia_src = os.path.join(skia, 'src') |
- |
- gyp_svn_url = self.svn_base + 'skia/gyp' |
- include_svn_url = self.svn_base + 'skia/include' |
- src_svn_url = self.svn_base + 'skia/src' |
- skia_git_url = self.git_base + 'repo_1' |
- |
- # Initial sync. Verify that we get the expected checkout. |
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2']) |
- self.assertEqual(res[2], 0, 'Initial sync failed.') |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'], |
- gyp_svn_url) |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'], |
- include_svn_url) |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'], |
- src_svn_url) |
- |
- # Verify that the sync succeeds. Verify that we have the expected merged |
- # checkout. |
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@3']) |
- self.assertEqual(res[2], 0, 'DEPS change sync failed.') |
- self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], |
- skia), skia_git_url) |
- |
- # Sync again. Verify that we still have the expected merged checkout. |
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@3']) |
- self.assertEqual(res[2], 0, 'Subsequent sync failed.') |
- self.assertEqual(gclient_scm.GIT.Capture(['config', 'remote.origin.url'], |
- skia), skia_git_url) |
- |
- # Sync back to the original DEPS. Verify that we get the original structure. |
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2']) |
- self.assertEqual(res[2], 0, 'Reverse sync failed.') |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'], |
- gyp_svn_url) |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'], |
- include_svn_url) |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'], |
- src_svn_url) |
- |
- # Sync again. Verify that we still have the original structure. |
- res = self.gclient(['sync', '--deps', 'mac', '--revision', 'src@2']) |
- self.assertEqual(res[2], 0, 'Subsequent sync #2 failed.') |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_gyp)['URL'], |
- gyp_svn_url) |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_include)['URL'], |
- include_svn_url) |
- self.assertEqual(gclient_scm.SVN.CaptureLocalInfo([], skia_src)['URL'], |
- src_svn_url) |
+ self.enabled = self.FAKE_REPOS.set_up_git() |
def testSkiaDEPSChangeGit(self): |
if not self.enabled: |
@@ -1542,7 +769,7 @@ class BlinkDEPSTransitionSmokeTest(GClientSmokeBase): |
"""Simulate the behavior of bisect bots as they transition across the Blink |
DEPS change.""" |
- FAKE_REPOS_CLASS = FakeRepoBlinkDEPS |
+ FAKE_REPOS_CLASS = fake_repos.FakeRepoBlinkDEPS |
def setUp(self): |
super(BlinkDEPSTransitionSmokeTest, self).setUp() |
@@ -1673,103 +900,6 @@ class BlinkDEPSTransitionSmokeTest(GClientSmokeBase): |
['git', 'show-ref', '-q', '--verify', 'refs/heads/foo'], cwd=self.blink) |
-class GClientSmokeFromCheckout(GClientSmokeBase): |
- # WebKit abuses this. It has a .gclient and a DEPS from a checkout. |
- def setUp(self): |
- super(GClientSmokeFromCheckout, self).setUp() |
- self.enabled = self.FAKE_REPOS.set_up_svn() |
- os.rmdir(self.root_dir) |
- if self.enabled: |
- usr, pwd = self.FAKE_REPOS.USERS[0] |
- subprocess2.check_call( |
- ['svn', 'checkout', self.svn_base + '/trunk/webkit', |
- self.root_dir, '-q', |
- '--non-interactive', '--no-auth-cache', |
- '--username', usr, '--password', pwd]) |
- |
- def testSync(self): |
- if not self.enabled: |
- return |
- self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'], |
- ['running', 'running']) |
- tree = self.mangle_svn_tree( |
- ('trunk/webkit@2', ''), |
- ('trunk/third_party/foo@1', 'foo/bar')) |
- self.assertTree(tree) |
- |
- def testRevertAndStatus(self): |
- if not self.enabled: |
- return |
- self.gclient(['sync']) |
- |
- # TODO(maruel): This is incorrect. |
- out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], []) |
- |
- # Revert implies --force implies running hooks without looking at pattern |
- # matching. |
- results = self.gclient(['revert', '--deps', 'mac', '--jobs', '1']) |
- out = self.splitBlock(results[0]) |
- self.assertEquals(2, len(out)) |
- # This value varies depending on the version of svn being run. |
- # New vesions (the one in Trust) print "Updating '.':" and "At revision 1.". |
- # Older versions (the one in Precise) print just "At revision 1.". |
- #self.assertEquals(3, len(out[0])) |
- self.assertEquals(2, len(out[1])) |
- self.checkString('foo', out[1][1]) |
- self.checkString('', results[1]) |
- self.assertEquals(0, results[2]) |
- tree = self.mangle_svn_tree( |
- ('trunk/webkit@2', ''), |
- ('trunk/third_party/foo@1', 'foo/bar')) |
- self.assertTree(tree) |
- |
- # TODO(maruel): This is incorrect. |
- out = self.parseGclient(['status', '--deps', 'mac'], []) |
- |
- def testRunHooks(self): |
- if not self.enabled: |
- return |
- # Hooks aren't really tested for now since there is no hook defined. |
- self.gclient(['sync', '--deps', 'mac']) |
- out = self.parseGclient(['runhooks', '--deps', 'mac'], ['running']) |
- self.assertEquals(1, len(out)) |
- self.assertEquals(2, len(out[0])) |
- self.assertEquals(3, len(out[0][0])) |
- self.checkString('foo', out[0][1]) |
- tree = self.mangle_svn_tree( |
- ('trunk/webkit@2', ''), |
- ('trunk/third_party/foo@1', 'foo/bar')) |
- self.assertTree(tree) |
- |
- def testRevInfo(self): |
- if not self.enabled: |
- return |
- self.gclient(['sync', '--deps', 'mac']) |
- results = self.gclient(['revinfo', '--deps', 'mac']) |
- expected = ( |
- './: None\nfoo/bar: %strunk/third_party/foo@1\n' % self.svn_base, |
- '', 0) |
- self.check(expected, results) |
- # TODO(maruel): To be added after the refactor. |
- #results = self.gclient(['revinfo', '--snapshot']) |
- #expected = ( |
- # './: None\nfoo/bar: %strunk/third_party/foo@1\n' % self.svn_base, |
- # '', 0) |
- #self.check(expected, results) |
- |
- def testRest(self): |
- if not self.enabled: |
- return |
- self.gclient(['sync']) |
- # TODO(maruel): This is incorrect, it should run on ./ too. |
- self.parseGclient( |
- ['cleanup', '--deps', 'mac', '--verbose', '--jobs', '1'], |
- [('running', join(self.root_dir, 'foo', 'bar'))]) |
- self.parseGclient( |
- ['diff', '--deps', 'mac', '--verbose', '--jobs', '1'], |
- [('running', join(self.root_dir, 'foo', 'bar'))]) |
- |
- |
if __name__ == '__main__': |
if '-v' in sys.argv: |
logging.basicConfig(level=logging.DEBUG) |