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 | |
9 import os | |
10 import StringIO | 8 import StringIO |
11 import unittest | |
12 | 9 |
13 # Local imports | 10 # Local imports |
14 import presubmit_support as presubmit | 11 import presubmit_support as presubmit |
15 import presubmit_canned_checks | 12 import presubmit_canned_checks |
16 import super_mox | 13 from super_mox import mox, SuperMoxTestBase |
17 from super_mox import mox | |
18 | 14 |
19 | 15 |
20 class PresubmitTestsBase(super_mox.SuperMoxTestBase): | 16 class PresubmitTestsBase(SuperMoxTestBase): |
21 """Setups and tear downs the mocks but doesn't test anything as-is.""" | 17 """Setups and tear downs the mocks but doesn't test anything as-is.""" |
22 presubmit_text = """ | 18 presubmit_text = """ |
23 def CheckChangeOnUpload(input_api, output_api): | 19 def CheckChangeOnUpload(input_api, output_api): |
24 if not input_api.change.NOSUCHKEY: | 20 if not input_api.change.NOSUCHKEY: |
25 return [output_api.PresubmitError("!!")] | 21 return [output_api.PresubmitError("!!")] |
26 elif not input_api.change.REALLYNOSUCHKEY: | 22 elif not input_api.change.REALLYNOSUCHKEY: |
27 return [output_api.PresubmitPromptWarning("??")] | 23 return [output_api.PresubmitPromptWarning("??")] |
28 elif not input_api.change.REALLYABSOLUTELYNOSUCHKEY: | 24 elif not input_api.change.REALLYABSOLUTELYNOSUCHKEY: |
29 return [output_api.PresubmitPromptWarning("??"), | 25 return [output_api.PresubmitPromptWarning("??"), |
30 output_api.PresubmitError("XX!!XX")] | 26 output_api.PresubmitError("XX!!XX")] |
31 else: | 27 else: |
32 return () | 28 return () |
33 """ | 29 """ |
34 presubmit_tryslave = """ | 30 presubmit_tryslave = """ |
35 def GetPreferredTrySlaves(): | 31 def GetPreferredTrySlaves(): |
36 return %s | 32 return %s |
37 """ | 33 """ |
38 | 34 |
39 def setUp(self): | 35 def setUp(self): |
40 super_mox.SuperMoxTestBase.setUp(self) | 36 SuperMoxTestBase.setUp(self) |
| 37 self.mox.StubOutWithMock(presubmit, 'random') |
41 self.mox.StubOutWithMock(presubmit, 'warnings') | 38 self.mox.StubOutWithMock(presubmit, 'warnings') |
42 # Stub out 'os' but keep os.path.commonprefix/dirname/join/normpath/splitext | |
43 # and os.sep. | |
44 os_sep = presubmit.os.sep | |
45 os_path_commonprefix = presubmit.os.path.commonprefix | |
46 os_path_dirname = presubmit.os.path.dirname | |
47 os_path_join = presubmit.os.path.join | |
48 os_path_normpath = presubmit.os.path.normpath | |
49 os_path_splitext = presubmit.os.path.splitext | |
50 self.mox.StubOutWithMock(presubmit, 'os') | |
51 self.mox.StubOutWithMock(presubmit.os, 'path') | |
52 presubmit.os.sep = os_sep | |
53 presubmit.os.path.join = os_path_join | |
54 presubmit.os.path.dirname = os_path_dirname | |
55 presubmit.os.path.normpath = os_path_normpath | |
56 presubmit.os.path.splitext = os_path_splitext | |
57 self.mox.StubOutWithMock(presubmit, 'random') | |
58 self.mox.StubOutWithMock(presubmit, 'sys') | |
59 presubmit._ASKED_FOR_FEEDBACK = False | 39 presubmit._ASKED_FOR_FEEDBACK = False |
60 presubmit.os.path.commonprefix = os_path_commonprefix | |
61 self.fake_root_dir = self.RootDir() | 40 self.fake_root_dir = self.RootDir() |
62 # Special mocks. | 41 # Special mocks. |
63 def MockAbsPath(f): | 42 def MockAbsPath(f): |
64 return f | 43 return f |
65 def MockChdir(f): | 44 def MockChdir(f): |
66 return None | 45 return None |
| 46 # SuperMoxTestBase already mock these but simplify our life. |
67 presubmit.os.path.abspath = MockAbsPath | 47 presubmit.os.path.abspath = MockAbsPath |
68 presubmit.os.getcwd = self.RootDir | 48 presubmit.os.getcwd = self.RootDir |
69 presubmit.os.chdir = MockChdir | 49 presubmit.os.chdir = MockChdir |
70 self.mox.StubOutWithMock(presubmit.gclient_scm, 'CaptureSVNInfo') | 50 self.mox.StubOutWithMock(presubmit.gclient_scm, 'CaptureSVNInfo') |
71 self.mox.StubOutWithMock(presubmit.gcl, 'GetSVNFileProperty') | 51 self.mox.StubOutWithMock(presubmit.gcl, 'GetSVNFileProperty') |
72 self.mox.StubOutWithMock(presubmit.gcl, 'ReadFile') | 52 self.mox.StubOutWithMock(presubmit.gcl, 'ReadFile') |
73 | 53 |
74 | 54 |
75 class PresubmitUnittest(PresubmitTestsBase): | 55 class PresubmitUnittest(PresubmitTestsBase): |
76 """General presubmit_support.py tests (excluding InputApi and OutputApi).""" | 56 """General presubmit_support.py tests (excluding InputApi and OutputApi).""" |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 | 254 |
275 self.failUnless(executer.ExecPresubmitScript( | 255 self.failUnless(executer.ExecPresubmitScript( |
276 ('def CheckChangeOnCommit(input_api, output_api):\n' | 256 ('def CheckChangeOnCommit(input_api, output_api):\n' |
277 ' if not input_api.change.NOSUCHKEY:\n' | 257 ' if not input_api.change.NOSUCHKEY:\n' |
278 ' return [output_api.PresubmitError("!!")]\n' | 258 ' return [output_api.PresubmitError("!!")]\n' |
279 ' else:\n' | 259 ' else:\n' |
280 ' return ()'), | 260 ' return ()'), |
281 fake_presubmit | 261 fake_presubmit |
282 )) | 262 )) |
283 | 263 |
284 self.assertRaises(exceptions.RuntimeError, | 264 self.assertRaises(presubmit.exceptions.RuntimeError, |
285 executer.ExecPresubmitScript, | 265 executer.ExecPresubmitScript, |
286 'def CheckChangeOnCommit(input_api, output_api):\n' | 266 'def CheckChangeOnCommit(input_api, output_api):\n' |
287 ' return "foo"', | 267 ' return "foo"', |
288 fake_presubmit) | 268 fake_presubmit) |
289 | 269 |
290 self.assertRaises(exceptions.RuntimeError, | 270 self.assertRaises(presubmit.exceptions.RuntimeError, |
291 executer.ExecPresubmitScript, | 271 executer.ExecPresubmitScript, |
292 'def CheckChangeOnCommit(input_api, output_api):\n' | 272 'def CheckChangeOnCommit(input_api, output_api):\n' |
293 ' return ["foo"]', | 273 ' return ["foo"]', |
294 fake_presubmit) | 274 fake_presubmit) |
295 | 275 |
296 def testDoPresubmitChecks(self): | 276 def testDoPresubmitChecks(self): |
297 join = presubmit.os.path.join | 277 join = presubmit.os.path.join |
298 description_lines = ('Hello there', | 278 description_lines = ('Hello there', |
299 'this is a change', | 279 'this is a change', |
300 'STORY=http://tracker/123') | 280 'STORY=http://tracker/123') |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 text = ('Warning, no presubmit.py found.\n' | 397 text = ('Warning, no presubmit.py found.\n' |
418 'Running default presubmit script.\n' | 398 'Running default presubmit script.\n' |
419 '** Presubmit ERRORS **\n!!\n\n' | 399 '** Presubmit ERRORS **\n!!\n\n' |
420 'Was the presubmit check useful? Please send feedback & hate mail ' | 400 'Was the presubmit check useful? Please send feedback & hate mail ' |
421 'to maruel@chromium.org!\n') | 401 'to maruel@chromium.org!\n') |
422 self.assertEquals(output.getvalue(), text) | 402 self.assertEquals(output.getvalue(), text) |
423 | 403 |
424 def testDirectoryHandling(self): | 404 def testDirectoryHandling(self): |
425 files = [ | 405 files = [ |
426 ['A', 'isdir'], | 406 ['A', 'isdir'], |
427 ['A', os.path.join('isdir', 'blat.cc')], | 407 ['A', presubmit.os.path.join('isdir', 'blat.cc')], |
428 ] | 408 ] |
429 isdir = presubmit.os.path.join(self.fake_root_dir, 'isdir') | 409 isdir = presubmit.os.path.join(self.fake_root_dir, 'isdir') |
430 blat = presubmit.os.path.join(isdir, 'blat.cc') | 410 blat = presubmit.os.path.join(isdir, 'blat.cc') |
431 presubmit.os.path.exists(isdir).AndReturn(True) | 411 presubmit.os.path.exists(isdir).AndReturn(True) |
432 presubmit.os.path.isdir(isdir).AndReturn(True) | 412 presubmit.os.path.isdir(isdir).AndReturn(True) |
433 presubmit.os.path.exists(blat).AndReturn(True) | 413 presubmit.os.path.exists(blat).AndReturn(True) |
434 presubmit.os.path.isdir(blat).AndReturn(False) | 414 presubmit.os.path.isdir(blat).AndReturn(False) |
435 self.mox.ReplayAll() | 415 self.mox.ReplayAll() |
436 | 416 |
437 change = presubmit.Change('mychange', 'foo', self.fake_root_dir, files, | 417 change = presubmit.Change('mychange', 'foo', self.fake_root_dir, files, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 | 474 |
495 executer = presubmit.GetTrySlavesExecuter() | 475 executer = presubmit.GetTrySlavesExecuter() |
496 self.assertEqual([], executer.ExecPresubmitScript('')) | 476 self.assertEqual([], executer.ExecPresubmitScript('')) |
497 self.assertEqual([], executer.ExecPresubmitScript('def foo():\n return\n')) | 477 self.assertEqual([], executer.ExecPresubmitScript('def foo():\n return\n')) |
498 | 478 |
499 # bad results | 479 # bad results |
500 starts_with_space_result = [' starts_with_space'] | 480 starts_with_space_result = [' starts_with_space'] |
501 not_list_result1 = "'foo'" | 481 not_list_result1 = "'foo'" |
502 not_list_result2 = "('a', 'tuple')" | 482 not_list_result2 = "('a', 'tuple')" |
503 for result in starts_with_space_result, not_list_result1, not_list_result2: | 483 for result in starts_with_space_result, not_list_result1, not_list_result2: |
504 self.assertRaises(exceptions.RuntimeError, | 484 self.assertRaises(presubmit.exceptions.RuntimeError, |
505 executer.ExecPresubmitScript, | 485 executer.ExecPresubmitScript, |
506 self.presubmit_tryslave % result) | 486 self.presubmit_tryslave % result) |
507 | 487 |
508 # good results | 488 # good results |
509 expected_result = ['1', '2', '3'] | 489 expected_result = ['1', '2', '3'] |
510 empty_result = [] | 490 empty_result = [] |
511 space_in_name_result = ['foo bar', '1\t2 3'] | 491 space_in_name_result = ['foo bar', '1\t2 3'] |
512 for result in expected_result, empty_result, space_in_name_result: | 492 for result in expected_result, empty_result, space_in_name_result: |
513 self.assertEqual(result, | 493 self.assertEqual(result, |
514 executer.ExecPresubmitScript(self.presubmit_tryslave % | 494 executer.ExecPresubmitScript(self.presubmit_tryslave % |
(...skipping 22 matching lines...) Expand all Loading... |
537 self.assertEqual(['win'], | 517 self.assertEqual(['win'], |
538 presubmit.DoGetTrySlaves([filename], self.fake_root_dir, | 518 presubmit.DoGetTrySlaves([filename], self.fake_root_dir, |
539 None, False, output)) | 519 None, False, output)) |
540 output = StringIO.StringIO() | 520 output = StringIO.StringIO() |
541 self.assertEqual(['win', 'linux'], | 521 self.assertEqual(['win', 'linux'], |
542 presubmit.DoGetTrySlaves([filename, filename_linux], | 522 presubmit.DoGetTrySlaves([filename, filename_linux], |
543 self.fake_root_dir, None, False, | 523 self.fake_root_dir, None, False, |
544 output)) | 524 output)) |
545 | 525 |
546 def testMain(self): | 526 def testMain(self): |
| 527 # OptParser calls presubmit.os.path.exists and is a pain when mocked. |
| 528 self.UnMock(presubmit.os.path, 'exists') |
547 self.mox.StubOutWithMock(presubmit, 'DoPresubmitChecks') | 529 self.mox.StubOutWithMock(presubmit, 'DoPresubmitChecks') |
548 self.mox.StubOutWithMock(presubmit, 'ParseFiles') | 530 self.mox.StubOutWithMock(presubmit, 'ParseFiles') |
549 presubmit.os.path.isdir(presubmit.os.path.join(self.fake_root_dir, '.git') | 531 presubmit.os.path.isdir(presubmit.os.path.join(self.fake_root_dir, '.git') |
550 ).AndReturn(False) | 532 ).AndReturn(False) |
551 presubmit.os.path.isdir(presubmit.os.path.join(self.fake_root_dir, '.svn') | 533 presubmit.os.path.isdir(presubmit.os.path.join(self.fake_root_dir, '.svn') |
552 ).AndReturn(False) | 534 ).AndReturn(False) |
553 #presubmit.ParseFiles([], None).AndReturn([]) | 535 #presubmit.ParseFiles([], None).AndReturn([]) |
554 presubmit.DoPresubmitChecks(mox.IgnoreArg(), False, False, | 536 presubmit.DoPresubmitChecks(mox.IgnoreArg(), False, False, |
555 mox.IgnoreArg(), | 537 mox.IgnoreArg(), |
556 mox.IgnoreArg(), | 538 mox.IgnoreArg(), |
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 stdout=presubmit.subprocess.PIPE).AndReturn(process) | 1452 stdout=presubmit.subprocess.PIPE).AndReturn(process) |
1471 process.communicate().AndReturn(('', '')) | 1453 process.communicate().AndReturn(('', '')) |
1472 self.mox.ReplayAll() | 1454 self.mox.ReplayAll() |
1473 | 1455 |
1474 results = presubmit_canned_checks.RunPythonUnitTests( | 1456 results = presubmit_canned_checks.RunPythonUnitTests( |
1475 input_api, presubmit.OutputApi, ['test_module']) | 1457 input_api, presubmit.OutputApi, ['test_module']) |
1476 self.assertEquals(len(results), 0) | 1458 self.assertEquals(len(results), 0) |
1477 | 1459 |
1478 | 1460 |
1479 if __name__ == '__main__': | 1461 if __name__ == '__main__': |
| 1462 import unittest |
1480 unittest.main() | 1463 unittest.main() |
OLD | NEW |