#!/usr/bin/perl

# Copyright (C) 2006 Eric Seidel (eric@webkit.org)
# Copyright (C) 2014 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. 
# 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.

# Script to run the WebKit Open Source Project page load tests (PLTs).

# Run all the tests passed in on the command line.

use strict;
use warnings;

use File::Basename;
use File::Spec;
use FindBin;
use Getopt::Long;

use lib $FindBin::Bin;
use webkitdirs;

# Argument handling
my $testName = 'svg';
my $showHelp = 0;

my $usage =
    "Usage: " . basename($0) . "[options] testName\n" .
    "  --help                  Show this help message\n" .
    sharedCommandLineOptionsUsage(indent => 2, switchWidth => 23);

my $getOptionsResult = GetOptions(
    sharedCommandLineOptions(),
   'help' => \$showHelp
);

if (!$getOptionsResult || $showHelp) {
    print STDERR $usage;
    exit 1;
}

$testName = shift @ARGV if (@ARGV);

my $safariExecutablePath = safariPath();
my $safariResourcePath = File::Spec->catdir(dirname(dirname($safariExecutablePath)), "Resources");

# Check to see that all the frameworks are built.
checkFrameworks();

chdirWebKit();

if ($testName eq 'svg') {
    my $suiteFile = "PerformanceTests/PageLoad/$testName/$testName.pltsuite";
    my $webkitPath = sourceDir();
    `cat "$suiteFile" | perl -pe 's|WEBKIT_PATH|$webkitPath|' > $safariResourcePath/$testName.pltsuite`
}

die "Please copy ${testName}.pltsuite to ${safariResourcePath}/${testName}.pltsuite"
    if (! -f "${safariResourcePath}/${testName}.pltsuite");

setConfiguration();

my $productDir = productDir();

# Set up DYLD_FRAMEWORK_PATH to point to the product directory.
print "Starting Safari with DYLD_FRAMEWORK_PATH set to point to built WebKit in $productDir.\n";
setupMacWebKitEnvironment($productDir);

my @testCommands = ('activate');
# Autovicki would clear history, we skip that here as this is likely an active user account
@testCommands = (@testCommands, ("run $testName", 'emptyCache', 'wait 30'));
@testCommands = (@testCommands, (("run $testName", 'wait 10') x 3));
my $testCommandsString = join('; ', @testCommands);
exec $safariExecutablePath, '--test-commands', $testCommandsString or die;
