Chromium Code Reviews| Index: tests/gclient_smoketest.py |
| diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py |
| index 9d04dc6d8fae51d966ee0c567f599e8c1a4f27c0..7f3491f066bb52fc9dedd393f610003aaccf0096 100755 |
| --- a/tests/gclient_smoketest.py |
| +++ b/tests/gclient_smoketest.py |
| @@ -10,27 +10,74 @@ Shell out 'gclient' and run basic conformance tests. |
| This test assumes GClientSmokeBase.URL_BASE is valid. |
| """ |
| +import logging |
| import os |
| +import pprint |
| import shutil |
| import subprocess |
| import sys |
| import unittest |
| -from fake_repos import rmtree, FakeRepos |
| +from fake_repos import rmtree, write, FakeRepos |
| + |
| +join = os.path.join |
| SHOULD_LEAK = False |
| UNITTEST_DIR = os.path.abspath(os.path.dirname(__file__)) |
| -GCLIENT_PATH = os.path.join(os.path.dirname(UNITTEST_DIR), 'gclient') |
| +GCLIENT_PATH = join(os.path.dirname(UNITTEST_DIR), 'gclient') |
| # all tests outputs goes there. |
| -TRIAL_DIR = os.path.join(UNITTEST_DIR, '_trial') |
| +TRIAL_DIR = join(UNITTEST_DIR, '_trial') |
| # In case you want to use another machine to create the fake repos, e.g. |
| # not on Windows. |
| HOST = '127.0.0.1' |
| +FAKE = None |
| + |
| + |
| +def read_tree(tree_root): |
| + """Returns a dict of all the files in a tree.""" |
| + tree = {} |
| + for root, dirs, files in os.walk(tree_root): |
| + for d in filter(lambda x: x.startswith('.'), dirs): |
| + dirs.remove(d) |
| + for f in [join(root, f) for f in files if not f.startswith('.')]: |
| + tree[f[len(tree_root) + 1:]] = open(join(root, f), 'rb').read() |
| + return tree |
| + |
| + |
| +def dict_diff(dict1, dict2): |
| + diff = {} |
| + for k, v in dict1.iteritems(): |
| + if k not in dict2: |
| + diff[k] = v |
| + elif v != dict2[k]: |
| + diff[k] = (v, dict2[k]) |
| + for k, v in dict2.iteritems(): |
| + if k not in dict1: |
| + diff[k] = v |
| + return diff |
| + |
| + |
| +def mangle_svn_tree(*args): |
| + result = {} |
| + for old_root, new_root, tree in args: |
| + for k, v in tree.iteritems(): |
| + if not k.startswith(old_root): |
| + continue |
| + result[join(new_root, k[len(old_root) + 1:])] = v |
| + return result |
| + |
| + |
| +def mangle_git_tree(*args): |
| + result = {} |
| + for new_root, tree in args: |
| + for k, v in tree.iteritems(): |
| + result[join(new_root, k)] = v |
| + return result |
| class GClientSmokeBase(unittest.TestCase): |
| # This subversion repository contains a test repository. |
| - ROOT_DIR = os.path.join(TRIAL_DIR, 'smoke') |
| + ROOT_DIR = join(TRIAL_DIR, 'smoke') |
| def setUp(self): |
| # Vaguely inspired by twisted. |
| @@ -38,7 +85,7 @@ class GClientSmokeBase(unittest.TestCase): |
| self.env = os.environ.copy() |
| self.env['DEPOT_TOOLS_UPDATE'] = '0' |
| # Remove left overs |
| - self.root_dir = os.path.join(self.ROOT_DIR, self.id()) |
| + self.root_dir = join(self.ROOT_DIR, self.id()) |
| rmtree(self.root_dir) |
| if not os.path.exists(self.ROOT_DIR): |
| os.mkdir(self.ROOT_DIR) |
| @@ -70,6 +117,15 @@ class GClientSmokeBase(unittest.TestCase): |
| checkString(expected[1], results[1]) |
| self.assertEquals(expected[2], results[2]) |
| + def assertTree(self, tree): |
| + actual = read_tree(self.root_dir) |
| + diff = dict_diff(tree, actual) |
| + if diff: |
| + logging.debug('Actual %s\n%s' % (self.root_dir, pprint.pformat(actual))) |
| + logging.debug('Expected\n%s' % pprint.pformat(tree)) |
| + logging.debug('Diff\n%s' % pprint.pformat(diff)) |
| + self.assertEquals(tree, actual) |
| + |
| class GClientSmoke(GClientSmokeBase): |
| def testCommands(self): |
| @@ -80,7 +136,7 @@ class GClientSmoke(GClientSmokeBase): |
| self.assertEquals(0, result[2]) |
| def testNotConfigured(self): |
| - res = ("", "Error: client not configured; see 'gclient config'\n", 1) |
| + res = ('', 'Error: client not configured; see \'gclient config\'\n', 1) |
| self.check(res, self.gclient(['cleanup'])) |
| self.check(res, self.gclient(['diff'])) |
| self.check(res, self.gclient(['export', 'foo'])) |
| @@ -93,30 +149,169 @@ class GClientSmoke(GClientSmokeBase): |
| self.check(res, self.gclient(['update'])) |
| -class GClientSmokeSync(GClientSmokeBase): |
| +class GClientSmokeSVN(GClientSmokeBase): |
| """sync is the most important command. Hence test it more.""" |
| - def testSyncSvn(self): |
| + def testSync(self): |
| """Test pure gclient svn checkout, example of Chromium checkout""" |
| self.gclient(['config', self.svn_base + 'trunk/src/']) |
| - results = self.gclient(['sync']) |
| + # Test unversioned checkout. |
| + results = self.gclient(['sync', '--deps', 'mac']) |
| + logging.debug(results[0]) |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + tree = mangle_svn_tree( |
| + (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), |
| + (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), |
| + FAKE.svn_revs[1]), |
| + (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| + ) |
| + self.assertTree(tree) |
| + |
| + # Test incremental versioned sync: sync backward. |
| + results = self.gclient(['sync', '--revision', 'src@1', '--deps', 'mac', |
| + '--delete_unversioned_trees']) |
| + logging.debug(results[0]) |
| + self.assertEquals('', results[1]) |
| self.assertEquals(0, results[2]) |
| - results = self.gclient(['sync', '--revision', 'a@32']) |
| + tree = mangle_svn_tree( |
| + (join('trunk', 'src'), 'src', FAKE.svn_revs[1]), |
| + (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'), |
| + FAKE.svn_revs[2]), |
| + (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| + (join('trunk', 'third_party', 'foo'), |
| + join('src', 'third_party', 'prout'), |
| + FAKE.svn_revs[2]), |
| + ) |
| + self.assertTree(tree) |
| + # Test incremental sync: delete-unversioned_trees isn't there. |
| + results = self.gclient(['sync', '--deps', 'mac']) |
| + logging.debug(results[0]) |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + tree = mangle_svn_tree( |
| + (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), |
| + (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'), |
| + FAKE.svn_revs[2]), |
| + (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), |
| + FAKE.svn_revs[1]), |
| + (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| + (join('trunk', 'third_party', 'foo'), |
| + join('src', 'third_party', 'prout'), |
| + FAKE.svn_revs[2]), |
| + ) |
| + self.assertTree(tree) |
| + |
| + def testRevertAndStatus(self): |
| + self.gclient(['config', self.svn_base + 'trunk/src/']) |
| + results = self.gclient(['sync', '--deps', 'mac']) |
| + write(join(self.root_dir, 'src', 'third_party', 'foo', 'hi'), 'Hey!') |
| + |
| + results = self.gclient(['status']) |
| + out = results[0].splitlines(False) |
| + self.assertEquals(7, len(out)) |
| + self.assertEquals(out[0], '') |
| + self.assertTrue(out[1].startswith('________ running \'svn status\' in \'')) |
| + self.assertEquals(out[2], '? other') |
| + self.assertEquals(out[3], '? third_party/foo') |
| + self.assertEquals(out[4], '') |
| + self.assertTrue(out[5].startswith('________ running \'svn status\' in \'')) |
| + self.assertEquals(out[6], '? hi') |
| + self.assertEquals('', results[1]) |
| self.assertEquals(0, results[2]) |
| + results = self.gclient(['revert']) |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + tree = mangle_svn_tree( |
| + (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), |
| + (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), |
| + FAKE.svn_revs[1]), |
| + (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| + ) |
| + self.assertTree(tree) |
| + |
| + results = self.gclient(['status']) |
| + out = results[0].splitlines(False) |
| + self.assertEquals(4, len(out)) |
| + self.assertEquals(out[0], '') |
| + self.assertTrue(out[1].startswith('________ running \'svn status\' in \'')) |
| + self.assertEquals(out[2], '? other') |
| + self.assertEquals(out[3], '? third_party/foo') |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + |
| + |
| +class GClientSmokeGIT(GClientSmokeBase): |
| def testSyncGit(self): |
| """Test pure gclient git checkout, example of Chromium OS checkout""" |
| - self.gclient(['config', self.git_base + 'repo_1']) |
| - results = self.gclient(['sync']) |
| - print results[0] |
| - print results[1] |
| + self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) |
| + # Test unversioned checkout. |
| + results = self.gclient(['sync', '--deps', 'mac']) |
|
yaar1
2010/05/26 01:37:24
Is this only going to work on Mac?
M-A Ruel
2010/05/26 01:56:02
No but I'm enforcing the platform so the test beha
|
| + logging.debug(results[0]) |
| + self.assertTrue(results[1].startswith('Switched to a new branch \'')) |
| self.assertEquals(0, results[2]) |
| + tree = mangle_git_tree( |
| + ('src', FAKE.git_hashes['repo_1'][1][1]), |
| + (join('src', 'repo2'), FAKE.git_hashes['repo_2'][0][1]), |
| + (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), |
| + ) |
| + self.assertTree(tree) |
| + # Test incremental versioned sync: sync backward. |
| + results = self.gclient(['sync', '--revision', |
| + 'src@' + FAKE.git_hashes['repo_1'][0][0], |
| + '--deps', 'mac', '--delete_unversioned_trees']) |
| + logging.debug(results[0]) |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + tree = mangle_git_tree( |
| + ('src', FAKE.git_hashes['repo_1'][0][1]), |
| + (join('src', 'repo2'), FAKE.git_hashes['repo_2'][1][1]), |
| + (join('src', 'repo2', 'repo3'), FAKE.git_hashes['repo_3'][1][1]), |
| + (join('src', 'repo4'), FAKE.git_hashes['repo_4'][1][1]), |
| + ) |
| + self.assertTree(tree) |
| + # Test incremental sync: delete-unversioned_trees isn't there. |
| + results = self.gclient(['sync', '--deps', 'mac']) |
| + logging.debug(results[0]) |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + tree = mangle_git_tree( |
| + ('src', FAKE.git_hashes['repo_1'][1][1]), |
| + (join('src', 'repo2'), FAKE.git_hashes['repo_2'][1][1]), |
| + (join('src', 'repo2', 'repo3'), FAKE.git_hashes['repo_3'][1][1]), |
| + (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), |
| + (join('src', 'repo4'), FAKE.git_hashes['repo_4'][1][1]), |
| + ) |
| + self.assertTree(tree) |
| -class GClientSmokeRevert(GClientSmokeBase): |
| - """revert is the second most important command. Hence test it more.""" |
| - def setUp(self): |
| - GClientSmokeBase.setUp(self) |
| - self.gclient(['config', self.URL_BASE]) |
| + def testRevertAndStatus(self): |
| + """TODO(maruel): Remove this line once this test is fixed.""" |
| + self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) |
| + results = self.gclient(['sync', '--deps', 'mac']) |
| + write(join(self.root_dir, 'src', 'repo2', 'hi'), 'Hey!') |
| + |
| + results = self.gclient(['status']) |
| + out = results[0].splitlines(False) |
| + # TODO(maruel): THIS IS WRONG. |
| + self.assertEquals(0, len(out)) |
| + |
| + results = self.gclient(['revert']) |
| + self.assertEquals('', results[1]) |
| + self.assertEquals(0, results[2]) |
| + tree = mangle_git_tree( |
| + ('src', FAKE.git_hashes['repo_1'][1][1]), |
| + (join('src', 'repo2'), FAKE.git_hashes['repo_2'][0][1]), |
| + (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), |
| + ) |
| + # TODO(maruel): THIS IS WRONG. |
| + tree[join('src', 'repo2', 'hi')] = 'Hey!' |
| + self.assertTree(tree) |
| + |
| + results = self.gclient(['status']) |
| + out = results[0].splitlines(False) |
| + # TODO(maruel): THIS IS WRONG. |
| + self.assertEquals(0, len(out)) |
| class GClientSmokeRevInfo(GClientSmokeBase): |
| @@ -127,9 +322,14 @@ class GClientSmokeRevInfo(GClientSmokeBase): |
| if __name__ == '__main__': |
| - fake = FakeRepos(TRIAL_DIR, SHOULD_LEAK, True) |
| + if '-v' in sys.argv: |
| + logging.basicConfig(level=logging.DEBUG) |
| + if '-l' in sys.argv: |
| + SHOULD_LEAK = True |
| + sys.argv.remove('-l') |
| + FAKE = FakeRepos(TRIAL_DIR, SHOULD_LEAK, True) |
| try: |
| - fake.setUp() |
| + FAKE.setUp() |
| unittest.main() |
| finally: |
| - fake.tearDown() |
| + FAKE.tearDown() |