| Index: tests/presubmit_unittest.py
|
| diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py
|
| index cc5825f421862b5eb6b28a78edee459514de1c25..5ba4581856b00d384fcf6f40d498f4162bcbf8cc 100755
|
| --- a/tests/presubmit_unittest.py
|
| +++ b/tests/presubmit_unittest.py
|
| @@ -60,17 +60,19 @@ def CheckChangeOnUpload(input_api, output_api):
|
| def setUp(self):
|
| mox.MoxTestBase.setUp(self)
|
| self.mox.StubOutWithMock(presubmit, 'warnings')
|
| - # Stub out 'os' but keep os.path.dirname/join/normpath and os.sep.
|
| + # Stub out 'os' but keep os.path.dirname/join/normpath/splitext and os.sep.
|
| os_sep = presubmit.os.sep
|
| os_path_join = presubmit.os.path.join
|
| os_path_dirname = presubmit.os.path.dirname
|
| os_path_normpath = presubmit.os.path.normpath
|
| + os_path_splitext = presubmit.os.path.splitext
|
| self.mox.StubOutWithMock(presubmit, 'os')
|
| self.mox.StubOutWithMock(presubmit.os, 'path')
|
| presubmit.os.sep = os_sep
|
| presubmit.os.path.join = os_path_join
|
| presubmit.os.path.dirname = os_path_dirname
|
| presubmit.os.path.normpath = os_path_normpath
|
| + presubmit.os.path.splitext = os_path_splitext
|
| self.mox.StubOutWithMock(presubmit, 'sys')
|
| # Special mocks.
|
| def MockAbsPath(f):
|
| @@ -523,9 +525,12 @@ class InputApiUnittest(PresubmitTestsBase):
|
| def testMembersChanged(self):
|
| self.mox.ReplayAll()
|
| members = [
|
| - 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles',
|
| - 'DepotToLocalPath', 'LocalPaths', 'LocalToDepotPath',
|
| - 'PresubmitLocalPath', 'RightHandSideLines', 'ReadFile', 'ServerPaths',
|
| + 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedSourceFiles',
|
| + 'AffectedTextFiles',
|
| + 'DEFAULT_BLACK_LIST', 'DEFAULT_WHITE_LIST',
|
| + 'DepotToLocalPath', 'FilterSourceFile', 'LocalPaths',
|
| + 'LocalToDepotPath',
|
| + 'PresubmitLocalPath', 'ReadFile', 'RightHandSideLines', 'ServerPaths',
|
| 'basename', 'cPickle', 'cStringIO', 'canned_checks', 'change',
|
| 'is_committing', 'marshal', 'os_path', 'pickle', 'platform',
|
| 're', 'subprocess', 'tempfile', 'traceback', 'unittest', 'urllib2',
|
| @@ -573,24 +578,30 @@ class InputApiUnittest(PresubmitTestsBase):
|
| 'BUG=123',
|
| ' STORY =http://foo/ \t',
|
| 'and some more regular text')
|
| + blat = join('foo', 'blat.cc')
|
| + readme = join('foo', 'blat', 'READ_ME2')
|
| + binary = join('foo', 'blat', 'binary.dll')
|
| + weird = join('foo', 'blat', 'weird.xyz')
|
| + third_party = join('foo', 'third_party', 'third.cc')
|
| + another = join('foo', 'blat', 'another.h')
|
| + beingdeleted = join('foo', 'mat', 'beingdeleted.txt')
|
| + notfound = join('flop', 'notfound.txt')
|
| + flap = join('boo', 'flap.h')
|
| files = [
|
| - ['A', join('foo', 'blat.cc')],
|
| - ['M', join('foo', 'blat', 'binary.dll')],
|
| + ['A', blat],
|
| + ['M', readme],
|
| + ['M', binary],
|
| + ['M', weird],
|
| + ['M', another],
|
| + ['M', third_party],
|
| ['D', 'foo/mat/beingdeleted.txt'],
|
| ['M', 'flop/notfound.txt'],
|
| ['A', 'boo/flap.h'],
|
| ]
|
|
|
| -
|
| - blat = join('foo', 'blat.cc')
|
| - binary = join('foo', 'blat', 'binary.dll')
|
| - beingdeleted = join('foo', 'mat', 'beingdeleted.txt')
|
| - notfound = join('flop', 'notfound.txt')
|
| - flap = join('boo', 'flap.h')
|
| - presubmit.os.path.exists(blat).AndReturn(True)
|
| - presubmit.os.path.isdir(blat).AndReturn(False)
|
| - presubmit.os.path.exists(binary).AndReturn(True)
|
| - presubmit.os.path.isdir(binary).AndReturn(False)
|
| + for i in (blat, readme, binary, weird, another, third_party):
|
| + presubmit.os.path.exists(i).AndReturn(True)
|
| + presubmit.os.path.isdir(i).AndReturn(False)
|
| presubmit.os.path.exists(beingdeleted).AndReturn(False)
|
| presubmit.os.path.exists(notfound).AndReturn(False)
|
| presubmit.os.path.exists(flap).AndReturn(True)
|
| @@ -598,30 +609,80 @@ class InputApiUnittest(PresubmitTestsBase):
|
| presubmit.gclient.CaptureSVNInfo(beingdeleted).AndReturn({})
|
| presubmit.gclient.CaptureSVNInfo(notfound).AndReturn({})
|
| presubmit.gcl.GetSVNFileProperty(blat, 'svn:mime-type').AndReturn(None)
|
| + presubmit.gcl.GetSVNFileProperty(readme, 'svn:mime-type').AndReturn(None)
|
| presubmit.gcl.GetSVNFileProperty(binary, 'svn:mime-type').AndReturn(
|
| 'application/octet-stream')
|
| + presubmit.gcl.GetSVNFileProperty(weird, 'svn:mime-type').AndReturn(None)
|
| + presubmit.gcl.GetSVNFileProperty(another, 'svn:mime-type').AndReturn(None)
|
| + presubmit.gcl.GetSVNFileProperty(third_party, 'svn:mime-type'
|
| + ).AndReturn(None)
|
| presubmit.gcl.ReadFile(blat).AndReturn('whatever\ncookie')
|
| + presubmit.gcl.ReadFile(another).AndReturn('whatever\ncookie2')
|
| self.mox.ReplayAll()
|
|
|
| ci = presubmit.gcl.ChangeInfo(name='mychange', issue=0, patchset=0,
|
| description='\n'.join(description_lines),
|
| files=files)
|
| change = presubmit.GclChange(ci)
|
| - api = presubmit.InputApi(change, 'foo/PRESUBMIT.py', False)
|
| - affected_files = api.AffectedFiles()
|
| - self.assertEquals(len(affected_files), 3)
|
| - self.assertEquals(affected_files[0].LocalPath(),
|
| - presubmit.normpath('foo/blat.cc'))
|
| - self.assertEquals(affected_files[1].LocalPath(),
|
| - presubmit.normpath('foo/blat/binary.dll'))
|
| - self.assertEquals(affected_files[2].LocalPath(),
|
| - presubmit.normpath('foo/mat/beingdeleted.txt'))
|
| - rhs_lines = []
|
| - for line in api.RightHandSideLines():
|
| - rhs_lines.append(line)
|
| - self.assertEquals(len(rhs_lines), 2)
|
| - self.assertEqual(rhs_lines[0][0].LocalPath(),
|
| - presubmit.normpath('foo/blat.cc'))
|
| + input_api = presubmit.InputApi(change, 'foo/PRESUBMIT.py', False)
|
| + # Doesn't filter much
|
| + got_files = input_api.AffectedFiles()
|
| + self.assertEquals(len(got_files), 7)
|
| + self.assertEquals(got_files[0].LocalPath(), presubmit.normpath(blat))
|
| + self.assertEquals(got_files[1].LocalPath(), presubmit.normpath(readme))
|
| + self.assertEquals(got_files[2].LocalPath(), presubmit.normpath(binary))
|
| + self.assertEquals(got_files[3].LocalPath(), presubmit.normpath(weird))
|
| + self.assertEquals(got_files[4].LocalPath(), presubmit.normpath(another))
|
| + self.assertEquals(got_files[5].LocalPath(), presubmit.normpath(third_party))
|
| + self.assertEquals(got_files[6].LocalPath(),
|
| + presubmit.normpath(beingdeleted))
|
| + # Ignores weird because of whitelist, third_party because of blacklist,
|
| + # binary isn't a text file and beingdeleted doesn't exist. The rest is
|
| + # outside foo/.
|
| + rhs_lines = [x for x in input_api.RightHandSideLines(None)]
|
| + self.assertEquals(len(rhs_lines), 4)
|
| + self.assertEqual(rhs_lines[0][0].LocalPath(), presubmit.normpath(blat))
|
| + self.assertEqual(rhs_lines[1][0].LocalPath(), presubmit.normpath(blat))
|
| + self.assertEqual(rhs_lines[2][0].LocalPath(), presubmit.normpath(another))
|
| + self.assertEqual(rhs_lines[3][0].LocalPath(), presubmit.normpath(another))
|
| +
|
| + def testCustomFilter(self):
|
| + def FilterSourceFile(affected_file):
|
| + return 'a' in affected_file.LocalPath()
|
| + files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee')]
|
| + for (action, item) in files:
|
| + presubmit.os.path.exists(item).AndReturn(True)
|
| + presubmit.os.path.isdir(item).AndReturn(False)
|
| + presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None)
|
| + self.mox.ReplayAll()
|
| +
|
| + ci = presubmit.gcl.ChangeInfo('mychange', 0, 0, '', files)
|
| + change = presubmit.GclChange(ci)
|
| + input_api = presubmit.InputApi(change, './PRESUBMIT.py', False)
|
| + got_files = input_api.AffectedSourceFiles(FilterSourceFile)
|
| + self.assertEquals(len(got_files), 2)
|
| + self.assertEquals(got_files[0].LocalPath(), 'eeaee')
|
| + self.assertEquals(got_files[1].LocalPath(), 'eeabee')
|
| +
|
| + def testLambdaFilter(self):
|
| + white_list = [r".*?a.*?"]
|
| + black_list = [r".*?b.*?"]
|
| + files = [('A', 'eeaee'), ('M', 'eeabee'), ('M', 'eebcee'), ('M', 'eecaee')]
|
| + for (action, item) in files:
|
| + presubmit.os.path.exists(item).AndReturn(True)
|
| + presubmit.os.path.isdir(item).AndReturn(False)
|
| + presubmit.gcl.GetSVNFileProperty(item, 'svn:mime-type').AndReturn(None)
|
| + self.mox.ReplayAll()
|
| +
|
| + ci = presubmit.gcl.ChangeInfo('mychange', 0, 0, '', files)
|
| + change = presubmit.GclChange(ci)
|
| + input_api = presubmit.InputApi(change, './PRESUBMIT.py', False)
|
| + # Sample usage of overiding the default white and black lists.
|
| + got_files = input_api.AffectedSourceFiles(
|
| + lambda x: input_api.FilterSourceFile(x, white_list, black_list))
|
| + self.assertEquals(len(got_files), 2)
|
| + self.assertEquals(got_files[0].LocalPath(), 'eeaee')
|
| + self.assertEquals(got_files[1].LocalPath(), 'eecaee')
|
|
|
| def testGetAbsoluteLocalPath(self):
|
| join = presubmit.os.path.join
|
| @@ -905,7 +966,7 @@ class CannedChecksUnittest(PresubmitTestsBase):
|
| (affected_file, 43, 'yer'),
|
| (affected_file, 23, 'ya'),
|
| ]
|
| - input_api1.RightHandSideLines().AndReturn(output1)
|
| + input_api1.RightHandSideLines(mox.IgnoreArg()).AndReturn(output1)
|
| input_api2 = self.MockInputApi()
|
| input_api2.change = self.MakeBasicChange('foo', 'Foo\n')
|
| output2 = [
|
| @@ -913,12 +974,12 @@ class CannedChecksUnittest(PresubmitTestsBase):
|
| (affected_file, 43, 'yer'),
|
| (affected_file, 23, 'ya'),
|
| ]
|
| - input_api2.RightHandSideLines().AndReturn(output2)
|
| + input_api2.RightHandSideLines(mox.IgnoreArg()).AndReturn(output2)
|
| self.mox.ReplayAll()
|
|
|
| - results1 = check(input_api1, presubmit.OutputApi)
|
| + results1 = check(input_api1, presubmit.OutputApi, None)
|
| self.assertEquals(results1, [])
|
| - results2 = check(input_api2, presubmit.OutputApi)
|
| + results2 = check(input_api2, presubmit.OutputApi, None)
|
| self.assertEquals(len(results2), 1)
|
| self.assertEquals(results2[0].__class__, error_type)
|
|
|
| @@ -948,31 +1009,32 @@ class CannedChecksUnittest(PresubmitTestsBase):
|
| presubmit.OutputApi.PresubmitError)
|
|
|
| def testCannedCheckDoNotSubmitInFiles(self):
|
| - self.TestContent(presubmit_canned_checks.CheckDoNotSubmitInFiles,
|
| - 'DO NOTSUBMIT', 'DO NOT ' + 'SUBMIT',
|
| - presubmit.OutputApi.PresubmitError)
|
| + self.TestContent(
|
| + lambda x,y,z: presubmit_canned_checks.CheckDoNotSubmitInFiles(x, y),
|
| + 'DO NOTSUBMIT', 'DO NOT ' + 'SUBMIT',
|
| + presubmit.OutputApi.PresubmitError)
|
|
|
| def testCheckChangeHasNoCR(self):
|
| input_api1 = self.MockInputApi()
|
| self.mox.StubOutWithMock(input_api1, 'ReadFile')
|
| input_api1.change = self.MakeBasicChange('foo', 'Foo\n')
|
| affected_file1 = self.mox.CreateMock(presubmit.SvnAffectedFile)
|
| - input_api1.AffectedTextFiles().AndReturn([affected_file1])
|
| + input_api1.AffectedSourceFiles(None).AndReturn([affected_file1])
|
| input_api1.ReadFile(affected_file1, 'rb').AndReturn("Hey!\nHo!\n")
|
| input_api2 = self.MockInputApi()
|
| self.mox.StubOutWithMock(input_api2, 'ReadFile')
|
| input_api2.change = self.MakeBasicChange('foo', 'Foo\n')
|
| affected_file2 = self.mox.CreateMock(presubmit.SvnAffectedFile)
|
| - input_api2.AffectedTextFiles().AndReturn([affected_file2])
|
| + input_api2.AffectedSourceFiles(None).AndReturn([affected_file2])
|
| input_api2.ReadFile(affected_file2, 'rb').AndReturn("Hey!\r\nHo!\r\n")
|
| affected_file2.LocalPath().AndReturn('bar.cc')
|
| self.mox.ReplayAll()
|
|
|
| results = presubmit_canned_checks.CheckChangeHasNoCR(
|
| - input_api1, presubmit.OutputApi)
|
| + input_api1, presubmit.OutputApi, None)
|
| self.assertEquals(results, [])
|
| results2 = presubmit_canned_checks.CheckChangeHasNoCR(
|
| - input_api2, presubmit.OutputApi)
|
| + input_api2, presubmit.OutputApi, None)
|
| self.assertEquals(len(results2), 1)
|
| self.assertEquals(results2[0].__class__,
|
| presubmit.OutputApi.PresubmitPromptWarning)
|
| @@ -983,7 +1045,7 @@ class CannedChecksUnittest(PresubmitTestsBase):
|
| presubmit.OutputApi.PresubmitPromptWarning)
|
|
|
| def testCannedCheckLongLines(self):
|
| - check = lambda x,y: presubmit_canned_checks.CheckLongLines(x, y, 10)
|
| + check = lambda x,y,z: presubmit_canned_checks.CheckLongLines(x, y, 10, z)
|
| self.TestContent(check, '', 'blah blah blah',
|
| presubmit.OutputApi.PresubmitPromptWarning)
|
|
|
|
|