blob: 2cb4d07041e5b9940024feea7c72ce47afd3ab83 [file] [log] [blame]
#!/usr/bin/env perl
#
# Copyright (C) 2011 Research In Motion Limited. All rights reserved.
# Copyright (C) 2013 Apple Inc. All rights reserved.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# Unit tests of parseDiff() with mock files; test override of patch EOL with EOL of target file.
use strict;
use warnings;
use File::Temp;
use POSIX qw/getcwd/;
use Test::More;
use VCSUtils;
# We should consider moving escapeNewLineCharacters() and toMacLineEndings()
# to VCSUtils.pm if they're useful in other places.
sub escapeNewLineCharacters($)
{
my ($text) = @_;
my @characters = split(//, $text);
my $result = "";
foreach (@characters) {
if (/^\r$/) {
$result .= '\r';
next;
}
if (/^\n$/) {
$result .= '\n';
}
$result .= $_;
}
return $result;
}
sub toMacLineEndings($)
{
my ($text) = @_;
$text =~ s/\n/\r/g;
return $text;
}
my $gitDiffHeaderForNewFile = <<EOF;
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..756e864
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,17 @@
EOF
my $gitDiffHeader = <<EOF;
diff --git a/Makefile b/Makefile
index 756e864..04d2ae1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,4 @@
EOF
my $svnConvertedGitDiffHeader = <<"EOF";
Index: Makefile
index 756e864..04d2ae1 100644
--- Makefile\t(revision 0)
+++ Makefile\t(working copy)
@@ -1,3 +1,4 @@
EOF
my $svnConvertedGitDiffHeaderForNewFile = <<"EOF";
Index: Makefile
new file mode 100644
index 0000000..756e864
--- Makefile\t(revision 0)
+++ Makefile\t(working copy)
@@ -0,0 +1,17 @@
EOF
my $svnDiffHeaderForNewFile = <<EOF;
Index: Makefile
===================================================================
--- Makefile (revision 0)
+++ Makefile (revision 0)
@@ -0,0 +1,17 @@
EOF
my $svnDiffHeader = <<EOF;
Index: Makefile
===================================================================
--- Makefile (revision 53052)
+++ Makefile (working copy)
@@ -1,3 +1,4 @@
EOF
my $diffBody = <<EOF;
+
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
all:
EOF
my $MakefileContents = <<EOF;
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools
all:
EOF
my $mockDir = File::Temp::tempdir("parseDiffXXXX", CLEANUP => 1);
writeToFile(File::Spec->catfile($mockDir, "MakefileWithUnixEOL"), $MakefileContents);
writeToFile(File::Spec->catfile($mockDir, "MakefileWithWindowsEOL"), toWindowsLineEndings($MakefileContents));
writeToFile(File::Spec->catfile($mockDir, "MakefileWithMacEOL"), toMacLineEndings($MakefileContents));
# The array of test cases.
my @testCaseHashRefs = (
###
# SVN test cases
##
{
# New test
diffName => "SVN: Patch with Unix line endings and IndexPath has Unix line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody, # Same as input text
indexPath => "MakefileWithUnixEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Windows line endings and IndexPath has Unix line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
indexPath => "MakefileWithUnixEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Windows line endings and IndexPath has Windows line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "MakefileWithWindowsEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch adds Windows newline to EOF and IndexPath has Windows line endings",
inputText => <<"EOF",
Index: MakefileWithWindowsEOL
===================================================================
--- MakefileWithWindowsEOL (revision 53052)
+++ MakefileWithWindowsEOL (working copy)
@@ -1,3 +1,4 @@\r
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
\r
-all:
\\ No newline at end of file
+all:\r
+\r
EOF
expectedReturn => [
[{
# Same as input text
svnConvertedText => <<"EOF",
Index: MakefileWithWindowsEOL
===================================================================
--- MakefileWithWindowsEOL (revision 53052)
+++ MakefileWithWindowsEOL (working copy)
@@ -1,3 +1,4 @@\r
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
\r
-all:
\\ No newline at end of file
+all:\r
+\r
EOF
indexPath => "MakefileWithWindowsEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => 53052
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch adds Mac newline to EOF and IndexPath has Mac line endings",
inputText => <<"EOF",
Index: MakefileWithMacEOL
===================================================================
--- MakefileWithMacEOL (revision 53052)
+++ MakefileWithMacEOL (working copy)
@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
\\ No newline at end of file
+all:\r+\r
EOF
expectedReturn => [
[{
# Same as input text
svnConvertedText => q(Index: MakefileWithMacEOL
===================================================================
--- MakefileWithMacEOL (revision 53052)
+++ MakefileWithMacEOL (working copy)
@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
\\ No newline at end of file
+all:\r+\r),
indexPath => "MakefileWithMacEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => 53052
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Unix line endings and IndexPath has Windows line endings",
inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
indexPath => "MakefileWithWindowsEOL",
isSvn => 1,
numTextChunks => 1,
sourceRevision => "53052",
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Unix line endings and nonexistent IndexPath",
inputText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody, # Same as input text
indexPath => "NonexistentFile",
isSvn => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "SVN: Patch with Windows line endings and nonexistent IndexPath",
inputText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "NonexistentFile",
isSvn => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
###
# Git test cases
##
{
# New test
diffName => "Git: Patch with Unix line endings and IndexPath has Unix line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody, # Same as input text
indexPath => "MakefileWithUnixEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Windows line endings and IndexPath has Unix line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithUnixEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithUnixEOL") . $diffBody,
indexPath => "MakefileWithUnixEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Windows line endings and IndexPath has Windows line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "MakefileWithWindowsEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch adds newline to EOF with Windows line endings and IndexPath has Windows line endings",
inputText => <<"EOF",
diff --git a/MakefileWithWindowsEOL b/MakefileWithWindowsEOL
index e7e8475..ae16fc3 100644
--- a/MakefileWithWindowsEOL
+++ b/MakefileWithWindowsEOL
@@ -1,3 +1,4 @@\r
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
\r
-all:
\\ No newline at end of file
+all:\r
+\r
EOF
expectedReturn => [
[{
# Same as input text
svnConvertedText => <<"EOF",
Index: MakefileWithWindowsEOL
index e7e8475..ae16fc3 100644
--- MakefileWithWindowsEOL\t(revision 0)
+++ MakefileWithWindowsEOL\t(working copy)
@@ -1,3 +1,4 @@\r
MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
\r
-all:
\\ No newline at end of file
+all:\r
+\r
EOF
indexPath => "MakefileWithWindowsEOL",
isGit => 1,
numTextChunks => 1
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch adds Mac newline to EOF and IndexPath has Mac line endings",
inputText => <<"EOF",
diff --git a/MakefileWithMacEOL b/MakefileWithMacEOL
index e7e8475..ae16fc3 100644
--- a/MakefileWithMacEOL
+++ b/MakefileWithMacEOL
@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
\\ No newline at end of file
+all:\r+\r
EOF
expectedReturn => [
[{
# Same as input text
svnConvertedText => qq(Index: MakefileWithMacEOL
index e7e8475..ae16fc3 100644
--- MakefileWithMacEOL\t(revision 0)
+++ MakefileWithMacEOL\t(working copy)
@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
\\ No newline at end of file
+all:\r+\r),
indexPath => "MakefileWithMacEOL",
isGit => 1,
numTextChunks => 1
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Unix line endings and IndexPath has Windows line endings",
inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . toWindowsLineEndings($diffBody),
indexPath => "MakefileWithWindowsEOL",
isGit => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Unix line endings and nonexistent IndexPath",
inputText => substituteString($gitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody,
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . $diffBody, # Same as input text
indexPath => "NonexistentFile",
isGit => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
{
# New test
diffName => "Git: Patch with Windows line endings and nonexistent IndexPath",
inputText => substituteString($gitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody),
expectedReturn => [
[{
svnConvertedText => substituteString($svnConvertedGitDiffHeaderForNewFile, "Makefile", "NonexistentFile") . toWindowsLineEndings($diffBody), # Same as input text
indexPath => "NonexistentFile",
isGit => 1,
isNew => 1,
numTextChunks => 1,
}],
undef],
expectedNextLine => undef,
},
);
my $testCasesCount = @testCaseHashRefs;
plan(tests => 2 * $testCasesCount); # Total number of assertions.
my $savedCWD = getcwd();
chdir($mockDir) or die;
foreach my $testCase (@testCaseHashRefs) {
my $testNameStart = "parseDiff(): $testCase->{diffName}: comparing";
my $fileHandle;
open($fileHandle, "<", \$testCase->{inputText});
my $line = <$fileHandle>;
my @got = VCSUtils::parseDiff($fileHandle, $line);
my $expectedReturn = $testCase->{expectedReturn};
$got[0][0]->{svnConvertedText} = escapeNewLineCharacters($got[0][0]->{svnConvertedText});
$expectedReturn->[0][0]->{svnConvertedText} = escapeNewLineCharacters($expectedReturn->[0][0]->{svnConvertedText});
is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
my $gotNextLine = <$fileHandle>;
is($gotNextLine, $testCase->{expectedNextLine}, "$testNameStart next read line.");
}
chdir($savedCWD);
sub substituteString
{
my ($string, $searchString, $replacementString) = @_;
$string =~ s/$searchString/$replacementString/g;
return $string;
}
sub writeToFile
{
my ($file, $text) = @_;
open(FILE, ">$file") or die;
print FILE $text;
close(FILE);
}