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 |