#!/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 Getopt::Long;
use File::Basename;
use File::Spec;
use Cwd;
use POSIX qw(strftime);

my $showHelp = 0;
my $runShark = 0;
my $runShark20 = 0;
my $runSharkCache = 0;
my $jsShellPath;
my $setBaseline = 0;
my $testsPattern;
my $testRuns = 10;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName --shell=[path] [options]
  --help            Show this help message
  --set-baseline    Set baseline for future comparisons
  --shell           Path to JavaScript shell
  --runs            Number of times to run tests (default: $testRuns)
  --tests           Only run tests matching provided pattern
  --shark           Sample execution time 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('runs=i' => \$testRuns,
           'set-baseline' => \$setBaseline,
           'shell=s' => \$jsShellPath,
           'shark' => \$runShark,
           'shark20' => \$runShark20,
           'shark-cache' => \$runSharkCache,
           'tests=s' => \$testsPattern,
           'help' => \$showHelp);

$runShark = 1 if $runSharkCache;
$runShark = 20 if $runShark20;
$testRuns = 1 if $runShark;
if ($runShark && ! -x "/usr/bin/shark") {
    die "Please install CHUD tools from http://developer.apple.com/tools/download/\n";
}

my $sharkCacheProfileIndex = 0;
if ($runSharkCache) {
    my $sharkProfileList = `shark -l 2>&1`;
    for my $profile (split(/\n/, $sharkProfileList)) {
        $profile =~ /(\d+) - (.+)/;
        next  unless (defined $1);
        my $profileIndex = $1;
        my $profileName = $2;
        if ($profileName =~ /L2 Cache/) {
            $sharkCacheProfileIndex = $profileIndex;
            print "Using Shark L2 Cache Miss Profile: " . $profile . "\n";
            last;
        }
    }
    die "Failed to find L2 Cache Miss Profile for --shark-cache\n"  unless ($sharkCacheProfileIndex);
}

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

sub dumpToFile($$)
{
    my ($contents, $path) = @_;
    open FILE, ">", $path or die "Failed to open $path";
    print FILE $contents;
    close FILE;
}

my @tests = ();
my @categories = ();
my %uniqueCategories = ();

sub loadTestsList()
{
    open TESTLIST, "<", "tests/LIST" or die "Can't find ./tests/LIST";
    while (<TESTLIST>) {
        chomp;
        next unless !$testsPattern || /$testsPattern/;
        
        push @tests, $_;
        my $category = $_;
        $category =~ s/-.*//;
        if (!$uniqueCategories{$category}) {
            push @categories, $category;
            $uniqueCategories{$category} = $category;
        }
    }
    close TESTLIST;
}

my $timeString = strftime "%Y-%m-%d-%H.%M.%S", localtime $^T;
my $prefixFile = "tmp/sunspider-test-prefix.js";
my $resultsFile = "tmp/sunspider-results-$timeString.js";

sub writePrefixFile()
{
    my $prefix = "var tests = [ " . join(", ", map { '"' . $_ . '"' } @tests) . " ];\n";
    $prefix .= "var categories = [ " . join(", ", map { '"' . $_ . '"' } @categories) . " ];\n";

    mkdir "tmp";
    dumpToFile($prefix, $prefixFile);
}

sub runTestsOnce($)
{
    my ($useShark) = @_;
    my $shellArgs = "-f $prefixFile -f resources/sunspider-standalone-driver.js 2> /dev/null";
    my $output;
    if ($useShark) {
        my $intervalArg = $useShark == 20 ? "-I 20u" : "";
        my $cacheArg = $runSharkCache ? "-c $sharkCacheProfileIndex" : "";
        $output = `shark $intervalArg $cacheArg -i -1-q "$jsShellPath" $shellArgs`;
    } else {
        $output = `"$jsShellPath" $shellArgs | grep -v break`;
    }
    return $output;
}

sub newestFile($$)
{
    my ($dir, $pattern) = @_;

    my $newestAge;
    my $newestFile = "";
    opendir DIR, $dir or die;
    for my $file (readdir DIR) {
        if ($file =~ $pattern) {
            my $age = -M "$dir/$file";
            if (!defined $newestAge || $age < $newestAge) {
                $newestFile = $file;
                $newestAge = $age;
            }
        }
    }
    closedir DIR;

    return "$dir/$newestFile";
}

loadTestsList();
if ($testsPattern) {
    print STDERR "Found " . scalar(@tests) . " tests matching '" . $testsPattern . "'\n";
} else {
    print STDERR "Found " . scalar(@tests) . " tests\n";
}
die "No tests to run"  unless scalar(@tests);
print STDERR "Running SunSpider once for warmup, then " . ($runShark ? "under Shark" : "$testRuns time" . ($testRuns == 1 ? "" : "s")) . "\n";
writePrefixFile();

runTestsOnce(0);
print "Discarded first run.\n";

my $result;
my $count = 0;
my @results = ();
my $total = 0;
print "[";
while ($count++ < $testRuns) {
    $result = runTestsOnce($runShark);
    $result =~ s/\r\n/\n/g;
    chomp $result;
    push @results, $result;
    print $result;
    print ",\n" unless ($count == $testRuns);
}
print "]\n";

my $output = "var output = [\n" . join(",\n", @results) . "\n];\n";
dumpToFile($output, $resultsFile);
dumpToFile(File::Spec->rel2abs($resultsFile), "tmp/baseline-filename.txt") if $setBaseline;

system("$jsShellPath", "-f", $prefixFile, "-f", $resultsFile, "-f", "resources/sunspider-analyze-results.js");

if ($runShark) {
    my $newestMShark = newestFile(".", qr/\.mshark$/);
    if ($newestMShark) {
        my $profileFile = "tmp/sunspider-profile-$timeString.mshark";
        rename $newestMShark, $profileFile or die;
        exec "/usr/bin/open", $profileFile;
    }
}
