| 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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.fake_root_dir = self.RootDir() | 55 self.fake_root_dir = self.RootDir() |
| 56 self.mox.StubOutWithMock(presubmit.gclient, 'CaptureSVNInfo') | 56 self.mox.StubOutWithMock(presubmit.gclient, 'CaptureSVNInfo') |
| 57 self.mox.StubOutWithMock(presubmit.gcl, 'GetSVNFileProperty') | 57 self.mox.StubOutWithMock(presubmit.gcl, 'GetSVNFileProperty') |
| 58 self.mox.StubOutWithMock(presubmit.gcl, 'ReadFile') | 58 self.mox.StubOutWithMock(presubmit.gcl, 'ReadFile') |
| 59 # Stub any non-getter function in gcl.ChangeInfo. | |
| 60 to_skip = lambda x: not x.startswith('_') and not x.startswith('Get') | |
| 61 for member in filter(to_skip, dir(presubmit.gcl.ChangeInfo)): | |
| 62 self.mox.StubOutWithMock(presubmit.gcl.ChangeInfo, member) | |
| 63 | |
| 64 def MakeChangeInfo(self, name, issue, patchset, description, files): | |
| 65 ci = presubmit.gcl.ChangeInfo(name, issue, patchset, description, files, | |
| 66 self.fake_root_dir) | |
| 67 return ci | |
| 68 | 59 |
| 69 | 60 |
| 70 class PresubmitUnittest(PresubmitTestsBase): | 61 class PresubmitUnittest(PresubmitTestsBase): |
| 71 """General presubmit_support.py tests (excluding InputApi and OutputApi).""" | 62 """General presubmit_support.py tests (excluding InputApi and OutputApi).""" |
| 72 def testMembersChanged(self): | 63 def testMembersChanged(self): |
| 73 self.mox.ReplayAll() | 64 self.mox.ReplayAll() |
| 74 members = [ | 65 members = [ |
| 75 'AffectedFile', 'DoPresubmitChecks', 'GclChange', 'InputApi', | 66 'AffectedFile', 'Change', 'DoPresubmitChecks', 'InputApi', |
| 76 'ListRelevantPresubmitFiles', 'Main', 'NotImplementedException', | 67 'ListRelevantPresubmitFiles', 'Main', 'NotImplementedException', |
| 77 'OutputApi', 'ParseFiles', 'PresubmitExecuter', 'ScanSubDirs', | 68 'OutputApi', 'ParseFiles', 'PresubmitExecuter', 'ScanSubDirs', |
| 78 'SvnAffectedFile', | 69 'SvnAffectedFile', 'SvnChange', |
| 79 'cPickle', 'cStringIO', 'exceptions', | 70 'cPickle', 'cStringIO', 'exceptions', |
| 80 'fnmatch', 'gcl', 'gclient', 'glob', 'logging', 'marshal', 'normpath', | 71 'fnmatch', 'gcl', 'gclient', 'glob', 'logging', 'marshal', 'normpath', |
| 81 'optparse', | 72 'optparse', |
| 82 'os', 'pickle', 'presubmit_canned_checks', 're', 'subprocess', 'sys', | 73 'os', 'pickle', 'presubmit_canned_checks', 're', 'subprocess', 'sys', |
| 83 'tempfile', 'traceback', 'types', 'unittest', 'urllib2', 'warnings', | 74 'tempfile', 'traceback', 'types', 'unittest', 'urllib2', 'warnings', |
| 84 ] | 75 ] |
| 85 # If this test fails, you should add the relevant test. | 76 # If this test fails, you should add the relevant test. |
| 86 self.compareMembers(presubmit, members) | 77 self.compareMembers(presubmit, members) |
| 87 | 78 |
| 88 def testListRelevantPresubmitFiles(self): | 79 def testListRelevantPresubmitFiles(self): |
| (...skipping 11 matching lines...) Expand all Loading... |
| 100 presubmit.os.path.isfile(join(self.fake_root_dir, 'foo', 'haspresubmit', | 91 presubmit.os.path.isfile(join(self.fake_root_dir, 'foo', 'haspresubmit', |
| 101 'PRESUBMIT.py')).AndReturn(True) | 92 'PRESUBMIT.py')).AndReturn(True) |
| 102 presubmit.os.path.isfile(join(self.fake_root_dir, 'foo', 'haspresubmit', | 93 presubmit.os.path.isfile(join(self.fake_root_dir, 'foo', 'haspresubmit', |
| 103 'yodle', 'PRESUBMIT.py')).AndReturn(True) | 94 'yodle', 'PRESUBMIT.py')).AndReturn(True) |
| 104 presubmit.os.path.isfile(join(self.fake_root_dir, 'moo', | 95 presubmit.os.path.isfile(join(self.fake_root_dir, 'moo', |
| 105 'PRESUBMIT.py')).AndReturn(False) | 96 'PRESUBMIT.py')).AndReturn(False) |
| 106 presubmit.os.path.isfile(join(self.fake_root_dir, 'moo', 'mat', | 97 presubmit.os.path.isfile(join(self.fake_root_dir, 'moo', 'mat', |
| 107 'PRESUBMIT.py')).AndReturn(False) | 98 'PRESUBMIT.py')).AndReturn(False) |
| 108 presubmit.os.path.isfile(join(self.fake_root_dir, 'moo', 'mat', 'gat', | 99 presubmit.os.path.isfile(join(self.fake_root_dir, 'moo', 'mat', 'gat', |
| 109 'PRESUBMIT.py')).AndReturn(False) | 100 'PRESUBMIT.py')).AndReturn(False) |
| 110 #isfile(join('moo', 'PRESUBMIT.py')).AndReturn(False) | |
| 111 self.mox.ReplayAll() | 101 self.mox.ReplayAll() |
| 112 | 102 |
| 113 presubmit_files = presubmit.ListRelevantPresubmitFiles(files, | 103 presubmit_files = presubmit.ListRelevantPresubmitFiles(files, |
| 114 self.fake_root_dir) | 104 self.fake_root_dir) |
| 115 self.assertEqual(presubmit_files, | 105 self.assertEqual(presubmit_files, |
| 116 [ | 106 [ |
| 117 join(self.fake_root_dir, 'PRESUBMIT.py'), | 107 join(self.fake_root_dir, 'PRESUBMIT.py'), |
| 118 join(self.fake_root_dir, 'foo', 'haspresubmit', 'PRESUBMIT.py'), | 108 join(self.fake_root_dir, 'foo', 'haspresubmit', 'PRESUBMIT.py'), |
| 119 join(self.fake_root_dir, 'foo', 'haspresubmit', 'yodle', | 109 join(self.fake_root_dir, 'foo', 'haspresubmit', 'yodle', |
| 120 'PRESUBMIT.py') | 110 'PRESUBMIT.py') |
| 121 ]) | 111 ]) |
| 122 | 112 |
| 123 def testTagLineRe(self): | 113 def testTagLineRe(self): |
| 124 self.mox.ReplayAll() | 114 self.mox.ReplayAll() |
| 125 m = presubmit.GclChange._tag_line_re.match(' BUG =1223, 1445 \t') | 115 m = presubmit.Change._TAG_LINE_RE.match(' BUG =1223, 1445 \t') |
| 126 self.failUnless(m) | 116 self.failUnless(m) |
| 127 self.failUnlessEqual(m.group('key'), 'BUG') | 117 self.failUnlessEqual(m.group('key'), 'BUG') |
| 128 self.failUnlessEqual(m.group('value'), '1223, 1445') | 118 self.failUnlessEqual(m.group('value'), '1223, 1445') |
| 129 | 119 |
| 130 def testGclChange(self): | 120 def testGclChange(self): |
| 131 description_lines = ('Hello there', | 121 description_lines = ('Hello there', |
| 132 'this is a change', | 122 'this is a change', |
| 133 'BUG=123', | 123 'BUG=123', |
| 134 ' STORY =http://foo/ \t', | 124 ' STORY =http://foo/ \t', |
| 135 'and some more regular text \t') | 125 'and some more regular text \t') |
| (...skipping 27 matching lines...) Expand all Loading... |
| 163 notfound, 'svn:mime-type').AndReturn('') | 153 notfound, 'svn:mime-type').AndReturn('') |
| 164 presubmit.gclient.CaptureSVNInfo(blat).AndReturn( | 154 presubmit.gclient.CaptureSVNInfo(blat).AndReturn( |
| 165 {'URL': 'svn:/foo/foo/blat.cc'}) | 155 {'URL': 'svn:/foo/foo/blat.cc'}) |
| 166 presubmit.gclient.CaptureSVNInfo(binary).AndReturn( | 156 presubmit.gclient.CaptureSVNInfo(binary).AndReturn( |
| 167 {'URL': 'svn:/foo/binary.dll'}) | 157 {'URL': 'svn:/foo/binary.dll'}) |
| 168 presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({}) | 158 presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({}) |
| 169 presubmit.gclient.CaptureSVNInfo(flap).AndReturn( | 159 presubmit.gclient.CaptureSVNInfo(flap).AndReturn( |
| 170 {'URL': 'svn:/foo/boo/flap.h'}) | 160 {'URL': 'svn:/foo/boo/flap.h'}) |
| 171 presubmit.gcl.ReadFile(blat).AndReturn('boo!\nahh?') | 161 presubmit.gcl.ReadFile(blat).AndReturn('boo!\nahh?') |
| 172 presubmit.gcl.ReadFile(notfound).AndReturn('look!\nthere?') | 162 presubmit.gcl.ReadFile(notfound).AndReturn('look!\nthere?') |
| 173 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 174 files) | |
| 175 self.mox.ReplayAll() | 163 self.mox.ReplayAll() |
| 176 | 164 |
| 177 change = presubmit.GclChange(ci) | 165 change = presubmit.SvnChange('mychange', '\n'.join(description_lines), |
| 178 | 166 self.fake_root_dir, files, 0, 0) |
| 179 self.failUnless(change.Name() == 'mychange') | 167 self.failUnless(change.Name() == 'mychange') |
| 180 self.failUnless(change.DescriptionText() == | 168 self.failUnless(change.DescriptionText() == |
| 181 'Hello there\nthis is a change\nand some more regular text') | 169 'Hello there\nthis is a change\nand some more regular text') |
| 182 self.failUnless(change.FullDescriptionText() == | 170 self.failUnless(change.FullDescriptionText() == |
| 183 '\n'.join(description_lines)) | 171 '\n'.join(description_lines)) |
| 184 | 172 |
| 185 self.failUnless(change.BUG == '123') | 173 self.failUnless(change.BUG == '123') |
| 186 self.failUnless(change.STORY == 'http://foo/') | 174 self.failUnless(change.STORY == 'http://foo/') |
| 175 self.failUnless(change.BLEH == None) |
| 187 | 176 |
| 188 self.failUnless(len(change.AffectedFiles()) == 4) | 177 self.failUnless(len(change.AffectedFiles()) == 4) |
| 189 self.failUnless(len(change.AffectedFiles(include_dirs=True)) == 5) | 178 self.failUnless(len(change.AffectedFiles(include_dirs=True)) == 5) |
| 190 self.failUnless(len(change.AffectedFiles(include_deletes=False)) == 3) | 179 self.failUnless(len(change.AffectedFiles(include_deletes=False)) == 3) |
| 191 self.failUnless(len(change.AffectedFiles(include_dirs=True, | 180 self.failUnless(len(change.AffectedFiles(include_dirs=True, |
| 192 include_deletes=False)) == 4) | 181 include_deletes=False)) == 4) |
| 193 | 182 |
| 194 affected_text_files = change.AffectedTextFiles() | 183 affected_text_files = change.AffectedTextFiles() |
| 195 self.failUnless(len(affected_text_files) == 2) | 184 self.failUnless(len(affected_text_files) == 2) |
| 196 self.failIf(filter(lambda x: x.LocalPath() == 'binary.dll', | 185 self.failIf(filter(lambda x: x.LocalPath() == 'binary.dll', |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 self.assertEquals(rhs_lines[3][2], 'there?') | 219 self.assertEquals(rhs_lines[3][2], 'there?') |
| 231 | 220 |
| 232 def testExecPresubmitScript(self): | 221 def testExecPresubmitScript(self): |
| 233 description_lines = ('Hello there', | 222 description_lines = ('Hello there', |
| 234 'this is a change', | 223 'this is a change', |
| 235 'STORY=http://tracker/123') | 224 'STORY=http://tracker/123') |
| 236 files = [ | 225 files = [ |
| 237 ['A', 'foo\\blat.cc'], | 226 ['A', 'foo\\blat.cc'], |
| 238 ] | 227 ] |
| 239 fake_presubmit = presubmit.os.path.join(self.fake_root_dir, 'PRESUBMIT.py') | 228 fake_presubmit = presubmit.os.path.join(self.fake_root_dir, 'PRESUBMIT.py') |
| 240 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 241 files) | |
| 242 self.mox.ReplayAll() | 229 self.mox.ReplayAll() |
| 243 | 230 |
| 244 executer = presubmit.PresubmitExecuter(ci, False) | 231 change = presubmit.Change('mychange', '\n'.join(description_lines), |
| 232 self.fake_root_dir, files, 0, 0) |
| 233 executer = presubmit.PresubmitExecuter(change, False) |
| 245 self.failIf(executer.ExecPresubmitScript('', fake_presubmit)) | 234 self.failIf(executer.ExecPresubmitScript('', fake_presubmit)) |
| 246 # No error if no on-upload entry point | 235 # No error if no on-upload entry point |
| 247 self.failIf(executer.ExecPresubmitScript( | 236 self.failIf(executer.ExecPresubmitScript( |
| 248 ('def CheckChangeOnCommit(input_api, output_api):\n' | 237 ('def CheckChangeOnCommit(input_api, output_api):\n' |
| 249 ' return (output_api.PresubmitError("!!"))\n'), | 238 ' return (output_api.PresubmitError("!!"))\n'), |
| 250 fake_presubmit | 239 fake_presubmit |
| 251 )) | 240 )) |
| 252 | 241 |
| 253 executer = presubmit.PresubmitExecuter(ci, True) | 242 executer = presubmit.PresubmitExecuter(change, True) |
| 254 # No error if no on-commit entry point | 243 # No error if no on-commit entry point |
| 255 self.failIf(executer.ExecPresubmitScript( | 244 self.failIf(executer.ExecPresubmitScript( |
| 256 ('def CheckChangeOnUpload(input_api, output_api):\n' | 245 ('def CheckChangeOnUpload(input_api, output_api):\n' |
| 257 ' return (output_api.PresubmitError("!!"))\n'), | 246 ' return (output_api.PresubmitError("!!"))\n'), |
| 258 fake_presubmit | 247 fake_presubmit |
| 259 )) | 248 )) |
| 260 | 249 |
| 261 self.failIf(executer.ExecPresubmitScript( | 250 self.failIf(executer.ExecPresubmitScript( |
| 262 ('def CheckChangeOnUpload(input_api, output_api):\n' | 251 ('def CheckChangeOnUpload(input_api, output_api):\n' |
| 263 ' if not input_api.change.STORY:\n' | 252 ' if not input_api.change.STORY:\n' |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 ['A', join('haspresubmit', 'blat.cc')], | 286 ['A', join('haspresubmit', 'blat.cc')], |
| 298 ] | 287 ] |
| 299 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') | 288 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') |
| 300 root_path = join(self.fake_root_dir, 'PRESUBMIT.py') | 289 root_path = join(self.fake_root_dir, 'PRESUBMIT.py') |
| 301 presubmit.os.path.isfile(root_path).AndReturn(True) | 290 presubmit.os.path.isfile(root_path).AndReturn(True) |
| 302 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) | 291 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) |
| 303 presubmit.gcl.ReadFile(root_path, | 292 presubmit.gcl.ReadFile(root_path, |
| 304 'rU').AndReturn(self.presubmit_text) | 293 'rU').AndReturn(self.presubmit_text) |
| 305 presubmit.gcl.ReadFile(haspresubmit_path, | 294 presubmit.gcl.ReadFile(haspresubmit_path, |
| 306 'rU').AndReturn(self.presubmit_text) | 295 'rU').AndReturn(self.presubmit_text) |
| 307 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 308 files) | |
| 309 self.mox.ReplayAll() | 296 self.mox.ReplayAll() |
| 310 | 297 |
| 311 output = StringIO.StringIO() | 298 output = StringIO.StringIO() |
| 312 input = StringIO.StringIO('y\n') | 299 input = StringIO.StringIO('y\n') |
| 313 | 300 change = presubmit.Change('mychange', '\n'.join(description_lines), |
| 314 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 301 self.fake_root_dir, files, 0, 0) |
| 302 self.failIf(presubmit.DoPresubmitChecks(change, False, True, output, input, |
| 315 None, False)) | 303 None, False)) |
| 316 self.assertEqual(output.getvalue().count('!!'), 2) | 304 self.assertEqual(output.getvalue().count('!!'), 2) |
| 317 | 305 |
| 318 def testDoPresubmitChecksPromptsAfterWarnings(self): | 306 def testDoPresubmitChecksPromptsAfterWarnings(self): |
| 319 join = presubmit.os.path.join | 307 join = presubmit.os.path.join |
| 320 description_lines = ('Hello there', | 308 description_lines = ('Hello there', |
| 321 'this is a change', | 309 'this is a change', |
| 322 'NOSUCHKEY=http://tracker/123') | 310 'NOSUCHKEY=http://tracker/123') |
| 323 files = [ | 311 files = [ |
| 324 ['A', join('haspresubmit', 'blat.cc')], | 312 ['A', join('haspresubmit', 'blat.cc')], |
| 325 ] | 313 ] |
| 326 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') | 314 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') |
| 327 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') | 315 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', 'PRESUBMIT.py') |
| 328 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 329 files) | |
| 330 for i in range(2): | 316 for i in range(2): |
| 331 presubmit.os.path.isfile(presubmit_path).AndReturn(True) | 317 presubmit.os.path.isfile(presubmit_path).AndReturn(True) |
| 332 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) | 318 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) |
| 333 presubmit.gcl.ReadFile(presubmit_path, 'rU' | 319 presubmit.gcl.ReadFile(presubmit_path, 'rU' |
| 334 ).AndReturn(self.presubmit_text) | 320 ).AndReturn(self.presubmit_text) |
| 335 presubmit.gcl.ReadFile(haspresubmit_path, 'rU' | 321 presubmit.gcl.ReadFile(haspresubmit_path, 'rU' |
| 336 ).AndReturn(self.presubmit_text) | 322 ).AndReturn(self.presubmit_text) |
| 337 self.mox.ReplayAll() | 323 self.mox.ReplayAll() |
| 338 | 324 |
| 339 output = StringIO.StringIO() | 325 output = StringIO.StringIO() |
| 340 input = StringIO.StringIO('n\n') # say no to the warning | 326 input = StringIO.StringIO('n\n') # say no to the warning |
| 341 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 327 change = presubmit.Change('mychange', '\n'.join(description_lines), |
| 328 self.fake_root_dir, files, 0, 0) |
| 329 self.failIf(presubmit.DoPresubmitChecks(change, False, True, output, input, |
| 342 None, True)) | 330 None, True)) |
| 343 self.assertEqual(output.getvalue().count('??'), 2) | 331 self.assertEqual(output.getvalue().count('??'), 2) |
| 344 | 332 |
| 345 output = StringIO.StringIO() | 333 output = StringIO.StringIO() |
| 346 input = StringIO.StringIO('y\n') # say yes to the warning | 334 input = StringIO.StringIO('y\n') # say yes to the warning |
| 347 self.failUnless(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 335 self.failUnless(presubmit.DoPresubmitChecks(change, False, True, output, |
| 348 None, True)) | 336 input, None, True)) |
| 349 self.assertEquals(output.getvalue().count('??'), 2) | 337 self.assertEquals(output.getvalue().count('??'), 2) |
| 350 | 338 |
| 351 def testDoPresubmitChecksNoWarningPromptIfErrors(self): | 339 def testDoPresubmitChecksNoWarningPromptIfErrors(self): |
| 352 join = presubmit.os.path.join | 340 join = presubmit.os.path.join |
| 353 description_lines = ('Hello there', | 341 description_lines = ('Hello there', |
| 354 'this is a change', | 342 'this is a change', |
| 355 'NOSUCHKEY=http://tracker/123', | 343 'NOSUCHKEY=http://tracker/123', |
| 356 'REALLYNOSUCHKEY=http://tracker/123') | 344 'REALLYNOSUCHKEY=http://tracker/123') |
| 357 files = [ | 345 files = [ |
| 358 ['A', join('haspresubmit', 'blat.cc')], | 346 ['A', join('haspresubmit', 'blat.cc')], |
| 359 ] | 347 ] |
| 360 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') | 348 presubmit_path = join(self.fake_root_dir, 'PRESUBMIT.py') |
| 361 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', | 349 haspresubmit_path = join(self.fake_root_dir, 'haspresubmit', |
| 362 'PRESUBMIT.py') | 350 'PRESUBMIT.py') |
| 363 presubmit.os.path.isfile(presubmit_path).AndReturn(True) | 351 presubmit.os.path.isfile(presubmit_path).AndReturn(True) |
| 364 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) | 352 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) |
| 365 presubmit.gcl.ReadFile(presubmit_path, 'rU').AndReturn(self.presubmit_text) | 353 presubmit.gcl.ReadFile(presubmit_path, 'rU').AndReturn(self.presubmit_text) |
| 366 presubmit.gcl.ReadFile(haspresubmit_path, 'rU').AndReturn( | 354 presubmit.gcl.ReadFile(haspresubmit_path, 'rU').AndReturn( |
| 367 self.presubmit_text) | 355 self.presubmit_text) |
| 368 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 369 files) | |
| 370 self.mox.ReplayAll() | 356 self.mox.ReplayAll() |
| 371 | 357 |
| 372 output = StringIO.StringIO() | 358 output = StringIO.StringIO() |
| 373 input = StringIO.StringIO() # should be unused | 359 input = StringIO.StringIO() # should be unused |
| 374 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 360 change = presubmit.Change('mychange', '\n'.join(description_lines), |
| 361 self.fake_root_dir, files, 0, 0) |
| 362 self.failIf(presubmit.DoPresubmitChecks(change, False, True, output, input, |
| 375 None, False)) | 363 None, False)) |
| 376 self.assertEqual(output.getvalue().count('??'), 2) | 364 self.assertEqual(output.getvalue().count('??'), 2) |
| 377 self.assertEqual(output.getvalue().count('XX!!XX'), 2) | 365 self.assertEqual(output.getvalue().count('XX!!XX'), 2) |
| 378 self.assertEqual(output.getvalue().count('(y/N)'), 0) | 366 self.assertEqual(output.getvalue().count('(y/N)'), 0) |
| 379 | 367 |
| 380 def testDoDefaultPresubmitChecks(self): | 368 def testDoDefaultPresubmitChecks(self): |
| 381 join = presubmit.os.path.join | 369 join = presubmit.os.path.join |
| 382 description_lines = ('Hello there', | 370 description_lines = ('Hello there', |
| 383 'this is a change', | 371 'this is a change', |
| 384 'STORY=http://tracker/123') | 372 'STORY=http://tracker/123') |
| 385 files = [ | 373 files = [ |
| 386 ['A', join('haspresubmit', 'blat.cc')], | 374 ['A', join('haspresubmit', 'blat.cc')], |
| 387 ] | 375 ] |
| 388 DEFAULT_SCRIPT = """ | 376 DEFAULT_SCRIPT = """ |
| 389 def CheckChangeOnUpload(input_api, output_api): | 377 def CheckChangeOnUpload(input_api, output_api): |
| 390 return [output_api.PresubmitError("!!")] | 378 return [output_api.PresubmitError("!!")] |
| 391 def CheckChangeOnCommit(input_api, output_api): | 379 def CheckChangeOnCommit(input_api, output_api): |
| 392 raise Exception("Test error") | 380 raise Exception("Test error") |
| 393 """ | 381 """ |
| 394 presubmit.os.path.isfile(join(self.fake_root_dir, 'PRESUBMIT.py') | 382 presubmit.os.path.isfile(join(self.fake_root_dir, 'PRESUBMIT.py') |
| 395 ).AndReturn(False) | 383 ).AndReturn(False) |
| 396 presubmit.os.path.isfile(join(self.fake_root_dir, | 384 presubmit.os.path.isfile(join(self.fake_root_dir, |
| 397 'haspresubmit', | 385 'haspresubmit', |
| 398 'PRESUBMIT.py')).AndReturn(False) | 386 'PRESUBMIT.py')).AndReturn(False) |
| 399 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 400 files) | |
| 401 self.mox.ReplayAll() | 387 self.mox.ReplayAll() |
| 402 | 388 |
| 403 output = StringIO.StringIO() | 389 output = StringIO.StringIO() |
| 404 input = StringIO.StringIO('y\n') | 390 input = StringIO.StringIO('y\n') |
| 405 # Always fail. | 391 # Always fail. |
| 406 self.failIf(presubmit.DoPresubmitChecks(ci, False, True, output, input, | 392 change = presubmit.Change('mychange', '\n'.join(description_lines), |
| 393 self.fake_root_dir, files, 0, 0) |
| 394 self.failIf(presubmit.DoPresubmitChecks(change, False, True, output, input, |
| 407 DEFAULT_SCRIPT, False)) | 395 DEFAULT_SCRIPT, False)) |
| 408 self.assertEquals(output.getvalue().count('!!'), 1) | 396 self.assertEquals(output.getvalue().count('!!'), 1) |
| 409 | 397 |
| 410 def testDirectoryHandling(self): | 398 def testDirectoryHandling(self): |
| 411 files = [ | 399 files = [ |
| 412 ['A', 'isdir'], | 400 ['A', 'isdir'], |
| 413 ['A', 'isdir\\blat.cc'], | 401 ['A', 'isdir\\blat.cc'], |
| 414 ] | 402 ] |
| 415 isdir = presubmit.os.path.join(self.fake_root_dir, 'isdir') | 403 isdir = presubmit.os.path.join(self.fake_root_dir, 'isdir') |
| 416 blat = presubmit.os.path.join(isdir, 'blat.cc') | 404 blat = presubmit.os.path.join(isdir, 'blat.cc') |
| 417 presubmit.os.path.exists(isdir).AndReturn(True) | 405 presubmit.os.path.exists(isdir).AndReturn(True) |
| 418 presubmit.os.path.isdir(isdir).AndReturn(True) | 406 presubmit.os.path.isdir(isdir).AndReturn(True) |
| 419 presubmit.os.path.exists(blat).AndReturn(True) | 407 presubmit.os.path.exists(blat).AndReturn(True) |
| 420 presubmit.os.path.isdir(blat).AndReturn(False) | 408 presubmit.os.path.isdir(blat).AndReturn(False) |
| 421 ci = self.MakeChangeInfo('mychange', 0, 0, 'foo', files) | |
| 422 self.mox.ReplayAll() | 409 self.mox.ReplayAll() |
| 423 | 410 |
| 424 change = presubmit.GclChange(ci) | 411 change = presubmit.Change('mychange', 'foo', self.fake_root_dir, files, |
| 412 0, 0) |
| 425 affected_files = change.AffectedFiles(include_dirs=False) | 413 affected_files = change.AffectedFiles(include_dirs=False) |
| 426 self.failUnless(len(affected_files) == 1) | 414 self.failUnless(len(affected_files) == 1) |
| 427 self.failUnless(affected_files[0].LocalPath().endswith('blat.cc')) | 415 self.failUnless(affected_files[0].LocalPath().endswith('blat.cc')) |
| 428 affected_files_and_dirs = change.AffectedFiles(include_dirs=True) | 416 affected_files_and_dirs = change.AffectedFiles(include_dirs=True) |
| 429 self.failUnless(len(affected_files_and_dirs) == 2) | 417 self.failUnless(len(affected_files_and_dirs) == 2) |
| 430 | 418 |
| 431 def testTags(self): | 419 def testTags(self): |
| 432 DEFAULT_SCRIPT = """ | 420 DEFAULT_SCRIPT = """ |
| 433 def CheckChangeOnUpload(input_api, output_api): | 421 def CheckChangeOnUpload(input_api, output_api): |
| 434 if input_api.change.tags['BUG'] != 'boo': | 422 if input_api.change.tags['BUG'] != 'boo': |
| (...skipping 17 matching lines...) Expand all Loading... |
| 452 return [output_api.PresubmitError('Tag parsing failed. 4 ' + | 440 return [output_api.PresubmitError('Tag parsing failed. 4 ' + |
| 453 input_api.change.DescriptionText())] | 441 input_api.change.DescriptionText())] |
| 454 if (input_api.change.FullDescriptionText() != | 442 if (input_api.change.FullDescriptionText() != |
| 455 'Blah Blah\\n\\nSTORY=http://tracker.com/42\\nBUG=boo\\n'): | 443 'Blah Blah\\n\\nSTORY=http://tracker.com/42\\nBUG=boo\\n'): |
| 456 return [output_api.PresubmitError('Tag parsing failed. 5 ' + | 444 return [output_api.PresubmitError('Tag parsing failed. 5 ' + |
| 457 input_api.change.FullDescriptionText())] | 445 input_api.change.FullDescriptionText())] |
| 458 return [output_api.PresubmitNotifyResult(input_api.change.tags['STORY'])] | 446 return [output_api.PresubmitNotifyResult(input_api.change.tags['STORY'])] |
| 459 def CheckChangeOnCommit(input_api, output_api): | 447 def CheckChangeOnCommit(input_api, output_api): |
| 460 raise Exception("Test error") | 448 raise Exception("Test error") |
| 461 """ | 449 """ |
| 462 ci = self.MakeChangeInfo( | |
| 463 'foo', 0, 0, "Blah Blah\n\nSTORY=http://tracker.com/42\nBUG=boo\n", | |
| 464 None) | |
| 465 self.mox.ReplayAll() | 450 self.mox.ReplayAll() |
| 466 | 451 |
| 467 output = StringIO.StringIO() | 452 output = StringIO.StringIO() |
| 468 input = StringIO.StringIO('y\n') | 453 input = StringIO.StringIO('y\n') |
| 469 self.failUnless(presubmit.DoPresubmitChecks(ci, False, True, output, | 454 change = presubmit.Change( |
| 455 'foo', "Blah Blah\n\nSTORY=http://tracker.com/42\nBUG=boo\n", |
| 456 self.fake_root_dir, None, 0, 0) |
| 457 self.failUnless(presubmit.DoPresubmitChecks(change, False, True, output, |
| 470 input, DEFAULT_SCRIPT, False)) | 458 input, DEFAULT_SCRIPT, False)) |
| 471 self.assertEquals(output.getvalue(), | 459 self.assertEquals(output.getvalue(), |
| 472 ('Warning, no presubmit.py found.\n' | 460 ('Warning, no presubmit.py found.\n' |
| 473 'Running default presubmit script.\n' | 461 'Running default presubmit script.\n' |
| 474 '** Presubmit Messages **\n' | 462 '** Presubmit Messages **\n' |
| 475 'http://tracker.com/42\n\n')) | 463 'http://tracker.com/42\n\n')) |
| 476 | 464 |
| 477 | 465 |
| 478 class InputApiUnittest(PresubmitTestsBase): | 466 class InputApiUnittest(PresubmitTestsBase): |
| 479 """Tests presubmit.InputApi.""" | 467 """Tests presubmit.InputApi.""" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None) | 553 presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None) |
| 566 presubmit.gcl.GetSVNFileProperty(readme, 'svn:mime-type').AndReturn(None) | 554 presubmit.gcl.GetSVNFileProperty(readme, 'svn:mime-type').AndReturn(None) |
| 567 presubmit.gcl.GetSVNFileProperty(binary, 'svn:mime-type').AndReturn( | 555 presubmit.gcl.GetSVNFileProperty(binary, 'svn:mime-type').AndReturn( |
| 568 'application/octet-stream') | 556 'application/octet-stream') |
| 569 presubmit.gcl.GetSVNFileProperty(weird, 'svn:mime-type').AndReturn(None) | 557 presubmit.gcl.GetSVNFileProperty(weird, 'svn:mime-type').AndReturn(None) |
| 570 presubmit.gcl.GetSVNFileProperty(another, 'svn:mime-type').AndReturn(None) | 558 presubmit.gcl.GetSVNFileProperty(another, 'svn:mime-type').AndReturn(None) |
| 571 presubmit.gcl.GetSVNFileProperty(third_party, 'svn:mime-type' | 559 presubmit.gcl.GetSVNFileProperty(third_party, 'svn:mime-type' |
| 572 ).AndReturn(None) | 560 ).AndReturn(None) |
| 573 presubmit.gcl.ReadFile(blat).AndReturn('whatever\ncookie') | 561 presubmit.gcl.ReadFile(blat).AndReturn('whatever\ncookie') |
| 574 presubmit.gcl.ReadFile(another).AndReturn('whatever\ncookie2') | 562 presubmit.gcl.ReadFile(another).AndReturn('whatever\ncookie2') |
| 575 ci = self.MakeChangeInfo('mychange', 0, 0, '\n'.join(description_lines), | |
| 576 files) | |
| 577 self.mox.ReplayAll() | 563 self.mox.ReplayAll() |
| 578 | 564 |
| 579 change = presubmit.GclChange(ci) | 565 change = presubmit.SvnChange('mychange', '\n'.join(description_lines), |
| 566 self.fake_root_dir, files, 0, 0) |
| 580 input_api = presubmit.InputApi(change, | 567 input_api = presubmit.InputApi(change, |
| 581 join(self.fake_root_dir, 'foo', | 568 join(self.fake_root_dir, 'foo', |
| 582 'PRESUBMIT.py'), | 569 'PRESUBMIT.py'), |
| 583 False) | 570 False) |
| 584 # Doesn't filter much | 571 # Doesn't filter much |
| 585 got_files = input_api.AffectedFiles() | 572 got_files = input_api.AffectedFiles() |
| 586 self.assertEquals(len(got_files), 7) | 573 self.assertEquals(len(got_files), 7) |
| 587 self.assertEquals(got_files[0].LocalPath(), presubmit.normpath(files[0][1])) | 574 self.assertEquals(got_files[0].LocalPath(), presubmit.normpath(files[0][1])) |
| 588 self.assertEquals(got_files[1].LocalPath(), presubmit.normpath(files[1][1])) | 575 self.assertEquals(got_files[1].LocalPath(), presubmit.normpath(files[1][1])) |
| 589 self.assertEquals(got_files[2].LocalPath(), presubmit.normpath(files[2][1])) | 576 self.assertEquals(got_files[2].LocalPath(), presubmit.normpath(files[2][1])) |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 | 665 |
| 679 def testCustomFilter(self): | 666 def testCustomFilter(self): |
| 680 def FilterSourceFile(affected_file): | 667 def FilterSourceFile(affected_file): |
| 681 return 'a' in affected_file.LocalPath() | 668 return 'a' in affected_file.LocalPath() |
| 682 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee')] | 669 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee')] |
| 683 for (action, item) in files: | 670 for (action, item) in files: |
| 684 item = presubmit.os.path.join(self.fake_root_dir, item) | 671 item = presubmit.os.path.join(self.fake_root_dir, item) |
| 685 presubmit.os.path.exists(item).AndReturn(True) | 672 presubmit.os.path.exists(item).AndReturn(True) |
| 686 presubmit.os.path.isdir(item).AndReturn(False) | 673 presubmit.os.path.isdir(item).AndReturn(False) |
| 687 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) | 674 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) |
| 688 ci = self.MakeChangeInfo('mychange', 0, 0, '', files) | |
| 689 self.mox.ReplayAll() | 675 self.mox.ReplayAll() |
| 690 | 676 |
| 691 change = presubmit.GclChange(ci) | 677 change = presubmit.SvnChange('mychange', '', self.fake_root_dir, files, 0, |
| 678 0) |
| 692 input_api = presubmit.InputApi(change, | 679 input_api = presubmit.InputApi(change, |
| 693 presubmit.os.path.join(self.fake_root_dir, | 680 presubmit.os.path.join(self.fake_root_dir, |
| 694 'PRESUBMIT.py'), | 681 'PRESUBMIT.py'), |
| 695 False) | 682 False) |
| 696 got_files = input_api.AffectedSourceFiles(FilterSourceFile) | 683 got_files = input_api.AffectedSourceFiles(FilterSourceFile) |
| 697 self.assertEquals(len(got_files), 2) | 684 self.assertEquals(len(got_files), 2) |
| 698 self.assertEquals(got_files[0].LocalPath(), 'eeaee') | 685 self.assertEquals(got_files[0].LocalPath(), 'eeaee') |
| 699 self.assertEquals(got_files[1].LocalPath(), 'eeabee') | 686 self.assertEquals(got_files[1].LocalPath(), 'eeabee') |
| 700 | 687 |
| 701 def testLambdaFilter(self): | 688 def testLambdaFilter(self): |
| 702 white_list = presubmit.InputApi.DEFAULT_BLACK_LIST + (r".*?a.*?",) | 689 white_list = presubmit.InputApi.DEFAULT_BLACK_LIST + (r".*?a.*?",) |
| 703 black_list = [r".*?b.*?"] | 690 black_list = [r".*?b.*?"] |
| 704 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee'), ('M', 'eecaee')] | 691 files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee'), ('M', 'eecaee')] |
| 705 for (action, item) in files: | 692 for (action, item) in files: |
| 706 item = presubmit.os.path.join(self.fake_root_dir, item) | 693 item = presubmit.os.path.join(self.fake_root_dir, item) |
| 707 presubmit.os.path.exists(item).AndReturn(True) | 694 presubmit.os.path.exists(item).AndReturn(True) |
| 708 presubmit.os.path.isdir(item).AndReturn(False) | 695 presubmit.os.path.isdir(item).AndReturn(False) |
| 709 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) | 696 presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None) |
| 710 ci = self.MakeChangeInfo('mychange', 0, 0, '', files) | |
| 711 self.mox.ReplayAll() | 697 self.mox.ReplayAll() |
| 712 | 698 |
| 713 change = presubmit.GclChange(ci) | 699 change = presubmit.SvnChange('mychange', '', self.fake_root_dir, files, 0, |
| 700 0) |
| 714 input_api = presubmit.InputApi(change, './PRESUBMIT.py', False) | 701 input_api = presubmit.InputApi(change, './PRESUBMIT.py', False) |
| 715 # Sample usage of overiding the default white and black lists. | 702 # Sample usage of overiding the default white and black lists. |
| 716 got_files = input_api.AffectedSourceFiles( | 703 got_files = input_api.AffectedSourceFiles( |
| 717 lambda x: input_api.FilterSourceFile(x, white_list, black_list)) | 704 lambda x: input_api.FilterSourceFile(x, white_list, black_list)) |
| 718 self.assertEquals(len(got_files), 2) | 705 self.assertEquals(len(got_files), 2) |
| 719 self.assertEquals(got_files[0].LocalPath(), 'eeaee') | 706 self.assertEquals(got_files[0].LocalPath(), 'eeaee') |
| 720 self.assertEquals(got_files[1].LocalPath(), 'eecaee') | 707 self.assertEquals(got_files[1].LocalPath(), 'eecaee') |
| 721 | 708 |
| 722 def testGetAbsoluteLocalPath(self): | 709 def testGetAbsoluteLocalPath(self): |
| 723 join = presubmit.os.path.join | 710 join = presubmit.os.path.join |
| 724 normpath = presubmit.normpath | 711 normpath = presubmit.normpath |
| 725 # Regression test for bug of presubmit stuff that relies on invoking | 712 # Regression test for bug of presubmit stuff that relies on invoking |
| 726 # SVN (e.g. to get mime type of file) not working unless gcl invoked | 713 # SVN (e.g. to get mime type of file) not working unless gcl invoked |
| 727 # from the client root (e.g. if you were at 'src' and did 'cd base' before | 714 # from the client root (e.g. if you were at 'src' and did 'cd base' before |
| 728 # invoking 'gcl upload' it would fail because svn wouldn't find the files | 715 # invoking 'gcl upload' it would fail because svn wouldn't find the files |
| 729 # the presubmit script was asking about). | 716 # the presubmit script was asking about). |
| 730 files = [ | 717 files = [ |
| 731 ['A', 'isdir'], | 718 ['A', 'isdir'], |
| 732 ['A', join('isdir', 'blat.cc')], | 719 ['A', join('isdir', 'blat.cc')], |
| 733 ['M', join('elsewhere', 'ouf.cc')], | 720 ['M', join('elsewhere', 'ouf.cc')], |
| 734 ] | 721 ] |
| 735 ci = self.MakeChangeInfo('mychange', 0, 0, '', files) | |
| 736 self.mox.ReplayAll() | 722 self.mox.ReplayAll() |
| 737 | 723 |
| 738 # It doesn't make sense on non-Windows platform. This is somewhat hacky, | 724 change = presubmit.Change('mychange', '', self.fake_root_dir, files, 0, 0) |
| 739 # but it is needed since we can't just use os.path.join('c:', 'temp'). | |
| 740 change = presubmit.GclChange(ci) | |
| 741 affected_files = change.AffectedFiles(include_dirs=True) | 725 affected_files = change.AffectedFiles(include_dirs=True) |
| 742 # Local paths should remain the same | 726 # Local paths should remain the same |
| 743 self.assertEquals(affected_files[0].LocalPath(), normpath('isdir')) | 727 self.assertEquals(affected_files[0].LocalPath(), normpath('isdir')) |
| 744 self.assertEquals(affected_files[1].LocalPath(), normpath('isdir/blat.cc')) | 728 self.assertEquals(affected_files[1].LocalPath(), normpath('isdir/blat.cc')) |
| 745 # Absolute paths should be prefixed | 729 # Absolute paths should be prefixed |
| 746 self.assertEquals(affected_files[0].AbsoluteLocalPath(), | 730 self.assertEquals(affected_files[0].AbsoluteLocalPath(), |
| 747 normpath(join(self.fake_root_dir, 'isdir'))) | 731 normpath(join(self.fake_root_dir, 'isdir'))) |
| 748 self.assertEquals(affected_files[1].AbsoluteLocalPath(), | 732 self.assertEquals(affected_files[1].AbsoluteLocalPath(), |
| 749 normpath(join(self.fake_root_dir, 'isdir/blat.cc'))) | 733 normpath(join(self.fake_root_dir, 'isdir/blat.cc'))) |
| 750 | 734 |
| 751 # New helper functions need to work | 735 # New helper functions need to work |
| 752 paths_from_change = change.AbsoluteLocalPaths(include_dirs=True) | 736 paths_from_change = change.AbsoluteLocalPaths(include_dirs=True) |
| 753 self.assertEqual(len(paths_from_change), 3) | 737 self.assertEqual(len(paths_from_change), 3) |
| 754 presubmit_path = join(self.fake_root_dir, 'isdir', 'PRESUBMIT.py') | 738 presubmit_path = join(self.fake_root_dir, 'isdir', 'PRESUBMIT.py') |
| 755 api = presubmit.InputApi(change=change, | 739 api = presubmit.InputApi(change=change, |
| 756 presubmit_path=presubmit_path, | 740 presubmit_path=presubmit_path, |
| 757 is_committing=True) | 741 is_committing=True) |
| 758 paths_from_api = api.AbsoluteLocalPaths(include_dirs=True) | 742 paths_from_api = api.AbsoluteLocalPaths(include_dirs=True) |
| 759 self.assertEqual(len(paths_from_api), 2) | 743 self.assertEqual(len(paths_from_api), 2) |
| 760 for absolute_paths in [paths_from_change, paths_from_api]: | 744 for absolute_paths in [paths_from_change, paths_from_api]: |
| 761 self.assertEqual(absolute_paths[0], | 745 self.assertEqual(absolute_paths[0], |
| 762 normpath(join(self.fake_root_dir, 'isdir'))) | 746 normpath(join(self.fake_root_dir, 'isdir'))) |
| 763 self.assertEqual(absolute_paths[1], | 747 self.assertEqual(absolute_paths[1], |
| 764 normpath(join(self.fake_root_dir, 'isdir', 'blat.cc'))) | 748 normpath(join(self.fake_root_dir, 'isdir', 'blat.cc'))) |
| 765 | 749 |
| 766 def testDeprecated(self): | 750 def testDeprecated(self): |
| 767 presubmit.warnings.warn(mox.IgnoreArg(), category=mox.IgnoreArg(), | 751 presubmit.warnings.warn(mox.IgnoreArg(), category=mox.IgnoreArg(), |
| 768 stacklevel=2) | 752 stacklevel=2) |
| 769 ci = self.MakeChangeInfo('mychange', 0, 0, 'Bleh\n', []) | |
| 770 self.mox.ReplayAll() | 753 self.mox.ReplayAll() |
| 771 | 754 |
| 772 change = presubmit.GclChange(ci) | 755 change = presubmit.Change('mychange', '', self.fake_root_dir, [], 0, 0) |
| 773 api = presubmit.InputApi( | 756 api = presubmit.InputApi( |
| 774 change, | 757 change, |
| 775 presubmit.os.path.join(self.fake_root_dir, 'foo', 'PRESUBMIT.py'), True) | 758 presubmit.os.path.join(self.fake_root_dir, 'foo', 'PRESUBMIT.py'), True) |
| 776 api.AffectedTextFiles(include_deletes=False) | 759 api.AffectedTextFiles(include_deletes=False) |
| 777 | 760 |
| 778 def testReadFileStringDenied(self): | 761 def testReadFileStringDenied(self): |
| 779 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n', [('M', 'AA')]) | |
| 780 self.mox.ReplayAll() | 762 self.mox.ReplayAll() |
| 781 | 763 |
| 764 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], |
| 765 0, 0) |
| 782 input_api = presubmit.InputApi( | 766 input_api = presubmit.InputApi( |
| 783 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) | 767 change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 784 input_api.change = presubmit.GclChange(ci) | |
| 785 self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x') | 768 self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x') |
| 786 | 769 |
| 787 def testReadFileStringAccepted(self): | 770 def testReadFileStringAccepted(self): |
| 788 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n', [('M', 'AA')]) | |
| 789 path = presubmit.os.path.join(self.fake_root_dir, 'AA/boo') | 771 path = presubmit.os.path.join(self.fake_root_dir, 'AA/boo') |
| 790 presubmit.gcl.ReadFile(path, 'x').AndReturn(None) | 772 presubmit.gcl.ReadFile(path, 'x').AndReturn(None) |
| 791 self.mox.ReplayAll() | 773 self.mox.ReplayAll() |
| 792 | 774 |
| 775 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], |
| 776 0, 0) |
| 793 input_api = presubmit.InputApi( | 777 input_api = presubmit.InputApi( |
| 794 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) | 778 change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 795 input_api.change = presubmit.GclChange(ci) | |
| 796 input_api.ReadFile(path, 'x') | 779 input_api.ReadFile(path, 'x') |
| 797 | 780 |
| 798 def testReadFileAffectedFileDenied(self): | 781 def testReadFileAffectedFileDenied(self): |
| 799 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n', [('M', 'AA')]) | |
| 800 file = presubmit.AffectedFile('boo', 'M', 'Unrelated') | 782 file = presubmit.AffectedFile('boo', 'M', 'Unrelated') |
| 801 self.mox.ReplayAll() | 783 self.mox.ReplayAll() |
| 802 | 784 |
| 785 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], |
| 786 0, 0) |
| 803 input_api = presubmit.InputApi( | 787 input_api = presubmit.InputApi( |
| 804 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) | 788 change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 805 input_api.change = presubmit.GclChange(ci) | |
| 806 self.assertRaises(IOError, input_api.ReadFile, file, 'x') | 789 self.assertRaises(IOError, input_api.ReadFile, file, 'x') |
| 807 | 790 |
| 808 def testReadFileAffectedFileAccepted(self): | 791 def testReadFileAffectedFileAccepted(self): |
| 809 ci = self.MakeChangeInfo('foo', 0, 0, 'Foo\n', [('M', 'AA')]) | |
| 810 file = presubmit.AffectedFile('AA/boo', 'M', self.fake_root_dir) | 792 file = presubmit.AffectedFile('AA/boo', 'M', self.fake_root_dir) |
| 811 presubmit.gcl.ReadFile(file.AbsoluteLocalPath(), 'x').AndReturn(None) | 793 presubmit.gcl.ReadFile(file.AbsoluteLocalPath(), 'x').AndReturn(None) |
| 812 self.mox.ReplayAll() | 794 self.mox.ReplayAll() |
| 813 | 795 |
| 796 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], |
| 797 0, 0) |
| 814 input_api = presubmit.InputApi( | 798 input_api = presubmit.InputApi( |
| 815 None, presubmit.os.path.join(self.fake_root_dir, '/p'), False) | 799 change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) |
| 816 input_api.change = presubmit.GclChange(ci) | |
| 817 input_api.ReadFile(file, 'x') | 800 input_api.ReadFile(file, 'x') |
| 818 | 801 |
| 819 | 802 |
| 820 class OuputApiUnittest(PresubmitTestsBase): | 803 class OuputApiUnittest(PresubmitTestsBase): |
| 821 """Tests presubmit.OutputApi.""" | 804 """Tests presubmit.OutputApi.""" |
| 822 def testMembersChanged(self): | 805 def testMembersChanged(self): |
| 823 self.mox.ReplayAll() | 806 self.mox.ReplayAll() |
| 824 members = [ | 807 members = [ |
| 825 'MailTextResult', 'PresubmitError', 'PresubmitNotifyResult', | 808 'MailTextResult', 'PresubmitError', 'PresubmitNotifyResult', |
| 826 'PresubmitPromptWarning', 'PresubmitResult', | 809 'PresubmitPromptWarning', 'PresubmitResult', |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 | 936 |
| 954 class GclChangeUnittest(PresubmitTestsBase): | 937 class GclChangeUnittest(PresubmitTestsBase): |
| 955 def testMembersChanged(self): | 938 def testMembersChanged(self): |
| 956 members = [ | 939 members = [ |
| 957 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles', | 940 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles', |
| 958 'DescriptionText', 'FullDescriptionText', 'LocalPaths', 'Name', | 941 'DescriptionText', 'FullDescriptionText', 'LocalPaths', 'Name', |
| 959 'RepositoryRoot', 'RightHandSideLines', 'ServerPaths', | 942 'RepositoryRoot', 'RightHandSideLines', 'ServerPaths', |
| 960 'issue', 'patchset', 'tags', | 943 'issue', 'patchset', 'tags', |
| 961 ] | 944 ] |
| 962 # If this test fails, you should add the relevant test. | 945 # If this test fails, you should add the relevant test. |
| 963 ci = self.MakeChangeInfo('', 0, 0, '', []) | |
| 964 self.mox.ReplayAll() | 946 self.mox.ReplayAll() |
| 965 | 947 |
| 966 self.compareMembers(presubmit.GclChange(ci), members) | 948 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], |
| 949 0, 0) |
| 950 self.compareMembers(change, members) |
| 967 | 951 |
| 968 | 952 |
| 969 class CannedChecksUnittest(PresubmitTestsBase): | 953 class CannedChecksUnittest(PresubmitTestsBase): |
| 970 """Tests presubmit_canned_checks.py.""" | 954 """Tests presubmit_canned_checks.py.""" |
| 971 | 955 |
| 972 def setUp(self): | 956 def setUp(self): |
| 973 PresubmitTestsBase.setUp(self) | 957 PresubmitTestsBase.setUp(self) |
| 974 self.mox.StubOutWithMock(presubmit_canned_checks, | 958 self.mox.StubOutWithMock(presubmit_canned_checks, |
| 975 '_RunPythonUnitTests_LoadTests') | 959 '_RunPythonUnitTests_LoadTests') |
| 976 | 960 |
| 977 def MockInputApi(self): | 961 def MockInputApi(self, change, committing): |
| 978 input_api = self.mox.CreateMock(presubmit.InputApi) | 962 input_api = self.mox.CreateMock(presubmit.InputApi) |
| 979 input_api.cStringIO = presubmit.cStringIO | 963 input_api.cStringIO = presubmit.cStringIO |
| 980 input_api.re = presubmit.re | 964 input_api.re = presubmit.re |
| 981 input_api.traceback = presubmit.traceback | 965 input_api.traceback = presubmit.traceback |
| 982 input_api.urllib2 = self.mox.CreateMock(presubmit.urllib2) | 966 input_api.urllib2 = self.mox.CreateMock(presubmit.urllib2) |
| 983 input_api.unittest = unittest | 967 input_api.unittest = unittest |
| 968 input_api.change = change |
| 969 input_api.is_committing = committing |
| 984 return input_api | 970 return input_api |
| 985 | 971 |
| 986 def testMembersChanged(self): | 972 def testMembersChanged(self): |
| 987 self.mox.ReplayAll() | 973 self.mox.ReplayAll() |
| 988 members = [ | 974 members = [ |
| 989 'CheckChangeHasBugField', 'CheckChangeHasDescription', | 975 'CheckChangeHasBugField', 'CheckChangeHasDescription', |
| 990 'CheckChangeHasNoStrayWhitespace', | 976 'CheckChangeHasNoStrayWhitespace', |
| 991 'CheckChangeHasOnlyOneEol', 'CheckChangeHasNoCR', | 977 'CheckChangeHasOnlyOneEol', 'CheckChangeHasNoCR', |
| 992 'CheckChangeHasNoCrAndHasOnlyOneEol', 'CheckChangeHasNoTabs', | 978 'CheckChangeHasNoCrAndHasOnlyOneEol', 'CheckChangeHasNoTabs', |
| 993 'CheckChangeHasQaField', 'CheckChangeHasTestedField', | 979 'CheckChangeHasQaField', 'CheckChangeHasTestedField', |
| 994 'CheckChangeHasTestField', 'CheckChangeSvnEolStyle', | 980 'CheckChangeHasTestField', 'CheckChangeSvnEolStyle', |
| 995 'CheckDoNotSubmit', | 981 'CheckDoNotSubmit', |
| 996 'CheckDoNotSubmitInDescription', 'CheckDoNotSubmitInFiles', | 982 'CheckDoNotSubmitInDescription', 'CheckDoNotSubmitInFiles', |
| 997 'CheckLongLines', 'CheckTreeIsOpen', 'RunPythonUnitTests', | 983 'CheckLongLines', 'CheckTreeIsOpen', 'RunPythonUnitTests', |
| 998 ] | 984 ] |
| 999 # If this test fails, you should add the relevant test. | 985 # If this test fails, you should add the relevant test. |
| 1000 self.compareMembers(presubmit_canned_checks, members) | 986 self.compareMembers(presubmit_canned_checks, members) |
| 1001 | 987 |
| 1002 def DescriptionTest(self, check, description1, description2, error_type, | 988 def DescriptionTest(self, check, description1, description2, error_type, |
| 1003 committing): | 989 committing): |
| 1004 input_api1 = self.MockInputApi() | 990 change1 = presubmit.Change('foo1', description1, self.fake_root_dir, None, |
| 1005 input_api1.is_committing = committing | 991 0, 0) |
| 1006 ci1 = self.MakeChangeInfo('foo', 0, 0, description1, []) | 992 input_api1 = self.MockInputApi(change1, committing) |
| 1007 input_api2 = self.MockInputApi() | 993 change2 = presubmit.Change('foo2', description2, self.fake_root_dir, None, |
| 1008 input_api2.is_committing = committing | 994 0, 0) |
| 1009 ci2 = self.MakeChangeInfo('foo', 0, 0, description2, []) | 995 input_api2 = self.MockInputApi(change2, committing) |
| 1010 self.mox.ReplayAll() | 996 self.mox.ReplayAll() |
| 1011 | 997 |
| 1012 input_api1.change = presubmit.GclChange(ci1) | |
| 1013 input_api2.change = presubmit.GclChange(ci2) | |
| 1014 results1 = check(input_api1, presubmit.OutputApi) | 998 results1 = check(input_api1, presubmit.OutputApi) |
| 1015 self.assertEquals(results1, []) | 999 self.assertEquals(results1, []) |
| 1016 results2 = check(input_api2, presubmit.OutputApi) | 1000 results2 = check(input_api2, presubmit.OutputApi) |
| 1017 self.assertEquals(len(results2), 1) | 1001 self.assertEquals(len(results2), 1) |
| 1018 self.assertEquals(results2[0].__class__, error_type) | 1002 self.assertEquals(results2[0].__class__, error_type) |
| 1019 | 1003 |
| 1020 def ContentTest(self, check, content1, content2, error_type): | 1004 def ContentTest(self, check, content1, content2, error_type): |
| 1021 input_api1 = self.MockInputApi() | 1005 change1 = presubmit.Change('foo1', 'foo1\n', self.fake_root_dir, None, |
| 1022 ci1 = self.MakeChangeInfo('foo', 0, 0, 'foo1\n', []) | 1006 0, 0) |
| 1007 input_api1 = self.MockInputApi(change1, False) |
| 1023 affected_file = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1008 affected_file = self.mox.CreateMock(presubmit.SvnAffectedFile) |
| 1024 affected_file.LocalPath().AndReturn('foo.cc') | 1009 affected_file.LocalPath().AndReturn('foo.cc') |
| 1025 output1 = [ | 1010 output1 = [ |
| 1026 (affected_file, 42, 'yo, ' + content1), | 1011 (affected_file, 42, 'yo, ' + content1), |
| 1027 (affected_file, 43, 'yer'), | 1012 (affected_file, 43, 'yer'), |
| 1028 (affected_file, 23, 'ya'), | 1013 (affected_file, 23, 'ya'), |
| 1029 ] | 1014 ] |
| 1030 input_api1.RightHandSideLines(mox.IgnoreArg()).AndReturn(output1) | 1015 input_api1.RightHandSideLines(mox.IgnoreArg()).AndReturn(output1) |
| 1031 input_api2 = self.MockInputApi() | 1016 change2 = presubmit.Change('foo2', 'foo2\n', self.fake_root_dir, None, |
| 1032 ci2 = self.MakeChangeInfo('foo2', 0, 0, 'foo2\n', None) | 1017 0, 0) |
| 1018 input_api2 = self.MockInputApi(change2, False) |
| 1033 output2 = [ | 1019 output2 = [ |
| 1034 (affected_file, 42, 'yo, ' + content2), | 1020 (affected_file, 42, 'yo, ' + content2), |
| 1035 (affected_file, 43, 'yer'), | 1021 (affected_file, 43, 'yer'), |
| 1036 (affected_file, 23, 'ya'), | 1022 (affected_file, 23, 'ya'), |
| 1037 ] | 1023 ] |
| 1038 input_api2.RightHandSideLines(mox.IgnoreArg()).AndReturn(output2) | 1024 input_api2.RightHandSideLines(mox.IgnoreArg()).AndReturn(output2) |
| 1039 self.mox.ReplayAll() | 1025 self.mox.ReplayAll() |
| 1040 | 1026 |
| 1041 input_api1.change = presubmit.GclChange(ci1) | |
| 1042 input_api2.change = presubmit.GclChange(ci2) | |
| 1043 results1 = check(input_api1, presubmit.OutputApi, None) | 1027 results1 = check(input_api1, presubmit.OutputApi, None) |
| 1044 self.assertEquals(results1, []) | 1028 self.assertEquals(results1, []) |
| 1045 results2 = check(input_api2, presubmit.OutputApi, None) | 1029 results2 = check(input_api2, presubmit.OutputApi, None) |
| 1046 self.assertEquals(len(results2), 1) | 1030 self.assertEquals(len(results2), 1) |
| 1047 self.assertEquals(results2[0].__class__, error_type) | 1031 self.assertEquals(results2[0].__class__, error_type) |
| 1048 | 1032 |
| 1049 def ReadFileTest(self, check, content1, content2, error_type): | 1033 def ReadFileTest(self, check, content1, content2, error_type): |
| 1050 input_api1 = self.MockInputApi() | 1034 self.mox.StubOutWithMock(presubmit.InputApi, 'ReadFile') |
| 1051 self.mox.StubOutWithMock(input_api1, 'ReadFile') | 1035 change1 = presubmit.Change('foo1', 'foo1\n', self.fake_root_dir, None, |
| 1052 ci1 = self.MakeChangeInfo('foo', 0, 0, 'foo1\n', None) | 1036 0, 0) |
| 1037 input_api1 = self.MockInputApi(change1, False) |
| 1053 affected_file1 = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1038 affected_file1 = self.mox.CreateMock(presubmit.SvnAffectedFile) |
| 1054 input_api1.AffectedSourceFiles(None).AndReturn([affected_file1]) | 1039 input_api1.AffectedSourceFiles(None).AndReturn([affected_file1]) |
| 1055 input_api1.ReadFile(affected_file1, 'rb').AndReturn(content1) | 1040 input_api1.ReadFile(affected_file1, 'rb').AndReturn(content1) |
| 1056 input_api2 = self.MockInputApi() | 1041 change2 = presubmit.Change('foo2', 'foo2\n', self.fake_root_dir, None, |
| 1057 self.mox.StubOutWithMock(input_api2, 'ReadFile') | 1042 0, 0) |
| 1058 ci2 = self.MakeChangeInfo('foo2', 0, 0, 'foo2\n', []) | 1043 input_api2 = self.MockInputApi(change2, False) |
| 1059 affected_file2 = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1044 affected_file2 = self.mox.CreateMock(presubmit.SvnAffectedFile) |
| 1060 input_api2.AffectedSourceFiles(None).AndReturn([affected_file2]) | 1045 input_api2.AffectedSourceFiles(None).AndReturn([affected_file2]) |
| 1061 input_api2.ReadFile(affected_file2, 'rb').AndReturn(content2) | 1046 input_api2.ReadFile(affected_file2, 'rb').AndReturn(content2) |
| 1062 affected_file2.LocalPath().AndReturn('bar.cc') | 1047 affected_file2.LocalPath().AndReturn('bar.cc') |
| 1063 self.mox.ReplayAll() | 1048 self.mox.ReplayAll() |
| 1064 | 1049 |
| 1065 input_api1.change = presubmit.GclChange(ci1) | |
| 1066 input_api2.change = presubmit.GclChange(ci2) | |
| 1067 results = check(input_api1, presubmit.OutputApi) | 1050 results = check(input_api1, presubmit.OutputApi) |
| 1068 self.assertEquals(results, []) | 1051 self.assertEquals(results, []) |
| 1069 results2 = check(input_api2, presubmit.OutputApi) | 1052 results2 = check(input_api2, presubmit.OutputApi) |
| 1070 self.assertEquals(len(results2), 1) | 1053 self.assertEquals(len(results2), 1) |
| 1071 self.assertEquals(results2[0].__class__, error_type) | 1054 self.assertEquals(results2[0].__class__, error_type) |
| 1072 | 1055 |
| 1073 def SvnPropertyTest(self, check, property, value1, value2, committing, | 1056 def SvnPropertyTest(self, check, property, value1, value2, committing, |
| 1074 error_type): | 1057 error_type): |
| 1075 input_api1 = self.MockInputApi() | 1058 input_api1 = self.MockInputApi(None, committing) |
| 1076 input_api1.is_committing = committing | |
| 1077 files1 = [ | 1059 files1 = [ |
| 1078 presubmit.SvnAffectedFile('foo/bar.cc', 'A'), | 1060 presubmit.SvnAffectedFile('foo/bar.cc', 'A'), |
| 1079 presubmit.SvnAffectedFile('foo.cc', 'M'), | 1061 presubmit.SvnAffectedFile('foo.cc', 'M'), |
| 1080 ] | 1062 ] |
| 1081 input_api1.AffectedSourceFiles(None).AndReturn(files1) | 1063 input_api1.AffectedSourceFiles(None).AndReturn(files1) |
| 1082 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo/bar.cc'), | 1064 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo/bar.cc'), |
| 1083 property).AndReturn(value1) | 1065 property).AndReturn(value1) |
| 1084 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo.cc'), | 1066 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo.cc'), |
| 1085 property).AndReturn(value1) | 1067 property).AndReturn(value1) |
| 1086 input_api2 = self.MockInputApi() | 1068 input_api2 = self.MockInputApi(None, committing) |
| 1087 input_api2.is_committing = committing | |
| 1088 files2 = [ | 1069 files2 = [ |
| 1089 presubmit.SvnAffectedFile('foo/bar.cc', 'A'), | 1070 presubmit.SvnAffectedFile('foo/bar.cc', 'A'), |
| 1090 presubmit.SvnAffectedFile('foo.cc', 'M'), | 1071 presubmit.SvnAffectedFile('foo.cc', 'M'), |
| 1091 ] | 1072 ] |
| 1092 input_api2.AffectedSourceFiles(None).AndReturn(files2) | 1073 input_api2.AffectedSourceFiles(None).AndReturn(files2) |
| 1093 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo/bar.cc'), | 1074 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo/bar.cc'), |
| 1094 property).AndReturn(value2) | 1075 property).AndReturn(value2) |
| 1095 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo.cc'), | 1076 presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo.cc'), |
| 1096 property).AndReturn(value2) | 1077 property).AndReturn(value2) |
| 1097 self.mox.ReplayAll() | 1078 self.mox.ReplayAll() |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1192 self.SvnPropertyTest(presubmit_canned_checks.CheckChangeSvnEolStyle, | 1173 self.SvnPropertyTest(presubmit_canned_checks.CheckChangeSvnEolStyle, |
| 1193 'svn:eol-style', 'LF', '', True, | 1174 'svn:eol-style', 'LF', '', True, |
| 1194 presubmit.OutputApi.PresubmitError) | 1175 presubmit.OutputApi.PresubmitError) |
| 1195 | 1176 |
| 1196 def testCheckChangeSvnEolStyleUpload(self): | 1177 def testCheckChangeSvnEolStyleUpload(self): |
| 1197 self.SvnPropertyTest(presubmit_canned_checks.CheckChangeSvnEolStyle, | 1178 self.SvnPropertyTest(presubmit_canned_checks.CheckChangeSvnEolStyle, |
| 1198 'svn:eol-style', 'LF', '', False, | 1179 'svn:eol-style', 'LF', '', False, |
| 1199 presubmit.OutputApi.PresubmitNotifyResult) | 1180 presubmit.OutputApi.PresubmitNotifyResult) |
| 1200 | 1181 |
| 1201 def testCannedCheckTreeIsOpenOpen(self): | 1182 def testCannedCheckTreeIsOpenOpen(self): |
| 1202 input_api = self.MockInputApi() | 1183 input_api = self.MockInputApi(None, True) |
| 1203 input_api.is_committing = True | |
| 1204 connection = self.mox.CreateMockAnything() | 1184 connection = self.mox.CreateMockAnything() |
| 1205 input_api.urllib2.urlopen('url_to_open').AndReturn(connection) | 1185 input_api.urllib2.urlopen('url_to_open').AndReturn(connection) |
| 1206 connection.read().AndReturn('1') | 1186 connection.read().AndReturn('1') |
| 1207 connection.close() | 1187 connection.close() |
| 1208 self.mox.ReplayAll() | 1188 self.mox.ReplayAll() |
| 1209 results = presubmit_canned_checks.CheckTreeIsOpen( | 1189 results = presubmit_canned_checks.CheckTreeIsOpen( |
| 1210 input_api, presubmit.OutputApi, url='url_to_open', closed='0') | 1190 input_api, presubmit.OutputApi, url='url_to_open', closed='0') |
| 1211 self.assertEquals(results, []) | 1191 self.assertEquals(results, []) |
| 1212 | 1192 |
| 1213 def testCannedCheckTreeIsOpenClosed(self): | 1193 def testCannedCheckTreeIsOpenClosed(self): |
| 1214 input_api = self.MockInputApi() | 1194 input_api = self.MockInputApi(None, True) |
| 1215 input_api.is_committing = True | |
| 1216 connection = self.mox.CreateMockAnything() | 1195 connection = self.mox.CreateMockAnything() |
| 1217 input_api.urllib2.urlopen('url_to_closed').AndReturn(connection) | 1196 input_api.urllib2.urlopen('url_to_closed').AndReturn(connection) |
| 1218 connection.read().AndReturn('0') | 1197 connection.read().AndReturn('0') |
| 1219 connection.close() | 1198 connection.close() |
| 1220 self.mox.ReplayAll() | 1199 self.mox.ReplayAll() |
| 1221 results = presubmit_canned_checks.CheckTreeIsOpen( | 1200 results = presubmit_canned_checks.CheckTreeIsOpen( |
| 1222 input_api, presubmit.OutputApi, url='url_to_closed', closed='0') | 1201 input_api, presubmit.OutputApi, url='url_to_closed', closed='0') |
| 1223 self.assertEquals(len(results), 1) | 1202 self.assertEquals(len(results), 1) |
| 1224 self.assertEquals(results[0].__class__, | 1203 self.assertEquals(results[0].__class__, |
| 1225 presubmit.OutputApi.PresubmitPromptWarning) | 1204 presubmit.OutputApi.PresubmitPromptWarning) |
| 1226 | 1205 |
| 1227 def testRunPythonUnitTestsNoTest(self): | 1206 def testRunPythonUnitTestsNoTest(self): |
| 1228 input_api = self.MockInputApi() | 1207 input_api = self.MockInputApi(None, False) |
| 1229 input_api.is_committing = False | |
| 1230 self.mox.ReplayAll() | 1208 self.mox.ReplayAll() |
| 1231 results = presubmit_canned_checks.RunPythonUnitTests( | 1209 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1232 input_api, presubmit.OutputApi, []) | 1210 input_api, presubmit.OutputApi, []) |
| 1233 self.assertEquals(results, []) | 1211 self.assertEquals(results, []) |
| 1234 | 1212 |
| 1235 def testRunPythonUnitTestsNonExistentUpload(self): | 1213 def testRunPythonUnitTestsNonExistentUpload(self): |
| 1236 input_api = self.MockInputApi() | 1214 input_api = self.MockInputApi(None, False) |
| 1237 input_api.is_committing = False | |
| 1238 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1215 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1239 input_api, '_non_existent_module').AndRaise( | 1216 input_api, '_non_existent_module').AndRaise( |
| 1240 exceptions.ImportError('Blehh')) | 1217 exceptions.ImportError('Blehh')) |
| 1241 self.mox.ReplayAll() | 1218 self.mox.ReplayAll() |
| 1219 |
| 1242 results = presubmit_canned_checks.RunPythonUnitTests( | 1220 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1243 input_api, presubmit.OutputApi, ['_non_existent_module']) | 1221 input_api, presubmit.OutputApi, ['_non_existent_module']) |
| 1244 self.assertEquals(len(results), 1) | 1222 self.assertEquals(len(results), 1) |
| 1245 self.assertEquals(results[0].__class__, | 1223 self.assertEquals(results[0].__class__, |
| 1246 presubmit.OutputApi.PresubmitNotifyResult) | 1224 presubmit.OutputApi.PresubmitNotifyResult) |
| 1247 | 1225 |
| 1248 def testRunPythonUnitTestsNonExistentCommitting(self): | 1226 def testRunPythonUnitTestsNonExistentCommitting(self): |
| 1249 input_api = self.MockInputApi() | 1227 input_api = self.MockInputApi(None, True) |
| 1250 input_api.is_committing = True | |
| 1251 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1228 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1252 input_api, '_non_existent_module').AndRaise( | 1229 input_api, '_non_existent_module').AndRaise( |
| 1253 exceptions.ImportError('Blehh')) | 1230 exceptions.ImportError('Blehh')) |
| 1254 self.mox.ReplayAll() | 1231 self.mox.ReplayAll() |
| 1255 results = presubmit_canned_checks.RunPythonUnitTests( | 1232 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1256 input_api, presubmit.OutputApi, ['_non_existent_module']) | 1233 input_api, presubmit.OutputApi, ['_non_existent_module']) |
| 1257 self.assertEquals(len(results), 1) | 1234 self.assertEquals(len(results), 1) |
| 1258 self.assertEquals(results[0].__class__, presubmit.OutputApi.PresubmitError) | 1235 self.assertEquals(results[0].__class__, presubmit.OutputApi.PresubmitError) |
| 1259 | 1236 |
| 1260 def testRunPythonUnitTestsEmptyUpload(self): | 1237 def testRunPythonUnitTestsEmptyUpload(self): |
| 1261 input_api = self.MockInputApi() | 1238 input_api = self.MockInputApi(None, False) |
| 1262 input_api.is_committing = False | |
| 1263 test_module = self.mox.CreateMockAnything() | 1239 test_module = self.mox.CreateMockAnything() |
| 1264 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1240 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1265 input_api, 'test_module').AndReturn([]) | 1241 input_api, 'test_module').AndReturn([]) |
| 1266 self.mox.ReplayAll() | 1242 self.mox.ReplayAll() |
| 1267 | 1243 |
| 1268 results = presubmit_canned_checks.RunPythonUnitTests( | 1244 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1269 input_api, presubmit.OutputApi, ['test_module']) | 1245 input_api, presubmit.OutputApi, ['test_module']) |
| 1270 self.assertEquals(results, []) | 1246 self.assertEquals(results, []) |
| 1271 | 1247 |
| 1272 def testRunPythonUnitTestsEmptyCommitting(self): | 1248 def testRunPythonUnitTestsEmptyCommitting(self): |
| 1273 input_api = self.MockInputApi() | 1249 input_api = self.MockInputApi(None, True) |
| 1274 input_api.is_committing = True | |
| 1275 test_module = self.mox.CreateMockAnything() | 1250 test_module = self.mox.CreateMockAnything() |
| 1276 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1251 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1277 input_api, 'test_module').AndReturn([]) | 1252 input_api, 'test_module').AndReturn([]) |
| 1278 self.mox.ReplayAll() | 1253 self.mox.ReplayAll() |
| 1279 | 1254 |
| 1280 results = presubmit_canned_checks.RunPythonUnitTests( | 1255 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1281 input_api, presubmit.OutputApi, ['test_module']) | 1256 input_api, presubmit.OutputApi, ['test_module']) |
| 1282 self.assertEquals(results, []) | 1257 self.assertEquals(results, []) |
| 1283 | 1258 |
| 1284 def testRunPythonUnitTestsFailureUpload(self): | 1259 def testRunPythonUnitTestsFailureUpload(self): |
| 1285 input_api = self.MockInputApi() | 1260 input_api = self.MockInputApi(None, False) |
| 1286 input_api.is_committing = False | |
| 1287 input_api.unittest = self.mox.CreateMock(unittest) | 1261 input_api.unittest = self.mox.CreateMock(unittest) |
| 1288 input_api.cStringIO = self.mox.CreateMock(presubmit.cStringIO) | 1262 input_api.cStringIO = self.mox.CreateMock(presubmit.cStringIO) |
| 1289 test = self.mox.CreateMockAnything() | 1263 test = self.mox.CreateMockAnything() |
| 1290 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1264 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1291 input_api, 'test_module').AndReturn([test]) | 1265 input_api, 'test_module').AndReturn([test]) |
| 1292 runner = self.mox.CreateMockAnything() | 1266 runner = self.mox.CreateMockAnything() |
| 1293 buffer = self.mox.CreateMockAnything() | 1267 buffer = self.mox.CreateMockAnything() |
| 1294 input_api.cStringIO.StringIO().AndReturn(buffer) | 1268 input_api.cStringIO.StringIO().AndReturn(buffer) |
| 1295 buffer.getvalue().AndReturn('BOO HOO!') | 1269 buffer.getvalue().AndReturn('BOO HOO!') |
| 1296 input_api.unittest.TextTestRunner(stream=buffer, verbosity=0 | 1270 input_api.unittest.TextTestRunner(stream=buffer, verbosity=0 |
| 1297 ).AndReturn(runner) | 1271 ).AndReturn(runner) |
| 1298 suite = self.mox.CreateMockAnything() | 1272 suite = self.mox.CreateMockAnything() |
| 1299 input_api.unittest.TestSuite([test]).AndReturn(suite) | 1273 input_api.unittest.TestSuite([test]).AndReturn(suite) |
| 1300 test_result = self.mox.CreateMockAnything() | 1274 test_result = self.mox.CreateMockAnything() |
| 1301 runner.run(suite).AndReturn(test_result) | 1275 runner.run(suite).AndReturn(test_result) |
| 1302 test_result.wasSuccessful().AndReturn(False) | 1276 test_result.wasSuccessful().AndReturn(False) |
| 1303 test_result.failures = [None, None] | 1277 test_result.failures = [None, None] |
| 1304 test_result.errors = [None, None, None] | 1278 test_result.errors = [None, None, None] |
| 1305 self.mox.ReplayAll() | 1279 self.mox.ReplayAll() |
| 1306 | 1280 |
| 1307 results = presubmit_canned_checks.RunPythonUnitTests( | 1281 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1308 input_api, presubmit.OutputApi, ['test_module']) | 1282 input_api, presubmit.OutputApi, ['test_module']) |
| 1309 self.assertEquals(len(results), 1) | 1283 self.assertEquals(len(results), 1) |
| 1310 self.assertEquals(results[0].__class__, | 1284 self.assertEquals(results[0].__class__, |
| 1311 presubmit.OutputApi.PresubmitNotifyResult) | 1285 presubmit.OutputApi.PresubmitNotifyResult) |
| 1312 self.assertEquals(results[0]._long_text, 'BOO HOO!') | 1286 self.assertEquals(results[0]._long_text, 'BOO HOO!') |
| 1313 | 1287 |
| 1314 def testRunPythonUnitTestsFailureCommitting(self): | 1288 def testRunPythonUnitTestsFailureCommitting(self): |
| 1315 input_api = self.MockInputApi() | 1289 input_api = self.MockInputApi(None, True) |
| 1316 input_api.is_committing = True | |
| 1317 input_api.unittest = self.mox.CreateMock(unittest) | 1290 input_api.unittest = self.mox.CreateMock(unittest) |
| 1318 input_api.cStringIO = self.mox.CreateMock(presubmit.cStringIO) | 1291 input_api.cStringIO = self.mox.CreateMock(presubmit.cStringIO) |
| 1319 test = self.mox.CreateMockAnything() | 1292 test = self.mox.CreateMockAnything() |
| 1320 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1293 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1321 input_api, 'test_module').AndReturn([test]) | 1294 input_api, 'test_module').AndReturn([test]) |
| 1322 runner = self.mox.CreateMockAnything() | 1295 runner = self.mox.CreateMockAnything() |
| 1323 buffer = self.mox.CreateMockAnything() | 1296 buffer = self.mox.CreateMockAnything() |
| 1324 input_api.cStringIO.StringIO().AndReturn(buffer) | 1297 input_api.cStringIO.StringIO().AndReturn(buffer) |
| 1325 buffer.getvalue().AndReturn('BOO HOO!') | 1298 buffer.getvalue().AndReturn('BOO HOO!') |
| 1326 input_api.unittest.TextTestRunner(stream=buffer, verbosity=0 | 1299 input_api.unittest.TextTestRunner(stream=buffer, verbosity=0 |
| 1327 ).AndReturn(runner) | 1300 ).AndReturn(runner) |
| 1328 suite = self.mox.CreateMockAnything() | 1301 suite = self.mox.CreateMockAnything() |
| 1329 input_api.unittest.TestSuite([test]).AndReturn(suite) | 1302 input_api.unittest.TestSuite([test]).AndReturn(suite) |
| 1330 test_result = self.mox.CreateMockAnything() | 1303 test_result = self.mox.CreateMockAnything() |
| 1331 runner.run(suite).AndReturn(test_result) | 1304 runner.run(suite).AndReturn(test_result) |
| 1332 test_result.wasSuccessful().AndReturn(False) | 1305 test_result.wasSuccessful().AndReturn(False) |
| 1333 test_result.failures = [None, None] | 1306 test_result.failures = [None, None] |
| 1334 test_result.errors = [None, None, None] | 1307 test_result.errors = [None, None, None] |
| 1335 self.mox.ReplayAll() | 1308 self.mox.ReplayAll() |
| 1336 | 1309 |
| 1337 results = presubmit_canned_checks.RunPythonUnitTests( | 1310 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1338 input_api, presubmit.OutputApi, ['test_module']) | 1311 input_api, presubmit.OutputApi, ['test_module']) |
| 1339 self.assertEquals(len(results), 1) | 1312 self.assertEquals(len(results), 1) |
| 1340 self.assertEquals(results[0].__class__, presubmit.OutputApi.PresubmitError) | 1313 self.assertEquals(results[0].__class__, presubmit.OutputApi.PresubmitError) |
| 1341 self.assertEquals(results[0]._long_text, 'BOO HOO!') | 1314 self.assertEquals(results[0]._long_text, 'BOO HOO!') |
| 1342 | 1315 |
| 1343 def testRunPythonUnitTestsSuccess(self): | 1316 def testRunPythonUnitTestsSuccess(self): |
| 1344 input_api = self.MockInputApi() | 1317 input_api = self.MockInputApi(None, False) |
| 1345 input_api.is_committing = False | 1318 input_api.cStringIO = self.mox.CreateMock(presubmit.cStringIO) |
| 1346 input_api.unittest = self.mox.CreateMock(unittest) | 1319 input_api.unittest = self.mox.CreateMock(unittest) |
| 1347 input_api.cStringIO = self.mox.CreateMock(presubmit.cStringIO) | |
| 1348 test = self.mox.CreateMockAnything() | 1320 test = self.mox.CreateMockAnything() |
| 1349 presubmit_canned_checks._RunPythonUnitTests_LoadTests( | 1321 presubmit_canned_checks._RunPythonUnitTests_LoadTests( |
| 1350 input_api, 'test_module').AndReturn([test]) | 1322 input_api, 'test_module').AndReturn([test]) |
| 1351 runner = self.mox.CreateMockAnything() | 1323 runner = self.mox.CreateMockAnything() |
| 1352 buffer = self.mox.CreateMockAnything() | 1324 buffer = self.mox.CreateMockAnything() |
| 1353 input_api.cStringIO.StringIO().AndReturn(buffer) | 1325 input_api.cStringIO.StringIO().AndReturn(buffer) |
| 1354 input_api.unittest.TextTestRunner(stream=buffer, verbosity=0 | 1326 input_api.unittest.TextTestRunner(stream=buffer, verbosity=0 |
| 1355 ).AndReturn(runner) | 1327 ).AndReturn(runner) |
| 1356 suite = self.mox.CreateMockAnything() | 1328 suite = self.mox.CreateMockAnything() |
| 1357 input_api.unittest.TestSuite([test]).AndReturn(suite) | 1329 input_api.unittest.TestSuite([test]).AndReturn(suite) |
| 1358 test_result = self.mox.CreateMockAnything() | 1330 test_result = self.mox.CreateMockAnything() |
| 1359 runner.run(suite).AndReturn(test_result) | 1331 runner.run(suite).AndReturn(test_result) |
| 1360 test_result.wasSuccessful().AndReturn(True) | 1332 test_result.wasSuccessful().AndReturn(True) |
| 1361 test_result.failures = 0 | 1333 test_result.failures = 0 |
| 1362 test_result.errors = 0 | 1334 test_result.errors = 0 |
| 1363 self.mox.ReplayAll() | 1335 self.mox.ReplayAll() |
| 1364 | 1336 |
| 1365 results = presubmit_canned_checks.RunPythonUnitTests( | 1337 results = presubmit_canned_checks.RunPythonUnitTests( |
| 1366 input_api, presubmit.OutputApi, ['test_module']) | 1338 input_api, presubmit.OutputApi, ['test_module']) |
| 1367 self.assertEquals(len(results), 0) | 1339 self.assertEquals(len(results), 0) |
| 1368 | 1340 |
| 1369 | 1341 |
| 1370 if __name__ == '__main__': | 1342 if __name__ == '__main__': |
| 1371 unittest.main() | 1343 unittest.main() |
| OLD | NEW |