| 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. |
| 11 """ | 11 """ |
| 12 | 12 |
| 13 import logging | 13 import logging |
| 14 import os | 14 import os |
| 15 import pprint | 15 import pprint |
| 16 import re |
| 16 import shutil | 17 import shutil |
| 17 import subprocess | 18 import subprocess |
| 18 import sys | 19 import sys |
| 19 import unittest | 20 import unittest |
| 20 | 21 |
| 21 from fake_repos import rmtree, write, FakeRepos | 22 from fake_repos import rmtree, write, FakeRepos |
| 22 | 23 |
| 23 join = os.path.join | 24 join = os.path.join |
| 24 | 25 |
| 25 SHOULD_LEAK = False | 26 SHOULD_LEAK = False |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 | 100 |
| 100 def gclient(self, cmd, cwd=None): | 101 def gclient(self, cmd, cwd=None): |
| 101 if not cwd: | 102 if not cwd: |
| 102 cwd = self.root_dir | 103 cwd = self.root_dir |
| 103 process = subprocess.Popen([GCLIENT_PATH] + cmd, cwd=cwd, env=self.env, | 104 process = subprocess.Popen([GCLIENT_PATH] + cmd, cwd=cwd, env=self.env, |
| 104 stdout=subprocess.PIPE, stderr=subprocess.PIPE, | 105 stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
| 105 shell=sys.platform.startswith('win')) | 106 shell=sys.platform.startswith('win')) |
| 106 (stdout, stderr) = process.communicate() | 107 (stdout, stderr) = process.communicate() |
| 107 return (stdout, stderr, process.returncode) | 108 return (stdout, stderr, process.returncode) |
| 108 | 109 |
| 110 def checkString(self, expected, result): |
| 111 if expected != result: |
| 112 # Strip the begining |
| 113 while expected and result and expected[0] == result[0]: |
| 114 expected = expected[1:] |
| 115 result = result[1:] |
| 116 # The exception trace makes it hard to read so dump it too. |
| 117 if '\n' in result: |
| 118 print result |
| 119 self.assertEquals(expected, result) |
| 120 |
| 109 def check(self, expected, results): | 121 def check(self, expected, results): |
| 110 def checkString(expected, result): | 122 self.checkString(expected[0], results[0]) |
| 111 if expected != result: | 123 self.checkString(expected[1], results[1]) |
| 112 while expected and result and expected[0] == result[0]: | |
| 113 expected = expected[1:] | |
| 114 result = result[1:] | |
| 115 self.assertEquals(expected, result) | |
| 116 checkString(expected[0], results[0]) | |
| 117 checkString(expected[1], results[1]) | |
| 118 self.assertEquals(expected[2], results[2]) | 124 self.assertEquals(expected[2], results[2]) |
| 119 | 125 |
| 120 def assertTree(self, tree): | 126 def assertTree(self, tree): |
| 121 actual = read_tree(self.root_dir) | 127 actual = read_tree(self.root_dir) |
| 122 diff = dict_diff(tree, actual) | 128 diff = dict_diff(tree, actual) |
| 123 if diff: | 129 if diff: |
| 124 logging.debug('Actual %s\n%s' % (self.root_dir, pprint.pformat(actual))) | 130 logging.debug('Actual %s\n%s' % (self.root_dir, pprint.pformat(actual))) |
| 125 logging.debug('Expected\n%s' % pprint.pformat(tree)) | 131 logging.debug('Expected\n%s' % pprint.pformat(tree)) |
| 126 logging.debug('Diff\n%s' % pprint.pformat(diff)) | 132 logging.debug('Diff\n%s' % pprint.pformat(diff)) |
| 127 self.assertEquals(tree, actual) | 133 self.assertEquals(tree, actual) |
| 128 | 134 |
| 129 | 135 |
| 130 class GClientSmoke(GClientSmokeBase): | 136 class GClientSmoke(GClientSmokeBase): |
| 131 def testCommands(self): | 137 def testCommands(self): |
| 132 """This test is to make sure no new command was added.""" | 138 """This test is to make sure no new command was added.""" |
| 133 result = self.gclient(['help']) | 139 result = self.gclient(['help']) |
| 134 self.assertEquals(3189, len(result[0])) | 140 self.assertEquals(1197, len(result[0])) |
| 135 self.assertEquals(0, len(result[1])) | 141 self.assertEquals(0, len(result[1])) |
| 136 self.assertEquals(0, result[2]) | 142 self.assertEquals(0, result[2]) |
| 137 | 143 |
| 138 def testNotConfigured(self): | 144 def testNotConfigured(self): |
| 139 res = ('', 'Error: client not configured; see \'gclient config\'\n', 1) | 145 res = ('', 'Error: client not configured; see \'gclient config\'\n', 1) |
| 140 self.check(res, self.gclient(['cleanup'])) | 146 self.check(res, self.gclient(['cleanup'])) |
| 141 self.check(res, self.gclient(['diff'])) | 147 self.check(res, self.gclient(['diff'])) |
| 142 self.check(res, self.gclient(['export', 'foo'])) | 148 self.check(res, self.gclient(['export', 'foo'])) |
| 143 self.check(res, self.gclient(['pack'])) | 149 self.check(res, self.gclient(['pack'])) |
| 144 self.check(res, self.gclient(['revert'])) | 150 self.check(res, self.gclient(['revert'])) |
| 145 self.check(res, self.gclient(['revinfo'])) | 151 self.check(res, self.gclient(['revinfo'])) |
| 146 self.check(res, self.gclient(['runhooks'])) | 152 self.check(res, self.gclient(['runhooks'])) |
| 147 self.check(res, self.gclient(['status'])) | 153 self.check(res, self.gclient(['status'])) |
| 148 self.check(res, self.gclient(['sync'])) | 154 self.check(res, self.gclient(['sync'])) |
| 149 self.check(res, self.gclient(['update'])) | 155 self.check(res, self.gclient(['update'])) |
| 150 | 156 |
| 151 | 157 |
| 152 class GClientSmokeSVN(GClientSmokeBase): | 158 class GClientSmokeSVN(GClientSmokeBase): |
| 153 """sync is the most important command. Hence test it more.""" | 159 """sync is the most important command. Hence test it more.""" |
| 154 def testSync(self): | 160 def testSync(self): |
| 155 """Test pure gclient svn checkout, example of Chromium checkout""" | |
| 156 self.gclient(['config', self.svn_base + 'trunk/src/']) | 161 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 157 # Test unversioned checkout. | 162 # Test unversioned checkout. |
| 158 results = self.gclient(['sync', '--deps', 'mac']) | 163 results = self.gclient(['sync', '--deps', 'mac']) |
| 159 logging.debug(results[0]) | 164 logging.debug(results[0]) |
| 160 self.assertEquals('', results[1]) | 165 out = results[0].splitlines(False) |
| 166 self.assertEquals(17, len(out)) |
| 167 self.checkString('', results[1]) |
| 161 self.assertEquals(0, results[2]) | 168 self.assertEquals(0, results[2]) |
| 162 tree = mangle_svn_tree( | 169 tree = mangle_svn_tree( |
| 163 (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), | 170 (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), |
| 164 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), | 171 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), |
| 165 FAKE.svn_revs[1]), | 172 FAKE.svn_revs[1]), |
| 166 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), | 173 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| 167 ) | 174 ) |
| 175 tree[join('src', 'hooked1')] = 'hooked1' |
| 168 self.assertTree(tree) | 176 self.assertTree(tree) |
| 169 | 177 |
| 178 # Manually remove hooked1 before synching to make sure it's not recreated. |
| 179 os.remove(join(self.root_dir, 'src', 'hooked1')) |
| 180 |
| 170 # Test incremental versioned sync: sync backward. | 181 # Test incremental versioned sync: sync backward. |
| 171 results = self.gclient(['sync', '--revision', 'src@1', '--deps', 'mac', | 182 results = self.gclient(['sync', '--revision', 'src@1', '--deps', 'mac', |
| 172 '--delete_unversioned_trees']) | 183 '--delete_unversioned_trees']) |
| 173 logging.debug(results[0]) | 184 logging.debug(results[0]) |
| 174 self.assertEquals('', results[1]) | 185 out = results[0].splitlines(False) |
| 186 self.assertEquals(19, len(out)) |
| 187 self.checkString('', results[1]) |
| 175 self.assertEquals(0, results[2]) | 188 self.assertEquals(0, results[2]) |
| 176 tree = mangle_svn_tree( | 189 tree = mangle_svn_tree( |
| 177 (join('trunk', 'src'), 'src', FAKE.svn_revs[1]), | 190 (join('trunk', 'src'), 'src', FAKE.svn_revs[1]), |
| 178 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'), | 191 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'), |
| 179 FAKE.svn_revs[2]), | 192 FAKE.svn_revs[2]), |
| 180 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), | 193 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| 181 (join('trunk', 'third_party', 'foo'), | 194 (join('trunk', 'third_party', 'foo'), |
| 182 join('src', 'third_party', 'prout'), | 195 join('src', 'third_party', 'prout'), |
| 183 FAKE.svn_revs[2]), | 196 FAKE.svn_revs[2]), |
| 184 ) | 197 ) |
| 185 self.assertTree(tree) | 198 self.assertTree(tree) |
| 186 # Test incremental sync: delete-unversioned_trees isn't there. | 199 # Test incremental sync: delete-unversioned_trees isn't there. |
| 187 results = self.gclient(['sync', '--deps', 'mac']) | 200 results = self.gclient(['sync', '--deps', 'mac']) |
| 188 logging.debug(results[0]) | 201 logging.debug(results[0]) |
| 189 self.assertEquals('', results[1]) | 202 out = results[0].splitlines(False) |
| 203 self.assertEquals(21, len(out)) |
| 204 self.checkString('', results[1]) |
| 190 self.assertEquals(0, results[2]) | 205 self.assertEquals(0, results[2]) |
| 191 tree = mangle_svn_tree( | 206 tree = mangle_svn_tree( |
| 192 (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), | 207 (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), |
| 193 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'), | 208 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'fpp'), |
| 194 FAKE.svn_revs[2]), | 209 FAKE.svn_revs[2]), |
| 195 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), | 210 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), |
| 196 FAKE.svn_revs[1]), | 211 FAKE.svn_revs[1]), |
| 197 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), | 212 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| 198 (join('trunk', 'third_party', 'foo'), | 213 (join('trunk', 'third_party', 'foo'), |
| 199 join('src', 'third_party', 'prout'), | 214 join('src', 'third_party', 'prout'), |
| 200 FAKE.svn_revs[2]), | 215 FAKE.svn_revs[2]), |
| 201 ) | 216 ) |
| 217 tree[join('src', 'hooked1')] = 'hooked1' |
| 202 self.assertTree(tree) | 218 self.assertTree(tree) |
| 203 | 219 |
| 204 def testRevertAndStatus(self): | 220 def testRevertAndStatus(self): |
| 205 self.gclient(['config', self.svn_base + 'trunk/src/']) | 221 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 206 results = self.gclient(['sync', '--deps', 'mac']) | 222 # Tested in testSync. |
| 223 self.gclient(['sync', '--deps', 'mac']) |
| 207 write(join(self.root_dir, 'src', 'third_party', 'foo', 'hi'), 'Hey!') | 224 write(join(self.root_dir, 'src', 'third_party', 'foo', 'hi'), 'Hey!') |
| 208 | 225 |
| 209 results = self.gclient(['status']) | 226 results = self.gclient(['status']) |
| 210 out = results[0].splitlines(False) | 227 out = results[0].splitlines(False) |
| 211 self.assertEquals(7, len(out)) | |
| 212 self.assertEquals(out[0], '') | 228 self.assertEquals(out[0], '') |
| 213 self.assertTrue(out[1].startswith('________ running \'svn status\' in \'')) | 229 self.assertTrue(out[1].startswith('________ running \'svn status\' in \'')) |
| 214 self.assertEquals(out[2], '? other') | 230 self.assertEquals(out[2], '? other') |
| 215 self.assertEquals(out[3], '? third_party/foo') | 231 self.assertEquals(out[3], '? hooked1') |
| 216 self.assertEquals(out[4], '') | 232 self.assertEquals(out[4], '? third_party/foo') |
| 217 self.assertTrue(out[5].startswith('________ running \'svn status\' in \'')) | 233 self.assertEquals(out[5], '') |
| 218 self.assertEquals(out[6], '? hi') | 234 self.assertTrue(out[6].startswith('________ running \'svn status\' in \'')) |
| 235 self.assertEquals(out[7], '? hi') |
| 236 self.assertEquals(8, len(out)) |
| 219 self.assertEquals('', results[1]) | 237 self.assertEquals('', results[1]) |
| 220 self.assertEquals(0, results[2]) | 238 self.assertEquals(0, results[2]) |
| 221 | 239 |
| 240 # Revert implies --force implies running hooks without looking at pattern |
| 241 # matching. |
| 222 results = self.gclient(['revert']) | 242 results = self.gclient(['revert']) |
| 223 self.assertEquals('', results[1]) | 243 out = results[0].splitlines(False) |
| 244 self.assertEquals(22, len(out)) |
| 245 self.checkString('', results[1]) |
| 224 self.assertEquals(0, results[2]) | 246 self.assertEquals(0, results[2]) |
| 225 tree = mangle_svn_tree( | 247 tree = mangle_svn_tree( |
| 226 (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), | 248 (join('trunk', 'src'), 'src', FAKE.svn_revs[-1]), |
| 227 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), | 249 (join('trunk', 'third_party', 'foo'), join('src', 'third_party', 'foo'), |
| 228 FAKE.svn_revs[1]), | 250 FAKE.svn_revs[1]), |
| 229 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), | 251 (join('trunk', 'other'), join('src', 'other'), FAKE.svn_revs[2]), |
| 230 ) | 252 ) |
| 253 tree[join('src', 'hooked1')] = 'hooked1' |
| 254 tree[join('src', 'hooked2')] = 'hooked2' |
| 231 self.assertTree(tree) | 255 self.assertTree(tree) |
| 232 | 256 |
| 233 results = self.gclient(['status']) | 257 results = self.gclient(['status']) |
| 234 out = results[0].splitlines(False) | 258 out = results[0].splitlines(False) |
| 235 self.assertEquals(4, len(out)) | |
| 236 self.assertEquals(out[0], '') | 259 self.assertEquals(out[0], '') |
| 237 self.assertTrue(out[1].startswith('________ running \'svn status\' in \'')) | 260 self.assertTrue(out[1].startswith('________ running \'svn status\' in \'')) |
| 238 self.assertEquals(out[2], '? other') | 261 self.assertEquals(out[2], '? other') |
| 239 self.assertEquals(out[3], '? third_party/foo') | 262 self.assertEquals(out[3], '? hooked1') |
| 240 self.assertEquals('', results[1]) | 263 self.assertEquals(out[4], '? hooked2') |
| 264 self.assertEquals(out[5], '? third_party/foo') |
| 265 self.assertEquals(6, len(out)) |
| 266 self.checkString('', results[1]) |
| 241 self.assertEquals(0, results[2]) | 267 self.assertEquals(0, results[2]) |
| 242 | 268 |
| 269 def testRunHooks(self): |
| 270 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 271 self.gclient(['sync', '--deps', 'mac']) |
| 272 results = self.gclient(['runhooks']) |
| 273 out = results[0].splitlines(False) |
| 274 self.assertEquals(4, len(out)) |
| 275 self.assertEquals(out[0], '') |
| 276 self.assertTrue(re.match(r'^________ running \'.*?python -c ' |
| 277 r'open\(\'src/hooked1\', \'w\'\)\.write\(\'hooked1\'\)\' in \'.*', |
| 278 out[1])) |
| 279 self.assertEquals(out[2], '') |
| 280 # runhooks runs all hooks even if not matching by design. |
| 281 self.assertTrue(re.match(r'^________ running \'.*?python -c ' |
| 282 r'open\(\'src/hooked2\', \'w\'\)\.write\(\'hooked2\'\)\' in \'.*', |
| 283 out[3])) |
| 284 self.checkString('', results[1]) |
| 285 self.assertEquals(0, results[2]) |
| 286 |
| 287 def testRunHooksDepsOs(self): |
| 288 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 289 self.gclient(['sync', '--deps', 'mac', '--revision', 'src@1']) |
| 290 results = self.gclient(['runhooks']) |
| 291 self.check(('', '', 0), results) |
| 292 |
| 293 def testRevInfo(self): |
| 294 # TODO(maruel): Test multiple solutions. |
| 295 self.gclient(['config', self.svn_base + 'trunk/src/']) |
| 296 self.gclient(['sync', '--deps', 'mac']) |
| 297 results = self.gclient(['revinfo']) |
| 298 out = ('src: %(base)s/src@2;\n' |
| 299 'src/other: %(base)s/other@2;\n' |
| 300 'src/third_party/foo: %(base)s/third_party/foo@1\n' % |
| 301 { 'base': self.svn_base + 'trunk' }) |
| 302 self.check((out, '', 0), results) |
| 303 |
| 243 | 304 |
| 244 class GClientSmokeGIT(GClientSmokeBase): | 305 class GClientSmokeGIT(GClientSmokeBase): |
| 245 def testSyncGit(self): | 306 def testSync(self): |
| 246 """Test pure gclient git checkout, example of Chromium OS checkout""" | |
| 247 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) | 307 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) |
| 248 # Test unversioned checkout. | 308 # Test unversioned checkout. |
| 249 results = self.gclient(['sync', '--deps', 'mac']) | 309 results = self.gclient(['sync', '--deps', 'mac']) |
| 250 logging.debug(results[0]) | 310 out = results[0].splitlines(False) |
| 311 # TODO(maruel): http://crosbug.com/3582 hooks run even if not matching, must |
| 312 # add sync parsing to get the list of updated files. |
| 313 self.assertEquals(13, len(out)) |
| 251 self.assertTrue(results[1].startswith('Switched to a new branch \'')) | 314 self.assertTrue(results[1].startswith('Switched to a new branch \'')) |
| 252 self.assertEquals(0, results[2]) | 315 self.assertEquals(0, results[2]) |
| 253 tree = mangle_git_tree( | 316 tree = mangle_git_tree( |
| 254 ('src', FAKE.git_hashes['repo_1'][1][1]), | 317 ('src', FAKE.git_hashes['repo_1'][1][1]), |
| 255 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][0][1]), | 318 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][0][1]), |
| 256 (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), | 319 (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), |
| 257 ) | 320 ) |
| 321 tree[join('src', 'hooked1')] = 'hooked1' |
| 322 tree[join('src', 'hooked2')] = 'hooked2' |
| 258 self.assertTree(tree) | 323 self.assertTree(tree) |
| 259 | 324 |
| 325 # Manually remove hooked1 before synching to make sure it's not recreated. |
| 326 os.remove(join(self.root_dir, 'src', 'hooked1')) |
| 327 |
| 260 # Test incremental versioned sync: sync backward. | 328 # Test incremental versioned sync: sync backward. |
| 261 results = self.gclient(['sync', '--revision', | 329 results = self.gclient(['sync', '--revision', |
| 262 'src@' + FAKE.git_hashes['repo_1'][0][0], | 330 'src@' + FAKE.git_hashes['repo_1'][0][0], |
| 263 '--deps', 'mac', '--delete_unversioned_trees']) | 331 '--deps', 'mac', '--delete_unversioned_trees']) |
| 264 logging.debug(results[0]) | 332 logging.debug(results[0]) |
| 265 self.assertEquals('', results[1]) | 333 out = results[0].splitlines(False) |
| 334 self.assertEquals(20, len(out)) |
| 335 self.checkString('', results[1]) |
| 266 self.assertEquals(0, results[2]) | 336 self.assertEquals(0, results[2]) |
| 267 tree = mangle_git_tree( | 337 tree = mangle_git_tree( |
| 268 ('src', FAKE.git_hashes['repo_1'][0][1]), | 338 ('src', FAKE.git_hashes['repo_1'][0][1]), |
| 269 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][1][1]), | 339 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][1][1]), |
| 270 (join('src', 'repo2', 'repo3'), FAKE.git_hashes['repo_3'][1][1]), | 340 (join('src', 'repo2', 'repo3'), FAKE.git_hashes['repo_3'][1][1]), |
| 271 (join('src', 'repo4'), FAKE.git_hashes['repo_4'][1][1]), | 341 (join('src', 'repo4'), FAKE.git_hashes['repo_4'][1][1]), |
| 272 ) | 342 ) |
| 343 tree[join('src', 'hooked2')] = 'hooked2' |
| 273 self.assertTree(tree) | 344 self.assertTree(tree) |
| 274 # Test incremental sync: delete-unversioned_trees isn't there. | 345 # Test incremental sync: delete-unversioned_trees isn't there. |
| 275 results = self.gclient(['sync', '--deps', 'mac']) | 346 results = self.gclient(['sync', '--deps', 'mac']) |
| 276 logging.debug(results[0]) | 347 logging.debug(results[0]) |
| 277 self.assertEquals('', results[1]) | 348 out = results[0].splitlines(False) |
| 349 self.assertEquals(25, len(out)) |
| 350 self.checkString('', results[1]) |
| 278 self.assertEquals(0, results[2]) | 351 self.assertEquals(0, results[2]) |
| 279 tree = mangle_git_tree( | 352 tree = mangle_git_tree( |
| 280 ('src', FAKE.git_hashes['repo_1'][1][1]), | 353 ('src', FAKE.git_hashes['repo_1'][1][1]), |
| 281 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][1][1]), | 354 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][1][1]), |
| 282 (join('src', 'repo2', 'repo3'), FAKE.git_hashes['repo_3'][1][1]), | 355 (join('src', 'repo2', 'repo3'), FAKE.git_hashes['repo_3'][1][1]), |
| 283 (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), | 356 (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), |
| 284 (join('src', 'repo4'), FAKE.git_hashes['repo_4'][1][1]), | 357 (join('src', 'repo4'), FAKE.git_hashes['repo_4'][1][1]), |
| 285 ) | 358 ) |
| 359 tree[join('src', 'hooked1')] = 'hooked1' |
| 360 tree[join('src', 'hooked2')] = 'hooked2' |
| 286 self.assertTree(tree) | 361 self.assertTree(tree) |
| 287 | 362 |
| 288 def testRevertAndStatus(self): | 363 def testRevertAndStatus(self): |
| 289 """TODO(maruel): Remove this line once this test is fixed.""" | 364 """TODO(maruel): Remove this line once this test is fixed.""" |
| 290 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) | 365 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) |
| 291 results = self.gclient(['sync', '--deps', 'mac']) | 366 # Tested in testSync. |
| 367 self.gclient(['sync', '--deps', 'mac']) |
| 292 write(join(self.root_dir, 'src', 'repo2', 'hi'), 'Hey!') | 368 write(join(self.root_dir, 'src', 'repo2', 'hi'), 'Hey!') |
| 293 | 369 |
| 294 results = self.gclient(['status']) | 370 results = self.gclient(['status']) |
| 295 out = results[0].splitlines(False) | 371 out = results[0].splitlines(False) |
| 296 # TODO(maruel): THIS IS WRONG. | 372 # TODO(maruel): http://crosbug.com/3584 It should output the unversioned |
| 373 # files. |
| 297 self.assertEquals(0, len(out)) | 374 self.assertEquals(0, len(out)) |
| 298 | 375 |
| 376 # Revert implies --force implies running hooks without looking at pattern |
| 377 # matching. |
| 299 results = self.gclient(['revert']) | 378 results = self.gclient(['revert']) |
| 300 self.assertEquals('', results[1]) | 379 out = results[0].splitlines(False) |
| 380 # TODO(maruel): http://crosbug.com/3583 It just runs the hooks right now. |
| 381 self.assertEquals(7, len(out)) |
| 382 self.checkString('', results[1]) |
| 301 self.assertEquals(0, results[2]) | 383 self.assertEquals(0, results[2]) |
| 302 tree = mangle_git_tree( | 384 tree = mangle_git_tree( |
| 303 ('src', FAKE.git_hashes['repo_1'][1][1]), | 385 ('src', FAKE.git_hashes['repo_1'][1][1]), |
| 304 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][0][1]), | 386 (join('src', 'repo2'), FAKE.git_hashes['repo_2'][0][1]), |
| 305 (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), | 387 (join('src', 'repo2', 'repo_renamed'), FAKE.git_hashes['repo_3'][1][1]), |
| 306 ) | 388 ) |
| 307 # TODO(maruel): THIS IS WRONG. | 389 # TODO(maruel): http://crosbug.com/3583 This file should have been removed. |
| 308 tree[join('src', 'repo2', 'hi')] = 'Hey!' | 390 tree[join('src', 'repo2', 'hi')] = 'Hey!' |
| 391 tree[join('src', 'hooked1')] = 'hooked1' |
| 392 tree[join('src', 'hooked2')] = 'hooked2' |
| 309 self.assertTree(tree) | 393 self.assertTree(tree) |
| 310 | 394 |
| 311 results = self.gclient(['status']) | 395 results = self.gclient(['status']) |
| 312 out = results[0].splitlines(False) | 396 out = results[0].splitlines(False) |
| 313 # TODO(maruel): THIS IS WRONG. | 397 # TODO(maruel): http://crosbug.com/3584 It should output the unversioned |
| 398 # files. |
| 314 self.assertEquals(0, len(out)) | 399 self.assertEquals(0, len(out)) |
| 315 | 400 |
| 316 | 401 def testRunHooks(self): |
| 317 class GClientSmokeRevInfo(GClientSmokeBase): | 402 self.gclient(['config', self.git_base + 'repo_1', '--name', 'src']) |
| 318 """revert is the second most important command. Hence test it more.""" | 403 self.gclient(['sync', '--deps', 'mac']) |
| 319 def setUp(self): | 404 results = self.gclient(['runhooks']) |
| 320 GClientSmokeBase.setUp(self) | 405 logging.debug(results[0]) |
| 321 self.gclient(['config', self.URL_BASE]) | 406 out = results[0].splitlines(False) |
| 407 self.assertEquals(4, len(out)) |
| 408 self.assertEquals(out[0], '') |
| 409 self.assertTrue(re.match(r'^________ running \'.*?python -c ' |
| 410 r'open\(\'src/hooked1\', \'w\'\)\.write\(\'hooked1\'\)\' in \'.*', |
| 411 out[1])) |
| 412 self.assertEquals(out[2], '') |
| 413 # runhooks runs all hooks even if not matching by design. |
| 414 self.assertTrue(re.match(r'^________ running \'.*?python -c ' |
| 415 r'open\(\'src/hooked2\', \'w\'\)\.write\(\'hooked2\'\)\' in \'.*', |
| 416 out[3])) |
| 417 self.checkString('', results[1]) |
| 418 self.assertEquals(0, results[2]) |
| 322 | 419 |
| 323 | 420 |
| 324 if __name__ == '__main__': | 421 if __name__ == '__main__': |
| 325 if '-v' in sys.argv: | 422 if '-v' in sys.argv: |
| 326 logging.basicConfig(level=logging.DEBUG) | 423 logging.basicConfig(level=logging.DEBUG) |
| 327 if '-l' in sys.argv: | 424 if '-l' in sys.argv: |
| 328 SHOULD_LEAK = True | 425 SHOULD_LEAK = True |
| 329 sys.argv.remove('-l') | 426 sys.argv.remove('-l') |
| 330 FAKE = FakeRepos(TRIAL_DIR, SHOULD_LEAK, True) | 427 FAKE = FakeRepos(TRIAL_DIR, SHOULD_LEAK, True) |
| 331 try: | 428 try: |
| 332 FAKE.setUp() | 429 FAKE.setUp() |
| 333 unittest.main() | 430 unittest.main() |
| 334 finally: | 431 finally: |
| 335 FAKE.tearDown() | 432 FAKE.tearDown() |
| OLD | NEW |