Index: tests/checkout_test.py |
=================================================================== |
--- tests/checkout_test.py (revision 220987) |
+++ tests/checkout_test.py (working copy) |
@@ -32,6 +32,8 @@ |
class FakeRepos(fake_repos.FakeReposBase): |
+ TEST_GIT_REPO = 'repo_1' |
+ |
def populateSvn(self): |
"""Creates a few revisions of changes files.""" |
subprocess2.check_call( |
@@ -39,12 +41,64 @@ |
'--non-interactive', '--no-auth-cache', |
'--username', self.USERS[0][0], '--password', self.USERS[0][1]]) |
assert os.path.isdir(os.path.join(self.svn_checkout, '.svn')) |
- self._commit_svn(self._tree_1()) |
- self._commit_svn(self._tree_2()) |
+ self._commit_svn(self._svn_tree_1()) |
+ self._commit_svn(self._svn_tree_2()) |
+ def populateGit(self): |
+ """Creates a few revisions of changes files.""" |
+ self._commit_git(self.TEST_GIT_REPO, self._git_tree()) |
+ # Fix for the remote rejected error. For more details see: |
+ # http://stackoverflow.com/questions/2816369/git-push-error-remote |
+ subprocess2.check_output( |
+ ['git', '--git-dir', |
+ os.path.join(self.git_root, self.TEST_GIT_REPO, '.git'), |
+ 'config', '--bool', 'core.bare', 'true']) |
+ |
+ assert os.path.isdir( |
+ os.path.join(self.git_root, self.TEST_GIT_REPO, '.git')) |
+ |
@staticmethod |
- def _tree_1(): |
+ def _git_tree(): |
fs = {} |
+ fs['origin'] = 'git@1' |
+ fs['extra'] = 'dummy\n' # new |
+ fs['codereview.settings'] = ( |
+ '# Test data\n' |
+ 'bar: pouet\n') |
+ fs['chrome/file.cc'] = ( |
+ 'a\n' |
+ 'bb\n' |
+ 'ccc\n' |
+ 'dd\n' |
+ 'e\n' |
+ 'ff\n' |
+ 'ggg\n' |
+ 'hh\n' |
+ 'i\n' |
+ 'jj\n' |
+ 'kkk\n' |
+ 'll\n' |
+ 'm\n' |
+ 'nn\n' |
+ 'ooo\n' |
+ 'pp\n' |
+ 'q\n') |
+ fs['chromeos/views/DOMui_menu_widget.h'] = ( |
+ '// Copyright (c) 2010\n' |
+ '// Use of this source code\n' |
+ '// found in the LICENSE file.\n' |
+ '\n' |
+ '#ifndef DOM\n' |
+ '#define DOM\n' |
+ '#pragma once\n' |
+ '\n' |
+ '#include <string>\n' |
+ '#endif\n') |
+ return fs |
+ |
+ @staticmethod |
+ def _svn_tree_1(): |
+ fs = {} |
fs['trunk/origin'] = 'svn@1' |
fs['trunk/codereview.settings'] = ( |
'# Test data\n' |
@@ -70,8 +124,8 @@ |
return fs |
@classmethod |
- def _tree_2(cls): |
- fs = cls._tree_1() |
+ def _svn_tree_2(cls): |
+ fs = cls._svn_tree_1() |
fs['trunk/origin'] = 'svn@2\n' |
fs['trunk/extra'] = 'dummy\n' |
fs['trunk/bin_file'] = '\x00' |
@@ -88,10 +142,7 @@ |
'#endif\n') |
return fs |
- def populateGit(self): |
- raise NotImplementedError() |
- |
# pylint: disable=R0201 |
class BaseTest(fake_repos.FakeReposTestBase): |
name = 'foo' |
@@ -127,71 +178,11 @@ |
]) |
def get_trunk(self, modified): |
- tree = {} |
- subroot = 'trunk/' |
- for k, v in self.FAKE_REPOS.svn_revs[-1].iteritems(): |
- if k.startswith(subroot): |
- f = k[len(subroot):] |
- assert f not in tree |
- tree[f] = v |
+ raise NotImplementedError() |
- if modified: |
- content_lines = tree['chrome/file.cc'].splitlines(True) |
- tree['chrome/file.cc'] = ''.join( |
- content_lines[0:5] + ['FOO!\n'] + content_lines[5:]) |
- del tree['extra'] |
- tree['new_dir/subdir/new_file'] = 'A new file\nshould exist.\n' |
- return tree |
+ def _check_base(self, co, root, expected): |
+ raise NotImplementedError() |
- def _check_base(self, co, root, git, expected): |
- read_only = isinstance(co, checkout.ReadOnlyCheckout) |
- self.assertEquals(not read_only, bool(expected)) |
- self.assertEquals(read_only, self.is_read_only) |
- if not read_only: |
- self.FAKE_REPOS.svn_dirty = True |
- |
- self.assertEquals(root, co.project_path) |
- self.assertEquals(self.previous_log['revision'], co.prepare(None)) |
- self.assertEquals('pouet', co.get_settings('bar')) |
- self.assertTree(self.get_trunk(False), root) |
- patches = self.get_patches() |
- co.apply_patch(patches) |
- self.assertEquals( |
- ['bin_file', 'chrome/file.cc', 'new_dir/subdir/new_file', 'extra'], |
- patches.filenames) |
- |
- if git: |
- # Hackish to verify _branches() internal function. |
- # pylint: disable=W0212 |
- self.assertEquals( |
- (['master', 'working_branch'], 'working_branch'), |
- co._branches()) |
- |
- # Verify that the patch is applied even for read only checkout. |
- self.assertTree(self.get_trunk(True), root) |
- fake_author = self.FAKE_REPOS.USERS[1][0] |
- revision = co.commit(u'msg', fake_author) |
- # Nothing changed. |
- self.assertTree(self.get_trunk(True), root) |
- |
- if read_only: |
- self.assertEquals('FAKE', revision) |
- self.assertEquals(self.previous_log['revision'], co.prepare(None)) |
- # Changes should be reverted now. |
- self.assertTree(self.get_trunk(False), root) |
- expected = self.previous_log |
- else: |
- self.assertEquals(self.previous_log['revision'] + 1, revision) |
- self.assertEquals(self.previous_log['revision'] + 1, co.prepare(None)) |
- self.assertTree(self.get_trunk(True), root) |
- expected = expected.copy() |
- expected['msg'] = 'msg' |
- expected['revision'] = self.previous_log['revision'] + 1 |
- expected.setdefault('author', fake_author) |
- |
- actual = self._log() |
- self.assertEquals(expected, actual) |
- |
def _check_exception(self, co, err_msg): |
co.prepare(None) |
try: |
@@ -285,10 +276,206 @@ |
data['revprops'].append((prop.attrib['name'], prop.text)) |
return data |
+ def _check_base(self, co, root, expected): |
+ read_only = isinstance(co, checkout.ReadOnlyCheckout) |
+ self.assertEquals(not read_only, bool(expected)) |
+ self.assertEquals(read_only, self.is_read_only) |
+ if not read_only: |
+ self.FAKE_REPOS.svn_dirty = True |
+ |
+ self.assertEquals(root, co.project_path) |
+ self.assertEquals(self.previous_log['revision'], co.prepare(None)) |
+ self.assertEquals('pouet', co.get_settings('bar')) |
+ self.assertTree(self.get_trunk(False), root) |
+ patches = self.get_patches() |
+ co.apply_patch(patches) |
+ self.assertEquals( |
+ ['bin_file', 'chrome/file.cc', 'new_dir/subdir/new_file', 'extra'], |
+ patches.filenames) |
+ |
+ # Verify that the patch is applied even for read only checkout. |
+ self.assertTree(self.get_trunk(True), root) |
+ fake_author = self.FAKE_REPOS.USERS[1][0] |
+ revision = co.commit(u'msg', fake_author) |
+ # Nothing changed. |
+ self.assertTree(self.get_trunk(True), root) |
+ |
+ if read_only: |
+ self.assertEquals('FAKE', revision) |
+ self.assertEquals(self.previous_log['revision'], co.prepare(None)) |
+ # Changes should be reverted now. |
+ self.assertTree(self.get_trunk(False), root) |
+ expected = self.previous_log |
+ else: |
+ self.assertEquals(self.previous_log['revision'] + 1, revision) |
+ self.assertEquals(self.previous_log['revision'] + 1, co.prepare(None)) |
+ self.assertTree(self.get_trunk(True), root) |
+ expected = expected.copy() |
+ expected['msg'] = 'msg' |
+ expected['revision'] = self.previous_log['revision'] + 1 |
+ expected.setdefault('author', fake_author) |
+ |
+ actual = self._log() |
+ self.assertEquals(expected, actual) |
+ |
def _test_prepare(self, co): |
self.assertEquals(1, co.prepare(1)) |
+ def get_trunk(self, modified): |
+ tree = {} |
+ subroot = 'trunk/' |
+ for k, v in self.FAKE_REPOS.svn_revs[-1].iteritems(): |
+ if k.startswith(subroot): |
+ f = k[len(subroot):] |
+ assert f not in tree |
+ tree[f] = v |
+ if modified: |
+ content_lines = tree['chrome/file.cc'].splitlines(True) |
+ tree['chrome/file.cc'] = ''.join( |
+ content_lines[0:5] + ['FOO!\n'] + content_lines[5:]) |
+ del tree['extra'] |
+ tree['new_dir/subdir/new_file'] = 'A new file\nshould exist.\n' |
+ return tree |
+ |
+ |
+class GitBaseTest(BaseTest): |
+ def setUp(self): |
+ super(GitBaseTest, self).setUp() |
+ self.enabled = self.FAKE_REPOS.set_up_git() |
+ self.assertTrue(self.enabled) |
+ self.previous_log = self._log() |
+ |
+ # pylint: disable=W0221 |
+ def _log(self, log_from_local_repo=False): |
+ if log_from_local_repo: |
+ repo_root = os.path.join(self.root_dir, self.name) |
+ else: |
+ repo_root = os.path.join(self.FAKE_REPOS.git_root, |
+ self.FAKE_REPOS.TEST_GIT_REPO) |
+ out = subprocess2.check_output( |
+ ['git', |
+ '--git-dir', |
+ os.path.join(repo_root, '.git'), |
+ 'log', '--pretty=format:"%H%x09%ae%x09%ad%x09%s"', |
+ '--max-count=1']).strip('"') |
+ if out and len(out.split()) != 0: |
+ revision = out.split()[0] |
+ else: |
+ return {'revision': 0} |
+ |
+ return { |
+ 'revision': revision, |
+ 'author': out.split()[1], |
+ 'msg': out.split()[-1], |
+ } |
+ |
+ def _check_base(self, co, root, expected): |
+ read_only = isinstance(co, checkout.ReadOnlyCheckout) |
+ self.assertEquals(read_only, self.is_read_only) |
+ if not read_only: |
+ self.FAKE_REPOS.git_dirty = True |
+ |
+ self.assertEquals(root, co.project_path) |
+ self.assertEquals(self.previous_log['revision'], co.prepare(None)) |
+ self.assertEquals('pouet', co.get_settings('bar')) |
+ self.assertTree(self.get_trunk(False), root) |
+ patches = self.get_patches() |
+ co.apply_patch(patches) |
+ self.assertEquals( |
+ ['bin_file', 'chrome/file.cc', 'new_dir/subdir/new_file', 'extra'], |
+ patches.filenames) |
+ |
+ # Hackish to verify _branches() internal function. |
+ # pylint: disable=W0212 |
+ self.assertEquals( |
+ (['master', 'working_branch'], 'working_branch'), |
+ co._branches()) |
+ |
+ # Verify that the patch is applied even for read only checkout. |
+ self.assertTree(self.get_trunk(True), root) |
+ fake_author = self.FAKE_REPOS.USERS[1][0] |
+ revision = co.commit(u'msg', fake_author) |
+ # Nothing changed. |
+ self.assertTree(self.get_trunk(True), root) |
+ |
+ if read_only: |
+ self.assertEquals('FAKE', revision) |
+ self.assertEquals(self.previous_log['revision'], co.prepare(None)) |
+ # Changes should be reverted now. |
+ self.assertTree(self.get_trunk(False), root) |
+ expected = self.previous_log |
+ else: |
+ self.assertEquals(self._log()['revision'], revision) |
+ self.assertEquals(self._log()['revision'], co.prepare(None)) |
+ self.assertTree(self.get_trunk(True), root) |
+ expected = self._log() |
+ |
+ actual = self._log(log_from_local_repo=True) |
+ self.assertEquals(expected, actual) |
+ |
+ def get_trunk(self, modified): |
+ tree = {} |
+ for k, v in self.FAKE_REPOS.git_hashes[ |
+ self.FAKE_REPOS.TEST_GIT_REPO][1][1].iteritems(): |
+ assert k not in tree |
+ tree[k] = v |
+ |
+ if modified: |
+ content_lines = tree['chrome/file.cc'].splitlines(True) |
+ tree['chrome/file.cc'] = ''.join( |
+ content_lines[0:5] + ['FOO!\n'] + content_lines[5:]) |
+ tree['bin_file'] = '\x00' |
+ del tree['extra'] |
+ tree['new_dir/subdir/new_file'] = 'A new file\nshould exist.\n' |
+ return tree |
+ |
+ def _test_prepare(self, co): |
+ print co.prepare(None) |
+ |
+ |
+class GitCheckout(GitBaseTest): |
+ def _get_co(self, post_processors): |
+ self.assertNotEqual(False, post_processors) |
+ return checkout.GitCheckout( |
+ root_dir=self.root_dir, |
+ project_name=self.name, |
+ remote_branch='master', |
+ git_url=os.path.join(self.FAKE_REPOS.git_root, |
+ self.FAKE_REPOS.TEST_GIT_REPO), |
+ commit_user=self.usr, |
+ post_processors=post_processors) |
+ |
+ def testAll(self): |
+ root = os.path.join(self.root_dir, self.name) |
+ self._check_base(self._get_co(None), root, None) |
+ |
+ def testException(self): |
+ self._check_exception( |
+ self._get_co(None), |
+ 'While running git apply --index -p1;\n fatal: corrupt patch at line ' |
+ '12\n') |
+ |
+ def testProcess(self): |
+ self._test_process(self._get_co) |
+ |
+ def _testPrepare(self): |
+ self._test_prepare(self._get_co(None)) |
+ |
+ def testMove(self): |
+ co = self._get_co(None) |
+ self._check_move(co) |
+ out = subprocess2.check_output( |
+ ['git', 'diff', 'HEAD~', '--name-status'], cwd=co.project_path) |
+ out = sorted(out.splitlines()) |
+ expected = sorted( |
+ [ |
+ 'A\tchromeos/views/webui_menu_widget.h', |
+ 'D\tchromeos/views/DOMui_menu_widget.h', |
+ ]) |
+ self.assertEquals(expected, out) |
+ |
+ |
class SvnCheckout(SvnBaseTest): |
def _get_co(self, post_processors): |
self.assertNotEqual(False, post_processors) |
@@ -302,7 +489,7 @@ |
'revprops': [('realauthor', self.FAKE_REPOS.USERS[1][0])] |
} |
root = os.path.join(self.root_dir, self.name) |
- self._check_base(self._get_co(None), root, False, expected) |
+ self._check_base(self._get_co(None), root, expected) |
def testException(self): |
self._check_exception( |
@@ -357,7 +544,7 @@ |
'revprops': [('commit-bot', 'user1@example.com')], |
} |
root = os.path.join(self.root_dir, self.name) |
- self._check_base(self._get_co(None), root, False, expected) |
+ self._check_base(self._get_co(None), root, expected) |
def testWithRevPropsSupportNotCommitBot(self): |
# Add the hook that will commit in a way that removes the race condition. |
@@ -372,7 +559,7 @@ |
expected = { |
'author': self.FAKE_REPOS.USERS[1][0], |
} |
- self._check_base(co, root, False, expected) |
+ self._check_base(co, root, expected) |
def testAutoProps(self): |
co = self._get_co(None) |
@@ -512,7 +699,7 @@ |
def testAll(self): |
root = os.path.join(self.root_dir, self.name) |
- self._check_base(self._get_co(None), root, False, None) |
+ self._check_base(self._get_co(None), root, None) |
def testException(self): |
self._check_exception( |