Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(587)

Side by Side Diff: infra/services/gnumbd/test/git_test.py

Issue 355153002: Refactor infra git libs and testing. (Closed) Base URL: https://chromium.googlesource.com/infra/infra@fake_testing_support
Patch Set: Change config ref to have a sandard naming scheme Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698