@ -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 \n this is a change \n and 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 ' )