OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 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 | 5 |
6 """Unit tests for git_common.py""" | 6 """Unit tests for git_common.py""" |
7 | 7 |
8 import binascii | 8 import binascii |
9 import collections | 9 import collections |
10 import os | 10 import os |
(...skipping 45 matching lines...) Loading... |
56 self.assertEqual(None, double_if_even(1)) | 56 self.assertEqual(None, double_if_even(1)) |
57 self.assertEqual(20, double_if_even(10)) | 57 self.assertEqual(20, double_if_even(10)) |
58 self.assertDictEqual({1: 4, 2: 2, 10: 1}, calls) | 58 self.assertDictEqual({1: 4, 2: 2, 10: 1}, calls) |
59 | 59 |
60 def testMemoizeOne(self): | 60 def testMemoizeOne(self): |
61 self._testMemoizeOneBody(threadsafe=False) | 61 self._testMemoizeOneBody(threadsafe=False) |
62 | 62 |
63 def testMemoizeOneThreadsafe(self): | 63 def testMemoizeOneThreadsafe(self): |
64 self._testMemoizeOneBody(threadsafe=True) | 64 self._testMemoizeOneBody(threadsafe=True) |
65 | 65 |
| 66 def testOnce(self): |
| 67 testlist = [] |
| 68 |
| 69 @self.gc.once |
| 70 def add_to_list(): |
| 71 testlist.append('dog') |
| 72 |
| 73 add_to_list() |
| 74 add_to_list() |
| 75 add_to_list() |
| 76 add_to_list() |
| 77 |
| 78 self.assertEquals(testlist, ['dog']) |
| 79 |
66 | 80 |
67 def slow_square(i): | 81 def slow_square(i): |
68 """Helper for ScopedPoolTest. | 82 """Helper for ScopedPoolTest. |
69 | 83 |
70 Must be global because non top-level functions aren't pickleable. | 84 Must be global because non top-level functions aren't pickleable. |
71 """ | 85 """ |
72 return i ** 2 | 86 return i ** 2 |
73 | 87 |
74 | 88 |
75 class ScopedPoolTest(GitCommonTestBase): | 89 class ScopedPoolTest(GitCommonTestBase): |
(...skipping 59 matching lines...) Loading... |
135 inc() | 149 inc() |
136 | 150 |
137 filtered = set(x.strip() for x in stream.data) | 151 filtered = set(x.strip() for x in stream.data) |
138 rslt = set(fmt % {'count': i} for i in xrange(11)) | 152 rslt = set(fmt % {'count': i} for i in xrange(11)) |
139 self.assertSetEqual(filtered, rslt) | 153 self.assertSetEqual(filtered, rslt) |
140 self.assertGreaterEqual(stream.count, 10) | 154 self.assertGreaterEqual(stream.count, 10) |
141 | 155 |
142 | 156 |
143 class GitReadOnlyFunctionsTest(git_test_utils.GitRepoReadOnlyTestBase, | 157 class GitReadOnlyFunctionsTest(git_test_utils.GitRepoReadOnlyTestBase, |
144 GitCommonTestBase): | 158 GitCommonTestBase): |
145 REPO = """ | 159 REPO_SCHEMA = """ |
146 A B C D | 160 A B C D |
147 B E D | 161 B E D |
148 """ | 162 """ |
149 | 163 |
150 COMMIT_A = { | 164 COMMIT_A = { |
151 'some/files/file1': {'data': 'file1'}, | 165 'some/files/file1': {'data': 'file1'}, |
152 'some/files/file2': {'data': 'file2'}, | 166 'some/files/file2': {'data': 'file2'}, |
153 'some/files/file3': {'data': 'file3'}, | 167 'some/files/file3': {'data': 'file3'}, |
154 'some/other/file': {'data': 'otherfile'}, | 168 'some/other/file': {'data': 'otherfile'}, |
155 } | 169 } |
(...skipping 44 matching lines...) Loading... |
200 items.remove(line) | 214 items.remove(line) |
201 | 215 |
202 self.repo.run(testfn) | 216 self.repo.run(testfn) |
203 | 217 |
204 def testCurrentBranch(self): | 218 def testCurrentBranch(self): |
205 self.repo.git('checkout', 'branch_D') | 219 self.repo.git('checkout', 'branch_D') |
206 self.assertEqual(self.repo.run(self.gc.current_branch), 'branch_D') | 220 self.assertEqual(self.repo.run(self.gc.current_branch), 'branch_D') |
207 | 221 |
208 def testBranches(self): | 222 def testBranches(self): |
209 self.assertEqual(self.repo.run(set, self.gc.branches()), | 223 self.assertEqual(self.repo.run(set, self.gc.branches()), |
210 set(('branch_D', 'root_A'))) | 224 set(('master', 'branch_D', 'root_A'))) |
211 | 225 |
212 def testTags(self): | 226 def testTags(self): |
213 self.assertEqual(set(self.repo.run(self.gc.tags)), | 227 self.assertEqual(set(self.repo.run(self.gc.tags)), |
214 {'tag_'+l for l in 'ABCDE'}) | 228 {'tag_'+l for l in 'ABCDE'}) |
215 | 229 |
216 def testParseCommitrefs(self): | 230 def testParseCommitrefs(self): |
217 ret = self.repo.run( | 231 ret = self.repo.run( |
218 self.gc.parse_commitrefs, *[ | 232 self.gc.parse_commitrefs, *[ |
219 'master', | 233 'master', |
220 'master~3', | 234 'master~3', |
(...skipping 51 matching lines...) Loading... |
272 self.assertEquals( | 286 self.assertEquals( |
273 tree['files/file3'], | 287 tree['files/file3'], |
274 ('100644', 'blob', git_test_utils.git_hash_data(file3))) | 288 ('100644', 'blob', git_test_utils.git_hash_data(file3))) |
275 self.assertEquals( | 289 self.assertEquals( |
276 tree['other/file'], | 290 tree['other/file'], |
277 ('100644', 'blob', git_test_utils.git_hash_data(other))) | 291 ('100644', 'blob', git_test_utils.git_hash_data(other))) |
278 | 292 |
279 | 293 |
280 class GitMutableFunctionsTest(git_test_utils.GitRepoReadWriteTestBase, | 294 class GitMutableFunctionsTest(git_test_utils.GitRepoReadWriteTestBase, |
281 GitCommonTestBase): | 295 GitCommonTestBase): |
282 REPO = '' | 296 REPO_SCHEMA = '' |
283 | 297 |
284 def _intern_data(self, data): | 298 def _intern_data(self, data): |
285 with tempfile.TemporaryFile() as f: | 299 with tempfile.TemporaryFile() as f: |
286 f.write(data) | 300 f.write(data) |
287 f.seek(0) | 301 f.seek(0) |
288 return self.repo.run(self.gc.intern_f, f) | 302 return self.repo.run(self.gc.intern_f, f) |
289 | 303 |
290 def testInternF(self): | 304 def testInternF(self): |
291 data = 'CoolBobcatsBro' | 305 data = 'CoolBobcatsBro' |
292 data_hash = self._intern_data(data) | 306 data_hash = self._intern_data(data) |
(...skipping 11 matching lines...) Loading... |
304 def testConfig(self): | 318 def testConfig(self): |
305 self.repo.git('config', '--add', 'happy.derpies', 'food') | 319 self.repo.git('config', '--add', 'happy.derpies', 'food') |
306 self.assertEquals(self.repo.run(self.gc.config_list, 'happy.derpies'), | 320 self.assertEquals(self.repo.run(self.gc.config_list, 'happy.derpies'), |
307 ['food']) | 321 ['food']) |
308 self.assertEquals(self.repo.run(self.gc.config_list, 'sad.derpies'), []) | 322 self.assertEquals(self.repo.run(self.gc.config_list, 'sad.derpies'), []) |
309 | 323 |
310 self.repo.git('config', '--add', 'happy.derpies', 'cat') | 324 self.repo.git('config', '--add', 'happy.derpies', 'cat') |
311 self.assertEquals(self.repo.run(self.gc.config_list, 'happy.derpies'), | 325 self.assertEquals(self.repo.run(self.gc.config_list, 'happy.derpies'), |
312 ['food', 'cat']) | 326 ['food', 'cat']) |
313 | 327 |
| 328 self.assertEquals('cat', self.repo.run(self.gc.config, 'dude.bob', 'cat')) |
| 329 |
| 330 self.repo.run(self.gc.set_config, 'dude.bob', 'dog') |
| 331 |
| 332 self.assertEquals('dog', self.repo.run(self.gc.config, 'dude.bob', 'cat')) |
| 333 |
| 334 self.repo.run(self.gc.del_config, 'dude.bob') |
| 335 |
| 336 self.assertEquals('cat', self.repo.run(self.gc.config, 'dude.bob', 'cat')) |
| 337 |
| 338 self.assertEquals('origin/master', self.repo.run(self.gc.root)) |
| 339 |
| 340 self.repo.git('config', 'depot-tools.upstream', 'catfood') |
| 341 |
| 342 self.assertEquals('catfood', self.repo.run(self.gc.root)) |
| 343 |
314 def testUpstream(self): | 344 def testUpstream(self): |
315 self.repo.git('commit', '--allow-empty', '-am', 'foooooo') | 345 self.repo.git('commit', '--allow-empty', '-am', 'foooooo') |
316 self.assertEquals(self.repo.run(self.gc.upstream, 'bobly'), None) | 346 self.assertEquals(self.repo.run(self.gc.upstream, 'bobly'), None) |
317 self.assertEquals(self.repo.run(self.gc.upstream, 'master'), None) | 347 self.assertEquals(self.repo.run(self.gc.upstream, 'master'), None) |
318 self.repo.git('checkout', '-tb', 'happybranch', 'master') | 348 self.repo.git('checkout', '-tb', 'happybranch', 'master') |
319 self.assertEquals(self.repo.run(self.gc.upstream, 'happybranch'), | 349 self.assertEquals(self.repo.run(self.gc.upstream, 'happybranch'), |
320 'master') | 350 'master') |
321 | 351 |
322 | 352 |
| 353 class GitMutableStructuredTest(git_test_utils.GitRepoReadWriteTestBase, |
| 354 GitCommonTestBase): |
| 355 REPO_SCHEMA = """ |
| 356 A B C D E F G |
| 357 B H I J K |
| 358 J L |
| 359 |
| 360 X Y Z |
| 361 """ |
| 362 |
| 363 COMMIT_B = {'file': {'data': 'B'}} |
| 364 COMMIT_H = {'file': {'data': 'H'}} |
| 365 COMMIT_I = {'file': {'data': 'I'}} |
| 366 COMMIT_J = {'file': {'data': 'J'}} |
| 367 COMMIT_K = {'file': {'data': 'K'}} |
| 368 COMMIT_L = {'file': {'data': 'L'}} |
| 369 |
| 370 def setUp(self): |
| 371 super(GitMutableStructuredTest, self).setUp() |
| 372 self.repo.git('branch', '--set-upstream-to', 'root_X', 'branch_Z') |
| 373 self.repo.git('branch', '--set-upstream-to', 'branch_G', 'branch_K') |
| 374 self.repo.git('branch', '--set-upstream-to', 'branch_K', 'branch_L') |
| 375 self.repo.git('branch', '--set-upstream-to', 'root_A', 'branch_G') |
| 376 self.repo.git('branch', '--set-upstream-to', 'root_X', 'root_A') |
| 377 |
| 378 def testMergeBase(self): |
| 379 self.repo.git('checkout', 'branch_K') |
| 380 |
| 381 self.assertEqual( |
| 382 self.repo['B'], |
| 383 self.repo.run(self.gc.get_or_create_merge_base, 'branch_K', 'branch_G') |
| 384 ) |
| 385 |
| 386 self.assertEqual( |
| 387 self.repo['B'], self.repo.run(self.gc.config, 'branch.branch_K.base') |
| 388 ) |
| 389 |
| 390 # deadbeef is a bad hash, so this will result in repo['B'] |
| 391 self.repo.run(self.gc.manual_merge_base, 'branch_K', 'deadbeef') |
| 392 |
| 393 self.assertEqual( |
| 394 self.repo['B'], |
| 395 self.repo.run(self.gc.get_or_create_merge_base, 'branch_K', 'branch_G') |
| 396 ) |
| 397 |
| 398 # but if we pick a real ancestor, then it'll work |
| 399 self.repo.run(self.gc.manual_merge_base, 'branch_K', self.repo['I']) |
| 400 |
| 401 self.assertEqual( |
| 402 self.repo['I'], |
| 403 self.repo.run(self.gc.get_or_create_merge_base, 'branch_K', 'branch_G') |
| 404 ) |
| 405 |
| 406 self.repo.run(self.gc.remove_merge_base, 'branch_K') |
| 407 |
| 408 self.assertEqual(None, |
| 409 self.repo.run(self.gc.config, 'branch.branch_K.base')) |
| 410 |
| 411 def testGetBranchTree(self): |
| 412 skipped, tree = self.repo.run(self.gc.get_branch_tree) |
| 413 self.assertEqual(skipped, ['master', 'root_X']) |
| 414 self.assertEqual(tree, { |
| 415 'branch_G': 'root_A', |
| 416 'root_A': 'root_X', |
| 417 'branch_K': 'branch_G', |
| 418 'branch_L': 'branch_K', |
| 419 'branch_Z': 'root_X' |
| 420 }) |
| 421 |
| 422 topdown = list(self.gc.topo_iter(tree)) |
| 423 bottomup = list(self.gc.topo_iter(tree, top_down=False)) |
| 424 |
| 425 self.assertEqual(topdown, [ |
| 426 ('root_A', 'root_X'), |
| 427 ('branch_Z', 'root_X'), |
| 428 ('branch_G', 'root_A'), |
| 429 ('branch_K', 'branch_G'), |
| 430 ('branch_L', 'branch_K'), |
| 431 ]) |
| 432 |
| 433 self.assertEqual(bottomup, [ |
| 434 ('branch_L', 'branch_K'), |
| 435 ('branch_Z', 'root_X'), |
| 436 ('branch_K', 'branch_G'), |
| 437 ('branch_G', 'root_A'), |
| 438 ('root_A', 'root_X'), |
| 439 ]) |
| 440 |
| 441 def testSquashBranch(self): |
| 442 self.repo.git('checkout', 'branch_K') |
| 443 |
| 444 self.repo.run(self.gc.squash_current_branch, 'cool message') |
| 445 |
| 446 lines = ['cool message'] |
| 447 for l in 'HIJK': |
| 448 lines.extend((self.repo[l], l, '')) |
| 449 lines.pop() |
| 450 msg = '\n'.join(lines) |
| 451 |
| 452 self.assertEquals(self.repo.run(self.gc.run, 'log', '-n1', '--format=%B'), |
| 453 msg) |
| 454 |
| 455 self.assertEquals( |
| 456 self.repo.git('cat-file', 'blob', 'branch_K:file').stdout, |
| 457 'K' |
| 458 ) |
| 459 |
| 460 def testRebase(self): |
| 461 before_raw = self.repo.git('rev-list', 'branch_K~4..branch_K') |
| 462 before = before_raw.stdout.splitlines() |
| 463 self.assertEquals(list(reversed(before)), [self.repo[l] for l in 'HIJK']) |
| 464 |
| 465 rslt = self.repo.run( |
| 466 self.gc.rebase, 'branch_G', 'branch_K~4', 'branch_K', ignore_date=True) |
| 467 self.assertTrue(rslt.success) |
| 468 |
| 469 after_raw = self.repo.git('rev-list', 'branch_K~4..branch_K') |
| 470 after = after_raw.stdout.splitlines() |
| 471 self.assertEquals( |
| 472 list(reversed(after)), |
| 473 [ |
| 474 'b2868a2282fbce7abf08f1ed1589f80d459dbd4e', |
| 475 '64f3b5f10b7bf759f448f05933206780d698405e', |
| 476 '1aea9bdab53e5f8f8546ce4316090b06f5f7a88d', |
| 477 'fbd3fde9849c3c0dcd984cce6a8fe336ef948271' |
| 478 ] |
| 479 ) |
| 480 |
| 481 rslt = self.repo.run( |
| 482 self.gc.rebase, 'branch_K', 'branch_L~1', 'branch_L', abort=True, |
| 483 ignore_date=True) |
| 484 self.assertFalse(rslt.success) |
| 485 |
| 486 self.assertFalse(self.repo.run(self.gc.in_rebase)) |
| 487 |
| 488 rslt = self.repo.run( |
| 489 self.gc.rebase, 'branch_K', 'branch_L~1', 'branch_L', abort=False, |
| 490 ignore_date=True) |
| 491 self.assertFalse(rslt.success) |
| 492 |
| 493 self.assertEqual(self.repo.git('status', '--porcelain').stdout, 'UU file\n') |
| 494 self.repo.git('checkout', '--theirs', 'file') |
| 495 self.repo.git('add', 'file') |
| 496 self.repo.git('rebase', '--continue', '--committer-date-is-author-date') |
| 497 |
| 498 self.assertEquals( |
| 499 self.repo.git('rev-parse', 'branch_L').stdout.strip(), |
| 500 '2c84f5091d4dd902084d91b9f37bae5a601c146e' |
| 501 ) |
| 502 |
| 503 |
323 if __name__ == '__main__': | 504 if __name__ == '__main__': |
324 sys.exit(coverage_utils.covered_main( | 505 sys.exit(coverage_utils.covered_main( |
325 os.path.join(DEPOT_TOOLS_ROOT, 'git_common.py') | 506 os.path.join(DEPOT_TOOLS_ROOT, 'git_common.py') |
326 )) | 507 )) |
OLD | NEW |