Home | History | Annotate | Download | only in VCSUtils_unittest
      1 #!/usr/bin/perl -w
      2 #
      3 # Copyright (C) 2010 Chris Jerdonek (cjerdonek (at] webkit.org)
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 # 1.  Redistributions of source code must retain the above copyright
      9 #     notice, this list of conditions and the following disclaimer.
     10 # 2.  Redistributions in binary form must reproduce the above copyright
     11 #     notice, this list of conditions and the following disclaimer in the
     12 #     documentation and/or other materials provided with the distribution.
     13 #
     14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
     15 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     16 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     17 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
     18 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     19 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     20 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     21 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     22 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24 
     25 # Unit tests of parseGitDiffHeader().
     26 
     27 use strict;
     28 use warnings;
     29 
     30 use Test::More;
     31 use VCSUtils;
     32 
     33 # The array of test cases.
     34 my @testCaseHashRefs = (
     35 {   # New test
     36     diffName => "Modified file",
     37     inputText => <<'END',
     38 diff --git a/foo.h b/foo.h
     39 index f5d5e74..3b6aa92 100644
     40 --- a/foo.h
     41 +++ b/foo.h
     42 @@ -1 +1 @@
     43 -file contents
     44 +new file contents
     45 END
     46     expectedReturn => [
     47 {
     48     svnConvertedText => <<'END',
     49 Index: foo.h
     50 index f5d5e74..3b6aa92 100644
     51 --- foo.h
     52 +++ foo.h
     53 END
     54     indexPath => "foo.h",
     55 },
     56 "@@ -1 +1 @@\n"],
     57     expectedNextLine => "-file contents\n",
     58 },
     59 {   # New test
     60     diffName => "new file",
     61     inputText => <<'END',
     62 diff --git a/foo.h b/foo.h
     63 new file mode 100644
     64 index 0000000..3c9f114
     65 --- /dev/null
     66 +++ b/foo.h
     67 @@ -0,0 +1,34 @@
     68 +<html>
     69 END
     70     expectedReturn => [
     71 {
     72     svnConvertedText => <<'END',
     73 Index: foo.h
     74 new file mode 100644
     75 index 0000000..3c9f114
     76 --- foo.h
     77 +++ foo.h
     78 END
     79     indexPath => "foo.h",
     80     isNew => 1,
     81 },
     82 "@@ -0,0 +1,34 @@\n"],
     83     expectedNextLine => "+<html>\n",
     84 },
     85 {   # New test
     86     diffName => "file deletion",
     87     inputText => <<'END',
     88 diff --git a/foo b/foo
     89 deleted file mode 100644
     90 index 1e50d1d..0000000
     91 --- a/foo
     92 +++ /dev/null
     93 @@ -1,1 +0,0 @@
     94 -line1
     95 diff --git a/configure.ac b/configure.ac
     96 index d45dd40..3494526 100644
     97 END
     98     expectedReturn => [
     99 {
    100     svnConvertedText => <<'END',
    101 Index: foo
    102 deleted file mode 100644
    103 index 1e50d1d..0000000
    104 --- foo
    105 +++ foo
    106 END
    107     indexPath => "foo",
    108     isDeletion => 1,
    109 },
    110 "@@ -1,1 +0,0 @@\n"],
    111     expectedNextLine => "-line1\n",
    112 },
    113 {   # New test
    114     diffName => "using --no-prefix",
    115     inputText => <<'END',
    116 diff --git foo.h foo.h
    117 index c925780..9e65c43 100644
    118 --- foo.h
    119 +++ foo.h
    120 @@ -1,3 +1,17 @@
    121 +contents
    122 END
    123     expectedReturn => [
    124 {
    125     svnConvertedText => <<'END',
    126 Index: foo.h
    127 index c925780..9e65c43 100644
    128 --- foo.h
    129 +++ foo.h
    130 END
    131     indexPath => "foo.h",
    132 },
    133 "@@ -1,3 +1,17 @@\n"],
    134     expectedNextLine => "+contents\n",
    135 },
    136 ####
    137 #    Copy operations
    138 ##
    139 {   # New test
    140     diffName => "copy (with similarity index 100%)",
    141     inputText => <<'END',
    142 diff --git a/foo b/foo_new
    143 similarity index 100%
    144 copy from foo
    145 copy to foo_new
    146 diff --git a/bar b/bar
    147 index d45dd40..3494526 100644
    148 END
    149     expectedReturn => [
    150 {
    151     svnConvertedText => <<'END',
    152 Index: foo_new
    153 similarity index 100%
    154 copy from foo
    155 copy to foo_new
    156 END
    157     copiedFromPath => "foo",
    158     indexPath => "foo_new",
    159 },
    160 "diff --git a/bar b/bar\n"],
    161     expectedNextLine => "index d45dd40..3494526 100644\n",
    162 },
    163 {   # New test
    164     diffName => "copy (with similarity index < 100%)",
    165     inputText => <<'END',
    166 diff --git a/foo b/foo_new
    167 similarity index 99%
    168 copy from foo
    169 copy to foo_new
    170 diff --git a/bar b/bar
    171 index d45dd40..3494526 100644
    172 END
    173     expectedReturn => [
    174 {
    175     svnConvertedText => <<'END',
    176 Index: foo_new
    177 similarity index 99%
    178 copy from foo
    179 copy to foo_new
    180 END
    181     copiedFromPath => "foo",
    182     indexPath => "foo_new",
    183     isCopyWithChanges => 1,
    184 },
    185 "diff --git a/bar b/bar\n"],
    186     expectedNextLine => "index d45dd40..3494526 100644\n",
    187 },
    188 {   # New test
    189     diffName => "rename (with similarity index 100%)",
    190     inputText => <<'END',
    191 diff --git a/foo b/foo_new
    192 similarity index 100%
    193 rename from foo
    194 rename to foo_new
    195 diff --git a/bar b/bar
    196 index d45dd40..3494526 100644
    197 END
    198     expectedReturn => [
    199 {
    200     svnConvertedText => <<'END',
    201 Index: foo_new
    202 similarity index 100%
    203 rename from foo
    204 rename to foo_new
    205 END
    206     copiedFromPath => "foo",
    207     indexPath => "foo_new",
    208     shouldDeleteSource => 1,
    209 },
    210 "diff --git a/bar b/bar\n"],
    211     expectedNextLine => "index d45dd40..3494526 100644\n",
    212 },
    213 {   # New test
    214     diffName => "rename (with similarity index < 100%)",
    215     inputText => <<'END',
    216 diff --git a/foo b/foo_new
    217 similarity index 99%
    218 rename from foo
    219 rename to foo_new
    220 index 1e50d1d..1459d21 100644
    221 --- a/foo
    222 +++ b/foo_new
    223 @@ -15,3 +15,4 @@ release r deployment dep deploy:
    224  line1
    225  line2
    226  line3
    227 +line4
    228 diff --git a/bar b/bar
    229 index d45dd40..3494526 100644
    230 END
    231     expectedReturn => [
    232 {
    233     svnConvertedText => <<'END',
    234 Index: foo_new
    235 similarity index 99%
    236 rename from foo
    237 rename to foo_new
    238 index 1e50d1d..1459d21 100644
    239 --- foo_new
    240 +++ foo_new
    241 END
    242     copiedFromPath => "foo",
    243     indexPath => "foo_new",
    244     isCopyWithChanges => 1,
    245     shouldDeleteSource => 1,
    246 },
    247 "@@ -15,3 +15,4 @@ release r deployment dep deploy:\n"],
    248     expectedNextLine => " line1\n",
    249 },
    250 {   # New test
    251     diffName => "rename (with executable bit change)",
    252     inputText => <<'END',
    253 diff --git a/foo b/foo_new
    254 old mode 100644
    255 new mode 100755
    256 similarity index 100%
    257 rename from foo
    258 rename to foo_new
    259 diff --git a/bar b/bar
    260 index d45dd40..3494526 100644
    261 END
    262     expectedReturn => [
    263 {
    264     svnConvertedText => <<'END',
    265 Index: foo_new
    266 old mode 100644
    267 new mode 100755
    268 similarity index 100%
    269 rename from foo
    270 rename to foo_new
    271 END
    272     copiedFromPath => "foo",
    273     executableBitDelta => 1,
    274     indexPath => "foo_new",
    275     isCopyWithChanges => 1,
    276     shouldDeleteSource => 1,
    277 },
    278 "diff --git a/bar b/bar\n"],
    279     expectedNextLine => "index d45dd40..3494526 100644\n",
    280 },
    281 ####
    282 #    Binary file test cases
    283 ##
    284 {
    285     # New test case
    286     diffName => "New binary file",
    287     inputText => <<'END',
    288 diff --git a/foo.gif b/foo.gif
    289 new file mode 100644
    290 index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
    291 GIT binary patch
    292 literal 7
    293 OcmYex&reDa;sO8*F9L)B
    294 
    295 literal 0
    296 HcmV?d00001
    297 
    298 END
    299     expectedReturn => [
    300 {
    301     svnConvertedText => <<'END',
    302 Index: foo.gif
    303 new file mode 100644
    304 index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
    305 GIT binary patch
    306 END
    307     indexPath => "foo.gif",
    308     isBinary => 1,
    309     isNew => 1,
    310 },
    311 "literal 7\n"],
    312     expectedNextLine => "OcmYex&reDa;sO8*F9L)B\n",
    313 },
    314 {
    315     # New test case
    316     diffName => "Deleted binary file",
    317     inputText => <<'END',
    318 diff --git a/foo.gif b/foo.gif
    319 deleted file mode 100644
    320 index 323fae0..0000000
    321 GIT binary patch
    322 literal 0
    323 HcmV?d00001
    324 
    325 literal 7
    326 OcmYex&reDa;sO8*F9L)B
    327 
    328 END
    329     expectedReturn => [
    330 {
    331     svnConvertedText => <<'END',
    332 Index: foo.gif
    333 deleted file mode 100644
    334 index 323fae0..0000000
    335 GIT binary patch
    336 END
    337     indexPath => "foo.gif",
    338     isBinary => 1,
    339     isDeletion => 1,
    340 },
    341 "literal 0\n"],
    342     expectedNextLine => "HcmV?d00001\n",
    343 },
    344 ####
    345 #    Executable bit test cases
    346 ##
    347 {
    348     # New test case
    349     diffName => "Modified executable file",
    350     inputText => <<'END',
    351 diff --git a/foo b/foo
    352 index d03e242..435ad3a 100755
    353 --- a/foo
    354 +++ b/foo
    355 @@ -1 +1 @@
    356 -file contents
    357 +new file contents
    358 
    359 END
    360     expectedReturn => [
    361 {
    362     svnConvertedText => <<'END',
    363 Index: foo
    364 index d03e242..435ad3a 100755
    365 --- foo
    366 +++ foo
    367 END
    368     indexPath => "foo",
    369 },
    370 "@@ -1 +1 @@\n"],
    371     expectedNextLine => "-file contents\n",
    372 },
    373 {
    374     # New test case
    375     diffName => "Making file executable (last diff)",
    376     inputText => <<'END',
    377 diff --git a/foo.exe b/foo.exe
    378 old mode 100644
    379 new mode 100755
    380 END
    381     expectedReturn => [
    382 {
    383     svnConvertedText => <<'END',
    384 Index: foo.exe
    385 old mode 100644
    386 new mode 100755
    387 END
    388     executableBitDelta => 1,
    389     indexPath => "foo.exe",
    390 },
    391 undef],
    392     expectedNextLine => undef,
    393 },
    394 {
    395     # New test case
    396     diffName => "Making file executable (not last diff)",
    397     inputText => <<'END',
    398 diff --git a/foo.exe b/foo.exe
    399 old mode 100644
    400 new mode 100755
    401 diff --git a/another_file.txt b/another_file.txt
    402 index d03e242..435ad3a 100755
    403 END
    404     expectedReturn => [
    405 {
    406     svnConvertedText => <<'END',
    407 Index: foo.exe
    408 old mode 100644
    409 new mode 100755
    410 END
    411     executableBitDelta => 1,
    412     indexPath => "foo.exe",
    413 },
    414 "diff --git a/another_file.txt b/another_file.txt\n"],
    415     expectedNextLine => "index d03e242..435ad3a 100755\n",
    416 },
    417 {
    418     # New test case
    419     diffName => "New executable file",
    420     inputText => <<'END',
    421 diff --git a/foo b/foo
    422 new file mode 100755
    423 index 0000000..d03e242
    424 --- /dev/null
    425 +++ b/foo
    426 @@ -0,0 +1 @@
    427 +file contents
    428 
    429 END
    430     expectedReturn => [
    431 {
    432     svnConvertedText => <<'END',
    433 Index: foo
    434 new file mode 100755
    435 index 0000000..d03e242
    436 --- foo
    437 +++ foo
    438 END
    439     executableBitDelta => 1,
    440     indexPath => "foo",
    441     isNew => 1,
    442 },
    443 "@@ -0,0 +1 @@\n"],
    444     expectedNextLine => "+file contents\n",
    445 },
    446 {
    447     # New test case
    448     diffName => "Deleted executable file",
    449     inputText => <<'END',
    450 diff --git a/foo b/foo
    451 deleted file mode 100755
    452 index d03e242..0000000
    453 --- a/foo
    454 +++ /dev/null
    455 @@ -1 +0,0 @@
    456 -file contents
    457 
    458 END
    459     expectedReturn => [
    460 {
    461     svnConvertedText => <<'END',
    462 Index: foo
    463 deleted file mode 100755
    464 index d03e242..0000000
    465 --- foo
    466 +++ foo
    467 END
    468     executableBitDelta => -1,
    469     indexPath => "foo",
    470     isDeletion => 1,
    471 },
    472 "@@ -1 +0,0 @@\n"],
    473     expectedNextLine => "-file contents\n",
    474 },
    475 );
    476 
    477 my $testCasesCount = @testCaseHashRefs;
    478 plan(tests => 2 * $testCasesCount); # Total number of assertions.
    479 
    480 foreach my $testCase (@testCaseHashRefs) {
    481     my $testNameStart = "parseGitDiffHeader(): $testCase->{diffName}: comparing";
    482 
    483     my $fileHandle;
    484     open($fileHandle, "<", \$testCase->{inputText});
    485     my $line = <$fileHandle>;
    486 
    487     my @got = VCSUtils::parseGitDiffHeader($fileHandle, $line);
    488     my $expectedReturn = $testCase->{expectedReturn};
    489 
    490     is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
    491 
    492     my $gotNextLine = <$fileHandle>;
    493     is($gotNextLine, $testCase->{expectedNextLine},  "$testNameStart next read line.");
    494 }
    495