| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 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 """Smoke tests for gclient.py. | 6 """Smoke tests for gclient.py. |
| 7 | 7 |
| 8 Shell out 'gclient' and run basic conformance tests. | 8 Shell out 'gclient' and run basic conformance tests. |
| 9 | 9 |
| 10 This test assumes GClientSmokeBase.URL_BASE is valid. | 10 This test assumes GClientSmokeBase.URL_BASE is valid. |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 class GClientSmokeSVN(GClientSmokeBase): | 197 class GClientSmokeSVN(GClientSmokeBase): |
| 198 def setUp(self): | 198 def setUp(self): |
| 199 GClientSmokeBase.setUp(self) | 199 GClientSmokeBase.setUp(self) |
| 200 self.FAKE_REPOS.setUpSVN() | 200 self.FAKE_REPOS.setUpSVN() |
| 201 | 201 |
| 202 def testSync(self): | 202 def testSync(self): |
| 203 # TODO(maruel): safesync. | 203 # TODO(maruel): safesync. |
| 204 self.gclient(['config', self.svn_base + 'trunk/src/']) | 204 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 205 # Test unversioned checkout. | 205 # Test unversioned checkout. |
| 206 self.parseGclient(['sync', '--deps', 'mac'], | 206 self.parseGclient(['sync', '--deps', 'mac'], |
| 207 ['running', 'running', 'running', 'running']) | 207 ['running', 'running', |
| 208 # This is due to the way svn update is called for a |
| 209 # single file when File() is used in a DEPS file. |
| 210 ('running', self.root_dir + '/src/file/foo'), |
| 211 'running', 'running', 'running', 'running']) |
| 208 tree = self.mangle_svn_tree( | 212 tree = self.mangle_svn_tree( |
| 209 ('trunk/src@2', 'src'), | 213 ('trunk/src@2', 'src'), |
| 210 ('trunk/third_party/foo@1', 'src/third_party/foo'), | 214 ('trunk/third_party/foo@1', 'src/third_party/foo'), |
| 211 ('trunk/other@2', 'src/other')) | 215 ('trunk/other@2', 'src/other')) |
| 216 tree['src/file/foo/origin'] = 'svn/trunk/third_party/foo@2\n' |
| 212 tree['src/svn_hooked1'] = 'svn_hooked1' | 217 tree['src/svn_hooked1'] = 'svn_hooked1' |
| 213 self.assertTree(tree) | 218 self.assertTree(tree) |
| 214 | 219 |
| 215 # Manually remove svn_hooked1 before synching to make sure it's not | 220 # Manually remove svn_hooked1 before synching to make sure it's not |
| 216 # recreated. | 221 # recreated. |
| 217 os.remove(join(self.root_dir, 'src', 'svn_hooked1')) | 222 os.remove(join(self.root_dir, 'src', 'svn_hooked1')) |
| 218 | 223 |
| 219 # Test incremental versioned sync: sync backward. | 224 # Test incremental versioned sync: sync backward. |
| 220 self.parseGclient(['sync', '--revision', 'src@1', '--deps', 'mac', | 225 self.parseGclient(['sync', '--revision', 'src@1', '--deps', 'mac', |
| 221 '--delete_unversioned_trees'], | 226 '--delete_unversioned_trees'], |
| 222 ['running', 'running', 'running', 'running', 'deleting']) | 227 ['running', 'running', 'running', 'running', 'deleting']) |
| 223 tree = self.mangle_svn_tree( | 228 tree = self.mangle_svn_tree( |
| 224 ('trunk/src@1', 'src'), | 229 ('trunk/src@1', 'src'), |
| 225 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | 230 ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
| 226 ('trunk/other@1', 'src/other'), | 231 ('trunk/other@1', 'src/other'), |
| 227 ('trunk/third_party/foo@2', 'src/third_party/prout')) | 232 ('trunk/third_party/foo@2', 'src/third_party/prout')) |
| 233 tree['src/file/foo/origin'] = 'svn/trunk/third_party/foo@2\n' |
| 228 self.assertTree(tree) | 234 self.assertTree(tree) |
| 229 # Test incremental sync: delete-unversioned_trees isn't there. | 235 # Test incremental sync: delete-unversioned_trees isn't there. |
| 230 self.parseGclient(['sync', '--deps', 'mac'], | 236 self.parseGclient(['sync', '--deps', 'mac'], |
| 231 ['running', 'running', 'running', 'running']) | 237 ['running', 'running', 'running', 'running', 'running']) |
| 232 tree = self.mangle_svn_tree( | 238 tree = self.mangle_svn_tree( |
| 233 ('trunk/src@2', 'src'), | 239 ('trunk/src@2', 'src'), |
| 234 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | 240 ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
| 235 ('trunk/third_party/foo@1', 'src/third_party/foo'), | 241 ('trunk/third_party/foo@1', 'src/third_party/foo'), |
| 236 ('trunk/other@2', 'src/other'), | 242 ('trunk/other@2', 'src/other'), |
| 237 ('trunk/third_party/foo@2', 'src/third_party/prout')) | 243 ('trunk/third_party/foo@2', 'src/third_party/prout')) |
| 244 tree['src/file/foo/origin'] = 'svn/trunk/third_party/foo@2\n' |
| 238 tree['src/svn_hooked1'] = 'svn_hooked1' | 245 tree['src/svn_hooked1'] = 'svn_hooked1' |
| 239 self.assertTree(tree) | 246 self.assertTree(tree) |
| 240 | 247 |
| 241 def testSyncIgnoredSolutionName(self): | 248 def testSyncIgnoredSolutionName(self): |
| 242 """TODO(maruel): This will become an error soon.""" | 249 """TODO(maruel): This will become an error soon.""" |
| 243 self.gclient(['config', self.svn_base + 'trunk/src/']) | 250 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 244 results = self.gclient(['sync', '--deps', 'mac', '-r', 'invalid@1']) | 251 results = self.gclient(['sync', '--deps', 'mac', '-r', 'invalid@1']) |
| 245 self.checkBlock(results[0], ['running', 'running', 'running', 'running']) | 252 self.checkBlock(results[0], [ |
| 253 'running', 'running', |
| 254 # This is due to the way svn update is called for a single file when |
| 255 # File() is used in a DEPS file. |
| 256 ('running', self.root_dir + '/src/file/foo'), |
| 257 'running', 'running', 'running', 'running']) |
| 246 self.checkString('Please fix your script, having invalid --revision flags ' | 258 self.checkString('Please fix your script, having invalid --revision flags ' |
| 247 'will soon considered an error.\n', results[1]) | 259 'will soon considered an error.\n', results[1]) |
| 248 self.assertEquals(0, results[2]) | 260 self.assertEquals(0, results[2]) |
| 249 tree = self.mangle_svn_tree( | 261 tree = self.mangle_svn_tree( |
| 250 ('trunk/src@2', 'src'), | 262 ('trunk/src@2', 'src'), |
| 251 ('trunk/third_party/foo@1', 'src/third_party/foo'), | 263 ('trunk/third_party/foo@1', 'src/third_party/foo'), |
| 252 ('trunk/other@2', 'src/other')) | 264 ('trunk/other@2', 'src/other')) |
| 265 tree['src/file/foo/origin'] = 'svn/trunk/third_party/foo@2\n' |
| 253 tree['src/svn_hooked1'] = 'svn_hooked1' | 266 tree['src/svn_hooked1'] = 'svn_hooked1' |
| 254 self.assertTree(tree) | 267 self.assertTree(tree) |
| 255 | 268 |
| 256 def testSyncNoSolutionName(self): | 269 def testSyncNoSolutionName(self): |
| 257 # When no solution name is provided, gclient uses the first solution listed. | 270 # When no solution name is provided, gclient uses the first solution listed. |
| 258 self.gclient(['config', self.svn_base + 'trunk/src/']) | 271 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 259 self.parseGclient(['sync', '--deps', 'mac', '-r', '1'], | 272 self.parseGclient(['sync', '--deps', 'mac', '-r', '1'], |
| 260 ['running', 'running', 'running', 'running']) | 273 ['running', 'running', 'running', 'running']) |
| 261 tree = self.mangle_svn_tree( | 274 tree = self.mangle_svn_tree( |
| 262 ('trunk/src@1', 'src'), | 275 ('trunk/src@1', 'src'), |
| 263 ('trunk/third_party/foo@2', 'src/third_party/fpp'), | 276 ('trunk/third_party/foo@2', 'src/third_party/fpp'), |
| 264 ('trunk/other@1', 'src/other'), | 277 ('trunk/other@1', 'src/other'), |
| 265 ('trunk/third_party/foo@2', 'src/third_party/prout')) | 278 ('trunk/third_party/foo@2', 'src/third_party/prout')) |
| 266 self.assertTree(tree) | 279 self.assertTree(tree) |
| 267 | 280 |
| 268 def testRevertAndStatus(self): | 281 def testRevertAndStatus(self): |
| 269 self.gclient(['config', self.svn_base + 'trunk/src/']) | 282 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 270 # Tested in testSync. | 283 # Tested in testSync. |
| 271 self.gclient(['sync', '--deps', 'mac']) | 284 self.gclient(['sync', '--deps', 'mac']) |
| 272 write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') | 285 write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') |
| 273 | 286 |
| 274 out = self.parseGclient(['status', '--deps', 'mac'], | 287 out = self.parseGclient(['status', '--deps', 'mac'], |
| 275 [['running', join(self.root_dir, 'src')], | 288 [['running', join(self.root_dir, 'src')], |
| 276 ['running', join(self.root_dir, 'src', 'other')]]) | 289 ['running', join(self.root_dir, 'src', 'other')]]) |
| 277 out = self.svnBlockCleanup(out) | 290 out = self.svnBlockCleanup(out) |
| 278 self.checkString('other', out[0][1]) | 291 self.checkString('file', out[0][1]) |
| 279 self.checkString('svn_hooked1', out[0][2]) | 292 self.checkString('other', out[0][2]) |
| 280 self.checkString(join('third_party', 'foo'), out[0][3]) | 293 self.checkString('svn_hooked1', out[0][3]) |
| 294 self.checkString(join('third_party', 'foo'), out[0][4]) |
| 281 self.checkString('hi', out[1][1]) | 295 self.checkString('hi', out[1][1]) |
| 282 self.assertEquals(4, len(out[0])) | 296 self.assertEquals(5, len(out[0])) |
| 283 self.assertEquals(2, len(out[1])) | 297 self.assertEquals(2, len(out[1])) |
| 284 | 298 |
| 285 # Revert implies --force implies running hooks without looking at pattern | 299 # Revert implies --force implies running hooks without looking at pattern |
| 286 # matching. | 300 # matching. |
| 287 results = self.gclient(['revert', '--deps', 'mac']) | 301 results = self.gclient(['revert', '--deps', 'mac']) |
| 288 out = self.splitBlock(results[0]) | 302 out = self.splitBlock(results[0]) |
| 289 # src, src/other is missing, src/other, src/third_party/foo is missing, | 303 # src, src/other is missing, src/other, src/third_party/foo is missing, |
| 290 # src/third_party/foo, 2 svn hooks. | 304 # src/third_party/foo, 2 svn hooks, 3 related to File(). |
| 291 self.assertEquals(7, len(out)) | 305 self.assertEquals(10, len(out)) |
| 292 self.checkString('', results[1]) | 306 self.checkString('', results[1]) |
| 293 self.assertEquals(0, results[2]) | 307 self.assertEquals(0, results[2]) |
| 294 tree = self.mangle_svn_tree( | 308 tree = self.mangle_svn_tree( |
| 295 ('trunk/src@2', 'src'), | 309 ('trunk/src@2', 'src'), |
| 296 ('trunk/third_party/foo@1', 'src/third_party/foo'), | 310 ('trunk/third_party/foo@1', 'src/third_party/foo'), |
| 297 ('trunk/other@2', 'src/other')) | 311 ('trunk/other@2', 'src/other')) |
| 312 tree['src/file/foo/origin'] = 'svn/trunk/third_party/foo@2\n' |
| 298 tree['src/svn_hooked1'] = 'svn_hooked1' | 313 tree['src/svn_hooked1'] = 'svn_hooked1' |
| 299 tree['src/svn_hooked2'] = 'svn_hooked2' | 314 tree['src/svn_hooked2'] = 'svn_hooked2' |
| 300 self.assertTree(tree) | 315 self.assertTree(tree) |
| 301 | 316 |
| 302 out = self.parseGclient(['status', '--deps', 'mac'], | 317 out = self.parseGclient(['status', '--deps', 'mac'], |
| 303 [['running', join(self.root_dir, 'src')]]) | 318 [['running', join(self.root_dir, 'src')]]) |
| 304 out = self.svnBlockCleanup(out) | 319 out = self.svnBlockCleanup(out) |
| 305 self.checkString('other', out[0][1]) | 320 self.checkString('file', out[0][1]) |
| 306 self.checkString('svn_hooked1', out[0][2]) | 321 self.checkString('other', out[0][2]) |
| 307 self.checkString('svn_hooked2', out[0][3]) | 322 self.checkString('svn_hooked1', out[0][3]) |
| 308 self.checkString(join('third_party', 'foo'), out[0][4]) | 323 self.checkString('svn_hooked2', out[0][4]) |
| 309 self.assertEquals(5, len(out[0])) | 324 self.checkString(join('third_party', 'foo'), out[0][5]) |
| 325 self.assertEquals(6, len(out[0])) |
| 326 self.assertEquals(1, len(out)) |
| 310 | 327 |
| 311 def testRevertAndStatusDepsOs(self): | 328 def testRevertAndStatusDepsOs(self): |
| 312 self.gclient(['config', self.svn_base + 'trunk/src/']) | 329 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 313 # Tested in testSync. | 330 # Tested in testSync. |
| 314 self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) | 331 self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) |
| 315 write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') | 332 write(join(self.root_dir, 'src', 'other', 'hi'), 'Hey!') |
| 316 | 333 |
| 317 # Without --verbose, gclient won't output the directories without | 334 # Without --verbose, gclient won't output the directories without |
| 318 # modification. | 335 # modification. |
| 319 out = self.parseGclient(['status', '--deps', 'mac'], | 336 out = self.parseGclient(['status', '--deps', 'mac'], |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 return | 602 return |
| 586 self.gclient(['config', '--spec', | 603 self.gclient(['config', '--spec', |
| 587 'solutions=[' | 604 'solutions=[' |
| 588 '{"name": "src",' | 605 '{"name": "src",' |
| 589 ' "url": "' + self.svn_base + 'trunk/src/"},' | 606 ' "url": "' + self.svn_base + 'trunk/src/"},' |
| 590 '{"name": "src-git",' | 607 '{"name": "src-git",' |
| 591 '"url": "' + self.git_base + 'repo_1"}]']) | 608 '"url": "' + self.git_base + 'repo_1"}]']) |
| 592 results = self.gclient(['sync', '--deps', 'mac']) | 609 results = self.gclient(['sync', '--deps', 'mac']) |
| 593 # 3x svn checkout, 3x run hooks | 610 # 3x svn checkout, 3x run hooks |
| 594 self.checkBlock(results[0], | 611 self.checkBlock(results[0], |
| 595 ['running', 'running', 'running', 'running', 'running', | 612 ['running', 'running', |
| 613 # This is due to the way svn update is called for a single |
| 614 # file when File() is used in a DEPS file. |
| 615 ('running', self.root_dir + '/src/file/foo'), |
| 616 'running', 'running', 'running', 'running', 'running', |
| 596 'running', 'running']) | 617 'running', 'running']) |
| 597 # TODO(maruel): Something's wrong here. git outputs to stderr 'Switched to | 618 # TODO(maruel): Something's wrong here. git outputs to stderr 'Switched to |
| 598 # new branch \'hash\''. | 619 # new branch \'hash\''. |
| 599 #self.checkString('', results[1]) | 620 #self.checkString('', results[1]) |
| 600 self.assertEquals(0, results[2]) | 621 self.assertEquals(0, results[2]) |
| 601 tree = self.mangle_git_tree(('repo_1@2', 'src-git'), | 622 tree = self.mangle_git_tree(('repo_1@2', 'src-git'), |
| 602 ('repo_2@1', 'src/repo2'), | 623 ('repo_2@1', 'src/repo2'), |
| 603 ('repo_3@2', 'src/repo2/repo_renamed')) | 624 ('repo_3@2', 'src/repo2/repo_renamed')) |
| 604 tree.update(self.mangle_svn_tree( | 625 tree.update(self.mangle_svn_tree( |
| 605 ('trunk/src@2', 'src'), | 626 ('trunk/src@2', 'src'), |
| 606 ('trunk/third_party/foo@1', 'src/third_party/foo'), | 627 ('trunk/third_party/foo@1', 'src/third_party/foo'), |
| 607 ('trunk/other@2', 'src/other'))) | 628 ('trunk/other@2', 'src/other'))) |
| 629 tree['src/file/foo/origin'] = 'svn/trunk/third_party/foo@2\n' |
| 608 tree['src/git_hooked1'] = 'git_hooked1' | 630 tree['src/git_hooked1'] = 'git_hooked1' |
| 609 tree['src/git_hooked2'] = 'git_hooked2' | 631 tree['src/git_hooked2'] = 'git_hooked2' |
| 610 tree['src/svn_hooked1'] = 'svn_hooked1' | 632 tree['src/svn_hooked1'] = 'svn_hooked1' |
| 611 tree['src/svn_hooked2'] = 'svn_hooked2' | 633 tree['src/svn_hooked2'] = 'svn_hooked2' |
| 612 self.assertTree(tree) | 634 self.assertTree(tree) |
| 613 | 635 |
| 614 def testMultiSolutionsMultiRev(self): | 636 def testMultiSolutionsMultiRev(self): |
| 615 if not self.enabled: | 637 if not self.enabled: |
| 616 return | 638 return |
| 617 self.gclient(['config', '--spec', | 639 self.gclient(['config', '--spec', |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 return | 690 return |
| 669 self.gclient(['config', '--spec', | 691 self.gclient(['config', '--spec', |
| 670 'solutions=[' | 692 'solutions=[' |
| 671 '{"name": "src",' | 693 '{"name": "src",' |
| 672 ' "url": "' + self.svn_base + 'trunk/src/"},' | 694 ' "url": "' + self.svn_base + 'trunk/src/"},' |
| 673 '{"name": "src-git",' | 695 '{"name": "src-git",' |
| 674 '"url": "' + self.git_base + 'repo_1"}]']) | 696 '"url": "' + self.git_base + 'repo_1"}]']) |
| 675 self.gclient(['sync', '--deps', 'mac']) | 697 self.gclient(['sync', '--deps', 'mac']) |
| 676 results = self.gclient(['recurse', 'sh', '-c', | 698 results = self.gclient(['recurse', 'sh', '-c', |
| 677 'echo $GCLIENT_SCM,$GCLIENT_URL,`pwd`']) | 699 'echo $GCLIENT_SCM,$GCLIENT_URL,`pwd`']) |
| 678 | 700 |
| 679 entries = [tuple(line.split(',')) | 701 entries = [tuple(line.split(',')) |
| 680 for line in results[0].strip().split('\n')] | 702 for line in results[0].strip().split('\n')] |
| 681 logging.debug(entries) | 703 logging.debug(entries) |
| 682 | 704 |
| 683 bases = {'svn': self.svn_base, 'git': self.git_base} | 705 bases = {'svn': self.svn_base, 'git': self.git_base} |
| 684 expected_source = [ | 706 expected_source = [ |
| 685 ('svn', 'trunk/src/', 'src'), | 707 ('svn', 'trunk/src/', 'src'), |
| 686 ('git', 'repo_1', 'src-git'), | 708 ('git', 'repo_1', 'src-git'), |
| 687 ('svn', 'trunk/other', 'src/other'), | 709 ('svn', 'trunk/other', 'src/other'), |
| 688 ('git', 'repo_2@' + self.githash('repo_2', 1)[:7], 'src/repo2'), | 710 ('git', 'repo_2@' + self.githash('repo_2', 1)[:7], 'src/repo2'), |
| 689 ('git', 'repo_3', 'src/repo2/repo_renamed'), | 711 ('git', 'repo_3', 'src/repo2/repo_renamed'), |
| 690 ('svn', 'trunk/third_party/foo@1', 'src/third_party/foo'), | 712 ('svn', 'trunk/third_party/foo@1', 'src/third_party/foo'), |
| 691 ] | 713 ] |
| 692 expected = [(scm, bases[scm] + url, os.path.join(self.root_dir, path)) | 714 expected = [(scm, bases[scm] + url, os.path.join(self.root_dir, path)) |
| 693 for (scm, url, path) in expected_source] | 715 for (scm, url, path) in expected_source] |
| 694 | 716 |
| 695 self.assertEquals(sorted(entries), sorted(expected)) | 717 self.assertEquals(sorted(entries), sorted(expected)) |
| 696 | 718 |
| 697 | 719 |
| 698 if __name__ == '__main__': | 720 if __name__ == '__main__': |
| 699 if '-c' in sys.argv: | 721 if '-c' in sys.argv: |
| 700 COVERAGE = True | 722 COVERAGE = True |
| 701 sys.argv.remove('-c') | 723 sys.argv.remove('-c') |
| 702 if os.path.exists('.coverage'): | 724 if os.path.exists('.coverage'): |
| 703 os.remove('.coverage') | 725 os.remove('.coverage') |
| 704 os.environ['COVERAGE_FILE'] = os.path.join( | 726 os.environ['COVERAGE_FILE'] = os.path.join( |
| 705 os.path.dirname(os.path.dirname(os.path.abspath(__file__))), | 727 os.path.dirname(os.path.dirname(os.path.abspath(__file__))), |
| 706 '.coverage') | 728 '.coverage') |
| 707 unittest.main() | 729 unittest.main() |
| OLD | NEW |