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