| OLD | NEW |
| 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 scm.py.""" | 6 """Unit tests for scm.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 30 matching lines...) Expand all Loading... |
| 41 self.mox.StubOutWithMock(scm.gclient_utils, 'CheckCallAndFilter') | 41 self.mox.StubOutWithMock(scm.gclient_utils, 'CheckCallAndFilter') |
| 42 self.mox.StubOutWithMock(scm.gclient_utils, 'CheckCallAndFilterAndHeader') | 42 self.mox.StubOutWithMock(scm.gclient_utils, 'CheckCallAndFilterAndHeader') |
| 43 self.mox.StubOutWithMock(subprocess2, 'Popen') | 43 self.mox.StubOutWithMock(subprocess2, 'Popen') |
| 44 self.mox.StubOutWithMock(subprocess2, 'communicate') | 44 self.mox.StubOutWithMock(subprocess2, 'communicate') |
| 45 | 45 |
| 46 | 46 |
| 47 class RootTestCase(BaseSCMTestCase): | 47 class RootTestCase(BaseSCMTestCase): |
| 48 def testMembersChanged(self): | 48 def testMembersChanged(self): |
| 49 self.mox.ReplayAll() | 49 self.mox.ReplayAll() |
| 50 members = [ | 50 members = [ |
| 51 'ElementTree', 'GetCasedPath', 'GenFakeDiff', 'GIT', 'SVN', | 51 'cStringIO', |
| 52 'determine_scm', |
| 53 'ElementTree', |
| 54 'gclient_utils', |
| 55 'GenFakeDiff', |
| 56 'GetCasedPath', |
| 57 'GIT', |
| 58 'glob', |
| 59 'logging', |
| 60 'only_int', |
| 61 'os', |
| 62 're', |
| 63 'subprocess2', |
| 64 'SVN', |
| 65 'sys', |
| 66 'tempfile', |
| 67 'time', |
| 52 'ValidateEmail', | 68 'ValidateEmail', |
| 53 'cStringIO', 'determine_scm', 'gclient_utils', 'glob', 'logging', | |
| 54 'only_int', 'os', 're', 'subprocess2', 'sys', 'tempfile', 'time', | |
| 55 ] | 69 ] |
| 56 # If this test fails, you should add the relevant test. | 70 # If this test fails, you should add the relevant test. |
| 57 self.compareMembers(scm, members) | 71 self.compareMembers(scm, members) |
| 58 | 72 |
| 59 | 73 |
| 60 class GitWrapperTestCase(BaseSCMTestCase): | 74 class GitWrapperTestCase(BaseSCMTestCase): |
| 61 def testMembersChanged(self): | 75 def testMembersChanged(self): |
| 62 members = [ | 76 members = [ |
| 63 'AssertVersion', 'Capture', 'CaptureStatus', | 77 'AssertVersion', |
| 78 'Capture', |
| 79 'CaptureStatus', |
| 80 'current_version', |
| 64 'FetchUpstreamTuple', | 81 'FetchUpstreamTuple', |
| 65 'GenerateDiff', 'GetBranch', 'GetBranchRef', 'GetCheckoutRoot', | 82 'GenerateDiff', |
| 66 'GetDifferentFiles', 'GetEmail', 'GetPatchName', 'GetSVNBranch', | 83 'GetBranch', |
| 67 'GetUpstreamBranch', 'IsGitSvn', 'MatchSvnGlob', 'ShortBranchName', | 84 'GetBranchRef', |
| 68 'current_version', | 85 'GetCheckoutRoot', |
| 86 'GetDifferentFiles', |
| 87 'GetEmail', |
| 88 'GetGitSvnHeadRev', |
| 89 'GetPatchName', |
| 90 'GetSha1ForSvnRev', |
| 91 'GetSVNBranch', |
| 92 'GetUpstreamBranch', |
| 93 'IsGitSvn', |
| 94 'IsValidRevision', |
| 95 'MatchSvnGlob', |
| 96 'ShortBranchName', |
| 69 ] | 97 ] |
| 70 # If this test fails, you should add the relevant test. | 98 # If this test fails, you should add the relevant test. |
| 71 self.compareMembers(scm.GIT, members) | 99 self.compareMembers(scm.GIT, members) |
| 72 | 100 |
| 73 def testGetEmail(self): | 101 def testGetEmail(self): |
| 74 self.mox.StubOutWithMock(scm.GIT, 'Capture') | 102 self.mox.StubOutWithMock(scm.GIT, 'Capture') |
| 75 scm.GIT.Capture(['config', 'user.email'], cwd=self.root_dir | 103 scm.GIT.Capture(['config', 'user.email'], cwd=self.root_dir |
| 76 ).AndReturn('mini@me.com') | 104 ).AndReturn('mini@me.com') |
| 77 self.mox.ReplayAll() | 105 self.mox.ReplayAll() |
| 78 self.assertEqual(scm.GIT.GetEmail(self.root_dir), 'mini@me.com') | 106 self.assertEqual(scm.GIT.GetEmail(self.root_dir), 'mini@me.com') |
| 79 | 107 |
| 80 def testMatchSvnGlob(self): | 108 def testMatchSvnGlob(self): |
| 81 self.assertEquals(scm.GIT.MatchSvnGlob( | 109 self.assertEquals(scm.GIT.MatchSvnGlob( |
| 82 'svn://svn.chromium.org/chrome/trunk/src', | 110 'svn://svn.chromium.org/chrome/trunk/src', |
| 83 'svn://svn.chromium.org/chrome', | 111 'svn://svn.chromium.org/chrome', |
| 84 'trunk/src:refs/remotes/origin/trunk', | 112 'trunk/src:refs/remotes/origin/trunk', |
| 85 False), 'refs/remotes/origin/trunk') | 113 False), 'refs/remotes/origin/trunk') |
| 86 self.assertEquals(scm.GIT.MatchSvnGlob( | 114 self.assertEquals(scm.GIT.MatchSvnGlob( |
| 87 'https://v8.googlecode.com/svn/branches/bleeding_edge', | 115 'https://v8.googlecode.com/svn/branches/bleeding_edge', |
| 88 'https://v8.googlecode.com/svn', | 116 'https://v8.googlecode.com/svn', |
| 89 'branches/*:refs/remotes/*', | 117 'branches/*:refs/remotes/*', |
| 90 True), 'refs/remotes/bleeding_edge') | 118 True), 'refs/remotes/bleeding_edge') |
| 91 | 119 |
| 120 |
| 121 class RealGitTest(fake_repos.FakeReposTestBase): |
| 122 def setUp(self): |
| 123 super(RealGitTest, self).setUp() |
| 124 self.enabled = self.FAKE_REPOS.set_up_git() |
| 125 if self.enabled: |
| 126 self.clone_dir = scm.os.path.join(self.FAKE_REPOS.git_root, 'repo_1') |
| 127 |
| 128 def testIsValidRevision(self): |
| 129 if not self.enabled: |
| 130 return |
| 131 # Sha1's are [0-9a-z]{32}, so starting with a 'z' or 'r' should always fail. |
| 132 self.assertFalse(scm.GIT.IsValidRevision(cwd=self.clone_dir, rev='zebra')) |
| 133 self.assertFalse(scm.GIT.IsValidRevision(cwd=self.clone_dir, rev='r123456')) |
| 134 # Valid cases |
| 135 first_rev = self.githash('repo_1', 1) |
| 136 self.assertTrue(scm.GIT.IsValidRevision(cwd=self.clone_dir, rev=first_rev)) |
| 137 self.assertTrue(scm.GIT.IsValidRevision(cwd=self.clone_dir, rev='HEAD')) |
| 138 |
| 139 |
| 140 class RealGitSvnTest(fake_repos.FakeReposTestBase): |
| 141 def setUp(self): |
| 142 super(RealGitSvnTest, self).setUp() |
| 143 self.enabled = self.FAKE_REPOS.set_up_git() and self.FAKE_REPOS.set_up_svn() |
| 144 if self.enabled: |
| 145 self.tree_name = 'git-svn' |
| 146 self.svn_url = scm.os.path.join(self.FAKE_REPOS.svn_base, 'trunk') |
| 147 self.clone_dir = scm.os.path.join(self.FAKE_REPOS.git_root, |
| 148 self.tree_name) |
| 149 scm.os.makedirs(self.clone_dir) |
| 150 self._capture(['svn', 'clone', '-q', '-q', self.svn_url, self.clone_dir]) |
| 151 # git rev-list gives revisions in reverse chronological order. |
| 152 hashes = reversed(self._capture(['rev-list', 'HEAD']).splitlines()) |
| 153 # We insert a null value at 0 to do 1-based indexing, not 0-based, as SVN |
| 154 # revisions are 1-based (i.e. they start at r1, not r0). |
| 155 self.git_hashes = ([None] + list(hashes)) |
| 156 |
| 157 def tearDown(self): |
| 158 scm.gclient_utils.rmtree(self.clone_dir) |
| 159 |
| 160 def _capture(self, cmd, **kwargs): |
| 161 kwargs.setdefault('cwd', self.clone_dir) |
| 162 return scm.GIT.Capture(cmd, **kwargs) |
| 163 |
| 164 def testGetGitSvnHeadRev(self): |
| 165 if not self.enabled: |
| 166 return |
| 167 self.assertEquals(scm.GIT.GetGitSvnHeadRev(cwd=self.clone_dir), 2) |
| 168 self._capture(['reset', '--hard', 'HEAD^']) |
| 169 self.assertEquals(scm.GIT.GetGitSvnHeadRev(cwd=self.clone_dir), 1) |
| 170 |
| 171 def testGetGetSha1ForSvnRev(self): |
| 172 if not self.enabled: |
| 173 return |
| 174 self.assertEquals(scm.GIT.GetSha1ForSvnRev(cwd=self.clone_dir, rev=1), |
| 175 self.git_hashes[1]) |
| 176 self.assertEquals(scm.GIT.GetSha1ForSvnRev(cwd=self.clone_dir, rev=2), |
| 177 self.git_hashes[2]) |
| 178 |
| 179 |
| 92 class SVNTestCase(BaseSCMTestCase): | 180 class SVNTestCase(BaseSCMTestCase): |
| 93 def setUp(self): | 181 def setUp(self): |
| 94 BaseSCMTestCase.setUp(self) | 182 BaseSCMTestCase.setUp(self) |
| 95 self.mox.StubOutWithMock(scm.SVN, 'Capture') | 183 self.mox.StubOutWithMock(scm.SVN, 'Capture') |
| 96 self.url = self.SvnUrl() | 184 self.url = self.SvnUrl() |
| 97 | 185 |
| 98 def testMembersChanged(self): | 186 def testMembersChanged(self): |
| 99 self.mox.ReplayAll() | 187 self.mox.ReplayAll() |
| 100 members = [ | 188 members = [ |
| 101 'AssertVersion', 'Capture', 'CaptureRevision', 'CaptureLocalInfo', | 189 'AssertVersion', |
| 190 'Capture', |
| 191 'CaptureLocalInfo', |
| 102 'CaptureRemoteInfo', | 192 'CaptureRemoteInfo', |
| 103 'CaptureStatus', 'current_version', 'DiffItem', 'GenerateDiff', | 193 'CaptureRevision', |
| 104 'GetCheckoutRoot', 'GetEmail', 'GetFileProperty', 'IsMoved', | 194 'CaptureStatus', |
| 105 'IsMovedInfo', 'ReadSimpleAuth', 'Revert', 'RunAndGetFileList', | 195 'current_version', |
| 196 'DiffItem', |
| 197 'GenerateDiff', |
| 198 'GetCheckoutRoot', |
| 199 'GetEmail', |
| 200 'GetFileProperty', |
| 201 'IsMoved', |
| 202 'IsMovedInfo', |
| 203 'IsValidRevision', |
| 204 'ReadSimpleAuth', |
| 205 'Revert', |
| 206 'RunAndGetFileList', |
| 106 ] | 207 ] |
| 107 # If this test fails, you should add the relevant test. | 208 # If this test fails, you should add the relevant test. |
| 108 self.compareMembers(scm.SVN, members) | 209 self.compareMembers(scm.SVN, members) |
| 109 | 210 |
| 110 def testGetCheckoutRoot(self): | 211 def testGetCheckoutRoot(self): |
| 111 # pylint: disable=E1103 | 212 # pylint: disable=E1103 |
| 112 self.mox.StubOutWithMock(scm.SVN, '_CaptureInfo') | 213 self.mox.StubOutWithMock(scm.SVN, '_CaptureInfo') |
| 113 self.mox.StubOutWithMock(scm, 'GetCasedPath') | 214 self.mox.StubOutWithMock(scm, 'GetCasedPath') |
| 114 scm.os.path.abspath = lambda x: x | 215 scm.os.path.abspath = lambda x: x |
| 115 scm.GetCasedPath = lambda x: x | 216 scm.GetCasedPath = lambda x: x |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 def _capture(self, cmd, **kwargs): | 382 def _capture(self, cmd, **kwargs): |
| 282 kwargs.setdefault('cwd', self.svn_root) | 383 kwargs.setdefault('cwd', self.svn_root) |
| 283 return scm.SVN.Capture(cmd, **kwargs) | 384 return scm.SVN.Capture(cmd, **kwargs) |
| 284 | 385 |
| 285 def testCheckout(self): | 386 def testCheckout(self): |
| 286 if not self.enabled: | 387 if not self.enabled: |
| 287 return | 388 return |
| 288 # Checkout and verify the tree. | 389 # Checkout and verify the tree. |
| 289 self.assertTree(self.tree, self.svn_root) | 390 self.assertTree(self.tree, self.svn_root) |
| 290 | 391 |
| 392 def testIsValidRevision(self): |
| 393 if not self.enabled: |
| 394 return |
| 395 url_at_rev = self.svn_base + 'trunk/third_party@%s' |
| 396 # Invalid or non-existent. |
| 397 self.assertFalse(scm.SVN.IsValidRevision('url://totally_invalid/trunk/foo')) |
| 398 self.assertFalse(scm.SVN.IsValidRevision(url_at_rev % 0)) |
| 399 self.assertFalse(scm.SVN.IsValidRevision(url_at_rev % 123)) |
| 400 # Valid. |
| 401 self.assertTrue(scm.SVN.IsValidRevision(url_at_rev % 1)) |
| 402 self.assertTrue(scm.SVN.IsValidRevision(url_at_rev % 2)) |
| 403 self.assertTrue(scm.SVN.IsValidRevision(url_at_rev % 'HEAD')) |
| 404 |
| 291 def testRevert(self): | 405 def testRevert(self): |
| 292 if not self.enabled: | 406 if not self.enabled: |
| 293 return | 407 return |
| 294 # Mess around and make sure revert works for all corner cases. | 408 # Mess around and make sure revert works for all corner cases. |
| 295 # - svn add a file | 409 # - svn add a file |
| 296 # - svn add a file and delete it | 410 # - svn add a file and delete it |
| 297 # - Delete a file | 411 # - Delete a file |
| 298 # - svn delete a file | 412 # - svn delete a file |
| 299 # - svn move a directory and svn rename files in it | 413 # - svn move a directory and svn rename files in it |
| 300 # - add a directory tree. | 414 # - add a directory tree. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 # Asserting the tree is not sufficient, svn status must come out clear too. | 456 # Asserting the tree is not sufficient, svn status must come out clear too. |
| 343 self.assertEquals('', self._capture(['status'])) | 457 self.assertEquals('', self._capture(['status'])) |
| 344 | 458 |
| 345 | 459 |
| 346 if __name__ == '__main__': | 460 if __name__ == '__main__': |
| 347 if '-v' in sys.argv: | 461 if '-v' in sys.argv: |
| 348 logging.basicConfig(level=logging.DEBUG) | 462 logging.basicConfig(level=logging.DEBUG) |
| 349 unittest.main() | 463 unittest.main() |
| 350 | 464 |
| 351 # vim: ts=2:sw=2:tw=80:et: | 465 # vim: ts=2:sw=2:tw=80:et: |
| OLD | NEW |