OLD | NEW |
| (Empty) |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import shutil | |
6 import sys | |
7 import tempfile | |
8 | |
9 # 'super on old-style class' - pylint: disable=E1002 | |
10 # 'cannot import' - pylint: disable=F0401 | |
11 # 'no __init__ method' - pylint: disable=W0232 | |
12 from testing_support import git_test_utils | |
13 | |
14 from infra.services.gnumbd.support import git, util | |
15 | |
16 class TestBasis(git_test_utils.GitRepoReadWriteTestBase): | |
17 REPO_SCHEMA = """ | |
18 A B C D E F | |
19 D L M N O | |
20 O P Q R S | |
21 B G H I J K | |
22 H Z | |
23 O Z | |
24 """ | |
25 | |
26 @staticmethod | |
27 def capture_stdio(fn, *args, **kwargs): | |
28 stdout = sys.stdout | |
29 stderr = sys.stderr | |
30 try: | |
31 # "multiple statements on a line" pylint: disable=C0321 | |
32 with tempfile.TemporaryFile() as out, tempfile.TemporaryFile() as err: | |
33 sys.stdout = out | |
34 sys.stderr = err | |
35 fn(*args, **kwargs) | |
36 out.seek(0) | |
37 err.seek(0) | |
38 return out.read(), err.read() | |
39 finally: | |
40 sys.stdout = stdout | |
41 sys.stderr = stderr | |
42 | |
43 def setUp(self): | |
44 self.repos_dir = tempfile.mkdtemp(suffix='.gnumbd') | |
45 super(TestBasis, self).setUp() | |
46 self.repo.git('branch', 'branch_O', self.repo['O']) | |
47 | |
48 def tearDown(self): | |
49 shutil.rmtree(self.repos_dir) | |
50 super(TestBasis, self).tearDown() | |
51 | |
52 def mkRepo(self): | |
53 r = git.Repo(self.repo.repo_path) | |
54 r.repos_dir = self.repos_dir | |
55 self.capture_stdio(r.reify) | |
56 return r | |
57 | |
58 | |
59 class TestRepo(TestBasis): | |
60 def testEmptyRepo(self): | |
61 r = git.Repo('doesnt_exist') | |
62 r.repos_dir = self.repos_dir | |
63 | |
64 with self.assertRaises(util.CalledProcessError): | |
65 self.capture_stdio(r.reify) | |
66 | |
67 with self.assertRaises(AssertionError): | |
68 r.run('show-ref') | |
69 | |
70 def testDefaultRepo(self): | |
71 r = self.mkRepo() | |
72 r.reify() # covers 'already initialized' portion of reify() | |
73 self.assertEqual(r.run('rev-parse', 'branch_F').strip(), self.repo['F']) | |
74 _, err = self.capture_stdio(r.run, 'rev-parse', 'rtaitnariostnr', | |
75 ok_ret={128}) | |
76 self.assertIn('fatal', err) | |
77 | |
78 def testDefaultRepoGit(self): | |
79 shutil.move(self.repo.repo_path, self.repo.repo_path + '.git') | |
80 self.repo.repo_path += '.git' | |
81 r = self.mkRepo() | |
82 self.assertFalse(r._repo_path.endswith('.git')) # pylint: disable=W0212 | |
83 self.assertIn('refs/heads/branch_F', r.run('show-ref')) | |
84 | |
85 def testRefglob(self): | |
86 r = self.mkRepo() | |
87 self.assertEqual( | |
88 {rf.ref for rf in r.refglob('*branch_*')}, | |
89 {'refs/heads/branch_'+l for l in 'FOKSZ'}) | |
90 self.assertIs(next(r.refglob('*branch_O')).repo, r) | |
91 self.assertEqual(list(r.refglob('*atritaosrtientsaroitna*')), []) | |
92 | |
93 def testDryRun(self): | |
94 r = self.mkRepo() | |
95 r.dry_run = True | |
96 self.assertIsNone(r.run('push', 'origin', 'HEAD')) | |
97 | |
98 def testRunIndata(self): | |
99 r = self.mkRepo() | |
100 with self.assertRaises(AssertionError): | |
101 r.run('bogus', indata='spam', stdin=sys.stdin) | |
102 self.assertEqual( | |
103 r.run('rev-list', '--stdin', indata='branch_O~').splitlines()[0], | |
104 self.repo['N']) | |
105 | |
106 def testGetCommit(self): | |
107 # pylint: disable=W0212 | |
108 r = self.mkRepo() | |
109 c = r.get_commit(self.repo['L']) | |
110 self.assertEqual(c.hsh, self.repo['L']) | |
111 self.assertEqual([self.repo['L']], r._commit_cache.keys()) | |
112 | |
113 c2 = r.get_commit(self.repo['L']) | |
114 self.assertIs(c, c2) | |
115 | |
116 def testGetCommitEviction(self): | |
117 # pylint: disable=W0212 | |
118 r = self.mkRepo() | |
119 r.MAX_CACHE_SIZE = 2 | |
120 L = r.get_commit(self.repo['L']) | |
121 self.assertIs(L, r.get_commit(self.repo['L'])) | |
122 self.assertEqual(len(r._commit_cache), 1) | |
123 | |
124 O = r.get_commit(self.repo['O']) | |
125 self.assertIs(L, r.get_commit(self.repo['L'])) | |
126 self.assertIs(O, r.get_commit(self.repo['O'])) | |
127 self.assertEqual(len(r._commit_cache), 2) | |
128 | |
129 N = r.get_commit(self.repo['N']) | |
130 self.assertIs(N, r.get_commit(self.repo['N'])) | |
131 self.assertIs(O, r.get_commit(self.repo['O'])) | |
132 self.assertEqual(len(r._commit_cache), 2) | |
133 | |
134 self.assertIsNot(L, r.get_commit(self.repo['L'])) | |
135 | |
136 | |
137 class TestRef(TestBasis): | |
138 def testComparison(self): | |
139 r = self.mkRepo() | |
140 O = git.Ref(r, 'refs/heads/branch_O') | |
141 self.assertEqual(O, O) | |
142 self.assertEqual(O, git.Ref(r, 'refs/heads/branch_O')) | |
143 | |
144 N = git.Ref(r, 'refs/heads/branch_K') | |
145 self.assertNotEqual(O, N) | |
146 | |
147 def testRepr(self): | |
148 r = self.mkRepo() | |
149 O = git.Ref(r, 'refs/heads/branch_O') | |
150 self.assertEqual("Ref(%r, 'refs/heads/branch_O')" % r, repr(O)) | |
151 | |
152 def testCommit(self): | |
153 r = self.mkRepo() | |
154 self.assertEqual( | |
155 git.Ref(r, 'refs/heads/branch_O').commit.hsh, | |
156 self.repo['O']) | |
157 | |
158 def testCommitBogus(self): | |
159 r = self.mkRepo() | |
160 self.assertIs(git.Ref(r, 'refs/heads/bogus').commit, git.INVALID) | |
161 # exercise __ne__ and __eq__ | |
162 self.assertNotEqual(git.Ref(r, 'refs/heads/bogus').commit, | |
163 git.Ref(r, 'refs/heads/other_bogus').commit) | |
164 self.assertFalse(git.Ref(r, 'refs/heads/bogus').commit == | |
165 git.Ref(r, 'refs/heads/other_bogus').commit) | |
166 | |
167 def testTo(self): | |
168 r = self.mkRepo() | |
169 A = git.Ref(r, 'refs/heads/root_A') | |
170 O = git.Ref(r, 'refs/heads/branch_O') | |
171 self.assertEqual( | |
172 list(c.hsh for c in A.to(O)), | |
173 [self.repo[c] for c in 'BCDLMNO'] | |
174 ) | |
175 | |
176 def testNonFastForward(self): | |
177 r = self.mkRepo() | |
178 O = git.Ref(r, 'refs/heads/branch_O') | |
179 D = r.get_commit(self.repo['D']) | |
180 with self.assertRaises(git.CalledProcessError): | |
181 O.fast_forward_push(D) | |
182 self.assertEqual( | |
183 self.repo.git('rev-parse', 'branch_O').stdout.strip(), | |
184 self.repo['O']) | |
185 | |
186 def testFastForward(self): | |
187 r = self.mkRepo() | |
188 O = git.Ref(r, 'refs/heads/branch_O') | |
189 S = r.get_commit(self.repo['S']) | |
190 self.capture_stdio(O.fast_forward_push, S) | |
191 self.assertEqual(O.commit.hsh, self.repo['S']) | |
192 self.assertEqual( | |
193 self.repo.git('rev-parse', 'branch_O').stdout.strip(), | |
194 self.repo['S']) | |
195 | |
196 | |
197 class TestCommit(TestBasis): | |
198 def testComparison(self): | |
199 r = self.mkRepo() | |
200 c = git.Ref(r, 'refs/heads/branch_O').commit | |
201 self.assertEqual(c, c) | |
202 self.assertEqual(c, git.Ref(r, 'refs/heads/branch_O').commit) | |
203 self.assertNotEqual(c, git.Ref(r, 'refs/heads/branch_S').commit) | |
204 self.assertIs(c.repo, r) | |
205 | |
206 def testRepr(self): | |
207 r = self.mkRepo() | |
208 c = git.Ref(r, 'refs/heads/branch_O').commit | |
209 self.assertEqual("Commit(%r, %r)" % (r, self.repo['O']), repr(c)) | |
210 | |
211 def testData(self): | |
212 r = self.mkRepo() | |
213 d = git.Ref(r, 'refs/heads/branch_O').commit.data | |
214 self.assertEqual(d.committer.email, 'commitish@example.com') | |
215 | |
216 def testBogus(self): | |
217 r = self.mkRepo() | |
218 d = git.Commit(r, 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeef').data | |
219 self.assertIs(d, git.INVALID) | |
220 self.assertIs(d.committer, git.INVALID) | |
221 self.assertIs(d.committer.alter(user='tom'), git.INVALID) | |
222 | |
223 def testParent(self): | |
224 r = self.mkRepo() | |
225 c = git.Ref(r, 'refs/heads/branch_O').commit | |
226 self.assertEqual(c.parent.hsh, self.repo['N']) | |
227 | |
228 a = git.Ref(r, 'refs/heads/root_A').commit | |
229 self.assertIsNone(a.parent) | |
230 | |
231 z = git.Ref(r, 'refs/heads/branch_Z').commit | |
232 self.assertIs(z.parent, git.INVALID) | |
233 | |
234 def testAlter(self): | |
235 r = self.mkRepo() | |
236 c = git.Ref(r, 'refs/heads/branch_O').commit | |
237 d = c.data | |
238 | |
239 a = c.alter(committer=d.committer.alter(email='bob@dude.example.com')) | |
240 self.assertEqual(a.hsh, 'fadfbe63d40f60f5313a71a1c9d72a741ee91770') | |
241 | |
242 with self.assertRaises(Exception): | |
243 c.alter(tree='failbeef') | |
244 | |
OLD | NEW |