[Win] Disable FTL stress tests
[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 # These variables are intentionally left undefined.
46 my $root;
47 my $showHelp;
48 my $extraTests;
49 my $jsDriverArgs;
50
51 my $buildJSC = 1;
52
53 my $runTestAPI = isAppleMacWebKit() || isAppleWinWebKit() || isWinCairo();
54
55 my $runJSCStress = 1;
56
57 my $enableFTL = isAppleMacWebKit();
58 my $createTarball = 0;
59 my $remoteHost = 0;
60
61 my $programName = basename($0);
62 my $buildJSCDefault = $buildJSC ? "will check" : "will not check";
63 my $testapiDefault = $runTestAPI ? "will run" : "will not run";
64 my $jscStressDefault = $runJSCStress ? "will run" : " will not run";
65 my $usage = <<EOF;
66 Usage: $programName [options] [options to pass to build system]
67   --help                        Show this help message
68   --root=                       Path to pre-built root containing jsc
69   --[no-]ftl-jit                Turn the FTL JIT on or off
70   --[no-]build                  Check (or don't check) to see if the jsc build is up-to-date (default: $buildJSCDefault)
71   --[no-]testapi                Run (or don't run) testapi (default: $testapiDefault)
72   --[no-]jsc-stress             Run (or don't run) the JSC stress tests (default: $jscStressDefault)
73
74   Mozilla tests only options (--no-jsc-stress):
75   ----------------------------------------------
76   --jsDriver-args=              A string of arguments to pass to jsDriver.pl
77
78   JSC stress tests only options (--jsc-stress):
79   ----------------------------------------------
80   --tarball                     Create a tarball of the bundle produced by running the JSC stress tests.
81   --remote=                     Run the JSC stress tests on the specified remote host. Implies --tarball.
82   --extra-tests=                Path to a file containing extra tests
83
84 EOF
85
86 GetOptions(
87     'j|jsDriver-args=s' => \$jsDriverArgs,
88     'root=s' => \$root,
89     'extra-tests=s' => \$extraTests,
90     'build!' => \$buildJSC,
91     'ftl-jit!' => \$enableFTL,
92     'testapi!' => \$runTestAPI,
93     'jsc-stress!' => \$runJSCStress,
94     'tarball!' => \$createTarball,
95     'remote=s' => \$remoteHost,
96     'help' => \$showHelp
97 );
98
99 # Assume any arguments left over from GetOptions are assumed to be build arguments
100 my @buildArgs = @ARGV;
101
102 # The --ftl-jit argument gets passed as a build argument.
103 if ($enableFTL) {
104     push(@buildArgs, '--ftl-jit');
105 }
106
107 if ($showHelp) {
108    print STDERR $usage;
109    exit 1;
110 }
111
112 setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));
113
114 if (!defined($root) && $buildJSC) {
115     chdirWebKit();
116
117     push(@buildArgs, argumentsForConfiguration());
118
119     print "Running: build-jsc " . join(" ", @buildArgs) . "\n";
120     my $buildResult = system "perl", "Tools/Scripts/build-jsc", @buildArgs;
121     if ($buildResult) {
122         print STDERR "Compiling jsc failed!\n";
123         exit exitStatus($buildResult);
124     }
125 }
126
127
128 my $productDir = jscProductDir();
129 $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
130 $ENV{JSC_timeout} = 60 unless $ENV{JSC_timeout}; # Set a 60 second timeout on all jsc tests (if environment variable not defined already).
131 $ENV{TZ}="US/Pacific"; # Some tests fail if the time zone is not set to US/Pacific (<https://webkit.org/b/136363>)
132 setPathForRunningWebKitApp(\%ENV) if isCygwin();
133
134 sub testapiPath($)
135 {
136     my ($productDir) = @_;
137     my $jscName = "testapi";
138     $jscName .= "_debug" if configuration() eq "Debug_All";
139     return "$productDir/$jscName";
140 }
141
142 #run api tests
143 if ($runTestAPI) {
144     chdirWebKit();
145     chdir($productDir) or die "Failed to switch directory to '$productDir'\n";
146     my @command = (testapiPath($productDir));
147     unshift @command, ("xcrun", "-sdk", xcodeSDK(), "sim") if willUseIOSSimulatorSDKWhenBuilding();
148
149     # Use an "indirect object" so that system() won't get confused if the path
150     # contains spaces (see perldoc -f exec).
151     my $testapiResult = system { $command[0] } @command;
152     my $exitStatus = exitStatus($testapiResult);
153     print "testAPI completed with rc=$testapiResult ($exitStatus)\n";
154     exit exitStatus($testapiResult) if $testapiResult;
155 }
156
157 # Find JavaScriptCore directory
158 chdirWebKit();
159
160 if ($runJSCStress) {
161     runJSCStressTests();
162 } else {
163     runMozillaTests();
164 }
165
166 sub runMozillaTests
167 {
168     my %mozillaFailures;
169     my %newMozillaFailures;
170     chdir("Source/JavaScriptCore");
171     chdir "tests/mozilla" or die "Failed to switch directory to 'tests/mozilla'\n";
172
173     # determine the list of skipped tests for Mozilla tests if --jsDriver-args command line argument isn't set
174     $jsDriverArgs ||= defaultJsDriverArgsForMozillaTests();
175
176     # Arguments passed to --jsDriver-args (if any) are passed to jsDriver.pl
177     my @jsArgs = split(" ", $jsDriverArgs);
178
179     my @jsMozillaDriverCmd = ("perl", "jsDriver.pl", "-e", "squirrelfish", "-s", jscPath($productDir), "-f", "actual.html", @jsArgs);
180     if (isGtk() || isEfl()) {
181         my @jhbuildPrefix = sourceDir() . "/Tools/jhbuild/jhbuild-wrapper";
182
183         if (isEfl()) {
184             push(@jhbuildPrefix, '--efl');
185         } elsif (isGtk()) {
186             push(@jhbuildPrefix, '--gtk');
187         }
188         push(@jhbuildPrefix, 'run');
189
190         unshift(@jsMozillaDriverCmd, @jhbuildPrefix);
191     } elsif (isIOSWebKit() && willUseIOSSimulatorSDKWhenBuilding()) {
192         push @jsMozillaDriverCmd, ("--sdk", xcodeSDK());
193     }
194     print "Running: " . join(" ", @jsMozillaDriverCmd) . "\n";
195     my $result = system(@jsMozillaDriverCmd);
196     exit exitStatus($result)  if $result;
197
198     open EXPECTED, "expected.html" or die "Failed to open 'expected.html'\n";
199     while (<EXPECTED>) {
200         last if /failures reported\.$/;
201     }
202     while (<EXPECTED>) {
203         chomp;
204         $mozillaFailures{$_} = 1;
205     }
206     close EXPECTED;
207
208     open ACTUAL, "actual.html" or die "Failed to open 'actual.html'";
209     while (<ACTUAL>) {
210         last if /failures reported\.$/;
211     }
212     while (<ACTUAL>) {
213         chomp;
214         if ($mozillaFailures{$_}) {
215             delete $mozillaFailures{$_};
216         } else {
217             $newMozillaFailures{$_} = 1;
218         }
219     }
220     close ACTUAL;
221
222     my $numNewMozillaFailures = keys %newMozillaFailures;
223     if ($numNewMozillaFailures) {
224         print "\n** The following Mozilla test failures have been introduced:\n";
225         foreach my $mozillaFailure (sort keys %newMozillaFailures) {
226             print "\t$mozillaFailure\n";
227         }
228     }
229
230     my $numOldMozillaFailures = keys %mozillaFailures;
231     if ($numOldMozillaFailures) {
232         print "\nYou fixed the following test";
233         print "s" if $numOldMozillaFailures != 1;
234         print ":\n";
235         foreach my $mozillaFailure (sort keys %mozillaFailures) {
236             print "\t$mozillaFailure\n";
237         }
238     }
239
240     print "\nResults for Mozilla tests:\n";
241     printThingsFound($numNewMozillaFailures, "regression", "regressions", "found");
242     printThingsFound($numOldMozillaFailures, "test", "tests", "fixed");
243     print "    OK.\n" if $numNewMozillaFailures == 0;
244     print "\n";
245
246     exit(1) if $numNewMozillaFailures;
247 }
248
249 sub runJSCStressTests
250 {
251     my $jscStressResultsDir = $productDir . "/jsc-stress-results";
252
253     # Set LANG environment variable so the stress tests will work with newer ruby (<rdar://problem/15010705>)
254     $ENV{LANG}="en_US.UTF-8";
255     my @jscStressDriverCmd = (
256         "/usr/bin/env", "ruby", "Tools/Scripts/run-jsc-stress-tests",
257         "-j", jscPath($productDir), "-o", $jscStressResultsDir,
258         "PerformanceTests/SunSpider/tests/sunspider-1.0",
259         "Source/JavaScriptCore/tests/exceptionFuzz.yaml",
260         "PerformanceTests/SunSpider/no-architecture-specific-optimizations.yaml",
261         "PerformanceTests/SunSpider/tests/v8-v6",
262         "Source/JavaScriptCore/tests/mozilla/mozilla-tests.yaml",
263         "Source/JavaScriptCore/tests/stress",
264         "LayoutTests/js/regress/script-tests",
265         "PerformanceTests/SunSpider/profiler-test.yaml",
266         "LayoutTests/jsc-layout-tests.yaml",
267         "Source/JavaScriptCore/tests/typeProfiler.yaml"
268     );
269     if ($enableFTL) {
270         push(@jscStressDriverCmd, "--ftl-jit");
271     }
272     if ($createTarball) {
273         push(@jscStressDriverCmd, "--tarball");
274     }
275     if ($remoteHost) {
276         push(@jscStressDriverCmd, "--remote");
277         push(@jscStressDriverCmd, $remoteHost);
278     }
279
280     # End option processing, the rest of the arguments are tests
281     push(@jscStressDriverCmd, "--");
282
283     if (defined($extraTests)) {
284         push(@jscStressDriverCmd, $extraTests);
285     }
286     if (defined($ENV{"EXTRA_JSC_TESTS"})) {
287         push(@jscStressDriverCmd, $ENV{"EXTRA_JSC_TESTS"});
288     }
289     print "Running: " . join(" ", @jscStressDriverCmd) . "\n";
290     my $result = system(@jscStressDriverCmd);
291     exit exitStatus($result) if $result;
292
293     my @jscStressFailList = readAllLines($jscStressResultsDir . "/failed");
294     @jscStressFailList = sort @jscStressFailList;
295     my $numJSCStressFailures = @jscStressFailList;
296
297     if ($numJSCStressFailures) {
298         print "\n** The following JSC stress test failures have been introduced:\n";
299         foreach my $testFailure (@jscStressFailList) {
300             print "\t$testFailure";
301         }
302     }
303     print "\n";
304
305     print "Results for JSC stress tests:\n";
306     printThingsFound($numJSCStressFailures, "failure", "failures", "found");
307     print "    OK.\n" if $numJSCStressFailures == 0;
308
309     print "\n";
310
311     exit(1) if $numJSCStressFailures;
312 }
313
314 sub readAllLines
315 {
316     my ($filename) = @_;
317     my @array = ();
318     eval {
319         open FILE, $filename or die;
320         while (<FILE>) {
321             push @array, $_;
322         }
323         close FILE;
324     };
325     return @array;
326 }
327
328 sub printThingsFound
329 {
330     my ($number, $label, $pluralLabel, $verb) = @_;
331     print "    $number ";
332     if ($number == 1) {
333         print $label;
334     } else {
335         print $pluralLabel;
336     }
337     print " $verb.\n";
338 }
339
340 sub defaultJsDriverArgsForMozillaTests
341 {
342     my @testsToSkipOnWindows = (
343         # Various ecma/Date tests sometimes fail on Windows (but not Mac) https://bugs.webkit.org/show_bug.cgi?id=25160
344         "ecma/Date/15.9.2.1.js",
345         "ecma/Date/15.9.2.2-1.js",
346         "ecma/Date/15.9.2.2-2.js",
347         "ecma/Date/15.9.2.2-3.js",
348         "ecma/Date/15.9.2.2-4.js",
349         "ecma/Date/15.9.2.2-5.js",
350         "ecma/Date/15.9.2.2-6.js",
351         "ecma/Date/15.9.5.31-1.js",
352         "ecma_3/Date/15.9.5.7.js",
353         "ecma/Date/15.9.3.1-1.js",
354         "ecma/Date/15.9.3.1-2.js",
355         "ecma/Date/15.9.3.1-3.js",
356         "ecma/Date/15.9.3.1-4.js",
357         "ecma/Date/15.9.3.1-5.js",
358         "ecma/Date/15.9.3.2-1.js",
359         "ecma/Date/15.9.3.2-2.js",
360         "ecma/Date/15.9.3.2-3.js",
361         "ecma/Date/15.9.3.2-4.js",
362         "ecma/Date/15.9.3.2-5.js",
363         "ecma/Date/15.9.4.2-1.js",
364         "ecma/Date/15.9.5.26-1.js",
365         "ecma/Date/15.9.5.27-1.js",
366         "ecma/Date/15.9.5.28-1.js",
367         "ecma/Date/15.9.5.30-1.js",
368     );
369
370     my @testsToSkipOnNonWindows = (
371         # ecma_3/Date/15.9.5.7.js fails on Mac (but not Windows) https://bugs.webkit.org/show_bug.cgi?id=25161
372         "ecma_3/Date/15.9.5.7.js",
373     );
374
375     my @testsToSkip = (
376         # function.arguments have been disabled
377         "js1_4/Functions/function-001.js",
378     );
379
380     @testsToSkip = (@testsToSkip, @testsToSkipOnWindows) if isAppleWinWebKit();
381     @testsToSkip = (@testsToSkip, @testsToSkipOnNonWindows) if !isAppleWinWebKit();
382     my $jsDriverArgs = "-L " . join(" ", @testsToSkip) if @testsToSkip;
383
384     return $jsDriverArgs;
385 }