| Index: tests/presubmit_unittest.py
|
| diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py
|
| index 314901012bf3744e983ca86b29600377dd85aa28..f97121a7ba783157f3da9d607f2337f01671f136 100755
|
| --- a/tests/presubmit_unittest.py
|
| +++ b/tests/presubmit_unittest.py
|
| @@ -147,6 +147,7 @@ def GetPreferredTrySlaves(project):
|
| self.mox.StubOutWithMock(presubmit.gclient_utils, 'FileRead')
|
| self.mox.StubOutWithMock(presubmit.gclient_utils, 'FileWrite')
|
| self.mox.StubOutWithMock(presubmit.scm.SVN, 'GenerateDiff')
|
| + self.mox.StubOutWithMock(presubmit.scm.GIT, 'GenerateDiff')
|
|
|
|
|
| class PresubmitUnittest(PresubmitTestsBase):
|
| @@ -385,6 +386,193 @@ class PresubmitUnittest(PresubmitTestsBase):
|
| self.assertEquals(rhs_lines[13][1], 49)
|
| self.assertEquals(rhs_lines[13][2], 'this is line number 48.1')
|
|
|
| + def testGitChange(self):
|
| + description_lines = ('Hello there',
|
| + 'this is a change',
|
| + 'BUG=123',
|
| + ' STORY =http://foo/ \t',
|
| + 'and some more regular text \t')
|
| + unified_diff = [
|
| + 'diff --git binary_a.png binary_a.png',
|
| + 'new file mode 100644',
|
| + 'index 0000000..6fbdd6d',
|
| + 'Binary files /dev/null and binary_a.png differ',
|
| + 'diff --git binary_d.png binary_d.png',
|
| + 'deleted file mode 100644',
|
| + 'index 6fbdd6d..0000000',
|
| + 'Binary files binary_d.png and /dev/null differ',
|
| + 'diff --git binary_md.png binary_md.png',
|
| + 'index 6fbdd6..be3d5d8 100644',
|
| + 'GIT binary patch',
|
| + 'delta 109',
|
| + 'zcmeyihjs5>)(Opwi4&WXB~yyi6N|G`(i5|?i<2_a@)OH5N{Um`D-<SM@g!_^W9;SR',
|
| + 'zO9b*W5{pxTM0slZ=F42indK9U^MTyVQlJ2s%1BMmEKMv1Q^gtS&9nHn&*Ede;|~CU',
|
| + 'CMJxLN',
|
| + '',
|
| + 'delta 34',
|
| + 'scmV+-0Nww+y#@BX1(1W0gkzIp3}CZh0gVZ>`wGVcgW(Rh;SK@ZPa9GXlK=n!',
|
| + '',
|
| + 'diff --git binary_m.png binary_m.png',
|
| + 'index 6fbdd6d..be3d5d8 100644',
|
| + 'Binary files binary_m.png and binary_m.png differ',
|
| + 'diff --git boo/blat.cc boo/blat.cc',
|
| + 'new file mode 100644',
|
| + 'index 0000000..37d18ad',
|
| + '--- boo/blat.cc',
|
| + '+++ boo/blat.cc',
|
| + '@@ -0,0 +1,5 @@',
|
| + '+This is some text',
|
| + '+which lacks a copyright warning',
|
| + '+but it is nonetheless interesting',
|
| + '+and worthy of your attention.',
|
| + '+Its freshness factor is through the roof.',
|
| + 'diff --git floo/delburt.cc floo/delburt.cc',
|
| + 'deleted file mode 100644',
|
| + 'index e06377a..0000000',
|
| + '--- floo/delburt.cc',
|
| + '+++ /dev/null',
|
| + '@@ -1,14 +0,0 @@',
|
| + '-This text used to be here',
|
| + '-but someone, probably you,',
|
| + '-having consumed the text',
|
| + '- (absorbed its meaning)',
|
| + '-decided that it should be made to not exist',
|
| + '-that others would not read it.',
|
| + '- (What happened here?',
|
| + '-was the author incompetent?',
|
| + '-or is the world today so different from the world',
|
| + '- the author foresaw',
|
| + '-and past imaginination',
|
| + '- amounts to rubble, insignificant,',
|
| + '-something to be tripped over',
|
| + '-and frustrated by)',
|
| + 'diff --git foo/TestExpectations foo/TestExpectations',
|
| + 'index c6e12ab..d1c5f23 100644',
|
| + '--- foo/TestExpectations',
|
| + '+++ foo/TestExpectations',
|
| + '@@ -1,12 +1,24 @@',
|
| + '-Stranger, behold:',
|
| + '+Strange to behold:',
|
| + ' This is a text',
|
| + ' Its contents existed before.',
|
| + '',
|
| + '-It is written:',
|
| + '+Weasel words suggest:',
|
| + ' its contents shall exist after',
|
| + ' and its contents',
|
| + ' with the progress of time',
|
| + ' will evolve,',
|
| + '- snaillike,',
|
| + '+ erratically,',
|
| + ' into still different texts',
|
| + '-from this.',
|
| + '\ No newline at end of file',
|
| + '+from this.',
|
| + '+',
|
| + '+For the most part,',
|
| + '+I really think unified diffs',
|
| + '+are elegant: the way you can type',
|
| + '+diff --git inside/a/text inside/a/text',
|
| + '+or something silly like',
|
| + '+@@ -278,6 +278,10 @@',
|
| + '+and have this not be interpreted',
|
| + '+as the start of a new file',
|
| + '+or anything messed up like that,',
|
| + '+because you parsed the header',
|
| + '+correctly.',
|
| + '\ No newline at end of file',
|
| + '']
|
| + files = [('A ', 'binary_a.png'),
|
| + ('D ', 'binary_d.png'),
|
| + ('M ', 'binary_m.png'),
|
| + ('M ', 'binary_md.png'), # Binary w/ diff
|
| + ('A ', 'boo/blat.cc'),
|
| + ('D ', 'floo/delburt.cc'),
|
| + ('M ', 'foo/TestExpectations')]
|
| +
|
| + for op, path in files:
|
| + full_path = presubmit.os.path.join(self.fake_root_dir, *path.split('/'))
|
| + if op.startswith('D'):
|
| + os.path.exists(full_path).AndReturn(False)
|
| + else:
|
| + os.path.exists(full_path).AndReturn(False)
|
| + os.path.isfile(full_path).AndReturn(True)
|
| +
|
| + presubmit.scm.GIT.GenerateDiff(self.fake_root_dir, files=[], full_move=True
|
| + ).AndReturn('\n'.join(unified_diff))
|
| +
|
| + self.mox.ReplayAll()
|
| +
|
| + change = presubmit.GitChange(
|
| + 'mychange',
|
| + '\n'.join(description_lines),
|
| + self.fake_root_dir,
|
| + files,
|
| + 0,
|
| + 0,
|
| + None)
|
| + self.failUnless(change.Name() == 'mychange')
|
| + self.failUnless(change.DescriptionText() ==
|
| + 'Hello there\nthis is a change\nand some more regular text')
|
| + self.failUnless(change.FullDescriptionText() ==
|
| + '\n'.join(description_lines))
|
| +
|
| + self.failUnless(change.BUG == '123')
|
| + self.failUnless(change.STORY == 'http://foo/')
|
| + self.failUnless(change.BLEH == None)
|
| +
|
| + self.failUnless(len(change.AffectedFiles()) == 7)
|
| + self.failUnless(len(change.AffectedFiles(include_dirs=True)) == 7)
|
| + self.failUnless(len(change.AffectedFiles(include_deletes=False)) == 5)
|
| + self.failUnless(len(change.AffectedFiles(include_dirs=True,
|
| + include_deletes=False)) == 5)
|
| +
|
| + # Note that on git, there's no distinction between binary files and text
|
| + # files; everything that's not a delete is a text file.
|
| + affected_text_files = change.AffectedTextFiles()
|
| + self.failUnless(len(affected_text_files) == 5)
|
| +
|
| + local_paths = change.LocalPaths()
|
| + expected_paths = [os.path.normpath(f) for op, f in files]
|
| + self.assertEqual(local_paths, expected_paths)
|
| +
|
| + try:
|
| + _ = change.ServerPaths()
|
| + self.fail("ServerPaths implemented.")
|
| + except NotImplementedError:
|
| + pass
|
| +
|
| + actual_rhs_lines = []
|
| + for f, linenum, line in change.RightHandSideLines():
|
| + actual_rhs_lines.append((f.LocalPath(), linenum, line))
|
| +
|
| + f_blat = os.path.normpath('boo/blat.cc')
|
| + f_test_expectations = os.path.normpath('foo/TestExpectations')
|
| + expected_rhs_lines = [
|
| + (f_blat, 1, 'This is some text'),
|
| + (f_blat, 2, 'which lacks a copyright warning'),
|
| + (f_blat, 3, 'but it is nonetheless interesting'),
|
| + (f_blat, 4, 'and worthy of your attention.'),
|
| + (f_blat, 5, 'Its freshness factor is through the roof.'),
|
| + (f_test_expectations, 1, 'Strange to behold:'),
|
| + (f_test_expectations, 5, 'Weasel words suggest:'),
|
| + (f_test_expectations, 10, ' erratically,'),
|
| + (f_test_expectations, 13, 'from this.'),
|
| + (f_test_expectations, 14, ''),
|
| + (f_test_expectations, 15, 'For the most part,'),
|
| + (f_test_expectations, 16, 'I really think unified diffs'),
|
| + (f_test_expectations, 17, 'are elegant: the way you can type'),
|
| + (f_test_expectations, 18, 'diff --git inside/a/text inside/a/text'),
|
| + (f_test_expectations, 19, 'or something silly like'),
|
| + (f_test_expectations, 20, '@@ -278,6 +278,10 @@'),
|
| + (f_test_expectations, 21, 'and have this not be interpreted'),
|
| + (f_test_expectations, 22, 'as the start of a new file'),
|
| + (f_test_expectations, 23, 'or anything messed up like that,'),
|
| + (f_test_expectations, 24, 'because you parsed the header'),
|
| + (f_test_expectations, 25, 'correctly.')]
|
| +
|
| + self.assertEquals(expected_rhs_lines, actual_rhs_lines)
|
| +
|
| def testInvalidChange(self):
|
| try:
|
| presubmit.SvnChange(
|
| @@ -1251,7 +1439,8 @@ class InputApiUnittest(PresubmitTestsBase):
|
| input_api.ReadFile(path, 'x')
|
|
|
| def testReadFileAffectedFileDenied(self):
|
| - fileobj = presubmit.AffectedFile('boo', 'M', 'Unrelated')
|
| + fileobj = presubmit.AffectedFile('boo', 'M', 'Unrelated',
|
| + diff_cache=mox.IsA(presubmit._DiffCache))
|
| self.mox.ReplayAll()
|
|
|
| change = presubmit.Change(
|
| @@ -1262,7 +1451,8 @@ class InputApiUnittest(PresubmitTestsBase):
|
| self.assertRaises(IOError, input_api.ReadFile, fileobj, 'x')
|
|
|
| def testReadFileAffectedFileAccepted(self):
|
| - fileobj = presubmit.AffectedFile('AA/boo', 'M', self.fake_root_dir)
|
| + fileobj = presubmit.AffectedFile('AA/boo', 'M', self.fake_root_dir,
|
| + diff_cache=mox.IsA(presubmit._DiffCache))
|
| presubmit.gclient_utils.FileRead(fileobj.AbsoluteLocalPath(), 'x'
|
| ).AndReturn(None)
|
| self.mox.ReplayAll()
|
| @@ -1358,19 +1548,22 @@ class OutputApiUnittest(PresubmitTestsBase):
|
| self.failIf(output.should_continue())
|
| self.failUnless(output.getvalue().count('???'))
|
|
|
| +
|
| class AffectedFileUnittest(PresubmitTestsBase):
|
| def testMembersChanged(self):
|
| self.mox.ReplayAll()
|
| members = [
|
| - 'AbsoluteLocalPath', 'Action', 'ChangedContents', 'GenerateScmDiff',
|
| - 'IsDirectory', 'IsTextFile', 'LocalPath', 'NewContents', 'OldContents',
|
| - 'OldFileTempPath', 'Property', 'ServerPath',
|
| + 'AbsoluteLocalPath', 'Action', 'ChangedContents', 'DIFF_CACHE',
|
| + 'GenerateScmDiff', 'IsDirectory', 'IsTextFile', 'LocalPath',
|
| + 'NewContents', 'Property', 'ServerPath',
|
| ]
|
| # If this test fails, you should add the relevant test.
|
| self.compareMembers(
|
| presubmit.AffectedFile('a', 'b', self.fake_root_dir), members)
|
| self.compareMembers(
|
| presubmit.SvnAffectedFile('a', 'b', self.fake_root_dir), members)
|
| + self.compareMembers(
|
| + presubmit.GitAffectedFile('a', 'b', self.fake_root_dir), members)
|
|
|
| def testAffectedFile(self):
|
| path = presubmit.os.path.join('foo', 'blat.cc')
|
|
|