| Index: tests/gclient_smoketest.py
|
| diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py
|
| index 2895a5ff62c301167208082b6099caaf840ee13c..93fec66021b2d069be86750f3b24732dc7bcc635 100755
|
| --- a/tests/gclient_smoketest.py
|
| +++ b/tests/gclient_smoketest.py
|
| @@ -12,126 +12,40 @@ This test assumes GClientSmokeBase.URL_BASE is valid.
|
|
|
| import logging
|
| import os
|
| -import pprint
|
| import re
|
| -import shutil
|
| import subprocess
|
| import sys
|
| import unittest
|
|
|
| -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 = join(os.path.dirname(UNITTEST_DIR), 'gclient')
|
| -# all tests outputs goes there.
|
| -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 = join(TRIAL_DIR, 'smoke')
|
| +from fake_repos import join, mangle_svn_tree, mangle_git_tree, write
|
| +from fake_repos import FakeReposTestBase
|
|
|
| +GCLIENT_PATH = join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
| + 'gclient')
|
| +COVERAGE = False
|
| +
|
| +
|
| +class GClientSmokeBase(FakeReposTestBase):
|
| def setUp(self):
|
| - # Vaguely inspired by twisted.
|
| + FakeReposTestBase.setUp(self)
|
| # Make sure it doesn't try to auto update when testing!
|
| self.env = os.environ.copy()
|
| self.env['DEPOT_TOOLS_UPDATE'] = '0'
|
| - # Remove left overs
|
| - 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)
|
| - os.mkdir(self.root_dir)
|
| - self.svn_base = 'svn://%s/svn/' % HOST
|
| - self.git_base = 'git://%s/git/' % HOST
|
| -
|
| - def tearDown(self):
|
| - if not SHOULD_LEAK:
|
| - rmtree(self.root_dir)
|
|
|
| def gclient(self, cmd, cwd=None):
|
| if not cwd:
|
| cwd = self.root_dir
|
| - process = subprocess.Popen([GCLIENT_PATH] + cmd, cwd=cwd, env=self.env,
|
| - stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
| - shell=sys.platform.startswith('win'))
|
| + if COVERAGE:
|
| + # Don't use the wrapper script.
|
| + cmd_base = ['coverage', 'run', '-a', GCLIENT_PATH + '.py']
|
| + else:
|
| + cmd_base = [GCLIENT_PATH]
|
| + process = subprocess.Popen(cmd_base + cmd, cwd=cwd, env=self.env,
|
| + stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
| + shell=sys.platform.startswith('win'))
|
| (stdout, stderr) = process.communicate()
|
| return (stdout, stderr, process.returncode)
|
|
|
| - def checkString(self, expected, result):
|
| - if expected != result:
|
| - # Strip the begining
|
| - while expected and result and expected[0] == result[0]:
|
| - expected = expected[1:]
|
| - result = result[1:]
|
| - # The exception trace makes it hard to read so dump it too.
|
| - if '\n' in result:
|
| - print result
|
| - self.assertEquals(expected, result)
|
| -
|
| - def check(self, expected, results):
|
| - self.checkString(expected[0], results[0])
|
| - self.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 testHelp(self):
|
| @@ -208,6 +122,10 @@ class GClientSmoke(GClientSmokeBase):
|
|
|
|
|
| class GClientSmokeSVN(GClientSmokeBase):
|
| + def setUp(self):
|
| + GClientSmokeBase.setUp(self)
|
| + self.FAKE_REPOS.setUpSVN()
|
| +
|
| def testSync(self):
|
| # TODO(maruel): safesync, multiple solutions, invalid@revisions,
|
| # multiple revisions.
|
| @@ -220,10 +138,11 @@ class GClientSmokeSVN(GClientSmokeBase):
|
| self.checkString('', results[1])
|
| self.assertEquals(0, results[2])
|
| tree = mangle_svn_tree(
|
| - (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]),
|
| + (join('trunk', 'src'), 'src', self.FAKE_REPOS.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.FAKE_REPOS.svn_revs[1]),
|
| + (join('trunk', 'other'), join('src', 'other'),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| )
|
| tree[join('src', 'hooked1')] = 'hooked1'
|
| self.assertTree(tree)
|
| @@ -240,13 +159,14 @@ class GClientSmokeSVN(GClientSmokeBase):
|
| self.checkString('', results[1])
|
| self.assertEquals(0, results[2])
|
| tree = mangle_svn_tree(
|
| - (join('trunk', 'src'), 'src', FAKE.svn_revs[1]),
|
| + (join('trunk', 'src'), 'src', self.FAKE_REPOS.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]),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| + (join('trunk', 'other'), join('src', 'other'),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| (join('trunk', 'third_party', 'foo'),
|
| join('src', 'third_party', 'prout'),
|
| - FAKE.svn_revs[2]),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| )
|
| self.assertTree(tree)
|
| # Test incremental sync: delete-unversioned_trees isn't there.
|
| @@ -257,15 +177,16 @@ class GClientSmokeSVN(GClientSmokeBase):
|
| self.checkString('', results[1])
|
| self.assertEquals(0, results[2])
|
| tree = mangle_svn_tree(
|
| - (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]),
|
| + (join('trunk', 'src'), 'src', self.FAKE_REPOS.svn_revs[-1]),
|
| (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'),
|
| - FAKE.svn_revs[2]),
|
| + self.FAKE_REPOS.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]),
|
| + self.FAKE_REPOS.svn_revs[1]),
|
| + (join('trunk', 'other'), join('src', 'other'),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| (join('trunk', 'third_party', 'foo'),
|
| join('src', 'third_party', 'prout'),
|
| - FAKE.svn_revs[2]),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| )
|
| tree[join('src', 'hooked1')] = 'hooked1'
|
| self.assertTree(tree)
|
| @@ -298,10 +219,11 @@ class GClientSmokeSVN(GClientSmokeBase):
|
| self.checkString('', results[1])
|
| self.assertEquals(0, results[2])
|
| tree = mangle_svn_tree(
|
| - (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]),
|
| + (join('trunk', 'src'), 'src', self.FAKE_REPOS.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.FAKE_REPOS.svn_revs[1]),
|
| + (join('trunk', 'other'), join('src', 'other'),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| )
|
| tree[join('src', 'hooked1')] = 'hooked1'
|
| tree[join('src', 'hooked2')] = 'hooked2'
|
| @@ -347,13 +269,14 @@ class GClientSmokeSVN(GClientSmokeBase):
|
| self.checkString('', results[1])
|
| self.assertEquals(0, results[2])
|
| tree = mangle_svn_tree(
|
| - (join('trunk', 'src'), 'src', FAKE.svn_revs[1]),
|
| + (join('trunk', 'src'), 'src', self.FAKE_REPOS.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]),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| + (join('trunk', 'other'), join('src', 'other'),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| (join('trunk', 'third_party', 'prout'),
|
| join('src', 'third_party', 'prout'),
|
| - FAKE.svn_revs[2]),
|
| + self.FAKE_REPOS.svn_revs[2]),
|
| )
|
| self.assertTree(tree)
|
|
|
| @@ -386,24 +309,6 @@ class GClientSmokeSVN(GClientSmokeBase):
|
| self.checkString('', results[1])
|
| self.assertEquals(0, results[2])
|
|
|
| - def testRunHooks(self):
|
| - self.gclient(['config', self.svn_base + 'trunk/src/'])
|
| - self.gclient(['sync', '--deps', 'mac'])
|
| - results = self.gclient(['runhooks'])
|
| - out = results[0].splitlines(False)
|
| - self.assertEquals(4, len(out))
|
| - self.assertEquals(out[0], '')
|
| - self.assertTrue(re.match(r'^________ running \'.*?python -c '
|
| - r'open\(\'src/hooked1\', \'w\'\)\.write\(\'hooked1\'\)\' in \'.*',
|
| - out[1]))
|
| - self.assertEquals(out[2], '')
|
| - # runhooks runs all hooks even if not matching by design.
|
| - self.assertTrue(re.match(r'^________ running \'.*?python -c '
|
| - r'open\(\'src/hooked2\', \'w\'\)\.write\(\'hooked2\'\)\' in \'.*',
|
| - out[3]))
|
| - self.checkString('', results[1])
|
| - self.assertEquals(0, results[2])
|
| -
|
| def testRunHooksDepsOs(self):
|
| self.gclient(['config', self.svn_base + 'trunk/src/'])
|
| self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1'])
|
| @@ -423,6 +328,10 @@ class GClientSmokeSVN(GClientSmokeBase):
|
|
|
|
|
| class GClientSmokeGIT(GClientSmokeBase):
|
| + def setUp(self):
|
| + GClientSmokeBase.setUp(self)
|
| + self.FAKE_REPOS.setUpGIT()
|
| +
|
| def testSync(self):
|
| # TODO(maruel): safesync, multiple solutions, invalid@revisions,
|
| # multiple revisions.
|
| @@ -436,9 +345,10 @@ class GClientSmokeGIT(GClientSmokeBase):
|
| 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]),
|
| + ('src', self.FAKE_REPOS.git_hashes['repo_1'][1][1]),
|
| + (join('src', 'repo2'), self.FAKE_REPOS.git_hashes['repo_2'][0][1]),
|
| + (join('src', 'repo2', 'repo_renamed'),
|
| + self.FAKE_REPOS.git_hashes['repo_3'][1][1]),
|
| )
|
| tree[join('src', 'hooked1')] = 'hooked1'
|
| tree[join('src', 'hooked2')] = 'hooked2'
|
| @@ -449,7 +359,7 @@ class GClientSmokeGIT(GClientSmokeBase):
|
|
|
| # Test incremental versioned sync: sync backward.
|
| results = self.gclient(['sync', '--revision',
|
| - 'src@' + FAKE.git_hashes['repo_1'][0][0],
|
| + 'src@' + self.FAKE_REPOS.git_hashes['repo_1'][0][0],
|
| '--deps', 'mac', '--delete_unversioned_trees'])
|
| logging.debug(results[0])
|
| out = results[0].splitlines(False)
|
| @@ -457,10 +367,11 @@ class GClientSmokeGIT(GClientSmokeBase):
|
| self.checkString('', 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]),
|
| + ('src', self.FAKE_REPOS.git_hashes['repo_1'][0][1]),
|
| + (join('src', 'repo2'), self.FAKE_REPOS.git_hashes['repo_2'][1][1]),
|
| + (join('src', 'repo2', 'repo3'),
|
| + self.FAKE_REPOS.git_hashes['repo_3'][1][1]),
|
| + (join('src', 'repo4'), self.FAKE_REPOS.git_hashes['repo_4'][1][1]),
|
| )
|
| tree[join('src', 'hooked2')] = 'hooked2'
|
| self.assertTree(tree)
|
| @@ -472,11 +383,13 @@ class GClientSmokeGIT(GClientSmokeBase):
|
| self.checkString('', 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]),
|
| + ('src', self.FAKE_REPOS.git_hashes['repo_1'][1][1]),
|
| + (join('src', 'repo2'), self.FAKE_REPOS.git_hashes['repo_2'][1][1]),
|
| + (join('src', 'repo2', 'repo3'),
|
| + self.FAKE_REPOS.git_hashes['repo_3'][1][1]),
|
| + (join('src', 'repo2', 'repo_renamed'),
|
| + self.FAKE_REPOS.git_hashes['repo_3'][1][1]),
|
| + (join('src', 'repo4'), self.FAKE_REPOS.git_hashes['repo_4'][1][1]),
|
| )
|
| tree[join('src', 'hooked1')] = 'hooked1'
|
| tree[join('src', 'hooked2')] = 'hooked2'
|
| @@ -504,9 +417,10 @@ class GClientSmokeGIT(GClientSmokeBase):
|
| self.checkString('', 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]),
|
| + ('src', self.FAKE_REPOS.git_hashes['repo_1'][1][1]),
|
| + (join('src', 'repo2'), self.FAKE_REPOS.git_hashes['repo_2'][0][1]),
|
| + (join('src', 'repo2', 'repo_renamed'),
|
| + self.FAKE_REPOS.git_hashes['repo_3'][1][1]),
|
| )
|
| # TODO(maruel): http://crosbug.com/3583 This file should have been removed.
|
| tree[join('src', 'repo2', 'hi')] = 'Hey!'
|
| @@ -549,22 +463,20 @@ class GClientSmokeGIT(GClientSmokeBase):
|
| 'src/repo2/repo_renamed: %(base)srepo_3@%(hash3)s\n' %
|
| {
|
| 'base': self.git_base,
|
| - 'hash1': FAKE.git_hashes['repo_1'][1][0],
|
| - 'hash2': FAKE.git_hashes['repo_2'][0][0],
|
| - 'hash3': FAKE.git_hashes['repo_3'][1][0],
|
| + 'hash1': self.FAKE_REPOS.git_hashes['repo_1'][1][0],
|
| + 'hash2': self.FAKE_REPOS.git_hashes['repo_2'][0][0],
|
| + 'hash3': self.FAKE_REPOS.git_hashes['repo_3'][1][0],
|
| })
|
| self.check((out, '', 0), results)
|
|
|
|
|
| if __name__ == '__main__':
|
| - 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()
|
| - unittest.main()
|
| - finally:
|
| - FAKE.tearDown()
|
| + if '-c' in sys.argv:
|
| + COVERAGE = True
|
| + sys.argv.remove('-c')
|
| + if os.path.exists('.coverage'):
|
| + os.remove('.coverage')
|
| + os.environ['COVERAGE_FILE'] = os.path.join(
|
| + os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
| + '.coverage')
|
| + unittest.main()
|
|
|