| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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_cl.py.""" | 6 """Unit tests for git_cl.py.""" |
| 7 | 7 |
| 8 import os | 8 import os |
| 9 import StringIO | 9 import StringIO |
| 10 import stat | 10 import stat |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 # diagnose. | 102 # diagnose. |
| 103 if expected_args != args: | 103 if expected_args != args: |
| 104 msg = '@%d Expected: %r Actual: %r' % ( | 104 msg = '@%d Expected: %r Actual: %r' % ( |
| 105 self._calls_done, expected_args, args) | 105 self._calls_done, expected_args, args) |
| 106 git_cl.logging.error(msg) | 106 git_cl.logging.error(msg) |
| 107 self.fail(msg) | 107 self.fail(msg) |
| 108 self._calls_done += 1 | 108 self._calls_done += 1 |
| 109 return result | 109 return result |
| 110 | 110 |
| 111 @classmethod | 111 @classmethod |
| 112 def _upload_calls(cls, similarity, find_copies): | 112 def _upload_calls(cls, similarity, find_copies, private): |
| 113 return (cls._git_base_calls(similarity, find_copies) + | 113 return (cls._git_base_calls(similarity, find_copies) + |
| 114 cls._git_upload_calls()) | 114 cls._git_upload_calls(private)) |
| 115 | 115 |
| 116 @classmethod | 116 @classmethod |
| 117 def _upload_no_rev_calls(cls, similarity, find_copies): | 117 def _upload_no_rev_calls(cls, similarity, find_copies): |
| 118 return (cls._git_base_calls(similarity, find_copies) + | 118 return (cls._git_base_calls(similarity, find_copies) + |
| 119 cls._git_upload_no_rev_calls()) | 119 cls._git_upload_no_rev_calls()) |
| 120 | 120 |
| 121 @classmethod | 121 @classmethod |
| 122 def _git_base_calls(cls, similarity, find_copies): | 122 def _git_base_calls(cls, similarity, find_copies): |
| 123 if similarity is None: | 123 if similarity is None: |
| 124 similarity = '50' | 124 similarity = '50' |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 'desc\n'), | 179 'desc\n'), |
| 180 ] | 180 ] |
| 181 | 181 |
| 182 @classmethod | 182 @classmethod |
| 183 def _git_upload_no_rev_calls(cls): | 183 def _git_upload_no_rev_calls(cls): |
| 184 return [ | 184 return [ |
| 185 ((['git', '--no-pager', 'config', 'core.editor'],), ''), | 185 ((['git', '--no-pager', 'config', 'core.editor'],), ''), |
| 186 ] | 186 ] |
| 187 | 187 |
| 188 @classmethod | 188 @classmethod |
| 189 def _git_upload_calls(cls): | 189 def _git_upload_calls(cls, private): |
| 190 if private: |
| 191 private_call = [] |
| 192 else: |
| 193 private_call = [ |
| 194 ((['git', '--no-pager', 'config', 'rietveld.private'],), '')] |
| 195 |
| 190 return [ | 196 return [ |
| 191 ((['git', '--no-pager', 'config', 'core.editor'],), ''), | 197 ((['git', '--no-pager', 'config', 'core.editor'],), ''), |
| 192 ((['git', '--no-pager', 'config', 'rietveld.cc'],), ''), | 198 ((['git', '--no-pager', 'config', 'rietveld.cc'],), '') |
| 193 ((['git', '--no-pager', 'config', 'branch.master.base-url'],), ''), | 199 ] + private_call + [ |
| 194 ((['git', '--no-pager', | 200 ((['git', '--no-pager', 'config', 'branch.master.base-url'],), ''), |
| 195 'config', '--local', '--get-regexp', '^svn-remote\\.'],), | 201 ((['git', '--no-pager', |
| 196 (('', None), 0)), | 202 'config', '--local', '--get-regexp', '^svn-remote\\.'],), |
| 197 ((['git', '--no-pager', 'rev-parse', '--show-cdup'],), ''), | 203 (('', None), 0)), |
| 198 ((['git', '--no-pager', 'svn', 'info'],), ''), | 204 ((['git', '--no-pager', 'rev-parse', '--show-cdup'],), ''), |
| 199 ((['git', '--no-pager', | 205 ((['git', '--no-pager', 'svn', 'info'],), ''), |
| 200 'config', 'branch.master.rietveldissue', '1'],), ''), | 206 ((['git', '--no-pager', |
| 201 ((['git', '--no-pager', 'config', 'branch.master.rietveldserver', | 207 'config', 'branch.master.rietveldissue', '1'],), ''), |
| 202 'https://codereview.example.com'],), ''), | 208 ((['git', '--no-pager', 'config', 'branch.master.rietveldserver', |
| 203 ((['git', '--no-pager', | 209 'https://codereview.example.com'],), ''), |
| 204 'config', 'branch.master.rietveldpatchset', '2'],), ''), | 210 ((['git', '--no-pager', |
| 205 ((['git', '--no-pager', 'rev-parse', 'HEAD'],), 'hash'), | 211 'config', 'branch.master.rietveldpatchset', '2'],), ''), |
| 206 ((['git', '--no-pager', 'symbolic-ref', 'HEAD'],), 'hash'), | 212 ((['git', '--no-pager', 'rev-parse', 'HEAD'],), 'hash'), |
| 207 ((['git', '--no-pager', | 213 ((['git', '--no-pager', 'symbolic-ref', 'HEAD'],), 'hash'), |
| 208 'config', 'branch.hash.last-upload-hash', 'hash'],), ''), | 214 ((['git', '--no-pager', |
| 215 'config', 'branch.hash.last-upload-hash', 'hash'],), ''), |
| 209 ] | 216 ] |
| 210 | 217 |
| 211 @staticmethod | 218 @staticmethod |
| 212 def _git_sanity_checks(diff_base, working_branch): | 219 def _git_sanity_checks(diff_base, working_branch): |
| 213 fake_ancestor = 'fake_ancestor' | 220 fake_ancestor = 'fake_ancestor' |
| 214 fake_cl = 'fake_cl_for_patch' | 221 fake_cl = 'fake_cl_for_patch' |
| 215 return [ | 222 return [ |
| 216 # Calls to verify branch point is ancestor | 223 # Calls to verify branch point is ancestor |
| 217 ((['git', '--no-pager', | 224 ((['git', '--no-pager', |
| 218 'rev-parse', '--verify', diff_base],), fake_ancestor), | 225 'rev-parse', '--verify', diff_base],), fake_ancestor), |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 'Review URL: https://codereview.example.com/12345'],), | 336 'Review URL: https://codereview.example.com/12345'],), |
| 330 ''), | 337 ''), |
| 331 ((['git', '--no-pager', | 338 ((['git', '--no-pager', |
| 332 'svn', 'dcommit', '-C50', '--no-rebase', '--rmdir'],), | 339 'svn', 'dcommit', '-C50', '--no-rebase', '--rmdir'],), |
| 333 (('', None), 0)), | 340 (('', None), 0)), |
| 334 ((['git', '--no-pager', 'checkout', '-q', 'working'],), ''), | 341 ((['git', '--no-pager', 'checkout', '-q', 'working'],), ''), |
| 335 ((['git', '--no-pager', 'branch', '-D', 'git-cl-commit'],), ''), | 342 ((['git', '--no-pager', 'branch', '-D', 'git-cl-commit'],), ''), |
| 336 ] | 343 ] |
| 337 | 344 |
| 338 @staticmethod | 345 @staticmethod |
| 339 def _cmd_line(description, args, similarity, find_copies): | 346 def _cmd_line(description, args, similarity, find_copies, private): |
| 340 """Returns the upload command line passed to upload.RealMain().""" | 347 """Returns the upload command line passed to upload.RealMain().""" |
| 341 return [ | 348 return [ |
| 342 'upload', '--assume_yes', '--server', | 349 'upload', '--assume_yes', '--server', |
| 343 'https://codereview.example.com', | 350 'https://codereview.example.com', |
| 344 '--message', description | 351 '--message', description |
| 345 ] + args + [ | 352 ] + args + [ |
| 346 '--cc', 'joe@example.com', | 353 '--cc', 'joe@example.com', |
| 354 ] + (['--private'] if private else []) + [ |
| 347 '--git_similarity', similarity or '50' | 355 '--git_similarity', similarity or '50' |
| 348 ] + (['--git_no_find_copies'] if find_copies == False else []) + [ | 356 ] + (['--git_no_find_copies'] if find_copies == False else []) + [ |
| 349 'fake_ancestor_sha', 'HEAD' | 357 'fake_ancestor_sha', 'HEAD' |
| 350 ] | 358 ] |
| 351 | 359 |
| 352 def _run_reviewer_test( | 360 def _run_reviewer_test( |
| 353 self, | 361 self, |
| 354 upload_args, | 362 upload_args, |
| 355 expected_description, | 363 expected_description, |
| 356 returned_description, | 364 returned_description, |
| 357 final_description, | 365 final_description, |
| 358 reviewers): | 366 reviewers, |
| 367 private=False): |
| 359 """Generic reviewer test framework.""" | 368 """Generic reviewer test framework.""" |
| 360 try: | 369 try: |
| 361 similarity = upload_args[upload_args.index('--similarity')+1] | 370 similarity = upload_args[upload_args.index('--similarity')+1] |
| 362 except ValueError: | 371 except ValueError: |
| 363 similarity = None | 372 similarity = None |
| 364 | 373 |
| 365 if '--find-copies' in upload_args: | 374 if '--find-copies' in upload_args: |
| 366 find_copies = True | 375 find_copies = True |
| 367 elif '--no-find-copies' in upload_args: | 376 elif '--no-find-copies' in upload_args: |
| 368 find_copies = False | 377 find_copies = False |
| 369 else: | 378 else: |
| 370 find_copies = None | 379 find_copies = None |
| 371 | 380 |
| 372 self.calls = self._upload_calls(similarity, find_copies) | 381 private = '--private' in upload_args |
| 382 |
| 383 self.calls = self._upload_calls(similarity, find_copies, private) |
| 373 def RunEditor(desc, _, **kwargs): | 384 def RunEditor(desc, _, **kwargs): |
| 374 self.assertEquals( | 385 self.assertEquals( |
| 375 '# Enter a description of the change.\n' | 386 '# Enter a description of the change.\n' |
| 376 '# This will be displayed on the codereview site.\n' | 387 '# This will be displayed on the codereview site.\n' |
| 377 '# The first line will also be used as the subject of the review.\n' + | 388 '# The first line will also be used as the subject of the review.\n' + |
| 378 expected_description, | 389 expected_description, |
| 379 desc) | 390 desc) |
| 380 return returned_description | 391 return returned_description |
| 381 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) | 392 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) |
| 382 def check_upload(args): | 393 def check_upload(args): |
| 383 cmd_line = self._cmd_line(final_description, reviewers, similarity, | 394 cmd_line = self._cmd_line(final_description, reviewers, similarity, |
| 384 find_copies) | 395 find_copies, private) |
| 385 self.assertEquals(cmd_line, args) | 396 self.assertEquals(cmd_line, args) |
| 386 return 1, 2 | 397 return 1, 2 |
| 387 self.mock(git_cl.upload, 'RealMain', check_upload) | 398 self.mock(git_cl.upload, 'RealMain', check_upload) |
| 388 git_cl.main(['upload'] + upload_args) | 399 git_cl.main(['upload'] + upload_args) |
| 389 | 400 |
| 390 def test_no_reviewer(self): | 401 def test_no_reviewer(self): |
| 391 self._run_reviewer_test( | 402 self._run_reviewer_test( |
| 392 [], | 403 [], |
| 393 'desc\n\nBUG=', | 404 'desc\n\nBUG=', |
| 394 '# Blah blah comment.\ndesc\n\nBUG=', | 405 '# Blah blah comment.\ndesc\n\nBUG=', |
| 395 'desc\n\nBUG=', | 406 'desc\n\nBUG=', |
| 396 []) | 407 []) |
| 397 | 408 |
| 398 def test_keep_similarity(self): | 409 def test_keep_similarity(self): |
| 399 self._run_reviewer_test( | 410 self._run_reviewer_test( |
| 400 ['--similarity', '70'], | 411 ['--similarity', '70'], |
| 401 'desc\n\nBUG=', | 412 'desc\n\nBUG=', |
| 402 '# Blah blah comment.\ndesc\n\nBUG=', | 413 '# Blah blah comment.\ndesc\n\nBUG=', |
| 403 'desc\n\nBUG=', | 414 'desc\n\nBUG=', |
| 404 []) | 415 []) |
| 405 | 416 |
| 406 def test_keep_find_copies(self): | 417 def test_keep_find_copies(self): |
| 407 self._run_reviewer_test( | 418 self._run_reviewer_test( |
| 408 ['--no-find-copies'], | 419 ['--no-find-copies'], |
| 409 'desc\n\nBUG=', | 420 'desc\n\nBUG=', |
| 410 '# Blah blah comment.\ndesc\n\nBUG=\n', | 421 '# Blah blah comment.\ndesc\n\nBUG=\n', |
| 411 'desc\n\nBUG=', | 422 'desc\n\nBUG=', |
| 412 []) | 423 []) |
| 413 | 424 |
| 425 def test_private(self): |
| 426 self._run_reviewer_test( |
| 427 ['--private'], |
| 428 'desc\n\nBUG=', |
| 429 '# Blah blah comment.\ndesc\n\nBUG=\n', |
| 430 'desc\n\nBUG=', |
| 431 []) |
| 432 |
| 414 def test_reviewers_cmd_line(self): | 433 def test_reviewers_cmd_line(self): |
| 415 # Reviewer is passed as-is | 434 # Reviewer is passed as-is |
| 416 description = 'desc\n\nR=foo@example.com\nBUG=' | 435 description = 'desc\n\nR=foo@example.com\nBUG=' |
| 417 self._run_reviewer_test( | 436 self._run_reviewer_test( |
| 418 ['-r' 'foo@example.com'], | 437 ['-r' 'foo@example.com'], |
| 419 description, | 438 description, |
| 420 '\n%s\n' % description, | 439 '\n%s\n' % description, |
| 421 description, | 440 description, |
| 422 ['--reviewers=foo@example.com']) | 441 ['--reviewers=foo@example.com']) |
| 423 | 442 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 return False | 643 return False |
| 625 # others paths, such as /usr/share/locale/.... | 644 # others paths, such as /usr/share/locale/.... |
| 626 return True | 645 return True |
| 627 self.mock(git_cl.os.path, 'exists', Exists) | 646 self.mock(git_cl.os.path, 'exists', Exists) |
| 628 self.mock(git_cl, 'urlretrieve', self._mocked_call) | 647 self.mock(git_cl, 'urlretrieve', self._mocked_call) |
| 629 self.calls = [ | 648 self.calls = [ |
| 630 ((['git', '--no-pager', 'config', 'rietveld.server', | 649 ((['git', '--no-pager', 'config', 'rietveld.server', |
| 631 'gerrit.chromium.org'],), ''), | 650 'gerrit.chromium.org'],), ''), |
| 632 ((['git', '--no-pager', 'config', '--unset-all', 'rietveld.cc'],), ''), | 651 ((['git', '--no-pager', 'config', '--unset-all', 'rietveld.cc'],), ''), |
| 633 ((['git', '--no-pager', 'config', '--unset-all', | 652 ((['git', '--no-pager', 'config', '--unset-all', |
| 653 'rietveld.private'],), ''), |
| 654 ((['git', '--no-pager', 'config', '--unset-all', |
| 634 'rietveld.tree-status-url'],), ''), | 655 'rietveld.tree-status-url'],), ''), |
| 635 ((['git', '--no-pager', 'config', '--unset-all', | 656 ((['git', '--no-pager', 'config', '--unset-all', |
| 636 'rietveld.viewvc-url'],), ''), | 657 'rietveld.viewvc-url'],), ''), |
| 637 ((['git', '--no-pager', 'config', 'gerrit.host', | 658 ((['git', '--no-pager', 'config', 'gerrit.host', |
| 638 'gerrit.chromium.org'],), ''), | 659 'gerrit.chromium.org'],), ''), |
| 639 ((['git', '--no-pager', 'config', 'gerrit.port', '29418'],), ''), | 660 ((['git', '--no-pager', 'config', 'gerrit.port', '29418'],), ''), |
| 640 # DownloadHooks(False) | 661 # DownloadHooks(False) |
| 641 ((['git', '--no-pager', 'config', 'gerrit.host'],), | 662 ((['git', '--no-pager', 'config', 'gerrit.host'],), |
| 642 'gerrit.chromium.org'), | 663 'gerrit.chromium.org'), |
| 643 ((['git', '--no-pager', 'config', 'rietveld.server'],), | 664 ((['git', '--no-pager', 'config', 'rietveld.server'],), |
| 644 'gerrit.chromium.org'), | 665 'gerrit.chromium.org'), |
| 645 ((['git', '--no-pager', 'rev-parse', '--show-cdup'],), ''), | 666 ((['git', '--no-pager', 'rev-parse', '--show-cdup'],), ''), |
| 646 ((commit_msg_path, os.X_OK,), False), | 667 ((commit_msg_path, os.X_OK,), False), |
| 647 (('https://gerrit.chromium.org/tools/hooks/commit-msg', | 668 (('https://gerrit.chromium.org/tools/hooks/commit-msg', |
| 648 commit_msg_path,), ''), | 669 commit_msg_path,), ''), |
| 649 ((commit_msg_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR,), ''), | 670 ((commit_msg_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR,), ''), |
| 650 # GetCodereviewSettingsInteractively | 671 # GetCodereviewSettingsInteractively |
| 651 ((['git', '--no-pager', 'config', 'rietveld.server'],), | 672 ((['git', '--no-pager', 'config', 'rietveld.server'],), |
| 652 'gerrit.chromium.org'), | 673 'gerrit.chromium.org'), |
| 653 (('Rietveld server (host[:port]) [https://gerrit.chromium.org]:',), | 674 (('Rietveld server (host[:port]) [https://gerrit.chromium.org]:',), |
| 654 ''), | 675 ''), |
| 655 ((['git', '--no-pager', 'config', 'rietveld.cc'],), ''), | 676 ((['git', '--no-pager', 'config', 'rietveld.cc'],), ''), |
| 656 (('CC list:',), ''), | 677 (('CC list:',), ''), |
| 678 ((['git', '--no-pager', 'config', 'rietveld.private'],), ''), |
| 679 (('Private flag (rietveld only):',), ''), |
| 657 ((['git', '--no-pager', 'config', 'rietveld.tree-status-url'],), ''), | 680 ((['git', '--no-pager', 'config', 'rietveld.tree-status-url'],), ''), |
| 658 (('Tree status URL:',), ''), | 681 (('Tree status URL:',), ''), |
| 659 ((['git', '--no-pager', 'config', 'rietveld.viewvc-url'],), ''), | 682 ((['git', '--no-pager', 'config', 'rietveld.viewvc-url'],), ''), |
| 660 (('ViewVC URL:',), ''), | 683 (('ViewVC URL:',), ''), |
| 661 # DownloadHooks(True) | 684 # DownloadHooks(True) |
| 662 ((commit_msg_path, os.X_OK,), True), | 685 ((commit_msg_path, os.X_OK,), True), |
| 663 ] | 686 ] |
| 664 git_cl.main(['config']) | 687 git_cl.main(['config']) |
| 665 | 688 |
| 666 def test_update_reviewers(self): | 689 def test_update_reviewers(self): |
| (...skipping 19 matching lines...) Expand all Loading... |
| 686 obj = git_cl.ChangeDescription(orig) | 709 obj = git_cl.ChangeDescription(orig) |
| 687 obj.update_reviewers(reviewers) | 710 obj.update_reviewers(reviewers) |
| 688 actual.append(obj.description) | 711 actual.append(obj.description) |
| 689 self.assertEqual(expected, actual) | 712 self.assertEqual(expected, actual) |
| 690 | 713 |
| 691 | 714 |
| 692 if __name__ == '__main__': | 715 if __name__ == '__main__': |
| 693 git_cl.logging.basicConfig( | 716 git_cl.logging.basicConfig( |
| 694 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) | 717 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) |
| 695 unittest.main() | 718 unittest.main() |
| OLD | NEW |