1 #!/usr/bin/perl -w 2 # 3 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek (at] gmail.com) 4 # Copyright (C) 2012 Daniel Bates (dbates (at] intudata.com) 5 # 6 # Redistribution and use in source and binary forms, with or without 7 # modification, are permitted provided that the following conditions are 8 # met: 9 # 10 # * Redistributions of source code must retain the above copyright 11 # notice, this list of conditions and the following disclaimer. 12 # * Redistributions in binary form must reproduce the above 13 # copyright notice, this list of conditions and the following disclaimer 14 # in the documentation and/or other materials provided with the 15 # distribution. 16 # * Neither the name of Apple Computer, Inc. ("Apple") nor the names of 17 # its contributors may be used to endorse or promote products derived 18 # from this software without specific prior written permission. 19 # 20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 32 # Unit tests of parseSvnDiffHeader(). 33 34 use strict; 35 use warnings; 36 37 use Test::More; 38 use VCSUtils; 39 40 # The array of test cases. 41 my @testCaseHashRefs = ( 42 { 43 # New test 44 diffName => "simple diff", 45 inputText => <<'END', 46 Index: WebKitTools/Scripts/VCSUtils.pm 47 =================================================================== 48 --- WebKitTools/Scripts/VCSUtils.pm (revision 53004) 49 +++ WebKitTools/Scripts/VCSUtils.pm (working copy) 50 @@ -32,6 +32,7 @@ use strict; 51 use warnings; 52 END 53 expectedReturn => [ 54 { 55 svnConvertedText => <<'END', 56 Index: WebKitTools/Scripts/VCSUtils.pm 57 =================================================================== 58 --- WebKitTools/Scripts/VCSUtils.pm (revision 53004) 59 +++ WebKitTools/Scripts/VCSUtils.pm (working copy) 60 END 61 indexPath => "WebKitTools/Scripts/VCSUtils.pm", 62 sourceRevision => "53004", 63 }, 64 "@@ -32,6 +32,7 @@ use strict;\n"], 65 expectedNextLine => " use warnings;\n", 66 }, 67 { 68 # New test 69 diffName => "new file", 70 inputText => <<'END', 71 Index: WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl 72 =================================================================== 73 --- WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl (revision 0) 74 +++ WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl (revision 0) 75 @@ -0,0 +1,262 @@ 76 +#!/usr/bin/perl -w 77 END 78 expectedReturn => [ 79 { 80 svnConvertedText => <<'END', 81 Index: WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl 82 =================================================================== 83 --- WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl (revision 0) 84 +++ WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl (revision 0) 85 END 86 indexPath => "WebKitTools/Scripts/webkitperl/VCSUtils_unittest/parseDiffHeader.pl", 87 isNew => 1, 88 }, 89 "@@ -0,0 +1,262 @@\n"], 90 expectedNextLine => "+#!/usr/bin/perl -w\n", 91 }, 92 { 93 # New test 94 diffName => "new file with spaces in its name", 95 inputText => <<'END', 96 Index: WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme 97 =================================================================== 98 --- WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme (revision 0) 99 +++ WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme (revision 0) 100 @@ -0,0 +1,8 @@ 101 +<?xml version="1.0" encoding="UTF-8"?> 102 END 103 expectedReturn => [ 104 { 105 svnConvertedText => <<'END', 106 Index: WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme 107 =================================================================== 108 --- WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme (revision 0) 109 +++ WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme (revision 0) 110 END 111 indexPath => "WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme", 112 isNew => 1, 113 }, 114 "@@ -0,0 +1,8 @@\n"], 115 expectedNextLine => "+<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", 116 }, 117 { 118 # New test 119 diffName => "copied file", 120 inputText => <<'END', 121 Index: index_path.py 122 =================================================================== 123 --- index_path.py (revision 53048) (from copied_from_path.py:53048) 124 +++ index_path.py (working copy) 125 @@ -0,0 +1,7 @@ 126 +# Python file... 127 END 128 expectedReturn => [ 129 { 130 svnConvertedText => <<'END', 131 Index: index_path.py 132 =================================================================== 133 --- index_path.py (revision 53048) (from copied_from_path.py:53048) 134 +++ index_path.py (working copy) 135 END 136 copiedFromPath => "copied_from_path.py", 137 indexPath => "index_path.py", 138 sourceRevision => 53048, 139 }, 140 "@@ -0,0 +1,7 @@\n"], 141 expectedNextLine => "+# Python file...\n", 142 }, 143 { 144 # New test 145 diffName => "contains \\r\\n lines", 146 inputText => <<END, # No single quotes to allow interpolation of "\r" 147 Index: index_path.py\r 148 ===================================================================\r 149 --- index_path.py (revision 53048)\r 150 +++ index_path.py (working copy)\r 151 @@ -0,0 +1,7 @@\r 152 +# Python file...\r 153 END 154 expectedReturn => [ 155 { 156 svnConvertedText => <<END, # No single quotes to allow interpolation of "\r" 157 Index: index_path.py\r 158 ===================================================================\r 159 --- index_path.py (revision 53048)\r 160 +++ index_path.py (working copy)\r 161 END 162 indexPath => "index_path.py", 163 sourceRevision => 53048, 164 }, 165 "@@ -0,0 +1,7 @@\r\n"], 166 expectedNextLine => "+# Python file...\r\n", 167 }, 168 { 169 # New test 170 diffName => "contains path corrections", 171 inputText => <<'END', 172 Index: index_path.py 173 =================================================================== 174 --- bad_path (revision 53048) (from copied_from_path.py:53048) 175 +++ bad_path (working copy) 176 @@ -0,0 +1,7 @@ 177 +# Python file... 178 END 179 expectedReturn => [ 180 { 181 svnConvertedText => <<'END', 182 Index: index_path.py 183 =================================================================== 184 --- index_path.py (revision 53048) (from copied_from_path.py:53048) 185 +++ index_path.py (working copy) 186 END 187 copiedFromPath => "copied_from_path.py", 188 indexPath => "index_path.py", 189 sourceRevision => 53048, 190 }, 191 "@@ -0,0 +1,7 @@\n"], 192 expectedNextLine => "+# Python file...\n", 193 }, 194 #### 195 # Binary test cases 196 ## 197 { 198 # New test 199 diffName => "binary file", 200 inputText => <<'END', 201 Index: test_file.swf 202 =================================================================== 203 Cannot display: file marked as a binary type. 204 svn:mime-type = application/octet-stream 205 206 Property changes on: test_file.swf 207 ___________________________________________________________________ 208 Name: svn:mime-type 209 + application/octet-stream 210 211 212 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA== 213 END 214 expectedReturn => [ 215 { 216 svnConvertedText => <<'END', 217 Index: test_file.swf 218 =================================================================== 219 Cannot display: file marked as a binary type. 220 svn:mime-type = application/octet-stream 221 222 END 223 indexPath => "test_file.swf", 224 isBinary => 1, 225 }, 226 "Property changes on: test_file.swf\n"], 227 expectedNextLine => "___________________________________________________________________\n", 228 }, 229 { 230 # New test 231 diffName => "binary file using SVN 1.7 syntax", 232 inputText => <<'END', 233 Index: test_file.swf 234 =================================================================== 235 Cannot display: file marked as a binary type. 236 svn:mime-type = application/octet-stream 237 Index: test_file.swf 238 =================================================================== 239 --- test_file.swf 240 +++ test_file.swf 241 242 Property changes on: test_file.swf 243 ___________________________________________________________________ 244 Added: svn:mime-type 245 ## -0,0 +1 ## 246 +application/octet-stream 247 \ No newline at end of property 248 249 Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA== 250 END 251 expectedReturn => [ 252 { 253 svnConvertedText => <<'END', 254 Index: test_file.swf 255 =================================================================== 256 Cannot display: file marked as a binary type. 257 svn:mime-type = application/octet-stream 258 Index: test_file.swf 259 =================================================================== 260 --- test_file.swf 261 +++ test_file.swf 262 END 263 indexPath => "test_file.swf", 264 isBinary => 1, 265 }, 266 "\n"], 267 expectedNextLine => "Property changes on: test_file.swf\n", 268 }, 269 ); 270 271 my $testCasesCount = @testCaseHashRefs; 272 plan(tests => 2 * $testCasesCount); # Total number of assertions. 273 274 foreach my $testCase (@testCaseHashRefs) { 275 my $testNameStart = "parseSvnDiffHeader(): $testCase->{diffName}: comparing"; 276 277 my $fileHandle; 278 open($fileHandle, "<", \$testCase->{inputText}); 279 my $line = <$fileHandle>; 280 281 my @got = VCSUtils::parseSvnDiffHeader($fileHandle, $line); 282 my $expectedReturn = $testCase->{expectedReturn}; 283 284 is_deeply(\@got, $expectedReturn, "$testNameStart return value."); 285 286 my $gotNextLine = <$fileHandle>; 287 is($gotNextLine, $testCase->{expectedNextLine}, "$testNameStart next read line."); 288 } 289