OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Unit tests for presubmit_support.py and presubmit_canned_checks.py.""" | 6 """Unit tests for presubmit_support.py and presubmit_canned_checks.py.""" |
7 | 7 |
8 import exceptions | 8 import exceptions |
9 import StringIO | 9 import StringIO |
10 import unittest | 10 import unittest |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 presubmit.os.sep = os_sep | 45 presubmit.os.sep = os_sep |
46 presubmit.os.path.join = os_path_join | 46 presubmit.os.path.join = os_path_join |
47 presubmit.os.path.dirname = os_path_dirname | 47 presubmit.os.path.dirname = os_path_dirname |
48 presubmit.os.path.normpath = os_path_normpath | 48 presubmit.os.path.normpath = os_path_normpath |
49 presubmit.os.path.splitext = os_path_splitext | 49 presubmit.os.path.splitext = os_path_splitext |
50 self.mox.StubOutWithMock(presubmit, 'sys') | 50 self.mox.StubOutWithMock(presubmit, 'sys') |
51 # Special mocks. | 51 # Special mocks. |
52 def MockAbsPath(f): | 52 def MockAbsPath(f): |
53 return f | 53 return f |
54 presubmit.os.path.abspath = MockAbsPath | 54 presubmit.os.path.abspath = MockAbsPath |
55 self.mox.StubOutWithMock(presubmit.gcl, 'GetRepositoryRoot') | 55 self.fake_root_dir = self.RootDir() |
56 fake_root_dir = self.RootDir() | |
57 self.fake_root_dir = fake_root_dir | |
58 def MockGetRepositoryRoot(): | |
59 return fake_root_dir | |
60 presubmit.gcl.GetRepositoryRoot = MockGetRepositoryRoot | |
61 self.mox.StubOutWithMock(presubmit.gclient, 'CaptureSVNInfo') | 56 self.mox.StubOutWithMock(presubmit.gclient, 'CaptureSVNInfo') |
62 self.mox.StubOutWithMock(presubmit.gcl, 'GetSVNFileProperty') | 57 self.mox.StubOutWithMock(presubmit.gcl, 'GetSVNFileProperty') |
63 self.mox.StubOutWithMock(presubmit.gcl, 'ReadFile') | 58 self.mox.StubOutWithMock(presubmit.gcl, 'ReadFile') |
| 59 self.mox.StubOutWithMock(presubmit.gcl, 'ChangeInfo') |
64 | 60 |
65 def MakeBasicChange(self, name, description, root=None): | 61 def MakeChangeInfo(self, name, issue, patchset, description): |
66 ci = presubmit.gcl.ChangeInfo(name, 0, 0, description, None) | 62 ci = self.mox.CreateMock(presubmit.gcl.ChangeInfo) |
67 if root is None: | 63 ci.name = name |
68 root = self.fake_root_dir | 64 ci.issue = issue |
69 return presubmit.GclChange(ci, root) | 65 ci.patchset = patchset |
| 66 ci.description = description |
| 67 ci.patch = None |
| 68 ci.local_root = self.fake_root_dir |
| 69 return ci |
70 | 70 |
71 | 71 |
72 class PresubmitUnittest(PresubmitTestsBase): | 72 class PresubmitUnittest(PresubmitTestsBase): |
73 """General presubmit_support.py tests (excluding InputApi and OutputApi).""" | 73 """General presubmit_support.py tests (excluding InputApi and OutputApi).""" |
74 def testMembersChanged(self): | 74 def testMembersChanged(self): |
75 self.mox.ReplayAll() | 75 self.mox.ReplayAll() |
76 members = [ | 76 members = [ |
77 'AffectedFile', 'DoPresubmitChecks', 'GclChange', 'InputApi', | 77 'AffectedFile', 'DoPresubmitChecks', 'GclChange', 'InputApi', |
78 'ListRelevantPresubmitFiles', 'Main', 'NotImplementedException', | 78 'ListRelevantPresubmitFiles', 'Main', 'NotImplementedException', |
79 'OutputApi', 'ParseFiles', 'PresubmitExecuter', | 79 'OutputApi', 'ParseFiles', 'PresubmitExecuter', 'ScanSubDirs', |
80 'ScanSubDirs', 'SvnAffectedFile', | 80 'SvnAffectedFile', |
81 'cPickle', 'cStringIO', 'exceptions', | 81 'cPickle', 'cStringIO', 'exceptions', |
82 'fnmatch', 'gcl', 'gclient', 'glob', 'logging', 'marshal', 'normpath', | 82 'fnmatch', 'gcl', 'gclient', 'glob', 'logging', 'marshal', 'normpath', |
83 'optparse', | 83 'optparse', |
84 'os', 'pickle', 'presubmit_canned_checks', 're', 'subprocess', 'sys', | 84 'os', 'pickle', 'presubmit_canned_checks', 're', 'subprocess', 'sys', |
85 'tempfile', 'traceback', 'types', 'unittest', 'urllib2', 'warnings', | 85 'tempfile', 'traceback', 'types', 'unittest', 'urllib2', 'warnings', |
86 ] | 86 ] |
87 # If this test fails, you should add the relevant test. | 87 # If this test fails, you should add the relevant test. |
88 self.compareMembers(presubmit, members) | 88 self.compareMembers(presubmit, members) |
89 | 89 |
90 def testListRelevantPresubmitFiles(self): | 90 def testListRelevantPresubmitFiles(self): |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 'BUG=123', | 135 'BUG=123', |
136 ' STORY =http://foo/ \t', | 136 ' STORY =http://foo/ \t', |
137 'and some more regular text \t') | 137 'and some more regular text \t') |
138 files = [ | 138 files = [ |
139 ['A', 'foo/blat.cc'], | 139 ['A', 'foo/blat.cc'], |
140 ['M', 'binary.dll'], # a binary file | 140 ['M', 'binary.dll'], # a binary file |
141 ['A', 'isdir'], # a directory | 141 ['A', 'isdir'], # a directory |
142 ['?', 'flop/notfound.txt'], # not found in SVN, still exists locally | 142 ['?', 'flop/notfound.txt'], # not found in SVN, still exists locally |
143 ['D', 'boo/flap.h'], | 143 ['D', 'boo/flap.h'], |
144 ] | 144 ] |
145 blat = presubmit.os.path.join('foo', 'blat.cc') | 145 blat = presubmit.os.path.join(self.fake_root_dir, 'foo', 'blat.cc') |
146 notfound = presubmit.os.path.join('flop', 'notfound.txt') | 146 notfound = presubmit.os.path.join(self.fake_root_dir, 'flop', 'notfound.txt'
) |
147 flap = presubmit.os.path.join('boo', 'flap.h') | 147 flap = presubmit.os.path.join(self.fake_root_dir, 'boo', 'flap.h') |
| 148 binary = presubmit.os.path.join(self.fake_root_dir, 'binary.dll') |
| 149 isdir = presubmit.os.path.join(self.fake_root_dir, 'isdir') |
148 presubmit.os.path.exists(blat).AndReturn(True) | 150 presubmit.os.path.exists(blat).AndReturn(True) |
149 presubmit.os.path.isdir(blat).AndReturn(False) | 151 presubmit.os.path.isdir(blat).AndReturn(False) |
150 presubmit.os.path.exists('binary.dll').AndReturn(True) | 152 presubmit.os.path.exists(binary).AndReturn(True) |
151 presubmit.os.path.isdir('binary.dll').AndReturn(False) | 153 presubmit.os.path.isdir(binary).AndReturn(False) |
152 presubmit.os.path.exists('isdir').AndReturn(True) | 154 presubmit.os.path.exists(isdir).AndReturn(True) |
153 presubmit.os.path.isdir('isdir').AndReturn(True) | 155 presubmit.os.path.isdir(isdir).AndReturn(True) |
154 presubmit.os.path.exists(notfound).AndReturn(True) | 156 presubmit.os.path.exists(notfound).AndReturn(True) |
155 presubmit.os.path.isdir(notfound).AndReturn(False) | 157 presubmit.os.path.isdir(notfound).AndReturn(False) |
156 presubmit.os.path.exists(flap).AndReturn(False) | 158 presubmit.os.path.exists(flap).AndReturn(False) |
157 presubmit.gclient.CaptureSVNInfo(flap | 159 presubmit.gclient.CaptureSVNInfo(flap |
158 ).AndReturn({'Node Kind': 'file'}) | 160 ).AndReturn({'Node Kind': 'file'}) |
159 presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None) | 161 presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None) |
160 presubmit.gcl.GetSVNFileProperty( | 162 presubmit.gcl.GetSVNFileProperty( |
161 'binary.dll', 'svn:mime-type').AndReturn('application/octet-stream') | 163 binary, 'svn:mime-type').AndReturn('application/octet-stream') |
162 presubmit.gcl.GetSVNFileProperty( | 164 presubmit.gcl.GetSVNFileProperty( |
163 notfound, 'svn:mime-type').AndReturn('') | 165 notfound, 'svn:mime-type').AndReturn('') |
164 presubmit.gclient.CaptureSVNInfo(blat).AndReturn( | 166 presubmit.gclient.CaptureSVNInfo(blat).AndReturn( |
165 {'URL': 'svn:/foo/foo/blat.cc'}) | 167 {'URL': 'svn:/foo/foo/blat.cc'}) |
166 presubmit.gclient.CaptureSVNInfo('binary.dll').AndReturn( | 168 presubmit.gclient.CaptureSVNInfo(binary).AndReturn( |
167 {'URL': 'svn:/foo/binary.dll'}) | 169 {'URL': 'svn:/foo/binary.dll'}) |
168 presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({}) | 170 presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({}) |
169 presubmit.gclient.CaptureSVNInfo(flap).AndReturn( | 171 presubmit.gclient.CaptureSVNInfo(flap).AndReturn( |
170 {'URL': 'svn:/foo/boo/flap.h'}) | 172 {'URL': 'svn:/foo/boo/flap.h'}) |
171 presubmit.gcl.ReadFile(blat).AndReturn('boo!\nahh?') | 173 presubmit.gcl.ReadFile(blat).AndReturn('boo!\nahh?') |
172 presubmit.gcl.ReadFile(notfound).AndReturn('look!\nthere?') | 174 presubmit.gcl.ReadFile(notfound).AndReturn('look!\nthere?') |
| 175 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
| 176 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 177 ci.GetFiles().AndReturn(files) |
173 self.mox.ReplayAll() | 178 self.mox.ReplayAll() |
174 | 179 |
175 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
176 description='\n'.join(description_lines), | |
177 files=files) | |
178 change = presubmit.GclChange(ci) | 180 change = presubmit.GclChange(ci) |
179 | 181 |
180 self.failUnless(change.Name() == 'mychange') | 182 self.failUnless(change.Name() == 'mychange') |
181 self.failUnless(change.DescriptionText() == | 183 self.failUnless(change.DescriptionText() == |
182 'Hello there\nthis is a change\nand some more regular text') | 184 'Hello there\nthis is a change\nand some more regular text') |
183 self.failUnless(change.FullDescriptionText() == | 185 self.failUnless(change.FullDescriptionText() == |
184 '\n'.join(description_lines)) | 186 '\n'.join(description_lines)) |
185 | 187 |
186 self.failUnless(change.BUG == '123') | 188 self.failUnless(change.BUG == '123') |
187 self.failUnless(change.STORY == 'http://foo/') | 189 self.failUnless(change.STORY == 'http://foo/') |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 self.assertEquals(rhs_lines[3][2], 'there?') | 233 self.assertEquals(rhs_lines[3][2], 'there?') |
232 | 234 |
233 def testExecPresubmitScript(self): | 235 def testExecPresubmitScript(self): |
234 description_lines = ('Hello there', | 236 description_lines = ('Hello there', |
235 'this is a change', | 237 'this is a change', |
236 'STORY=http://tracker/123') | 238 'STORY=http://tracker/123') |
237 files = [ | 239 files = [ |
238 ['A', 'foo\\blat.cc'], | 240 ['A', 'foo\\blat.cc'], |
239 ] | 241 ] |
240 fake_presubmit = presubmit.os.path.join(self.fake_root_dir, 'PRESUBMIT.py') | 242 fake_presubmit = presubmit.os.path.join(self.fake_root_dir, 'PRESUBMIT.py') |
| 243 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
| 244 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 245 ci.GetFiles().AndReturn(files) |
| 246 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 247 ci.GetFiles().AndReturn(files) |
241 self.mox.ReplayAll() | 248 self.mox.ReplayAll() |
242 | 249 |
243 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
244 description='\n'.join(description_lines), | |
245 files=files) | |
246 | |
247 executer = presubmit.PresubmitExecuter(ci, False) | 250 executer = presubmit.PresubmitExecuter(ci, False) |
248 self.failIf(executer.ExecPresubmitScript('', fake_presubmit)) | 251 self.failIf(executer.ExecPresubmitScript('', fake_presubmit)) |
249 # No error if no on-upload entry point | 252 # No error if no on-upload entry point |
250 self.failIf(executer.ExecPresubmitScript( | 253 self.failIf(executer.ExecPresubmitScript( |
251 ('def CheckChangeOnCommit(input_api, output_api):\n' | 254 ('def CheckChangeOnCommit(input_api, output_api):\n' |
252 ' return (output_api.PresubmitError("!!"))\n'), | 255 ' return (output_api.PresubmitError("!!"))\n'), |
253 fake_presubmit | 256 fake_presubmit |
254 )) | 257 )) |
255 | 258 |
256 executer = presubmit.PresubmitExecuter(ci, True) | 259 executer = presubmit.PresubmitExecuter(ci, True) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 ['A', join('haspresubmit', 'blat.cc')], | 303 ['A', join('haspresubmit', 'blat.cc')], |
301 ] | 304 ] |
302 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') | 305 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') |
303 root_path = join(self.fake_root_dir, 'PRESUBMIT.py') | 306 root_path = join(self.fake_root_dir, 'PRESUBMIT.py') |
304 presubmit.os.path.isfile(root_path).AndReturn(True) | 307 presubmit.os.path.isfile(root_path).AndReturn(True) |
305 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) | 308 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) |
306 presubmit.gcl.ReadFile(root_path, | 309 presubmit.gcl.ReadFile(root_path, |
307 'rU').AndReturn(self.presubmit_text) | 310 'rU').AndReturn(self.presubmit_text) |
308 presubmit.gcl.ReadFile(haspresubmit_path, | 311 presubmit.gcl.ReadFile(haspresubmit_path, |
309 'rU').AndReturn(self.presubmit_text) | 312 'rU').AndReturn(self.presubmit_text) |
| 313 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
| 314 ci.GetFileNames().AndReturn([item[1] for item in files]) |
| 315 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 316 ci.GetFiles().AndReturn(files) |
310 self.mox.ReplayAll() | 317 self.mox.ReplayAll() |
311 | 318 |
312 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
313 description='\n'.join(description_lines), | |
314 files=files) | |
315 | |
316 output = StringIO.StringIO() | 319 output = StringIO.StringIO() |
317 input = StringIO.StringIO('y\n') | 320 input = StringIO.StringIO('y\n') |
318 | 321 |
319 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 322 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, |
320 None, False)) | 323 None, False)) |
321 self.assertEqual(output.getvalue().count('!!'), 2) | 324 self.assertEqual(output.getvalue().count('!!'), 2) |
322 | 325 |
323 def testDoPresubmitChecksPromptsAfterWarnings(self): | 326 def testDoPresubmitChecksPromptsAfterWarnings(self): |
324 join = presubmit.os.path.join | 327 join = presubmit.os.path.join |
325 description_lines = ('Hello there', | 328 description_lines = ('Hello there', |
326 'this is a change', | 329 'this is a change', |
327 'NOSUCHKEY=http://tracker/123') | 330 'NOSUCHKEY=http://tracker/123') |
328 files = [ | 331 files = [ |
329 ['A', join('haspresubmit', 'blat.cc')], | 332 ['A', join('haspresubmit', 'blat.cc')], |
330 ] | 333 ] |
331 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') | 334 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') |
332 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') | 335 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') |
| 336 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
333 for i in range(2): | 337 for i in range(2): |
334 presubmit.os.path.isfile(presubmit_path).AndReturn(True) | 338 presubmit.os.path.isfile(presubmit_path).AndReturn(True) |
335 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) | 339 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) |
336 presubmit.gcl.ReadFile(presubmit_path, 'rU' | 340 presubmit.gcl.ReadFile(presubmit_path, 'rU' |
337 ).AndReturn(self.presubmit_text) | 341 ).AndReturn(self.presubmit_text) |
338 presubmit.gcl.ReadFile(haspresubmit_path, 'rU' | 342 presubmit.gcl.ReadFile(haspresubmit_path, 'rU' |
339 ).AndReturn(self.presubmit_text) | 343 ).AndReturn(self.presubmit_text) |
| 344 ci.GetFileNames().AndReturn([item[1] for item in files]) |
| 345 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 346 ci.GetFiles().AndReturn(files) |
340 self.mox.ReplayAll() | 347 self.mox.ReplayAll() |
341 | 348 |
342 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
343 description='\n'.join(description_lines), | |
344 files=files) | |
345 | |
346 output = StringIO.StringIO() | 349 output = StringIO.StringIO() |
347 input = StringIO.StringIO('n\n') # say no to the warning | 350 input = StringIO.StringIO('n\n') # say no to the warning |
348 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 351 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, |
349 None, True)) | 352 None, True)) |
350 self.assertEqual(output.getvalue().count('??'), 2) | 353 self.assertEqual(output.getvalue().count('??'), 2) |
351 | 354 |
352 output = StringIO.StringIO() | 355 output = StringIO.StringIO() |
353 input = StringIO.StringIO('y\n') # say yes to the warning | 356 input = StringIO.StringIO('y\n') # say yes to the warning |
354 self.failUnless(presubmit.DoPresubmitChecks(ci, | 357 self.failUnless(presubmit.DoPresubmitChecks(ci, False, True, output, input, |
355 False, | 358 None, True)) |
356 True, | |
357 output, | |
358 input, | |
359 None, | |
360 True)) | |
361 self.assertEquals(output.getvalue().count('??'), 2) | 359 self.assertEquals(output.getvalue().count('??'), 2) |
362 | 360 |
363 def testDoPresubmitChecksNoWarningPromptIfErrors(self): | 361 def testDoPresubmitChecksNoWarningPromptIfErrors(self): |
364 join = presubmit.os.path.join | 362 join = presubmit.os.path.join |
365 description_lines = ('Hello there', | 363 description_lines = ('Hello there', |
366 'this is a change', | 364 'this is a change', |
367 'NOSUCHKEY=http://tracker/123', | 365 'NOSUCHKEY=http://tracker/123', |
368 'REALLYNOSUCHKEY=http://tracker/123') | 366 'REALLYNOSUCHKEY=http://tracker/123') |
369 files = [ | 367 files = [ |
370 ['A', join('haspresubmit', 'blat.cc')], | 368 ['A', join('haspresubmit', 'blat.cc')], |
371 ] | 369 ] |
372 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') | 370 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') |
373 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', | 371 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', |
374 'PRESUBMIT.py') | 372 'PRESUBMIT.py') |
375 presubmit.os.path.isfile(presubmit_path).AndReturn(True) | 373 presubmit.os.path.isfile(presubmit_path).AndReturn(True) |
376 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) | 374 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) |
377 presubmit.gcl.ReadFile(presubmit_path, 'rU').AndReturn(self.presubmit_text) | 375 presubmit.gcl.ReadFile(presubmit_path, 'rU').AndReturn(self.presubmit_text) |
378 presubmit.gcl.ReadFile(haspresubmit_path, 'rU' | 376 presubmit.gcl.ReadFile(haspresubmit_path, 'rU').AndReturn( |
379 ).AndReturn(self.presubmit_text) | 377 self.presubmit_text) |
| 378 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
| 379 ci.GetFileNames().AndReturn([item[1] for item in files]) |
| 380 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 381 ci.GetFiles().AndReturn(files) |
380 self.mox.ReplayAll() | 382 self.mox.ReplayAll() |
381 | 383 |
382 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
383 description='\n'.join(description_lines), | |
384 files=files) | |
385 output = StringIO.StringIO() | 384 output = StringIO.StringIO() |
386 input = StringIO.StringIO() # should be unused | 385 input = StringIO.StringIO() # should be unused |
387 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 386 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, |
388 None, False)) | 387 None, False)) |
389 self.assertEqual(output.getvalue().count('??'), 2) | 388 self.assertEqual(output.getvalue().count('??'), 2) |
390 self.assertEqual(output.getvalue().count('XX!!XX'), 2) | 389 self.assertEqual(output.getvalue().count('XX!!XX'), 2) |
391 self.assertEqual(output.getvalue().count('(y/N)'), 0) | 390 self.assertEqual(output.getvalue().count('(y/N)'), 0) |
392 | 391 |
393 def testDoDefaultPresubmitChecks(self): | 392 def testDoDefaultPresubmitChecks(self): |
394 join = presubmit.os.path.join | 393 join = presubmit.os.path.join |
395 description_lines = ('Hello there', | 394 description_lines = ('Hello there', |
396 'this is a change', | 395 'this is a change', |
397 'STORY=http://tracker/123') | 396 'STORY=http://tracker/123') |
398 files = [ | 397 files = [ |
399 ['A', join('haspresubmit', 'blat.cc')], | 398 ['A', join('haspresubmit', 'blat.cc')], |
400 ] | 399 ] |
401 DEFAULT_SCRIPT = """ | 400 DEFAULT_SCRIPT = """ |
402 def CheckChangeOnUpload(input_api, output_api): | 401 def CheckChangeOnUpload(input_api, output_api): |
403 return [output_api.PresubmitError("!!")] | 402 return [output_api.PresubmitError("!!")] |
404 def CheckChangeOnCommit(input_api, output_api): | 403 def CheckChangeOnCommit(input_api, output_api): |
405 raise Exception("Test error") | 404 raise Exception("Test error") |
406 """ | 405 """ |
407 presubmit.os.path.isfile(join(self.fake_root_dir, 'PRESUBMIT.py') | 406 presubmit.os.path.isfile(join(self.fake_root_dir, 'PRESUBMIT.py') |
408 ).AndReturn(False) | 407 ).AndReturn(False) |
409 presubmit.os.path.isfile(join(self.fake_root_dir, | 408 presubmit.os.path.isfile(join(self.fake_root_dir, |
410 'haspresubmit', | 409 'haspresubmit', |
411 'PRESUBMIT.py')).AndReturn(False) | 410 'PRESUBMIT.py')).AndReturn(False) |
| 411 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
| 412 ci.GetFileNames().AndReturn([item[1] for item in files]) |
| 413 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 414 ci.GetFiles().AndReturn(files) |
412 self.mox.ReplayAll() | 415 self.mox.ReplayAll() |
413 | |
414 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
415 description='\n'.join(description_lines), | |
416 files=files) | |
417 | |
418 | 416 |
419 output = StringIO.StringIO() | 417 output = StringIO.StringIO() |
420 input = StringIO.StringIO('y\n') | 418 input = StringIO.StringIO('y\n') |
421 # Always fail. | 419 # Always fail. |
422 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 420 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, |
423 DEFAULT_SCRIPT, False)) | 421 DEFAULT_SCRIPT, False)) |
424 self.assertEquals(output.getvalue().count('!!'), 1) | 422 self.assertEquals(output.getvalue().count('!!'), 1) |
425 | 423 |
426 def testDirectoryHandling(self): | 424 def testDirectoryHandling(self): |
427 files = [ | 425 files = [ |
428 ['A', 'isdir'], | 426 ['A', 'isdir'], |
429 ['A', 'isdir\\blat.cc'], | 427 ['A', 'isdir\\blat.cc'], |
430 ] | 428 ] |
431 presubmit.os.path.exists('isdir').AndReturn(True) | 429 isdir = presubmit.os.path.join(self.fake_root_dir, 'isdir') |
432 presubmit.os.path.isdir('isdir').AndReturn(True) | 430 blat = presubmit.os.path.join(isdir, 'blat.cc') |
433 presubmit.os.path.exists(presubmit.os.path.join('isdir', 'blat.cc') | 431 presubmit.os.path.exists(isdir).AndReturn(True) |
434 ).AndReturn(True) | 432 presubmit.os.path.isdir(isdir).AndReturn(True) |
435 presubmit.os.path.isdir(presubmit.os.path.join('isdir', 'blat.cc') | 433 presubmit.os.path.exists(blat).AndReturn(True) |
436 ).AndReturn(False) | 434 presubmit.os.path.isdir(blat).AndReturn(False) |
| 435 ci = self.MakeChangeInfo('mychange', 0, 0, 'foo') |
| 436 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 437 ci.GetFiles().AndReturn(files) |
437 self.mox.ReplayAll() | 438 self.mox.ReplayAll() |
438 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | 439 |
439 description='foo', files=files) | |
440 change = presubmit.GclChange(ci) | 440 change = presubmit.GclChange(ci) |
441 | |
442 affected_files = change.AffectedFiles(include_dirs=False) | 441 affected_files = change.AffectedFiles(include_dirs=False) |
443 self.failUnless(len(affected_files) == 1) | 442 self.failUnless(len(affected_files) == 1) |
444 self.failUnless(affected_files[0].LocalPath().endswith('blat.cc')) | 443 self.failUnless(affected_files[0].LocalPath().endswith('blat.cc')) |
445 affected_files_and_dirs = change.AffectedFiles(include_dirs=True) | 444 affected_files_and_dirs = change.AffectedFiles(include_dirs=True) |
446 self.failUnless(len(affected_files_and_dirs) == 2) | 445 self.failUnless(len(affected_files_and_dirs) == 2) |
447 | 446 |
448 def testTags(self): | 447 def testTags(self): |
449 DEFAULT_SCRIPT = """ | 448 DEFAULT_SCRIPT = """ |
450 def CheckChangeOnUpload(input_api, output_api): | 449 def CheckChangeOnUpload(input_api, output_api): |
451 if input_api.change.tags['BUG'] != 'boo': | 450 if input_api.change.tags['BUG'] != 'boo': |
(...skipping 17 matching lines...) Expand all Loading... |
469 return [output_api.PresubmitError('Tag parsing failed. 4 ' + | 468 return [output_api.PresubmitError('Tag parsing failed. 4 ' + |
470 input_api.change.DescriptionText())] | 469 input_api.change.DescriptionText())] |
471 if (input_api.change.FullDescriptionText() != | 470 if (input_api.change.FullDescriptionText() != |
472 'Blah Blah\\n\\nSTORY=http://tracker.com/42\\nBUG=boo\\n'): | 471 'Blah Blah\\n\\nSTORY=http://tracker.com/42\\nBUG=boo\\n'): |
473 return [output_api.PresubmitError('Tag parsing failed. 5 ' + | 472 return [output_api.PresubmitError('Tag parsing failed. 5 ' + |
474 input_api.change.FullDescriptionText())] | 473 input_api.change.FullDescriptionText())] |
475 return [output_api.PresubmitNotifyResult(input_api.change.tags['STORY'])] | 474 return [output_api.PresubmitNotifyResult(input_api.change.tags['STORY'])] |
476 def CheckChangeOnCommit(input_api, output_api): | 475 def CheckChangeOnCommit(input_api, output_api): |
477 raise Exception("Test error") | 476 raise Exception("Test error") |
478 """ | 477 """ |
| 478 ci = self.MakeChangeInfo( |
| 479 'foo', 0, 0, "Blah Blah\n\nSTORY=http://tracker.com/42\nBUG=boo\n") |
| 480 ci.GetFileNames().AndReturn([]) |
| 481 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 482 ci.GetFiles().AndReturn([]) |
479 self.mox.ReplayAll() | 483 self.mox.ReplayAll() |
480 | 484 |
481 change = presubmit.gcl.ChangeInfo( | |
482 name='foo', | |
483 issue=0, | |
484 patchset=0, | |
485 description="Blah Blah\n\nSTORY=http://tracker.com/42\nBUG=boo\n", | |
486 files=None) | |
487 output = StringIO.StringIO() | 485 output = StringIO.StringIO() |
488 input = StringIO.StringIO('y\n') | 486 input = StringIO.StringIO('y\n') |
489 self.failUnless(presubmit.DoPresubmitChecks(change, False, True, output, | 487 self.failUnless(presubmit.DoPresubmitChecks(ci, False, True, output, |
490 input, DEFAULT_SCRIPT, False)) | 488 input, DEFAULT_SCRIPT, False)) |
491 self.assertEquals(output.getvalue(), | 489 self.assertEquals(output.getvalue(), |
492 ('Warning, no presubmit.py found.\n' | 490 ('Warning, no presubmit.py found.\n' |
493 'Running default presubmit script.\n' | 491 'Running default presubmit script.\n' |
494 '** Presubmit Messages **\n' | 492 '** Presubmit Messages **\n' |
495 'http://tracker.com/42\n\n')) | 493 'http://tracker.com/42\n\n')) |
496 | 494 |
497 | 495 |
498 class InputApiUnittest(PresubmitTestsBase): | 496 class InputApiUnittest(PresubmitTestsBase): |
499 """Tests presubmit.InputApi.""" | 497 """Tests presubmit.InputApi.""" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 self.assertEquals(api.PresubmitLocalPath(), 'foo/path') | 544 self.assertEquals(api.PresubmitLocalPath(), 'foo/path') |
547 self.assertEquals(api.change, 42) | 545 self.assertEquals(api.change, 42) |
548 | 546 |
549 def testInputApiPresubmitScriptFiltering(self): | 547 def testInputApiPresubmitScriptFiltering(self): |
550 join = presubmit.os.path.join | 548 join = presubmit.os.path.join |
551 description_lines = ('Hello there', | 549 description_lines = ('Hello there', |
552 'this is a change', | 550 'this is a change', |
553 'BUG=123', | 551 'BUG=123', |
554 ' STORY =http://foo/ \t', | 552 ' STORY =http://foo/ \t', |
555 'and some more regular text') | 553 'and some more regular text') |
556 blat = join('foo', 'blat.cc') | |
557 readme = join('foo', 'blat', 'READ_ME2') | |
558 binary = join('foo', 'blat', 'binary.dll') | |
559 weird = join('foo', 'blat', 'weird.xyz') | |
560 third_party = join('foo', 'third_party', 'third.cc') | |
561 another = join('foo', 'blat', 'another.h') | |
562 beingdeleted = join('foo', 'mat', 'beingdeleted.txt') | |
563 notfound = join('flop', 'notfound.txt') | |
564 flap = join('boo', 'flap.h') | |
565 files = [ | 554 files = [ |
566 ['A', blat], | 555 ['A', join('foo', 'blat.cc')], |
567 ['M', readme], | 556 ['M', join('foo', 'blat', 'READ_ME2')], |
568 ['M', binary], | 557 ['M', join('foo', 'blat', 'binary.dll')], |
569 ['M', weird], | 558 ['M', join('foo', 'blat', 'weird.xyz')], |
570 ['M', another], | 559 ['M', join('foo', 'blat', 'another.h')], |
571 ['M', third_party], | 560 ['M', join('foo', 'third_party', 'third.cc')], |
572 ['D', 'foo/mat/beingdeleted.txt'], | 561 ['D', 'foo/mat/beingdeleted.txt'], |
573 ['M', 'flop/notfound.txt'], | 562 ['M', 'flop/notfound.txt'], |
574 ['A', 'boo/flap.h'], | 563 ['A', 'boo/flap.h'], |
575 ] | 564 ] |
576 | 565 blat = presubmit.normpath(join(self.fake_root_dir, files[0][1])) |
| 566 readme = presubmit.normpath(join(self.fake_root_dir, files[1][1])) |
| 567 binary = presubmit.normpath(join(self.fake_root_dir, files[2][1])) |
| 568 weird = presubmit.normpath(join(self.fake_root_dir, files[3][1])) |
| 569 another = presubmit.normpath(join(self.fake_root_dir, files[4][1])) |
| 570 third_party = presubmit.normpath(join(self.fake_root_dir, files[5][1])) |
| 571 beingdeleted = presubmit.normpath(join(self.fake_root_dir, files[6][1])) |
| 572 notfound = presubmit.normpath(join(self.fake_root_dir, files[7][1])) |
| 573 flap = presubmit.normpath(join(self.fake_root_dir, files[8][1])) |
577 for i in (blat, readme, binary, weird, another, third_party): | 574 for i in (blat, readme, binary, weird, another, third_party): |
578 presubmit.os.path.exists(i).AndReturn(True) | 575 presubmit.os.path.exists(i).AndReturn(True) |
579 presubmit.os.path.isdir(i).AndReturn(False) | 576 presubmit.os.path.isdir(i).AndReturn(False) |
580 presubmit.os.path.exists(beingdeleted).AndReturn(False) | 577 presubmit.os.path.exists(beingdeleted).AndReturn(False) |
581 presubmit.os.path.exists(notfound).AndReturn(False) | 578 presubmit.os.path.exists(notfound).AndReturn(False) |
582 presubmit.os.path.exists(flap).AndReturn(True) | 579 presubmit.os.path.exists(flap).AndReturn(True) |
583 presubmit.os.path.isdir(flap).AndReturn(False) | 580 presubmit.os.path.isdir(flap).AndReturn(False) |
584 presubmit.gclient.CaptureSVNInfo(beingdeleted).AndReturn({}) | 581 presubmit.gclient.CaptureSVNInfo(beingdeleted).AndReturn({}) |
585 presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({}) | 582 presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({}) |
586 presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None) | 583 presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None) |
587 presubmit.gcl.GetSVNFileProperty(readme, 'svn:mime-type').AndReturn(None) | 584 presubmit.gcl.GetSVNFileProperty(readme, 'svn:mime-type').AndReturn(None) |
588 presubmit.gcl.GetSVNFileProperty(binary, 'svn:mime-type').AndReturn( | 585 presubmit.gcl.GetSVNFileProperty(binary, 'svn:mime-type').AndReturn( |
589 'application/octet-stream') | 586 'application/octet-stream') |
590 presubmit.gcl.GetSVNFileProperty(weird, 'svn:mime-type').AndReturn(None) | 587 presubmit.gcl.GetSVNFileProperty(weird, 'svn:mime-type').AndReturn(None) |
591 presubmit.gcl.GetSVNFileProperty(another, 'svn:mime-type').AndReturn(None) | 588 presubmit.gcl.GetSVNFileProperty(another, 'svn:mime-type').AndReturn(None) |
592 presubmit.gcl.GetSVNFileProperty(third_party, 'svn:mime-type' | 589 presubmit.gcl.GetSVNFileProperty(third_party, 'svn:mime-type' |
593 ).AndReturn(None) | 590 ).AndReturn(None) |
594 presubmit.gcl.ReadFile(blat).AndReturn('whatever\ncookie') | 591 presubmit.gcl.ReadFile(blat).AndReturn('whatever\ncookie') |
595 presubmit.gcl.ReadFile(another).AndReturn('whatever\ncookie2') | 592 presubmit.gcl.ReadFile(another).AndReturn('whatever\ncookie2') |
| 593 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines)) |
| 594 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 595 ci.GetFiles().AndReturn(files) |
596 self.mox.ReplayAll() | 596 self.mox.ReplayAll() |
597 | 597 |
598 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
599 description='\n'.join(description_lines), | |
600 files=files) | |
601 change = presubmit.GclChange(ci) | 598 change = presubmit.GclChange(ci) |
602 input_api = presubmit.InputApi(change, 'foo/PRESUBMIT.py', False) | 599 input_api = presubmit.InputApi(change, |
| 600 join(self.fake_root_dir, 'foo', |
| 601 'PRESUBMIT.py'), |
| 602 False) |
603 # Doesn't filter much | 603 # Doesn't filter much |
604 got_files = input_api.AffectedFiles() | 604 got_files = input_api.AffectedFiles() |
605 self.assertEquals(len(got_files), 7) | 605 self.assertEquals(len(got_files), 7) |
606 self.assertEquals(got_files[0].LocalPath(), presubmit.normpath(blat)) | 606 self.assertEquals(got_files[0].LocalPath(), presubmit.normpath(files[0][1])) |
607 self.assertEquals(got_files[1].LocalPath(), presubmit.normpath(readme)) | 607 self.assertEquals(got_files[1].LocalPath(), presubmit.normpath(files[1][1])) |
608 self.assertEquals(got_files[2].LocalPath(), presubmit.normpath(binary)) | 608 self.assertEquals(got_files[2].LocalPath(), presubmit.normpath(files[2][1])) |
609 self.assertEquals(got_files[3].LocalPath(), presubmit.normpath(weird)) | 609 self.assertEquals(got_files[3].LocalPath(), presubmit.normpath(files[3][1])) |
610 self.assertEquals(got_files[4].LocalPath(), presubmit.normpath(another)) | 610 self.assertEquals(got_files[4].LocalPath(), presubmit.normpath(files[4][1])) |
611 self.assertEquals(got_files[5].LocalPath(), presubmit.normpath(third_party)) | 611 self.assertEquals(got_files[5].LocalPath(), presubmit.normpath(files[5][1])) |
612 self.assertEquals(got_files[6].LocalPath(), | 612 self.assertEquals(got_files[6].LocalPath(), presubmit.normpath(files[6][1])) |
613 presubmit.normpath(beingdeleted)) | |
614 # Ignores weird because of whitelist, third_party because of blacklist, | 613 # Ignores weird because of whitelist, third_party because of blacklist, |
615 # binary isn't a text file and beingdeleted doesn't exist. The rest is | 614 # binary isn't a text file and beingdeleted doesn't exist. The rest is |
616 # outside foo/. | 615 # outside foo/. |
617 rhs_lines = [x for x in input_api.RightHandSideLines(None)] | 616 rhs_lines = [x for x in input_api.RightHandSideLines(None)] |
618 self.assertEquals(len(rhs_lines), 4) | 617 self.assertEquals(len(rhs_lines), 4) |
619 self.assertEqual(rhs_lines[0][0].LocalPath(), presubmit.normpath(blat)) | 618 self.assertEqual(rhs_lines[0][0].LocalPath(), |
620 self.assertEqual(rhs_lines[1][0].LocalPath(), presubmit.normpath(blat)) | 619 presubmit.normpath(files[0][1])) |
621 self.assertEqual(rhs_lines[2][0].LocalPath(), presubmit.normpath(another)) | 620 self.assertEqual(rhs_lines[1][0].LocalPath(), |
622 self.assertEqual(rhs_lines[3][0].LocalPath(), presubmit.normpath(another)) | 621 presubmit.normpath(files[0][1])) |
| 622 self.assertEqual(rhs_lines[2][0].LocalPath(), |
| 623 presubmit.normpath(files[4][1])) |
| 624 self.assertEqual(rhs_lines[3][0].LocalPath(), |
| 625 presubmit.normpath(files[4][1])) |
623 | 626 |
624 def testDefaultWhiteListBlackListFilters(self): | 627 def testDefaultWhiteListBlackListFilters(self): |
625 def f(x): | 628 def f(x): |
626 return presubmit.AffectedFile(x, 'M') | 629 return presubmit.AffectedFile(x, 'M') |
627 files = [ | 630 files = [ |
628 ( | 631 ( |
629 [ | 632 [ |
630 # To be tested. | 633 # To be tested. |
631 f('a/experimental/b'), | 634 f('a/experimental/b'), |
632 f('experimental/b'), | 635 f('experimental/b'), |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 self.assertEquals(results[i].LocalPath(), | 693 self.assertEquals(results[i].LocalPath(), |
691 presubmit.normpath(item[1][i])) | 694 presubmit.normpath(item[1][i])) |
692 # Same number of expected results. | 695 # Same number of expected results. |
693 self.assertEquals(len(results), len(item[1])) | 696 self.assertEquals(len(results), len(item[1])) |
694 | 697 |
695 def testCustomFilter(self): | 698 def testCustomFilter(self): |
696 def FilterSourceFile(affected_file): | 699 def FilterSourceFile(affected_file): |
697 return 'a' in affected_file.LocalPath() | 700 return 'a' in affected_file.LocalPath() |
698 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee')] | 701 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee')] |
699 for (action, item) in files: | 702 for (action, item) in files: |
| 703 item = presubmit.os.path.join(self.fake_root_dir, item) |
700 presubmit.os.path.exists(item).AndReturn(True) | 704 presubmit.os.path.exists(item).AndReturn(True) |
701 presubmit.os.path.isdir(item).AndReturn(False) | 705 presubmit.os.path.isdir(item).AndReturn(False) |
702 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) | 706 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) |
| 707 ci = self.MakeChangeInfo('mychange', 0, 0, '') |
| 708 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 709 ci.GetFiles().AndReturn(files) |
703 self.mox.ReplayAll() | 710 self.mox.ReplayAll() |
704 | 711 |
705 ci = presubmit.gcl.ChangeInfo('mychange', 0, 0, '', files) | |
706 change = presubmit.GclChange(ci) | 712 change = presubmit.GclChange(ci) |
707 input_api = presubmit.InputApi(change, './PRESUBMIT.py', False) | 713 input_api = presubmit.InputApi(change, |
| 714 presubmit.os.path.join(self.fake_root_dir, |
| 715 'PRESUBMIT.py'), |
| 716 False) |
708 got_files = input_api.AffectedSourceFiles(FilterSourceFile) | 717 got_files = input_api.AffectedSourceFiles(FilterSourceFile) |
709 self.assertEquals(len(got_files), 2) | 718 self.assertEquals(len(got_files), 2) |
710 self.assertEquals(got_files[0].LocalPath(), 'eeaee') | 719 self.assertEquals(got_files[0].LocalPath(), 'eeaee') |
711 self.assertEquals(got_files[1].LocalPath(), 'eeabee') | 720 self.assertEquals(got_files[1].LocalPath(), 'eeabee') |
712 | 721 |
713 def testLambdaFilter(self): | 722 def testLambdaFilter(self): |
714 white_list = presubmit.InputApi.DEFAULT_BLACK_LIST + (r".*?a.*?",) | 723 white_list = presubmit.InputApi.DEFAULT_BLACK_LIST + (r".*?a.*?",) |
715 black_list = [r".*?b.*?"] | 724 black_list = [r".*?b.*?"] |
716 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee'), ('M', 'eecaee')] | 725 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee'), ('M', 'eecaee')] |
717 for (action, item) in files: | 726 for (action, item) in files: |
| 727 item = presubmit.os.path.join(self.fake_root_dir, item) |
718 presubmit.os.path.exists(item).AndReturn(True) | 728 presubmit.os.path.exists(item).AndReturn(True) |
719 presubmit.os.path.isdir(item).AndReturn(False) | 729 presubmit.os.path.isdir(item).AndReturn(False) |
720 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) | 730 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) |
| 731 ci = self.MakeChangeInfo('mychange', 0, 0, '') |
| 732 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 733 ci.GetFiles().AndReturn(files) |
721 self.mox.ReplayAll() | 734 self.mox.ReplayAll() |
722 | 735 |
723 ci = presubmit.gcl.ChangeInfo('mychange', 0, 0, '', files) | |
724 change = presubmit.GclChange(ci) | 736 change = presubmit.GclChange(ci) |
725 input_api = presubmit.InputApi(change, './PRESUBMIT.py', False) | 737 input_api = presubmit.InputApi(change, './PRESUBMIT.py', False) |
726 # Sample usage of overiding the default white and black lists. | 738 # Sample usage of overiding the default white and black lists. |
727 got_files = input_api.AffectedSourceFiles( | 739 got_files = input_api.AffectedSourceFiles( |
728 lambda x: input_api.FilterSourceFile(x, white_list, black_list)) | 740 lambda x: input_api.FilterSourceFile(x, white_list, black_list)) |
729 self.assertEquals(len(got_files), 2) | 741 self.assertEquals(len(got_files), 2) |
730 self.assertEquals(got_files[0].LocalPath(), 'eeaee') | 742 self.assertEquals(got_files[0].LocalPath(), 'eeaee') |
731 self.assertEquals(got_files[1].LocalPath(), 'eecaee') | 743 self.assertEquals(got_files[1].LocalPath(), 'eecaee') |
732 | 744 |
733 def testGetAbsoluteLocalPath(self): | 745 def testGetAbsoluteLocalPath(self): |
734 join = presubmit.os.path.join | 746 join = presubmit.os.path.join |
735 normpath = presubmit.normpath | 747 normpath = presubmit.normpath |
736 # Regression test for bug of presubmit stuff that relies on invoking | 748 # Regression test for bug of presubmit stuff that relies on invoking |
737 # SVN (e.g. to get mime type of file) not working unless gcl invoked | 749 # SVN (e.g. to get mime type of file) not working unless gcl invoked |
738 # from the client root (e.g. if you were at 'src' and did 'cd base' before | 750 # from the client root (e.g. if you were at 'src' and did 'cd base' before |
739 # invoking 'gcl upload' it would fail because svn wouldn't find the files | 751 # invoking 'gcl upload' it would fail because svn wouldn't find the files |
740 # the presubmit script was asking about). | 752 # the presubmit script was asking about). |
741 files = [ | 753 files = [ |
742 ['A', 'isdir'], | 754 ['A', 'isdir'], |
743 ['A', join('isdir', 'blat.cc')], | 755 ['A', join('isdir', 'blat.cc')], |
744 ['M', join('elsewhere', 'ouf.cc')], | 756 ['M', join('elsewhere', 'ouf.cc')], |
745 ] | 757 ] |
| 758 ci = self.MakeChangeInfo('mychange', 0, 0, '') |
| 759 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 760 ci.GetFiles().AndReturn(files) |
746 self.mox.ReplayAll() | 761 self.mox.ReplayAll() |
747 | 762 |
748 ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | |
749 description='', files=files) | |
750 # It doesn't make sense on non-Windows platform. This is somewhat hacky, | 763 # It doesn't make sense on non-Windows platform. This is somewhat hacky, |
751 # but it is needed since we can't just use os.path.join('c:', 'temp'). | 764 # but it is needed since we can't just use os.path.join('c:', 'temp'). |
752 change = presubmit.GclChange(ci, self.fake_root_dir) | 765 change = presubmit.GclChange(ci) |
753 affected_files = change.AffectedFiles(include_dirs=True) | 766 affected_files = change.AffectedFiles(include_dirs=True) |
754 # Local paths should remain the same | 767 # Local paths should remain the same |
755 self.assertEquals(affected_files[0].LocalPath(), normpath('isdir')) | 768 self.assertEquals(affected_files[0].LocalPath(), normpath('isdir')) |
756 self.assertEquals(affected_files[1].LocalPath(), normpath('isdir/blat.cc')) | 769 self.assertEquals(affected_files[1].LocalPath(), normpath('isdir/blat.cc')) |
757 # Absolute paths should be prefixed | 770 # Absolute paths should be prefixed |
758 self.assertEquals(affected_files[0].AbsoluteLocalPath(), | 771 self.assertEquals(affected_files[0].AbsoluteLocalPath(), |
759 normpath(join(self.fake_root_dir, 'isdir'))) | 772 normpath(join(self.fake_root_dir, 'isdir'))) |
760 self.assertEquals(affected_files[1].AbsoluteLocalPath(), | 773 self.assertEquals(affected_files[1].AbsoluteLocalPath(), |
761 normpath(join(self.fake_root_dir, 'isdir/blat.cc'))) | 774 normpath(join(self.fake_root_dir, 'isdir/blat.cc'))) |
762 | 775 |
763 # New helper functions need to work | 776 # New helper functions need to work |
764 paths_from_change = change.AbsoluteLocalPaths(include_dirs=True) | 777 paths_from_change = change.AbsoluteLocalPaths(include_dirs=True) |
765 self.assertEqual(len(paths_from_change), 3) | 778 self.assertEqual(len(paths_from_change), 3) |
766 presubmit_path = join(self.fake_root_dir, 'isdir', 'PRESUBMIT.py') | 779 presubmit_path = join(self.fake_root_dir, 'isdir', 'PRESUBMIT.py') |
767 api = presubmit.InputApi(change=change, | 780 api = presubmit.InputApi(change=change, |
768 presubmit_path=presubmit_path, | 781 presubmit_path=presubmit_path, |
769 is_committing=True) | 782 is_committing=True) |
770 paths_from_api = api.AbsoluteLocalPaths(include_dirs=True) | 783 paths_from_api = api.AbsoluteLocalPaths(include_dirs=True) |
771 self.assertEqual(len(paths_from_api), 2) | 784 self.assertEqual(len(paths_from_api), 2) |
772 for absolute_paths in [paths_from_change, paths_from_api]: | 785 for absolute_paths in [paths_from_change, paths_from_api]: |
773 self.assertEqual(absolute_paths[0], | 786 self.assertEqual(absolute_paths[0], |
774 normpath(join(self.fake_root_dir, 'isdir'))) | 787 normpath(join(self.fake_root_dir, 'isdir'))) |
775 self.assertEqual(absolute_paths[1], | 788 self.assertEqual(absolute_paths[1], |
776 normpath(join(self.fake_root_dir, 'isdir', 'blat.cc'))) | 789 normpath(join(self.fake_root_dir, 'isdir', 'blat.cc'))) |
777 | 790 |
778 def testDeprecated(self): | 791 def testDeprecated(self): |
779 presubmit.warnings.warn(mox.IgnoreArg(), category=mox.IgnoreArg(), | 792 presubmit.warnings.warn(mox.IgnoreArg(), category=mox.IgnoreArg(), |
780 stacklevel=2) | 793 stacklevel=2) |
| 794 ci = self.MakeChangeInfo('mychange', 0, 0, 'Bleh\n') |
| 795 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 796 ci.GetFiles().AndReturn([]) |
781 self.mox.ReplayAll() | 797 self.mox.ReplayAll() |
782 change = presubmit.GclChange( | 798 |
783 presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0, | 799 change = presubmit.GclChange(ci) |
784 description='Bleh\n', files=None)) | 800 api = presubmit.InputApi( |
785 api = presubmit.InputApi(change, 'foo/PRESUBMIT.py', True) | 801 change, |
| 802 presubmit.os.path.join(self.fake_root_dir, 'foo', 'PRESUBMIT.py'), True) |
786 api.AffectedTextFiles(include_deletes=False) | 803 api.AffectedTextFiles(include_deletes=False) |
787 | 804 |
788 def testReadFileStringDenied(self): | 805 def testReadFileStringDenied(self): |
| 806 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n') |
| 807 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 808 ci.GetFiles().AndReturn([('M', 'AA')]) |
789 self.mox.ReplayAll() | 809 self.mox.ReplayAll() |
790 input_api = presubmit.InputApi(None, './p', False) | 810 |
791 input_api.change = self.MakeBasicChange('foo', 'Foo\n', '/AA') | 811 input_api = presubmit.InputApi( |
| 812 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 813 input_api.change = presubmit.GclChange(ci) |
792 self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x') | 814 self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x') |
793 | 815 |
794 def testReadFileStringAccepted(self): | 816 def testReadFileStringAccepted(self): |
795 presubmit.gcl.ReadFile('/AA/boo', 'x').AndReturn(None) | 817 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n') |
| 818 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 819 path = presubmit.os.path.join(self.fake_root_dir, 'AA/boo') |
| 820 ci.GetFiles().AndReturn([('M', 'AA')]) |
| 821 presubmit.gcl.ReadFile(path, 'x').AndReturn(None) |
796 self.mox.ReplayAll() | 822 self.mox.ReplayAll() |
797 input_api = presubmit.InputApi(None, './p', False) | 823 |
798 input_api.change = self.MakeBasicChange('foo', 'Foo\n', '/AA') | 824 input_api = presubmit.InputApi( |
799 input_api.ReadFile('/AA/boo', 'x') | 825 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 826 input_api.change = presubmit.GclChange(ci) |
| 827 input_api.ReadFile(path, 'x') |
800 | 828 |
801 def testReadFileAffectedFileDenied(self): | 829 def testReadFileAffectedFileDenied(self): |
802 file = presubmit.AffectedFile('boo', 'M') | 830 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n') |
| 831 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 832 ci.GetFiles().AndReturn([('M', 'AA')]) |
| 833 file = presubmit.AffectedFile('boo', 'M', 'Unrelated') |
803 self.mox.ReplayAll() | 834 self.mox.ReplayAll() |
804 input_api = presubmit.InputApi(None, './p', False) | 835 |
805 input_api.change = self.MakeBasicChange('foo', 'Foo\n', '/AA') | 836 input_api = presubmit.InputApi( |
806 self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x') | 837 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 838 input_api.change = presubmit.GclChange(ci) |
| 839 self.assertRaises(IOError, input_api.ReadFile, file, 'x') |
807 | 840 |
808 def testReadFileAffectedFileAccepted(self): | 841 def testReadFileAffectedFileAccepted(self): |
809 file = presubmit.AffectedFile('/AA/boo', 'M') | 842 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n') |
810 presubmit.gcl.ReadFile('/AA/boo', 'x').AndReturn(None) | 843 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 844 ci.GetFiles().AndReturn([('M', 'AA')]) |
| 845 file = presubmit.AffectedFile('AA/boo', 'M', self.fake_root_dir) |
| 846 presubmit.gcl.ReadFile(file.AbsoluteLocalPath(), 'x').AndReturn(None) |
811 self.mox.ReplayAll() | 847 self.mox.ReplayAll() |
812 input_api = presubmit.InputApi(None, './p', False) | 848 |
813 input_api.change = self.MakeBasicChange('foo', 'Foo\n', '/AA') | 849 input_api = presubmit.InputApi( |
814 input_api.ReadFile('/AA/boo', 'x') | 850 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 851 input_api.change = presubmit.GclChange(ci) |
| 852 input_api.ReadFile(file, 'x') |
815 | 853 |
816 | 854 |
817 class OuputApiUnittest(PresubmitTestsBase): | 855 class OuputApiUnittest(PresubmitTestsBase): |
818 """Tests presubmit.OutputApi.""" | 856 """Tests presubmit.OutputApi.""" |
819 def testMembersChanged(self): | 857 def testMembersChanged(self): |
820 self.mox.ReplayAll() | 858 self.mox.ReplayAll() |
821 members = [ | 859 members = [ |
822 'MailTextResult', 'PresubmitError', 'PresubmitNotifyResult', | 860 'MailTextResult', 'PresubmitError', 'PresubmitNotifyResult', |
823 'PresubmitPromptWarning', 'PresubmitResult', | 861 'PresubmitPromptWarning', 'PresubmitResult', |
824 ] | 862 ] |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 ).AndReturn('application/octet-stream') | 981 ).AndReturn('application/octet-stream') |
944 self.mox.ReplayAll() | 982 self.mox.ReplayAll() |
945 | 983 |
946 output = filter(lambda x: x.IsTextFile(), list) | 984 output = filter(lambda x: x.IsTextFile(), list) |
947 self.failUnless(len(output) == 1) | 985 self.failUnless(len(output) == 1) |
948 self.failUnless(list[0] == output[0]) | 986 self.failUnless(list[0] == output[0]) |
949 | 987 |
950 | 988 |
951 class GclChangeUnittest(PresubmitTestsBase): | 989 class GclChangeUnittest(PresubmitTestsBase): |
952 def testMembersChanged(self): | 990 def testMembersChanged(self): |
953 self.mox.ReplayAll() | |
954 members = [ | 991 members = [ |
955 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles', | 992 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles', |
956 'DescriptionText', 'FullDescriptionText', 'LocalPaths', 'Name', | 993 'DescriptionText', 'FullDescriptionText', 'LocalPaths', 'Name', |
957 'RepositoryRoot', 'RightHandSideLines', 'ServerPaths', | 994 'RepositoryRoot', 'RightHandSideLines', 'ServerPaths', |
958 'issue', 'patchset', 'tags', | 995 'issue', 'patchset', 'tags', |
959 ] | 996 ] |
960 # If this test fails, you should add the relevant test. | 997 # If this test fails, you should add the relevant test. |
961 ci = presubmit.gcl.ChangeInfo('', 0, 0, '', None) | 998 ci = self.MakeChangeInfo('', 0, 0, '') |
962 self.compareMembers(presubmit.GclChange(ci, self.fake_root_dir), members) | 999 ci.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1000 ci.GetFiles().AndReturn([]) |
| 1001 self.mox.ReplayAll() |
| 1002 |
| 1003 self.compareMembers(presubmit.GclChange(ci), members) |
963 | 1004 |
964 | 1005 |
965 class CannedChecksUnittest(PresubmitTestsBase): | 1006 class CannedChecksUnittest(PresubmitTestsBase): |
966 """Tests presubmit_canned_checks.py.""" | 1007 """Tests presubmit_canned_checks.py.""" |
967 | 1008 |
968 def setUp(self): | 1009 def setUp(self): |
969 PresubmitTestsBase.setUp(self) | 1010 PresubmitTestsBase.setUp(self) |
970 self.mox.StubOutWithMock(presubmit_canned_checks, | 1011 self.mox.StubOutWithMock(presubmit_canned_checks, |
971 '_RunPythonUnitTests_LoadTests') | 1012 '_RunPythonUnitTests_LoadTests') |
972 | 1013 |
(...skipping 19 matching lines...) Expand all Loading... |
992 'CheckDoNotSubmitInDescription', 'CheckDoNotSubmitInFiles', | 1033 'CheckDoNotSubmitInDescription', 'CheckDoNotSubmitInFiles', |
993 'CheckLongLines', 'CheckTreeIsOpen', 'RunPythonUnitTests', | 1034 'CheckLongLines', 'CheckTreeIsOpen', 'RunPythonUnitTests', |
994 ] | 1035 ] |
995 # If this test fails, you should add the relevant test. | 1036 # If this test fails, you should add the relevant test. |
996 self.compareMembers(presubmit_canned_checks, members) | 1037 self.compareMembers(presubmit_canned_checks, members) |
997 | 1038 |
998 def DescriptionTest(self, check, description1, description2, error_type, | 1039 def DescriptionTest(self, check, description1, description2, error_type, |
999 committing): | 1040 committing): |
1000 input_api1 = self.MockInputApi() | 1041 input_api1 = self.MockInputApi() |
1001 input_api1.is_committing = committing | 1042 input_api1.is_committing = committing |
1002 input_api1.change = self.MakeBasicChange('foo', description1) | 1043 ci1 = self.MakeChangeInfo('foo', 0, 0, description1) |
| 1044 ci1.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1045 ci1.GetFiles().AndReturn([]) |
1003 input_api2 = self.MockInputApi() | 1046 input_api2 = self.MockInputApi() |
1004 input_api2.is_committing = committing | 1047 input_api2.is_committing = committing |
1005 input_api2.change = self.MakeBasicChange('foo', description2) | 1048 ci2 = self.MakeChangeInfo('foo', 0, 0, description2) |
| 1049 ci2.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1050 ci2.GetFiles().AndReturn([]) |
1006 self.mox.ReplayAll() | 1051 self.mox.ReplayAll() |
1007 | 1052 |
| 1053 input_api1.change = presubmit.GclChange(ci1) |
| 1054 input_api2.change = presubmit.GclChange(ci2) |
1008 results1 = check(input_api1, presubmit.OutputApi) | 1055 results1 = check(input_api1, presubmit.OutputApi) |
1009 self.assertEquals(results1, []) | 1056 self.assertEquals(results1, []) |
1010 results2 = check(input_api2, presubmit.OutputApi) | 1057 results2 = check(input_api2, presubmit.OutputApi) |
1011 self.assertEquals(len(results2), 1) | 1058 self.assertEquals(len(results2), 1) |
1012 self.assertEquals(results2[0].__class__, error_type) | 1059 self.assertEquals(results2[0].__class__, error_type) |
1013 | 1060 |
1014 def ContentTest(self, check, content1, content2, error_type): | 1061 def ContentTest(self, check, content1, content2, error_type): |
1015 input_api1 = self.MockInputApi() | 1062 input_api1 = self.MockInputApi() |
1016 input_api1.change = self.MakeBasicChange('foo', 'Foo\n') | 1063 ci1 = self.MakeChangeInfo('foo', 0, 0, 'foo1\n') |
| 1064 ci1.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1065 ci1.GetFiles().AndReturn([]) |
1017 affected_file = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1066 affected_file = self.mox.CreateMock(presubmit.SvnAffectedFile) |
1018 affected_file.LocalPath().AndReturn('foo.cc') | 1067 affected_file.LocalPath().AndReturn('foo.cc') |
1019 output1 = [ | 1068 output1 = [ |
1020 (affected_file, 42, 'yo, ' + content1), | 1069 (affected_file, 42, 'yo, ' + content1), |
1021 (affected_file, 43, 'yer'), | 1070 (affected_file, 43, 'yer'), |
1022 (affected_file, 23, 'ya'), | 1071 (affected_file, 23, 'ya'), |
1023 ] | 1072 ] |
1024 input_api1.RightHandSideLines(mox.IgnoreArg()).AndReturn(output1) | 1073 input_api1.RightHandSideLines(mox.IgnoreArg()).AndReturn(output1) |
1025 input_api2 = self.MockInputApi() | 1074 input_api2 = self.MockInputApi() |
1026 input_api2.change = self.MakeBasicChange('foo', 'Foo\n') | 1075 ci2 = self.MakeChangeInfo('foo2', 0, 0, 'foo2\n') |
| 1076 ci2.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1077 ci2.GetFiles().AndReturn([]) |
1027 output2 = [ | 1078 output2 = [ |
1028 (affected_file, 42, 'yo, ' + content2), | 1079 (affected_file, 42, 'yo, ' + content2), |
1029 (affected_file, 43, 'yer'), | 1080 (affected_file, 43, 'yer'), |
1030 (affected_file, 23, 'ya'), | 1081 (affected_file, 23, 'ya'), |
1031 ] | 1082 ] |
1032 input_api2.RightHandSideLines(mox.IgnoreArg()).AndReturn(output2) | 1083 input_api2.RightHandSideLines(mox.IgnoreArg()).AndReturn(output2) |
1033 self.mox.ReplayAll() | 1084 self.mox.ReplayAll() |
1034 | 1085 |
| 1086 input_api1.change = presubmit.GclChange(ci1) |
| 1087 input_api2.change = presubmit.GclChange(ci2) |
1035 results1 = check(input_api1, presubmit.OutputApi, None) | 1088 results1 = check(input_api1, presubmit.OutputApi, None) |
1036 self.assertEquals(results1, []) | 1089 self.assertEquals(results1, []) |
1037 results2 = check(input_api2, presubmit.OutputApi, None) | 1090 results2 = check(input_api2, presubmit.OutputApi, None) |
1038 self.assertEquals(len(results2), 1) | 1091 self.assertEquals(len(results2), 1) |
1039 self.assertEquals(results2[0].__class__, error_type) | 1092 self.assertEquals(results2[0].__class__, error_type) |
1040 | 1093 |
1041 def ReadFileTest(self, check, content1, content2, error_type): | 1094 def ReadFileTest(self, check, content1, content2, error_type): |
1042 input_api1 = self.MockInputApi() | 1095 input_api1 = self.MockInputApi() |
1043 self.mox.StubOutWithMock(input_api1, 'ReadFile') | 1096 self.mox.StubOutWithMock(input_api1, 'ReadFile') |
1044 input_api1.change = self.MakeBasicChange('foo', 'Foo\n') | 1097 ci1 = self.MakeChangeInfo('foo', 0, 0, 'foo1\n') |
| 1098 ci1.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1099 ci1.GetFiles().AndReturn([]) |
1045 affected_file1 = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1100 affected_file1 = self.mox.CreateMock(presubmit.SvnAffectedFile) |
1046 input_api1.AffectedSourceFiles(None).AndReturn([affected_file1]) | 1101 input_api1.AffectedSourceFiles(None).AndReturn([affected_file1]) |
1047 input_api1.ReadFile(affected_file1, 'rb').AndReturn(content1) | 1102 input_api1.ReadFile(affected_file1, 'rb').AndReturn(content1) |
1048 input_api2 = self.MockInputApi() | 1103 input_api2 = self.MockInputApi() |
1049 self.mox.StubOutWithMock(input_api2, 'ReadFile') | 1104 self.mox.StubOutWithMock(input_api2, 'ReadFile') |
1050 input_api2.change = self.MakeBasicChange('foo', 'Foo\n') | 1105 ci2 = self.MakeChangeInfo('foo2', 0, 0, 'foo2\n') |
| 1106 ci2.GetLocalRoot().AndReturn(self.fake_root_dir) |
| 1107 ci2.GetFiles().AndReturn([]) |
1051 affected_file2 = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1108 affected_file2 = self.mox.CreateMock(presubmit.SvnAffectedFile) |
1052 input_api2.AffectedSourceFiles(None).AndReturn([affected_file2]) | 1109 input_api2.AffectedSourceFiles(None).AndReturn([affected_file2]) |
1053 input_api2.ReadFile(affected_file2, 'rb').AndReturn(content2) | 1110 input_api2.ReadFile(affected_file2, 'rb').AndReturn(content2) |
1054 affected_file2.LocalPath().AndReturn('bar.cc') | 1111 affected_file2.LocalPath().AndReturn('bar.cc') |
1055 self.mox.ReplayAll() | 1112 self.mox.ReplayAll() |
1056 | 1113 |
| 1114 input_api1.change = presubmit.GclChange(ci1) |
| 1115 input_api2.change = presubmit.GclChange(ci2) |
1057 results = check(input_api1, presubmit.OutputApi) | 1116 results = check(input_api1, presubmit.OutputApi) |
1058 self.assertEquals(results, []) | 1117 self.assertEquals(results, []) |
1059 results2 = check(input_api2, presubmit.OutputApi) | 1118 results2 = check(input_api2, presubmit.OutputApi) |
1060 self.assertEquals(len(results2), 1) | 1119 self.assertEquals(len(results2), 1) |
1061 self.assertEquals(results2[0].__class__, error_type) | 1120 self.assertEquals(results2[0].__class__, error_type) |
1062 | 1121 |
1063 def SvnPropertyTest(self, check, property, value1, value2, committing, | 1122 def SvnPropertyTest(self, check, property, value1, value2, committing, |
1064 error_type): | 1123 error_type): |
1065 input_api1 = self.MockInputApi() | 1124 input_api1 = self.MockInputApi() |
1066 input_api1.is_committing = committing | 1125 input_api1.is_committing = committing |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 test_result.errors = 0 | 1411 test_result.errors = 0 |
1353 self.mox.ReplayAll() | 1412 self.mox.ReplayAll() |
1354 | 1413 |
1355 results = presubmit_canned_checks.RunPythonUnitTests( | 1414 results = presubmit_canned_checks.RunPythonUnitTests( |
1356 input_api, presubmit.OutputApi, ['test_module']) | 1415 input_api, presubmit.OutputApi, ['test_module']) |
1357 self.assertEquals(len(results), 0) | 1416 self.assertEquals(len(results), 0) |
1358 | 1417 |
1359 | 1418 |
1360 if __name__ == '__main__': | 1419 if __name__ == '__main__': |
1361 unittest.main() | 1420 unittest.main() |
OLD | NEW |