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 |