Chromium Code Reviews

Side by Side Diff: tests/git_common_test.py

Issue 184253003: Add git-reup and friends (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@freeze_thaw
Patch Set: one more argparse Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
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...)
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...)
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...)
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...)
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...)
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 ))
OLDNEW

Powered by Google App Engine