#!/usr/bin/perl -w

# Copyright (C) 2007 Apple Inc. All rights reserved.
# Copyright (C) 2007 Eric Seidel <eric@webkit.org>
#
# 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 COMPUTER, INC. ``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 COMPUTER, INC. OR
# 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. 

use strict;
use FindBin;
use Getopt::Long qw(:config pass_through);
use lib $FindBin::Bin;
use webkitdirs;
use POSIX;

# determine configuration, but default to "Release" instead of last-used configuration
setConfiguration("Release");
setConfiguration();
my $configuration = configuration();

my $root;
my $testRuns = 10; # This number may be different from what sunspider defaults to (that's OK)
my $runShark = 0;
my $runShark20 = 0;
my $runSharkCache = 0;
my $setBaseline = 0;
my $showHelp = 0;
my $testsPattern;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName [options] [options to pass to build system]
  --help            Show this help message
  --set-baseline    Set baseline for future comparisons
  --root            Path to root tools build
  --runs            Number of times to run tests (default: $testRuns)
  --tests           Only run tests matching provided pattern
  --shark           Sample with the Mac OS X "Shark" performance testing tool (implies --runs=1)
  --shark20         Like --shark, but with a 20 microsecond sampling interval
  --shark-cache     Like --shark, but performs a L2 cache-miss sample instead of time sample
EOF

GetOptions('root=s' => sub { my ($value) = @_; $root = $value; setConfigurationProductDir(Cwd::abs_path($root)); },
           'runs=i' => \$testRuns,
           'set-baseline' => \$setBaseline,
           'shark' => \$runShark,
           'shark20' => \$runShark20,
           'shark-cache' => \$runSharkCache,
           'tests=s' => \$testsPattern,
           'help' => \$showHelp);

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

sub buildTestKJS
{
    if (!defined($root)){
        push(@ARGV,  "--" . $configuration);
        
        chdirWebKit();
        my $buildResult = system "WebKitTools/Scripts/build-testkjs", @ARGV;
        if ($buildResult) {
            print STDERR "Compiling testkjs failed!\n";
            exit exitStatus($buildResult);
        }
    }
}

sub setupEnvironmentForExecution($)
{
    my ($productDir) = @_;
    print "Starting sunspider with DYLD_FRAMEWORK_PATH set to point to built JavaScriptCore in $productDir.\n";
    $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
    # FIXME: Other platforms may wish to augment this method to use LD_LIBRARY_PATH, etc.
}

sub testKJSPath($)
{
    my ($productDir) = @_;
    my $testkjsName = "testkjs";
    $testkjsName .= "_debug"  if (isCygwin() && ($configuration eq "Debug"));
    return "$productDir/$testkjsName";
}

buildTestKJS();

chdirWebKit();
chdir("SunSpider");

my $productDir = productDir();
# FIXME: This hack should be pushed down into productDir()
$productDir .= "/JavaScriptCore" if (isQt() or isGtk());

setupEnvironmentForExecution($productDir);
my @args = ("--shell", testKJSPath($productDir), "--runs", $testRuns);
# This code could be removed if we chose to pass extra args to sunspider instead of Xcode
push @args, "--set-baseline" if $setBaseline;
push @args, "--shark" if $runShark;
push @args, "--shark20" if $runShark20;
push @args, "--shark-cache" if $runSharkCache;
push @args, "--tests", $testsPattern if $testsPattern;

exec "./sunspider", @args;
