#!/usr/bin/env perl

# Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
#
# 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. 
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE 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 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.

# A script to semi-automatically run mangleme tests.

use strict;
use warnings;

use Cwd;
use File::Spec;
use FindBin;
use Getopt::Long;
use IPC::Open2;

use lib $FindBin::Bin;
use webkitdirs;

sub openHTTPDIfNeeded();
sub closeHTTPD();
sub runSafariWithMangleme();

# Argument handling
my $guardMalloc = '';
my $httpdPort = 8000;
my $downloadTest;

GetOptions(
    'guard-malloc|g' => \$guardMalloc,
    'get=s' => \$downloadTest,
    'port=i' => \$httpdPort
);


setConfiguration();
my $productDir = productDir();

chdirWebKit();

checkBuild();

mkdir "WebKitBuild/mangleme";
(system "/usr/bin/make", "-C", "Tools/mangleme") == 0 or die;

my $httpdOpen = 0;
openHTTPDIfNeeded();

if ($downloadTest) {
    system "/usr/bin/curl -o ~/Desktop/mangleme$downloadTest.html http://127.0.0.1:$httpdPort/remangle.cgi?$downloadTest";
    print "Saved the test as mangleme$downloadTest.html on the desktop\n";
} else {
    runSafariWithMangleme();
    print "Last generated tests:\n";
    system "grep 'Mangle attempt' /tmp/WebKit/error_log.txt | tail -n -5 | awk ' {print \$4}'";
}

closeHTTPD();


sub runSafariWithMangleme()
{
    my $redirectTo;
    if (@ARGV) {
        $redirectTo = "http://127.0.0.1:$httpdPort/remangle.cgi?$ARGV[0]";
    } else {
        $redirectTo = "http://127.0.0.1:$httpdPort/mangle.cgi";
    }

    open REDIRECT_HTML, ">", "/tmp/WebKit/redirect.html" or die;
    print REDIRECT_HTML "<html>\n";
    print REDIRECT_HTML "    <head>\n";
    print REDIRECT_HTML "        <meta http-equiv=\"refresh\" content=\"1;URL=$redirectTo\" />\n";
    print REDIRECT_HTML "        <script type=\"text/javascript\">\n";
    print REDIRECT_HTML "            document.location = \"$redirectTo\";\n";
    print REDIRECT_HTML "        </script>\n";
    print REDIRECT_HTML "    </head>\n";
    print REDIRECT_HTML "    <body>\n";
    print REDIRECT_HTML "    </body>\n";
    print REDIRECT_HTML "</html>\n";
    close REDIRECT_HTML;
    
    local %ENV;
    $ENV{DYLD_INSERT_LIBRARIES} = "/usr/lib/libgmalloc.dylib" if $guardMalloc;
    system "Tools/Scripts/run-safari", "-NSOpen", "/tmp/WebKit/redirect.html";
}

sub openHTTPDIfNeeded()
{
    return if $httpdOpen;

    mkdir "/tmp/WebKit";
    
    if (-f "/tmp/WebKit/httpd.pid") {
        my $oldPid = `cat /tmp/WebKit/httpd.pid`;
        chomp $oldPid;
        if (0 != kill 0, $oldPid) {
            print "\nhttpd is already running: pid $oldPid, killing...\n";
            kill 15, $oldPid;
            
            my $retryCount = 20;
            while ((0 != kill 0, $oldPid) && $retryCount) {
                sleep 1;
                --$retryCount;
            }
            
            die "Timed out waiting for httpd to quit" unless $retryCount;
        }
    }
    
    my $testDirectory = getcwd() . "/LayoutTests";
    my $manglemeDirectory = getcwd() . "/WebKitBuild/mangleme";
    my $httpdPath = "/usr/sbin/httpd";
    my $httpdConfig = "$testDirectory/http/conf/httpd.conf";
    $httpdConfig = "$testDirectory/http/conf/apache2-httpd.conf" if `$httpdPath -v` =~ m|Apache/2|;
    my $documentRoot = "$manglemeDirectory";
    my $typesConfig = "$testDirectory/http/conf/mime.types";
    my $sslCertificate = "$testDirectory/http/conf/webkit-httpd.pem";
    my $listen = "127.0.0.1:$httpdPort";

    open2(\*HTTPDIN, \*HTTPDOUT, $httpdPath, 
        "-f", "$httpdConfig",
        "-C", "DocumentRoot \"$documentRoot\"",
        "-C", "Listen $listen",
        "-c", "TypesConfig \"$typesConfig\"",
        "-c", "CustomLog \"/tmp/WebKit/access_log.txt\" common",
        "-c", "ErrorLog \"/tmp/WebKit/error_log.txt\"",
        "-c", "SSLCertificateFile \"$sslCertificate\"",
        # Apache wouldn't run CGIs with permissions==700 otherwise
        "-c", "User \"#$<\"");

    my $retryCount = 20;
    while (system("/usr/bin/curl -q --silent --stderr - --output " . File::Spec->devnull() . " $listen") && $retryCount) {
        sleep 1;
        --$retryCount;
    }
    
    die "Timed out waiting for httpd to start" unless $retryCount;
    
    $httpdOpen = 1;
}

sub closeHTTPD()
{
    return if !$httpdOpen;

    close HTTPDIN;
    close HTTPDOUT;

    kill 15, `cat /tmp/WebKit/httpd.pid` if -f "/tmp/WebKit/httpd.pid";

    $httpdOpen = 0;
}
