OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 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 """Tests for git_drover.""" | 5 """Tests for git_drover.""" |
6 | 6 |
7 import os | 7 import os |
8 import shutil | 8 import shutil |
9 import subprocess | 9 import subprocess |
10 import sys | 10 import sys |
(...skipping 19 matching lines...) Expand all Loading... |
30 with open(os.path.join(self._parent_repo, '.git', 'HEAD'), 'w') as f: | 30 with open(os.path.join(self._parent_repo, '.git', 'HEAD'), 'w') as f: |
31 f.write('HEAD') | 31 f.write('HEAD') |
32 os.mkdir(os.path.join(self._parent_repo, '.git', 'info')) | 32 os.mkdir(os.path.join(self._parent_repo, '.git', 'info')) |
33 with open( | 33 with open( |
34 os.path.join(self._parent_repo, '.git', 'info', 'refs'), 'w') as f: | 34 os.path.join(self._parent_repo, '.git', 'info', 'refs'), 'w') as f: |
35 f.write('refs') | 35 f.write('refs') |
36 self.mock(tempfile, 'mkdtemp', self._mkdtemp) | 36 self.mock(tempfile, 'mkdtemp', self._mkdtemp) |
37 self.mock(__builtins__, 'raw_input', self._get_input) | 37 self.mock(__builtins__, 'raw_input', self._get_input) |
38 self.mock(subprocess, 'check_call', self._check_call) | 38 self.mock(subprocess, 'check_call', self._check_call) |
39 self.mock(subprocess, 'check_output', self._check_call) | 39 self.mock(subprocess, 'check_output', self._check_call) |
| 40 self.real_popen = subprocess.Popen |
| 41 self.mock(subprocess, 'Popen', self._Popen) |
40 self._commands = [] | 42 self._commands = [] |
41 self._input = [] | 43 self._input = [] |
42 self._fail_on_command = None | 44 self._fail_on_command = None |
43 | 45 |
44 self.REPO_CHECK_COMMANDS = [ | 46 self.REPO_CHECK_COMMANDS = [ |
45 (['git', '--help'], self._parent_repo), | 47 (['git', '--help'], self._parent_repo), |
46 (['git', 'status'], self._parent_repo), | 48 (['git', 'status'], self._parent_repo), |
47 (['git', 'fetch', 'origin'], self._parent_repo), | 49 (['git', 'fetch', 'origin'], self._parent_repo), |
48 (['git', 'rev-parse', 'refs/remotes/branch-heads/branch^{commit}'], | 50 (['git', 'rev-parse', 'refs/remotes/branch-heads/branch^{commit}'], |
49 self._parent_repo), | 51 self._parent_repo), |
(...skipping 18 matching lines...) Expand all Loading... |
68 self.BRANCH_CLEANUP_COMMANDS = [ | 70 self.BRANCH_CLEANUP_COMMANDS = [ |
69 (['rmdir', '/s', '/q', self._target_repo], None), | 71 (['rmdir', '/s', '/q', self._target_repo], None), |
70 (['git', 'branch', '-D', 'drover_branch_123'], self._parent_repo), | 72 (['git', 'branch', '-D', 'drover_branch_123'], self._parent_repo), |
71 ] | 73 ] |
72 else: | 74 else: |
73 self.BRANCH_CLEANUP_COMMANDS = [ | 75 self.BRANCH_CLEANUP_COMMANDS = [ |
74 (['git', 'branch', '-D', 'drover_branch_123'], self._parent_repo), | 76 (['git', 'branch', '-D', 'drover_branch_123'], self._parent_repo), |
75 ] | 77 ] |
76 self.MANUAL_RESOLVE_PREPARATION_COMMANDS = [ | 78 self.MANUAL_RESOLVE_PREPARATION_COMMANDS = [ |
77 (['git', 'status', '--porcelain'], self._target_repo), | 79 (['git', 'status', '--porcelain'], self._target_repo), |
78 (['git', 'update-index', '--skip-worktree', '--', 'foo', 'bar'], | 80 (['git', 'update-index', '--skip-worktree', '--stdin'], |
79 self._target_repo), | 81 self._target_repo), |
80 ] | 82 ] |
81 self.FINISH_MANUAL_RESOLVE_COMMANDS = [ | 83 self.FINISH_MANUAL_RESOLVE_COMMANDS = [ |
82 (['git', 'commit', '--no-edit'], self._target_repo), | 84 (['git', 'commit', '--no-edit'], self._target_repo), |
83 ] | 85 ] |
84 | 86 |
85 def tearDown(self): | 87 def tearDown(self): |
86 shutil.rmtree(self._temp_directory) | 88 shutil.rmtree(self._temp_directory) |
87 super(GitDroverTest, self).tearDown() | 89 super(GitDroverTest, self).tearDown() |
88 | 90 |
(...skipping 17 matching lines...) Expand all Loading... |
106 if (self._fail_on_command is not None and | 108 if (self._fail_on_command is not None and |
107 self._fail_on_command == len(self._commands)): | 109 self._fail_on_command == len(self._commands)): |
108 self._fail_on_command = None | 110 self._fail_on_command = None |
109 raise subprocess.CalledProcessError(1, args[0]) | 111 raise subprocess.CalledProcessError(1, args[0]) |
110 if args == ['git', 'rev-parse', '--git-dir']: | 112 if args == ['git', 'rev-parse', '--git-dir']: |
111 return os.path.join(self._parent_repo, '.git') | 113 return os.path.join(self._parent_repo, '.git') |
112 if args == ['git', 'status', '--porcelain']: | 114 if args == ['git', 'status', '--porcelain']: |
113 return ' D foo\nUU baz\n D bar\n' | 115 return ' D foo\nUU baz\n D bar\n' |
114 return '' | 116 return '' |
115 | 117 |
| 118 def _Popen(self, args, shell=False, cwd=None, stdin=None, stdout=None, |
| 119 stderr=None): |
| 120 if args == ['git', 'update-index', '--skip-worktree', '--stdin']: |
| 121 self._commands.append((args, cwd)) |
| 122 self.assertFalse(shell) |
| 123 self.assertEqual(stdin, subprocess.PIPE) |
| 124 class MockPopen(object): |
| 125 def __init__(self, *args, **kwargs): |
| 126 self.returncode = -999 |
| 127 def communicate(self, stdin): |
| 128 if stdin == 'foo\nbar\n': |
| 129 self.returncode = 0 |
| 130 else: |
| 131 self.returncode = 1 |
| 132 return MockPopen() |
| 133 else: |
| 134 return self.real_popen(args, shell=shell, cwd=cwd, stdin=stdin, |
| 135 stdout=stdout, stderr=stderr) |
| 136 |
116 def testSuccess(self): | 137 def testSuccess(self): |
117 self._input = ['y', 'y'] | 138 self._input = ['y', 'y'] |
118 git_drover.cherry_pick_change('branch', 'cl', self._parent_repo, False) | 139 git_drover.cherry_pick_change('branch', 'cl', self._parent_repo, False) |
119 self.assertEqual( | 140 self.assertEqual( |
120 self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + | 141 self.REPO_CHECK_COMMANDS + self.LOCAL_REPO_COMMANDS + |
121 self.UPLOAD_COMMANDS + self.LAND_COMMAND + self.BRANCH_CLEANUP_COMMANDS, | 142 self.UPLOAD_COMMANDS + self.LAND_COMMAND + self.BRANCH_CLEANUP_COMMANDS, |
122 self._commands) | 143 self._commands) |
123 self.assertFalse(os.path.exists(self._target_repo)) | 144 self.assertFalse(os.path.exists(self._target_repo)) |
124 self.assertFalse(self._input) | 145 self.assertFalse(self._input) |
125 | 146 |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 self.assertRaises(git_drover.Error, git_drover.continue_cherry_pick, | 313 self.assertRaises(git_drover.Error, git_drover.continue_cherry_pick, |
293 self._parent_repo) | 314 self._parent_repo) |
294 | 315 |
295 def testAbortInvalidWorkdir(self): | 316 def testAbortInvalidWorkdir(self): |
296 self.assertRaises(git_drover.Error, git_drover.abort_cherry_pick, | 317 self.assertRaises(git_drover.Error, git_drover.abort_cherry_pick, |
297 self._parent_repo) | 318 self._parent_repo) |
298 | 319 |
299 | 320 |
300 if __name__ == '__main__': | 321 if __name__ == '__main__': |
301 unittest.main() | 322 unittest.main() |
OLD | NEW |