15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/perl -w
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2007 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2007 Eric Seidel <eric@webkit.org>
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# are met:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#    documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use strict;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use Getopt::Long;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use File::Basename;
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use File::Spec;
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use Cwd;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use POSIX qw(strftime);
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)use Time::HiRes qw(gettimeofday tv_interval);
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $showHelp = 0;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $runInstruments = 0;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $ubench = 0;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $v8suite = 0;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $suite = "";
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $parseOnly = 0;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $jsShellPath;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $jsShellArgs = "";
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $setBaseline = 0;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $testsPattern;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $testRuns = 10;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $programName = basename($0);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $usage = <<EOF;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Usage: $programName --shell=[path] [options]
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --help            Show this help message
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --set-baseline    Set baseline for future comparisons
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --shell           Path to JavaScript shell
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --args            Arguments to pass to JavaScript shell
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --runs            Number of times to run tests (default: $testRuns)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --tests           Only run tests matching provided pattern
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --instruments     Sample execution time with the Mac OS X "Instruments" tool (Time Profile) (implies --runs=1)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --suite           Select a specific benchmark suite. The default is sunspider-1.0
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --ubench          Use microbenchmark suite instead of regular tests. Same as --suite=ubench
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --v8-suite        Use the V8 benchmark suite. Same as --suite=v8-v4
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  --parse-only      Use the parse-only benchmark suite. Same as --suite=parse-only
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EOF
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GetOptions('runs=i' => \$testRuns,
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'set-baseline' => \$setBaseline,
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'shell=s' => \$jsShellPath,
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'args=s' => \$jsShellArgs,
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'instruments' => \$runInstruments,
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'suite=s' => \$suite,
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'ubench' => \$ubench,
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'v8-suite' => \$v8suite,
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'parse-only' => \$parseOnly,
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'tests=s' => \$testsPattern,
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           'help' => \$showHelp);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$suite = "ubench" if ($ubench);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$suite = "v8-v4" if ($v8suite);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$suite = "parse-only" if ($parseOnly);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$suite = "sunspider-1.0" if (!$suite);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $resultDirectory = "${suite}-results";
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $suitePath = $suite;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$suitePath = "tests/" . $suitePath unless ($suite =~ /\//);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)$testRuns = 1 if $runInstruments;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (!$jsShellPath || $showHelp) {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   print STDERR $usage;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   exit 1;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)sub dumpToFile($$)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my ($contents, $path) = @_;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    open FILE, ">", $path or die "Failed to open $path";
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print FILE $contents;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    close FILE;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my @tests = ();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my @categories = ();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my %uniqueCategories = ();
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)sub loadTestsList()
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    open TESTLIST, "<", "${suitePath}/LIST" or die "Can't find ${suitePath}/LIST";
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (<TESTLIST>) {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chomp;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        next unless !$testsPattern || /$testsPattern/;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        push @tests, $_;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        my $category = $_;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $category =~ s/-.*//;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!$uniqueCategories{$category}) {
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            push @categories, $category;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            $uniqueCategories{$category} = $category;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    close TESTLIST;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $timeString = strftime "%Y-%m-%d-%H.%M.%S", localtime $^T;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $prefixFile = "$resultDirectory/sunspider-test-prefix.js";
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $resultsFile = "$resultDirectory/sunspider-results-$timeString.js";
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)sub writePrefixFile()
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $prefix = "var suitePath = " . '"' . $suitePath . '"' . ";\n";
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $prefix .= "var tests = [ " . join(", ", map { '"' . $_ . '"' } @tests) . " ];\n";
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $prefix .= "var categories = [ " . join(", ", map { '"' . $_ . '"' } @categories) . " ];\n";
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mkdir "$resultDirectory";
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dumpToFile($prefix, $prefixFile);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)sub runTestsOnce($)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    my ($useInstruments) = @_;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $shellArgs = $jsShellArgs . " -f $prefixFile -f resources/sunspider-standalone-driver.js 2> " . File::Spec->devnull();
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $output;
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if ($useInstruments) {
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $output = `instruments -t "resources/TimeProfile20us.tracetemplate" "$jsShellPath" $shellArgs`;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $output = `"$jsShellPath" $shellArgs | grep -v break`;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $output;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)sub newestFile($$)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my ($dir, $pattern) = @_;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $newestAge;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $newestFile = "";
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    opendir DIR, $dir or die;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for my $file (readdir DIR) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ($file =~ $pattern) {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            my $age = -M "$dir/$file";
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!defined $newestAge || $age < $newestAge) {
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $newestFile = $file;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $newestAge = $age;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    closedir DIR;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return "$dir/$newestFile";
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)loadTestsList();
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if ($testsPattern) {
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print STDERR "Found " . scalar(@tests) . " tests matching '" . $testsPattern . "'\n";
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} else {
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print STDERR "Found " . scalar(@tests) . " tests\n";
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)die "No tests to run"  unless scalar(@tests);
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)print STDERR "Running SunSpider once for warmup, then " . ($runInstruments ? "under Instruments" : "$testRuns time" . ($testRuns == 1 ? "" : "s")) . "\n";
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)writePrefixFile();
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)runTestsOnce(0);
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)print "Discarded first run.\n";
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $result;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $count = 0;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my @results = ();
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $total = 0;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)print "[";
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)while ($count++ < $testRuns) {
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    $result = runTestsOnce($runInstruments);
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $result =~ s/\r\n/\n/g;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    chomp $result;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    push @results, $result;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print $result;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print ",\n" unless ($count == $testRuns);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)print "]\n";
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)my $output = "var output = [\n" . join(",\n", @results) . "\n];\n";
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dumpToFile($output, $resultsFile);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)dumpToFile(File::Spec->rel2abs($resultsFile), "$resultDirectory/baseline-filename.txt") if $setBaseline;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)system("$jsShellPath", "-f", $prefixFile, "-f", $resultsFile, "-f", "resources/sunspider-analyze-results.js");
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)print("\nResults are located at $resultsFile\n");
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if ($runInstruments) {
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    my $newestTrace = newestFile(".", qr/\.trace$/);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ($newestTrace) {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        my $profileFile = "$resultDirectory/sunspider-profile-$timeString.trace";
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rename $newestTrace, $profileFile or die;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        exec "/usr/bin/open", $profileFile;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
215