#!/usr/bin/perl -w
#
# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Unit tests of parseGitDiffHeader().
use strict;
use warnings;
use Test::More;
use VCSUtils;
# The array of test cases.
my @testCaseHashRefs = (
{ # New test
diffName => "Modified file",
inputText => <<'END',
diff --git a/foo.h b/foo.h
index f5d5e74..3b6aa92 100644
--- a/foo.h
+++ b/foo.h
@@ -1 +1 @@
-file contents
+new file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo.h
index f5d5e74..3b6aa92 100644
--- foo.h\t(revision 0)
+++ foo.h\t(working copy)
END
indexPath => "foo.h",
},
"@@ -1 +1 @@\n"],
expectedNextLine => "-file contents\n",
},
{
diffName => "Modified file using --src-prefix and --dst-prefix option",
inputText => <<'END',
diff --git s/foo.h d/foo.h
index f5d5e74..3b6aa92 100644
--- s/foo.h
+++ d/foo.h
@@ -1 +1 @@
-file contents
+new file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo.h
index f5d5e74..3b6aa92 100644
--- foo.h\t(revision 0)
+++ foo.h\t(working copy)
END
indexPath => "foo.h",
},
"@@ -1 +1 @@\n"],
expectedNextLine => "-file contents\n",
},
{ # New test
diffName => "Modified file which have space characters in path",
inputText => <<'END',
diff --git a/foo bar.h b/foo bar.h
index f5d5e74..3b6aa92 100644
--- a/foo bar.h
+++ b/foo bar.h
@@ -1 +1 @@
-file contents
+new file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo bar.h
index f5d5e74..3b6aa92 100644
--- foo bar.h\t(revision 0)
+++ foo bar.h\t(working copy)
END
indexPath => "foo bar.h",
},
"@@ -1 +1 @@\n"],
expectedNextLine => "-file contents\n",
},
{ # New test
diffName => "Modified file which have space characters in path using --no-prefix",
inputText => <<'END',
diff --git directory/foo bar.h directory/foo bar.h
index f5d5e74..3b6aa92 100644
--- directory/foo bar.h
+++ directory/foo bar.h
@@ -1 +1 @@
-file contents
+new file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: directory/foo bar.h
index f5d5e74..3b6aa92 100644
--- directory/foo bar.h\t(revision 0)
+++ directory/foo bar.h\t(working copy)
END
indexPath => "directory/foo bar.h",
},
"@@ -1 +1 @@\n"],
expectedNextLine => "-file contents\n",
},
{ # New test
diffName => "new file",
inputText => <<'END',
diff --git a/foo.h b/foo.h
new file mode 100644
index 0000000..3c9f114
--- /dev/null
+++ b/foo.h
@@ -0,0 +1,34 @@
+
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo.h
new file mode 100644
index 0000000..3c9f114
--- foo.h\t(revision 0)
+++ foo.h\t(working copy)
END
indexPath => "foo.h",
isNew => 1,
},
"@@ -0,0 +1,34 @@\n"],
expectedNextLine => "+\n",
},
{ # New test
diffName => "file deletion",
inputText => <<'END',
diff --git a/foo b/foo
deleted file mode 100644
index 1e50d1d..0000000
--- a/foo
+++ /dev/null
@@ -1,1 +0,0 @@
-line1
diff --git a/configure.ac b/configure.ac
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo
deleted file mode 100644
index 1e50d1d..0000000
--- foo\t(revision 0)
+++ foo\t(working copy)
END
indexPath => "foo",
isDeletion => 1,
},
"@@ -1,1 +0,0 @@\n"],
expectedNextLine => "-line1\n",
},
{
diffName => "delete file which have space characters in path using --no-prefix",
inputText => <<'END',
diff --git directory/foo bar.h directory/foo bar.h
deleted file mode 100644
index 1e50d1d..0000000
--- directory/foo bar.h
+++ /dev/null
@@ -1,1 +0,0 @@
-line1
diff --git a/configure.ac b/configure.ac
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: directory/foo bar.h
deleted file mode 100644
index 1e50d1d..0000000
--- directory/foo bar.h\t(revision 0)
+++ directory/foo bar.h\t(working copy)
END
indexPath => "directory/foo bar.h",
isDeletion => 1,
},
"@@ -1,1 +0,0 @@\n"],
expectedNextLine => "-line1\n",
},
{ # New test
diffName => "using --no-prefix",
inputText => <<'END',
diff --git foo.h foo.h
index c925780..9e65c43 100644
--- foo.h
+++ foo.h
@@ -1,3 +1,17 @@
+contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo.h
index c925780..9e65c43 100644
--- foo.h\t(revision 0)
+++ foo.h\t(working copy)
END
indexPath => "foo.h",
},
"@@ -1,3 +1,17 @@\n"],
expectedNextLine => "+contents\n",
},
####
# Copy operations
##
{ # New test
diffName => "copy (with similarity index 100%)",
inputText => <<'END',
diff --git a/foo b/foo_new
similarity index 100%
copy from foo
copy to foo_new
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo_new
similarity index 100%
copy from foo
copy to foo_new
END
copiedFromPath => "foo",
indexPath => "foo_new",
},
"diff --git a/bar b/bar\n"],
expectedNextLine => "index d45dd40..3494526 100644\n",
},
{
diffName => "copy file which have space characters in path using --no-prefix (with similarity index 100%)",
inputText => <<'END',
diff --git directory/foo bar.h directory/foo baz.h
similarity index 100%
copy from directory/foo bar.h
copy to directory/foo baz.h
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: directory/foo baz.h
similarity index 100%
copy from directory/foo bar.h
copy to directory/foo baz.h
END
copiedFromPath => "directory/foo bar.h",
indexPath => "directory/foo baz.h",
},
"diff --git a/bar b/bar\n"],
expectedNextLine => "index d45dd40..3494526 100644\n",
},
{ # New test
diffName => "copy (with similarity index < 100%)",
inputText => <<'END',
diff --git a/foo b/foo_new
similarity index 99%
copy from foo
copy to foo_new
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo_new
similarity index 99%
copy from foo
copy to foo_new
END
copiedFromPath => "foo",
indexPath => "foo_new",
isCopyWithChanges => 1,
},
"diff --git a/bar b/bar\n"],
expectedNextLine => "index d45dd40..3494526 100644\n",
},
{ # New test
diffName => "rename (with similarity index 100%)",
inputText => <<'END',
diff --git a/foo b/foo_new
similarity index 100%
rename from foo
rename to foo_new
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo_new
similarity index 100%
rename from foo
rename to foo_new
END
copiedFromPath => "foo",
indexPath => "foo_new",
shouldDeleteSource => 1,
},
"diff --git a/bar b/bar\n"],
expectedNextLine => "index d45dd40..3494526 100644\n",
},
{
diffName => "rename file which have space characters in path using --no-prefix (with similarity index 100%)",
inputText => <<'END',
diff --git directory/foo bar.h directory/foo baz.h
similarity index 100%
rename from directory/foo bar.h
rename to directory/foo baz.h
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: directory/foo baz.h
similarity index 100%
rename from directory/foo bar.h
rename to directory/foo baz.h
END
copiedFromPath => "directory/foo bar.h",
indexPath => "directory/foo baz.h",
shouldDeleteSource => 1,
},
"diff --git a/bar b/bar\n"],
expectedNextLine => "index d45dd40..3494526 100644\n",
},
{ # New test
diffName => "rename (with similarity index < 100%)",
inputText => <<'END',
diff --git a/foo b/foo_new
similarity index 99%
rename from foo
rename to foo_new
index 1e50d1d..1459d21 100644
--- a/foo
+++ b/foo_new
@@ -15,3 +15,4 @@ release r deployment dep deploy:
line1
line2
line3
+line4
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo_new
similarity index 99%
rename from foo
rename to foo_new
index 1e50d1d..1459d21 100644
--- foo_new\t(revision 0)
+++ foo_new\t(working copy)
END
copiedFromPath => "foo",
indexPath => "foo_new",
isCopyWithChanges => 1,
shouldDeleteSource => 1,
},
"@@ -15,3 +15,4 @@ release r deployment dep deploy:\n"],
expectedNextLine => " line1\n",
},
{ # New test
diffName => "rename (with executable bit change)",
inputText => <<'END',
diff --git a/foo b/foo_new
old mode 100644
new mode 100755
similarity index 100%
rename from foo
rename to foo_new
diff --git a/bar b/bar
index d45dd40..3494526 100644
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo_new
old mode 100644
new mode 100755
similarity index 100%
rename from foo
rename to foo_new
END
copiedFromPath => "foo",
executableBitDelta => 1,
indexPath => "foo_new",
isCopyWithChanges => 1,
shouldDeleteSource => 1,
},
"diff --git a/bar b/bar\n"],
expectedNextLine => "index d45dd40..3494526 100644\n",
},
####
# Binary file test cases
##
{
# New test case
diffName => "New binary file",
inputText => <<'END',
diff --git a/foo.gif b/foo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
GIT binary patch
literal 7
OcmYex&reDa;sO8*F9L)B
literal 0
HcmV?d00001
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..64a9532e7794fcd791f6f12157406d9060151690
GIT binary patch
END
indexPath => "foo.gif",
isBinary => 1,
isNew => 1,
},
"literal 7\n"],
expectedNextLine => "OcmYex&reDa;sO8*F9L)B\n",
},
{
# New test case
diffName => "Deleted binary file",
inputText => <<'END',
diff --git a/foo.gif b/foo.gif
deleted file mode 100644
index 323fae0..0000000
GIT binary patch
literal 0
HcmV?d00001
literal 7
OcmYex&reDa;sO8*F9L)B
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo.gif
deleted file mode 100644
index 323fae0..0000000
GIT binary patch
END
indexPath => "foo.gif",
isBinary => 1,
isDeletion => 1,
},
"literal 0\n"],
expectedNextLine => "HcmV?d00001\n",
},
####
# Executable bit test cases
##
{
# New test case
diffName => "Modified executable file",
inputText => <<'END',
diff --git a/foo b/foo
index d03e242..435ad3a 100755
--- a/foo
+++ b/foo
@@ -1 +1 @@
-file contents
+new file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo
index d03e242..435ad3a 100755
--- foo\t(revision 0)
+++ foo\t(working copy)
END
indexPath => "foo",
},
"@@ -1 +1 @@\n"],
expectedNextLine => "-file contents\n",
},
{
# New test case
diffName => "Making file executable (last diff)",
inputText => <<'END',
diff --git a/foo.exe b/foo.exe
old mode 100644
new mode 100755
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo.exe
old mode 100644
new mode 100755
END
executableBitDelta => 1,
indexPath => "foo.exe",
},
undef],
expectedNextLine => undef,
},
{
# New test case
diffName => "Making file executable (not last diff)",
inputText => <<'END',
diff --git a/foo.exe b/foo.exe
old mode 100644
new mode 100755
diff --git a/another_file.txt b/another_file.txt
index d03e242..435ad3a 100755
END
expectedReturn => [
{
svnConvertedText => <<'END',
Index: foo.exe
old mode 100644
new mode 100755
END
executableBitDelta => 1,
indexPath => "foo.exe",
},
"diff --git a/another_file.txt b/another_file.txt\n"],
expectedNextLine => "index d03e242..435ad3a 100755\n",
},
{
# New test case
diffName => "New executable file",
inputText => <<'END',
diff --git a/foo b/foo
new file mode 100755
index 0000000..d03e242
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo
new file mode 100755
index 0000000..d03e242
--- foo\t(revision 0)
+++ foo\t(working copy)
END
executableBitDelta => 1,
indexPath => "foo",
isNew => 1,
},
"@@ -0,0 +1 @@\n"],
expectedNextLine => "+file contents\n",
},
{
# New test case
diffName => "Deleted executable file",
inputText => <<'END',
diff --git a/foo b/foo
deleted file mode 100755
index d03e242..0000000
--- a/foo
+++ /dev/null
@@ -1 +0,0 @@
-file contents
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: foo
deleted file mode 100755
index d03e242..0000000
--- foo\t(revision 0)
+++ foo\t(working copy)
END
executableBitDelta => -1,
indexPath => "foo",
isDeletion => 1,
},
"@@ -1 +0,0 @@\n"],
expectedNextLine => "-file contents\n",
},
{
# svn-apply rejected https://bug-111042-attachments.webkit.org/attachment.cgi?id=190663
diffName => "Modified file which have space characters in path. svn-apply rejected attachment #190663.",
inputText => <<'END',
diff --git a/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme b/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme
index 72d60effb9bbba0520e520ec3c1aa43f348c6997..b7924b96d5978c1ad1053dca7e554023235d9a16 100644
--- a/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme
+++ b/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme
@@ -161,7 +161,7 @@
END
expectedReturn => [
{
svnConvertedText => <<"END",
Index: WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme
index 72d60effb9bbba0520e520ec3c1aa43f348c6997..b7924b96d5978c1ad1053dca7e554023235d9a16 100644
--- WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme\t(revision 0)
+++ WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme\t(working copy)
END
indexPath => "WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme",
},
"@@ -161,7 +161,7 @@\n"],
expectedNextLine => " \n",
},
);
my $testCasesCount = @testCaseHashRefs;
plan(tests => 2 * $testCasesCount); # Total number of assertions.
foreach my $testCase (@testCaseHashRefs) {
my $testNameStart = "parseGitDiffHeader(): $testCase->{diffName}: comparing";
my $fileHandle;
open($fileHandle, "<", \$testCase->{inputText});
my $line = <$fileHandle>;
my @got = VCSUtils::parseGitDiffHeader($fileHandle, $line);
my $expectedReturn = $testCase->{expectedReturn};
is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
my $gotNextLine = <$fileHandle>;
is($gotNextLine, $testCase->{expectedNextLine}, "$testNameStart next read line.");
}