#!/usr/bin/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 iExploder tests.

use strict;
use warnings;

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

use lib $FindBin::Bin;
use webkitperl::httpd;
use webkitdirs;

sub configureAndOpenHTTPDIfNeeded();
sub runSafariWithIExploder();

# Argument handling
my $guardMalloc = '';
my $httpdPort = 8000;
my $downloadTest;
my $iExploderTestDirectory = "/tmp/iExploderTest";

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


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

chdirWebKit();

checkFrameworks();

my $isHttpdOpen = 0;
configureAndOpenHTTPDIfNeeded();

if ($downloadTest) {
    system "/usr/bin/curl -o ~/Desktop/iexploder$downloadTest.html \"http://127.0.0.1:$httpdPort/iexploder.cgi?lookup=1&test=$downloadTest\"";
    print "Saved the test as iexploder$downloadTest.html on the desktop\n";
} else {
    runSafariWithIExploder();
    print "Last generated tests:\n";
    system "grep 'iexploder.cgi' $iExploderTestDirectory/access_log.txt | tail -n -5 | awk -F'[ =&\\?]' '{if (\$8 == \"lookup\") print \$11; else print \$9}'";
}

rmtree $iExploderTestDirectory;
$isHttpdOpen = !closeHTTPD();

sub runSafariWithIExploder()
{
    my $redirectTo;
    if (@ARGV) {
        $redirectTo = "http://127.0.0.1:$httpdPort/iexploder.cgi?lookup=1&test=$ARGV[0]";
    } else {
        $redirectTo = "http://127.0.0.1:$httpdPort/index.html";
    }

    open REDIRECT_HTML, ">", "$iExploderTestDirectory/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;
    
    if (!isAppleWebKit()) {
        system "Tools/Scripts/run-minibrowser", "$iExploderTestDirectory/redirect.html";
    } else {
        local %ENV;
        $ENV{DYLD_INSERT_LIBRARIES} = "/usr/lib/libgmalloc.dylib" if $guardMalloc;
        system "Tools/Scripts/run-safari", "-NSOpen", "$iExploderTestDirectory/redirect.html";
    }
}

sub configureAndOpenHTTPDIfNeeded()
{
    return if $isHttpdOpen;
    mkdir $iExploderTestDirectory;
    my $webkitDirectory = getcwd();
    my $testDirectory = $webkitDirectory . "/LayoutTests";
    my $iExploderDirectory = $webkitDirectory . "/Tools/iExploder/iExploder-1.3.2";

    my $httpdConfig = getHTTPDConfigPathForTestDirectory($testDirectory);

    my $documentRoot = "$iExploderDirectory/htdocs";
    my $typesConfig = "$testDirectory/http/conf/mime.types";
    my $sslCertificate = "$testDirectory/http/conf/webkit-httpd.pem";
    my $listen = "127.0.0.1:$httpdPort";


    my @args = (
        "-f", "$httpdConfig",
        "-C", "DocumentRoot \"$documentRoot\"",
        "-C", "Listen $listen",
        "-c", "TypesConfig \"$typesConfig\"",
        "-c", "CustomLog \"$iExploderTestDirectory/access_log.txt\" common",
        "-c", "ErrorLog \"$iExploderTestDirectory/error_log.txt\"",
        "-c", "SSLCertificateFile \"$sslCertificate\"",
        # Apache wouldn't run CGIs with permissions==700 otherwise
        "-c", "User \"#$<\""
    );

    $isHttpdOpen = openHTTPD(@args);
}
