| 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 |