WebKitTools/Scripts/webkitperl/VCSUtils_unittest/mergeChangeLogs.pl
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebKitTools/Scripts/webkitperl/VCSUtils_unittest/mergeChangeLogs.pl	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,336 @@
+#!/usr/bin/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'} || "/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);
+}
+
+# --------------------------------------------------------------------------------
+