blob: 2489dfb69d699990959f9241a3fe2a3e5aedbbca [file] [log] [blame]
#!/usr/bin/env perl
#
# Copyright (C) 2010 Apple Inc. All rights reserved.
#
# 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 VCSUtils::mergeChangeLogs().
use strict;
use Test::Simple tests => 16;
use File::Temp qw(tempfile);
use VCSUtils;
# Read contents of a file and return it.
sub readFile($)
{
my ($fileName) = @_;
local $/;
open(FH, "<", $fileName);
my $content = <FH>;
close(FH);
return $content;
}
# Write a temporary file and return the filename.
sub writeTempFile($$$)
{
my ($name, $extension, $content) = @_;
my ($FH, $fileName) = tempfile(
$name . "-XXXXXXXX",
DIR => ($ENV{'TMPDIR'} || $ENV{'TEMP'} || "/tmp"),
UNLINK => 0,
);
print $FH $content;
close $FH;
if ($extension) {
my $newFileName = $fileName . $extension;
rename($fileName, $newFileName);
$fileName = $newFileName;
}
return $fileName;
}
# --------------------------------------------------------------------------------
{
# New test
my $title = "mergeChangeLogs: traditional rejected patch success";
my $fileNewerContent = <<'EOF';
2010-01-29 Mark Rowe <mrowe@apple.com>
Fix the Mac build.
Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional".
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileNewer = writeTempFile("file", "", $fileNewerContent);
my $fileMineContent = <<'EOF';
***************
*** 1,3 ****
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
--- 1,9 ----
+ 2010-01-29 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Darin Adler.
+
+ JSC is failing to propagate anonymous slot count on some transitions
+
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
EOF
my $fileMine = writeTempFile("file", ".rej", $fileMineContent);
rename($fileMine, $fileNewer . ".rej");
$fileMine = $fileNewer . ".rej";
my $fileOlderContent = $fileNewerContent;
my $fileOlder = writeTempFile("file", ".orig", $fileOlderContent);
rename($fileOlder, $fileNewer . ".orig");
$fileOlder = $fileNewer . ".orig";
my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer);
# mergeChangeLogs() should return 1 since the patch succeeded.
ok($exitStatus == 1, "$title: should return 1 for success");
ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged");
ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged");
my $expectedContent = <<'EOF';
2010-01-29 Oliver Hunt <oliver@apple.com>
Reviewed by Darin Adler.
JSC is failing to propagate anonymous slot count on some transitions
EOF
$expectedContent .= $fileNewerContent;
ok(readFile($fileNewer) eq $expectedContent, "$title: \$fileNewer should be updated to include patch");
unlink($fileMine, $fileOlder, $fileNewer);
}
# --------------------------------------------------------------------------------
{
# New test
my $title = "mergeChangeLogs: traditional rejected patch failure";
my $fileNewerContent = <<'EOF';
2010-01-29 Mark Rowe <mrowe@apple.com>
Fix the Mac build.
Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional".
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileNewer = writeTempFile("file", "", $fileNewerContent);
my $fileMineContent = <<'EOF';
***************
*** 1,9 ****
- 2010-01-29 Oliver Hunt <oliver@apple.com>
-
- Reviewed by Darin Adler.
-
- JSC is failing to propagate anonymous slot count on some transitions
-
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
--- 1,3 ----
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
EOF
my $fileMine = writeTempFile("file", ".rej", $fileMineContent);
rename($fileMine, $fileNewer . ".rej");
$fileMine = $fileNewer . ".rej";
my $fileOlderContent = $fileNewerContent;
my $fileOlder = writeTempFile("file", ".orig", $fileOlderContent);
rename($fileOlder, $fileNewer . ".orig");
$fileOlder = $fileNewer . ".orig";
my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer);
# mergeChangeLogs() should return 0 since the patch failed.
ok($exitStatus == 0, "$title: should return 0 for failure");
ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged");
ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged");
ok(readFile($fileNewer) eq $fileNewerContent, "$title: \$fileNewer should be unchanged");
unlink($fileMine, $fileOlder, $fileNewer);
}
# --------------------------------------------------------------------------------
{
# New test
my $title = "mergeChangeLogs: patch succeeds";
my $fileMineContent = <<'EOF';
2010-01-29 Oliver Hunt <oliver@apple.com>
Reviewed by Darin Adler.
JSC is failing to propagate anonymous slot count on some transitions
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileMine = writeTempFile("fileMine", "", $fileMineContent);
my $fileOlderContent = <<'EOF';
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileOlder = writeTempFile("fileOlder", "", $fileOlderContent);
my $fileNewerContent = <<'EOF';
2010-01-29 Mark Rowe <mrowe@apple.com>
Fix the Mac build.
Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional".
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileNewer = writeTempFile("fileNewer", "", $fileNewerContent);
my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer);
# mergeChangeLogs() should return 1 since the patch succeeded.
ok($exitStatus == 1, "$title: should return 1 for success");
ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged");
ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged");
my $expectedContent = <<'EOF';
2010-01-29 Oliver Hunt <oliver@apple.com>
Reviewed by Darin Adler.
JSC is failing to propagate anonymous slot count on some transitions
EOF
$expectedContent .= $fileNewerContent;
ok(readFile($fileNewer) eq $expectedContent, "$title: \$fileNewer should be patched");
unlink($fileMine, $fileOlder, $fileNewer);
}
# --------------------------------------------------------------------------------
{
# New test
my $title = "mergeChangeLogs: patch fails";
my $fileMineContent = <<'EOF';
2010-01-29 Mark Rowe <mrowe@apple.com>
Fix the Mac build.
Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional".
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileMine = writeTempFile("fileMine", "", $fileMineContent);
my $fileOlderContent = <<'EOF';
2010-01-29 Mark Rowe <mrowe@apple.com>
Fix the Mac build.
Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional".
2010-01-29 Oliver Hunt <oliver@apple.com>
Reviewed by Darin Adler.
JSC is failing to propagate anonymous slot count on some transitions
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileOlder = writeTempFile("fileOlder", "", $fileOlderContent);
my $fileNewerContent = <<'EOF';
2010-01-29 Oliver Hunt <oliver@apple.com>
Reviewed by Darin Adler.
JSC is failing to propagate anonymous slot count on some transitions
2010-01-29 Simon Hausmann <simon.hausmann@nokia.com>
Rubber-stamped by Maciej Stachowiak.
Fix the ARM build.
EOF
my $fileNewer = writeTempFile("fileNewer", "", $fileNewerContent);
my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer);
# mergeChangeLogs() should return a non-zero exit status since the patch failed.
ok($exitStatus == 0, "$title: return non-zero exit status for failure");
ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged");
ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged");
# $fileNewer should still exist unchanged because the patch failed
ok(readFile($fileNewer) eq $fileNewerContent, "$title: \$fileNewer should be unchanged");
unlink($fileMine, $fileOlder, $fileNewer);
}
# --------------------------------------------------------------------------------