Skip a JSC test after r174036.
[WebKit-https.git] / Tools / Scripts / run-javascriptcore-tests
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2005, 2013-2014 Apple Inc.  All rights reserved.
4 # Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 #
10 # 1.  Redistributions of source code must retain the above copyright
11 #     notice, this list of conditions and the following disclaimer.
12 # 2.  Redistributions in binary form must reproduce the above copyright
13 #     notice, this list of conditions and the following disclaimer in the
14 #     documentation and/or other materials provided with the distribution.
15 # 3.  Neither the name of Apple Inc. ("Apple") nor the names of
16 #     its contributors may be used to endorse or promote products derived
17 #     from this software without specific prior written permission.
18 #
19 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 # Script to run the WebKit Open Source Project JavaScriptCore tests (adapted from Mozilla),
31 # as well as other tests: testapi on Mac and LayoutTests/js.
32
33 use strict;
34 use FindBin;
35 use Getopt::Long qw(:config pass_through);
36 use List::Util qw(min max);
37 use lib $FindBin::Bin;
38 use webkitdirs;
39 use POSIX;
40
41 # determine configuration
42 setConfiguration();
43 my $configuration = configuration();
44
45 my @testsToSkipOnWindows = (
46     # Various ecma/Date tests sometimes fail on Windows (but not Mac) https://bugs.webkit.org/show_bug.cgi?id=25160
47     "ecma/Date/15.9.2.1.js",
48     "ecma/Date/15.9.2.2-1.js",
49     "ecma/Date/15.9.2.2-2.js",
50     "ecma/Date/15.9.2.2-3.js",
51     "ecma/Date/15.9.2.2-4.js",
52     "ecma/Date/15.9.2.2-5.js",
53     "ecma/Date/15.9.2.2-6.js",
54     "ecma/Date/15.9.5.31-1.js",
55     "ecma_3/Date/15.9.5.7.js",
56 );
57
58 my @testsToSkipOnNonWindows = (
59     # ecma_3/Date/15.9.5.7.js fails on Mac (but not Windows) https://bugs.webkit.org/show_bug.cgi?id=25161
60     "ecma_3/Date/15.9.5.7.js",
61
62 );
63
64 my @testsToSkip = (
65     # function.arguments have been disabled
66     "js1_4/Functions/function-001.js",
67 );
68
69 @testsToSkip = (@testsToSkip, @testsToSkipOnWindows) if isAppleWinWebKit();
70 @testsToSkip = (@testsToSkip, @testsToSkipOnNonWindows) if !isAppleWinWebKit();
71 my $jsDriverArgs = "-L " . join(" ", @testsToSkip) if @testsToSkip;
72
73 # These variables are intentionally left undefined.
74 my $root;
75 my $showHelp;
76 my $extraTests;
77
78 my $buildJSC = 1;
79
80 my $runTestAPI = isAppleMacWebKit() || isAppleWinWebKit() || isWinCairo();
81
82 my $runMozilla = 0;
83
84 # FIXME: run-jsc-stress-tests should be ported to other platforms.
85 # https://bugs.webkit.org/show_bug.cgi?id=120809
86 my $runJSCStress = !isAppleWinWebKit();
87
88 my $enableFTL = isAppleWebKit();
89
90 my $createTarball = 0;
91 my $remoteHost = 0;
92
93 my $programName = basename($0);
94 my $buildJSCDefault = $buildJSC ? "will check" : "will not check";
95 my $testapiDefault = $runTestAPI ? "will run" : "will not run";
96 my $mozillaDefault = $runMozilla ? "will run" : "will not run";
97 my $jscStressDefault = $runJSCStress ? "will run" : " will not run";
98 my $usage = <<EOF;
99 Usage: $programName [options] [options to pass to build system]
100   --help                        Show this help message
101   --jsDriver-args=              A string of arguments to pass to jsDriver.pl
102   --root=                       Path to pre-built root containing jsc
103   --extra-tests=                Path to a file containing extra tests
104   --[no-]ftl-jit                Turn the FTL JIT on or off
105   --[no-]build                  Check (or don't check) to see if the jsc build is up-to-date (default: $buildJSCDefault)
106   --[no-]testapi                Run (or don't run) testapi (default: $testapiDefault)
107   --[no-]jsc-stress             Run (or don't run) the JSC stress tests (default: $jscStressDefault)
108   --tarball                     Create a tarball of the bundle produced by running the JSC stress tests.
109   --remote=                     Run the JSC stress tests on the specified remote host. Implies --tarball.
110 EOF
111
112 GetOptions(
113     'j|jsDriver-args=s' => \$jsDriverArgs,
114     'root=s' => \$root,
115     'extra-tests=s' => \$extraTests,
116     'build!' => \$buildJSC,
117     'ftl-jit!' => \$enableFTL,
118     'testapi!' => \$runTestAPI,
119     'jsc-stress!' => \$runJSCStress,
120     'tarball!' => \$createTarball,
121     'remote=s' => \$remoteHost,
122     'help' => \$showHelp
123 );
124
125 # Assume any arguments left over from GetOptions are assumed to be build arguments
126 my @buildArgs = @ARGV;
127
128 # The --ftl-jit argument gets passed as a build argument.
129 if ($enableFTL) {
130     push(@buildArgs, '--ftl-jit');
131 }
132
133 # Arguments passed to --jsDriver-args (if any) are passed to jsDriver.pl
134 my @jsArgs = split(" ", $jsDriverArgs);
135
136 if ($showHelp) {
137    print STDERR $usage;
138    exit 1;
139 }
140
141 setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));
142
143 if (!defined($root) && $buildJSC) {
144     chdirWebKit();
145
146     push(@buildArgs, argumentsForConfiguration());
147     
148     print "Running: build-jsc " . join(" ", @buildArgs) . "\n";
149     my $buildResult = system "perl", "Tools/Scripts/build-jsc", @buildArgs;
150     if ($buildResult) {
151         print STDERR "Compiling jsc failed!\n";
152         exit exitStatus($buildResult);
153     }
154 }
155
156
157 my $productDir = jscProductDir();
158 $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
159 $ENV{JSC_timeout} = 60 unless $ENV{JSC_timeout}; # Set a 60 second timeout on all jsc tests (if environment variable not defined already).
160 $ENV{TZ}="US/Pacific"; # Some tests fail if the time zone is not set to US/Pacific (<https://webkit.org/b/136363>)
161 setPathForRunningWebKitApp(\%ENV) if isCygwin();
162
163 sub testapiPath($)
164 {
165     my ($productDir) = @_;
166     my $jscName = "testapi";
167     $jscName .= "_debug" if configuration() eq "Debug_All";
168     return "$productDir/$jscName";
169 }
170
171 #run api tests
172 if ($runTestAPI) {
173     chdirWebKit();
174     chdir($productDir) or die "Failed to switch directory to '$productDir'\n";
175     my @command = (testapiPath($productDir));
176     unshift @command, ("xcrun", "-sdk", xcodeSDK(), "sim") if willUseIOSSimulatorSDKWhenBuilding();
177
178     # Use an "indirect object" so that system() won't get confused if the path
179     # contains spaces (see perldoc -f exec).
180     my $testapiResult = system { $command[0] } @command;
181     my $exitStatus = exitStatus($testapiResult);
182     print "testAPI completed with rc=$testapiResult ($exitStatus)\n";
183     exit exitStatus($testapiResult) if $testapiResult;
184 }
185
186 # Find JavaScriptCore directory
187 chdirWebKit();
188
189 $runMozilla = !$runJSCStress;
190
191 my %mozillaFailures;
192 my %newMozillaFailures;
193
194 if ($runMozilla) {
195     chdir("Source/JavaScriptCore");
196     chdir "tests/mozilla" or die "Failed to switch directory to 'tests/mozilla'\n";
197     my @jsMozillaDriverCmd = ("perl", "jsDriver.pl", "-e", "squirrelfish", "-s", jscPath($productDir), "-f", "actual.html", @jsArgs);
198     if (isGtk() || isEfl()) {
199         my @jhbuildPrefix = sourceDir() . "/Tools/jhbuild/jhbuild-wrapper";
200     
201         if (isEfl()) {
202             push(@jhbuildPrefix, '--efl');
203         } elsif (isGtk()) {
204             push(@jhbuildPrefix, '--gtk');
205         }
206         push(@jhbuildPrefix, 'run');
207     
208         unshift(@jsMozillaDriverCmd, @jhbuildPrefix);
209     } elsif (isIOSWebKit() && willUseIOSSimulatorSDKWhenBuilding()) {
210         push @jsMozillaDriverCmd, ("--sdk", xcodeSDK());
211     }
212     print "Running: " . join(" ", @jsMozillaDriverCmd) . "\n";
213     my $result = system(@jsMozillaDriverCmd);
214     exit exitStatus($result)  if $result;
215     
216     open EXPECTED, "expected.html" or die "Failed to open 'expected.html'\n";
217     while (<EXPECTED>) {
218         last if /failures reported\.$/;
219     }
220     while (<EXPECTED>) {
221         chomp;
222         $mozillaFailures{$_} = 1;
223     }
224     close EXPECTED;
225     
226     open ACTUAL, "actual.html" or die "Failed to open 'actual.html'";
227     while (<ACTUAL>) {
228         last if /failures reported\.$/;
229     }
230     while (<ACTUAL>) {
231         chomp;
232         if ($mozillaFailures{$_}) {
233             delete $mozillaFailures{$_};
234         } else {
235             $newMozillaFailures{$_} = 1;
236         }
237     }
238     close ACTUAL;
239 }
240
241 chdirWebKit();
242 my $jscStressResultsDir = $productDir . "/jsc-stress-results";
243
244 if ($runJSCStress) {
245     # Set LANG environment variable so the stress tests will work with newer ruby (<rdar://problem/15010705>)
246     $ENV{LANG}="en_US.UTF-8";
247     my @jscStressDriverCmd = (
248         "/usr/bin/env", "ruby", "Tools/Scripts/run-jsc-stress-tests",
249         "-j", jscPath($productDir), "-o", $jscStressResultsDir,
250         "PerformanceTests/SunSpider/tests/sunspider-1.0",
251         "Source/JavaScriptCore/tests/exceptionFuzz.yaml",
252         "PerformanceTests/SunSpider/no-architecture-specific-optimizations.yaml",
253         "PerformanceTests/SunSpider/tests/v8-v6",
254         "Source/JavaScriptCore/tests/mozilla/mozilla-tests.yaml",
255         "Source/JavaScriptCore/tests/stress",
256         "LayoutTests/js/regress/script-tests",
257         "PerformanceTests/SunSpider/profiler-test.yaml",
258         "LayoutTests/jsc-layout-tests.yaml",
259         "Source/JavaScriptCore/tests/typeProfiler.yaml"
260     );
261     if ($enableFTL) {
262         push(@jscStressDriverCmd, "--ftl-jit");
263     }
264     if ($createTarball) {
265         push(@jscStressDriverCmd, "--tarball");
266     }
267     if ($remoteHost) {
268         push(@jscStressDriverCmd, "--remote");
269         push(@jscStressDriverCmd, $remoteHost);
270     }
271     if (defined($extraTests)) {
272         push(@jscStressDriverCmd, $extraTests);
273     }
274     if (defined($ENV{"EXTRA_JSC_TESTS"})) {
275         push(@jscStressDriverCmd, $ENV{"EXTRA_JSC_TESTS"});
276     }
277     print "Running: " . join(" ", @jscStressDriverCmd) . "\n";
278     my $result = system(@jscStressDriverCmd);
279     exit exitStatus($result) if $result;
280 }
281
282 my $numNewMozillaFailures = keys %newMozillaFailures;
283 if ($numNewMozillaFailures) {
284     print "\n** The following Mozilla test failures have been introduced:\n";
285     foreach my $mozillaFailure (sort keys %newMozillaFailures) {
286         print "\t$mozillaFailure\n";
287     }
288 }
289
290 my $numOldMozillaFailures = keys %mozillaFailures;
291 if ($numOldMozillaFailures) {
292     print "\nYou fixed the following test";
293     print "s" if $numOldMozillaFailures != 1;
294     print ":\n";
295     foreach my $mozillaFailure (sort keys %mozillaFailures) {
296         print "\t$mozillaFailure\n";
297     }
298 }
299
300 sub readAllLines
301 {
302     my ($filename) = @_;
303     my @array = ();
304     eval {
305         open FILE, $filename or die;
306         while (<FILE>) {
307             push @array, $_;
308         }
309         close FILE;
310     };
311     return @array;
312 }
313
314 sub printThingsFound
315 {
316     my ($number, $label, $pluralLabel, $verb) = @_;
317     print "    $number ";
318     if ($number == 1) {
319         print $label;
320     } else {
321         print $pluralLabel;
322     }
323     print " $verb.\n";
324 }
325
326 my @jscStressFailList = readAllLines($jscStressResultsDir . "/failed");
327 @jscStressFailList = sort @jscStressFailList;
328 my $numJSCStressFailures = @jscStressFailList;
329
330 if ($numJSCStressFailures) {
331     print "\n** The following JSC stress test failures have been introduced:\n";
332     foreach my $testFailure (@jscStressFailList) {
333         print "\t$testFailure";
334     }
335 }
336
337 print "\n";
338
339 if ($runMozilla) {
340     print "Results for Mozilla tests:\n";
341     printThingsFound($numNewMozillaFailures, "regression", "regressions", "found");
342     printThingsFound($numOldMozillaFailures, "test", "tests", "fixed");
343     print "    OK.\n" if $numNewMozillaFailures == 0;
344     
345     print "\n";
346 }
347
348 if ($runJSCStress) {
349     print "Results for JSC stress tests:\n";
350     printThingsFound($numJSCStressFailures, "failure", "failures", "found");
351     print "    OK.\n" if $numJSCStressFailures == 0;
352     
353     print "\n";
354 }
355
356 exit(1)  if ($runMozilla && $numNewMozillaFailures) || ($runJSCStress && $numJSCStressFailures);