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

Side by Side Diff: tests/checkout_test.py

Issue 8038056: Fix handling of file renames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Rebase against HEAD Created 9 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « patch.py ('k') | tests/patch_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 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 checkout.py.""" 6 """Unit tests for checkout.py."""
7 7
8 from __future__ import with_statement 8 from __future__ import with_statement
9 import logging 9 import logging
10 import os 10 import os
(...skipping 22 matching lines...) Expand all
33 33
34 34
35 class FakeRepos(fake_repos.FakeReposBase): 35 class FakeRepos(fake_repos.FakeReposBase):
36 def populateSvn(self): 36 def populateSvn(self):
37 """Creates a few revisions of changes files.""" 37 """Creates a few revisions of changes files."""
38 subprocess2.check_call( 38 subprocess2.check_call(
39 ['svn', 'checkout', self.svn_base, self.svn_checkout, '-q', 39 ['svn', 'checkout', self.svn_base, self.svn_checkout, '-q',
40 '--non-interactive', '--no-auth-cache', 40 '--non-interactive', '--no-auth-cache',
41 '--username', self.USERS[0][0], '--password', self.USERS[0][1]]) 41 '--username', self.USERS[0][0], '--password', self.USERS[0][1]])
42 assert os.path.isdir(os.path.join(self.svn_checkout, '.svn')) 42 assert os.path.isdir(os.path.join(self.svn_checkout, '.svn'))
43 self._commit_svn(self._tree_1())
44 self._commit_svn(self._tree_2())
45
46 @staticmethod
47 def _tree_1():
43 fs = {} 48 fs = {}
44 fs['trunk/origin'] = 'svn@1' 49 fs['trunk/origin'] = 'svn@1'
45 fs['trunk/codereview.settings'] = ( 50 fs['trunk/codereview.settings'] = (
46 '# Test data\n' 51 '# Test data\n'
47 'bar: pouet\n') 52 'bar: pouet\n')
48 fs['trunk/chrome/file.cc'] = ( 53 fs['trunk/chrome/file.cc'] = (
49 'a\n' 54 'a\n'
50 'bb\n' 55 'bb\n'
51 'ccc\n' 56 'ccc\n'
52 'dd\n' 57 'dd\n'
53 'e\n' 58 'e\n'
54 'ff\n' 59 'ff\n'
55 'ggg\n' 60 'ggg\n'
56 'hh\n' 61 'hh\n'
57 'i\n' 62 'i\n'
58 'jj\n' 63 'jj\n'
59 'kkk\n' 64 'kkk\n'
60 'll\n' 65 'll\n'
61 'm\n' 66 'm\n'
62 'nn\n' 67 'nn\n'
63 'ooo\n' 68 'ooo\n'
64 'pp\n' 69 'pp\n'
65 'q\n') 70 'q\n')
66 self._commit_svn(fs) 71 return fs
72
73 @classmethod
74 def _tree_2(cls):
75 fs = cls._tree_1()
67 fs['trunk/origin'] = 'svn@2\n' 76 fs['trunk/origin'] = 'svn@2\n'
68 fs['trunk/extra'] = 'dummy\n' 77 fs['trunk/extra'] = 'dummy\n'
69 fs['trunk/bin_file'] = '\x00' 78 fs['trunk/bin_file'] = '\x00'
70 self._commit_svn(fs) 79 fs['trunk/chromeos/views/DOMui_menu_widget.h'] = (
80 '// Copyright (c) 2010\n'
81 '// Use of this source code\n'
82 '// found in the LICENSE file.\n'
83 '\n'
84 '#ifndef DOM\n'
85 '#define DOM\n'
86 '#pragma once\n'
87 '\n'
88 '#include <string>\n'
89 '#endif\n')
90 return fs
71 91
72 def populateGit(self): 92 def populateGit(self):
73 raise NotImplementedError() 93 raise NotImplementedError()
74 94
75 95
76 # pylint: disable=R0201 96 # pylint: disable=R0201
77 class BaseTest(fake_repos.FakeReposTestBase): 97 class BaseTest(fake_repos.FakeReposTestBase):
78 name = 'foo' 98 name = 'foo'
79 FAKE_REPOS_CLASS = FakeRepos 99 FAKE_REPOS_CLASS = FakeRepos
80 is_read_only = False 100 is_read_only = False
(...skipping 12 matching lines...) Expand all
93 subprocess2.call = redirect_call 113 subprocess2.call = redirect_call
94 self.usr, self.pwd = self.FAKE_REPOS.USERS[0] 114 self.usr, self.pwd = self.FAKE_REPOS.USERS[0]
95 self.previous_log = None 115 self.previous_log = None
96 116
97 def tearDown(self): 117 def tearDown(self):
98 subprocess2.call = self._old_call 118 subprocess2.call = self._old_call
99 super(BaseTest, self).tearDown() 119 super(BaseTest, self).tearDown()
100 120
101 def get_patches(self): 121 def get_patches(self):
102 return patch.PatchSet([ 122 return patch.PatchSet([
123 patch.FilePatchDiff('new_dir/subdir/new_file', GIT.NEW_SUBDIR, []),
124 patch.FilePatchDiff('chrome/file.cc', GIT.PATCH, []),
103 # TODO(maruel): Test with is_new == False. 125 # TODO(maruel): Test with is_new == False.
104 patch.FilePatchBinary('bin_file', '\x00', [], is_new=True), 126 patch.FilePatchBinary('bin_file', '\x00', [], is_new=True),
105 patch.FilePatchDiff(
106 'chrome/file.cc', GIT.PATCH, []),
107 patch.FilePatchDiff('new_dir/subdir/new_file', GIT.NEW_SUBDIR, []),
108 patch.FilePatchDelete('extra', False), 127 patch.FilePatchDelete('extra', False),
109 ]) 128 ])
110 129
111 def get_trunk(self, modified): 130 def get_trunk(self, modified):
112 tree = {} 131 tree = {}
113 subroot = 'trunk/' 132 subroot = 'trunk/'
114 for k, v in self.FAKE_REPOS.svn_revs[-1].iteritems(): 133 for k, v in self.FAKE_REPOS.svn_revs[-1].iteritems():
115 if k.startswith(subroot): 134 if k.startswith(subroot):
116 f = k[len(subroot):] 135 f = k[len(subroot):]
117 assert f not in tree 136 assert f not in tree
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 co.prepare(None) 213 co.prepare(None)
195 ps = self.get_patches() 214 ps = self.get_patches()
196 results = [] 215 results = []
197 co.apply_patch(ps) 216 co.apply_patch(ps)
198 expected_co = getattr(co, 'checkout', co) 217 expected_co = getattr(co, 'checkout', co)
199 # Because of ReadOnlyCheckout. 218 # Because of ReadOnlyCheckout.
200 expected = [(expected_co, p) for p in ps.patches] 219 expected = [(expected_co, p) for p in ps.patches]
201 self.assertEquals(len(expected), len(results)) 220 self.assertEquals(len(expected), len(results))
202 self.assertEquals(expected, results) 221 self.assertEquals(expected, results)
203 222
223 def _check_move(self, co):
224 """Makes sure file moves are handled correctly."""
225 co.prepare(None)
226 patchset = patch.PatchSet([
227 patch.FilePatchDelete('chromeos/views/DOMui_menu_widget.h', False),
228 patch.FilePatchDiff(
229 'chromeos/views/webui_menu_widget.h', GIT.RENAME_PARTIAL, []),
230 ])
231 co.apply_patch(patchset)
232 # Make sure chromeos/views/DOMui_menu_widget.h is deleted and
233 # chromeos/views/webui_menu_widget.h is correctly created.
234 root = os.path.join(self.root_dir, self.name)
235 tree = self.get_trunk(False)
236 del tree['chromeos/views/DOMui_menu_widget.h']
237 tree['chromeos/views/webui_menu_widget.h'] = (
238 '// Copyright (c) 2011\n'
239 '// Use of this source code\n'
240 '// found in the LICENSE file.\n'
241 '\n'
242 '#ifndef WEB\n'
243 '#define WEB\n'
244 '#pragma once\n'
245 '\n'
246 '#include <string>\n'
247 '#endif\n')
248 #print patchset[0].get()
249 #print fake_repos.read_tree(root)
250 self.assertTree(tree, root)
251
204 252
205 class SvnBaseTest(BaseTest): 253 class SvnBaseTest(BaseTest):
206 def setUp(self): 254 def setUp(self):
207 super(SvnBaseTest, self).setUp() 255 super(SvnBaseTest, self).setUp()
208 self.enabled = self.FAKE_REPOS.set_up_svn() 256 self.enabled = self.FAKE_REPOS.set_up_svn()
209 self.assertTrue(self.enabled) 257 self.assertTrue(self.enabled)
210 self.svn_trunk = 'trunk' 258 self.svn_trunk = 'trunk'
211 self.svn_url = self.svn_base + self.svn_trunk 259 self.svn_url = self.svn_base + self.svn_trunk
212 self.previous_log = self._log() 260 self.previous_log = self._log()
213 261
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 ['svn', 'pget', 'svn:eol-style', 'chrome/file.cc'], 390 ['svn', 'pget', 'svn:eol-style', 'chrome/file.cc'],
343 cwd=co.project_path) 391 cwd=co.project_path)
344 self.assertEquals('LF\n', out) 392 self.assertEquals('LF\n', out)
345 393
346 def testProcess(self): 394 def testProcess(self):
347 self._test_process(self._get_co) 395 self._test_process(self._get_co)
348 396
349 def testPrepare(self): 397 def testPrepare(self):
350 self._test_prepare(self._get_co(None)) 398 self._test_prepare(self._get_co(None))
351 399
400 def testMove(self):
401 self._check_move(self._get_co(None))
402
352 403
353 class GitSvnCheckout(SvnBaseTest): 404 class GitSvnCheckout(SvnBaseTest):
354 name = 'foo.git' 405 name = 'foo.git'
355 406
356 def _get_co(self, post_processors): 407 def _get_co(self, post_processors):
357 self.assertNotEqual(False, post_processors) 408 self.assertNotEqual(False, post_processors)
358 return checkout.GitSvnCheckout( 409 return checkout.GitSvnCheckout(
359 self.root_dir, self.name[:-4], 410 self.root_dir, self.name[:-4],
360 self.usr, self.pwd, 411 self.usr, self.pwd,
361 self.svn_base, self.svn_trunk, post_processors) 412 self.svn_base, self.svn_trunk, post_processors)
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 # TODO(maruel): Cheat here until prepare(revision != None) implemented. 463 # TODO(maruel): Cheat here until prepare(revision != None) implemented.
413 co.old_prepare = co.prepare 464 co.old_prepare = co.prepare
414 def prepare(rev): 465 def prepare(rev):
415 # Basically, test that it is broken. 466 # Basically, test that it is broken.
416 self.assertEquals(1, rev) 467 self.assertEquals(1, rev)
417 self.assertEquals(2, co.old_prepare(None)) 468 self.assertEquals(2, co.old_prepare(None))
418 return 1 469 return 1
419 co.prepare = prepare 470 co.prepare = prepare
420 self._test_prepare(co) 471 self._test_prepare(co)
421 472
473 def testMove(self):
474 self._check_move(self._get_co(None))
475
422 476
423 class RawCheckout(SvnBaseTest): 477 class RawCheckout(SvnBaseTest):
424 def setUp(self): 478 def setUp(self):
425 super(RawCheckout, self).setUp() 479 super(RawCheckout, self).setUp()
426 # Use a svn checkout as the base. 480 # Use a svn checkout as the base.
427 self.base_co = checkout.SvnCheckout( 481 self.base_co = checkout.SvnCheckout(
428 self.root_dir, self.name, None, None, self.svn_url) 482 self.root_dir, self.name, None, None, self.svn_url)
429 self.base_co.prepare(None) 483 self.base_co.prepare(None)
430 484
431 def _get_co(self, post_processors): 485 def _get_co(self, post_processors):
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 # RawCheckout doesn't support prepare() but emulate it. 529 # RawCheckout doesn't support prepare() but emulate it.
476 co = self._get_co(None) 530 co = self._get_co(None)
477 revs = [1] 531 revs = [1]
478 def prepare(asked): 532 def prepare(asked):
479 self.assertEquals(1, asked) 533 self.assertEquals(1, asked)
480 return revs.pop(0) 534 return revs.pop(0)
481 co.prepare = prepare 535 co.prepare = prepare
482 self._test_prepare(co) 536 self._test_prepare(co)
483 self.assertEquals([], revs) 537 self.assertEquals([], revs)
484 538
539 def testMove(self):
540 self._check_move(self._get_co(None))
541
485 542
486 class ReadOnlyCheckout(SvnBaseTest): 543 class ReadOnlyCheckout(SvnBaseTest):
487 # Use SvnCheckout as the backed since it support read-only checkouts too. 544 # Use SvnCheckout as the backed since it support read-only checkouts too.
488 is_read_only = True 545 is_read_only = True
489 546
490 def _get_co(self, post_processors): 547 def _get_co(self, post_processors):
491 self.assertNotEqual(False, post_processors) 548 self.assertNotEqual(False, post_processors)
492 return checkout.ReadOnlyCheckout( 549 return checkout.ReadOnlyCheckout(
493 checkout.SvnCheckout( 550 checkout.SvnCheckout(
494 self.root_dir, self.name, None, None, self.svn_url, None), 551 self.root_dir, self.name, None, None, self.svn_url, None),
(...skipping 11 matching lines...) Expand all
506 'Hunk #1 FAILED at 3.\n' 563 'Hunk #1 FAILED at 3.\n'
507 '1 out of 1 hunk FAILED -- saving rejects to file ' 564 '1 out of 1 hunk FAILED -- saving rejects to file '
508 'chrome/file.cc.rej\n') 565 'chrome/file.cc.rej\n')
509 566
510 def testProcess(self): 567 def testProcess(self):
511 self._test_process(self._get_co) 568 self._test_process(self._get_co)
512 569
513 def testPrepare(self): 570 def testPrepare(self):
514 self._test_prepare(self._get_co(None)) 571 self._test_prepare(self._get_co(None))
515 572
573 def testMove(self):
574 self._check_move(self._get_co(None))
575
516 576
517 if __name__ == '__main__': 577 if __name__ == '__main__':
518 if '-v' in sys.argv: 578 if '-v' in sys.argv:
519 DEBUGGING = True 579 DEBUGGING = True
520 logging.basicConfig( 580 logging.basicConfig(
521 level=logging.DEBUG, 581 level=logging.DEBUG,
522 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') 582 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s')
523 else: 583 else:
524 logging.basicConfig( 584 logging.basicConfig(
525 level=logging.ERROR, 585 level=logging.ERROR,
526 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') 586 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s')
527 unittest.main() 587 unittest.main()
OLDNEW
« no previous file with comments | « patch.py ('k') | tests/patch_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698