[Win] build-jsc and run-javascriptcore-tests do not work
[WebKit-https.git] / Tools / Scripts / run-javascriptcore-tests
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2005, 2013-2015 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 my $childProcesses;
51 my $shellRunner;
52 my $makeRunner;
53
54 my $buildJSC = 1;
55
56 my $runTestAPI = isAppleMacWebKit() || isAppleWinWebKit() || isWinCairo();
57
58 my $runJSCStress = 1;
59 my $runJITStressTests = 1;
60 my $runQuickMode = 0;
61 my $envVars = "";
62 my $gmallocPath = undef;
63 my $gmallocDefaultPath = "/usr/lib/libgmalloc.dylib";
64
65 my $enableFTL = isAppleMacWebKit();
66 my $createTarball = 0;
67 my $remoteHost = 0;
68 my $remoteConfigFile;
69
70 my $programName = basename($0);
71 my $buildJSCDefault = $buildJSC ? "will check" : "will not check";
72 my $testapiDefault = $runTestAPI ? "will run" : "will not run";
73 my $jscStressDefault = $runJSCStress ? "will run" : " will not run";
74 my $jitStressTestsDefault = $runJITStressTests ? "will run" : " will not run";
75 my $quickModeDefault = $runQuickMode ? "some" : "all";
76 my $filter;
77 my $usage = <<EOF;
78 Usage: $programName [options] [options to pass to build system]
79   --help                        Show this help message
80   --root=                       Path to pre-built root containing jsc
81   --[no-]ftl-jit                Turn the FTL JIT on or off
82   --[no-]build                  Check (or don't check) to see if the jsc build is up-to-date (default: $buildJSCDefault)
83   --[no-]testapi                Run (or don't run) testapi (default: $testapiDefault)
84   --[no-]jsc-stress             Run (or don't run) the JSC stress tests (default: $jscStressDefault)
85   --[no-]jit-stress-tests       Run (or don't run) the JIT stress tests (default: $jitStressTestsDefault)
86   --[no-]quick                  Run some (or all) of the regular testing modes (default: $quickModeDefault)
87                                 If the runner only runs some it will run the default and no-cjit-validate modes.
88                                 Note, this will not change the behavior of tests that specify their own modes.
89
90   --tarball                     Create a tarball of the bundle produced by running the JSC stress tests.
91   --remote=                     Run the JSC stress tests on the specified remote host. Implies --tarball.
92   --remote-config-file=         Same as remote, but read config from JSON file.
93   --extra-tests=                Path to a file containing extra tests
94   --child-processes=            Specify the number of child processes.
95   --shell-runner                Uses the shell-based test runner instead of the default make-based runner.
96                                 In general the shell runner is slower than the make runner.
97   --make-runner                 Uses the faster make-based runner.
98   --filter                      Only run tests whose name matches the given regular expression.
99   --env-vars                    Pass a list of environment variables to set before running tests.
100                                 Each environment variable should be separated by a space.
101                                 e.g. \"foo=bar x=y\" (no quotes).
102   --gmalloc:                    Run tests with Guard Malloc enabled (if no path is given: $gmallocDefaultPath is used)
103
104 EOF
105
106 GetOptions(
107     'root=s' => \$root,
108     'extra-tests=s' => \$extraTests,
109     'build!' => \$buildJSC,
110     'ftl-jit!' => \$enableFTL,
111     'testapi!' => \$runTestAPI,
112     'jsc-stress!' => \$runJSCStress,
113     'jit-stress-tests!' => \$runJITStressTests,
114     'quick!' => \$runQuickMode,
115     'tarball!' => \$createTarball,
116     'remote=s' => \$remoteHost,
117     'remote-config-file=s' => \$remoteConfigFile,
118     'child-processes=s' => \$childProcesses,
119     'shell-runner' => \$shellRunner,
120     'make-runner' => \$makeRunner,
121     'filter=s' => \$filter,
122     'help' => \$showHelp,
123     'env-vars=s' => \$envVars,
124     'gmalloc:s' => \$gmallocPath
125 );
126
127 # Assume any arguments left over from GetOptions are assumed to be build arguments
128 my @buildArgs = @ARGV;
129
130 # The --ftl-jit argument gets passed as a build argument.
131 if ($enableFTL) {
132     push(@buildArgs, '--ftl-jit');
133 }
134
135 if ($showHelp) {
136    print STDERR $usage;
137    exit 1;
138 }
139
140 setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));
141
142 if (!defined($root) && $buildJSC) {
143     chdirWebKit();
144
145     push(@buildArgs, argumentsForConfiguration());
146
147     print "Running: build-jsc " . join(" ", @buildArgs) . "\n";
148     my $buildResult = system "perl", File::Spec->catfile("Tools", "Scripts", "build-jsc"), @buildArgs;
149     if ($buildResult) {
150         print STDERR "Compiling jsc failed!\n";
151         exit exitStatus($buildResult);
152     }
153 }
154
155 if (defined($gmallocPath)) {
156     if ($gmallocPath eq "") {
157         $envVars .= " DYLD_INSERT_LIBRARIES=" . $gmallocDefaultPath;
158     } else {
159         $envVars .= " DYLD_INSERT_LIBRARIES=" . $gmallocPath;
160     }
161 }
162
163 my $productDir = jscProductDir();
164 $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
165 $ENV{JSC_timeout} = 60 unless $ENV{JSC_timeout}; # Set a 60 second timeout on all jsc tests (if environment variable not defined already).
166 $ENV{TZ}="US/Pacific"; # Some tests fail if the time zone is not set to US/Pacific (<https://webkit.org/b/136363>)
167 setPathForRunningWebKitApp(\%ENV) if isCygwin();
168
169 sub testapiPath($)
170 {
171     my ($productDir) = @_;
172     my $jscName = "testapi";
173     $jscName .= "_debug" if configuration() eq "Debug_All";
174     return File::Spec->catfile($productDir, $jscName);
175 }
176
177 #run api tests
178 if ($runTestAPI) {
179     chdirWebKit();
180     chdir($productDir) or die "Failed to switch directory to '$productDir'\n";
181     my @command = (testapiPath($productDir));
182     unshift @command, ("xcrun", "-sdk", xcodeSDK(), "sim") if willUseIOSSimulatorSDKWhenBuilding();
183
184     if ($envVars ne "") {
185         foreach my $var (split(/\s+/, $envVars)) {
186             if ($var =~ /([^=]*)=(.*)/) {
187                 $ENV{$1} = $2;
188             }
189         }
190     }
191
192     # Use an "indirect object" so that system() won't get confused if the path
193     # contains spaces (see perldoc -f exec).
194     my $testapiResult = system { $command[0] } @command;
195     my $exitStatus = exitStatus($testapiResult);
196     print "testAPI completed with rc=$testapiResult ($exitStatus)\n";
197     exit exitStatus($testapiResult) if $testapiResult;
198 }
199
200 # Find JavaScriptCore directory
201 chdirWebKit();
202
203 runJSCStressTests();
204
205 sub runJSCStressTests
206 {
207     my $jscStressResultsDir = $productDir . "/jsc-stress-results";
208
209     my @testList;
210     if ($runJSCStress) {
211         @testList = (
212             "PerformanceTests/SunSpider/tests/sunspider-1.0",
213             "PerformanceTests/JetStream/cdjs/cdjs-tests.yaml",
214             "Source/JavaScriptCore/tests/executableAllocationFuzz.yaml",
215             "Source/JavaScriptCore/tests/exceptionFuzz.yaml",
216             "PerformanceTests/SunSpider/no-architecture-specific-optimizations.yaml",
217             "PerformanceTests/SunSpider/tests/v8-v6",
218             "Source/JavaScriptCore/tests/mozilla/mozilla-tests.yaml",
219             "Source/JavaScriptCore/tests/stress",
220             "LayoutTests/js/regress/script-tests",
221             "PerformanceTests/SunSpider/profiler-test.yaml",
222             "LayoutTests/jsc-layout-tests.yaml",
223             "Source/JavaScriptCore/tests/typeProfiler.yaml",
224             "Source/JavaScriptCore/tests/controlFlowProfiler.yaml",
225             "Source/JavaScriptCore/tests/es6.yaml",
226             "Source/JavaScriptCore/tests/modules.yaml");
227     } else {
228         @testList = ("Source/JavaScriptCore/tests/mozilla/mozilla-tests.yaml");
229     }
230
231
232     # Set LANG environment variable so the stress tests will work with newer ruby (<rdar://problem/15010705>)
233     $ENV{LANG}="en_US.UTF-8";
234     my @jscStressDriverCmd = (
235         "/usr/bin/env", "ruby", "Tools/Scripts/run-jsc-stress-tests",
236         "-j", jscPath($productDir), "-o", $jscStressResultsDir);
237
238     push(@jscStressDriverCmd, @testList);
239
240     if (isWindows() && !isCygwin()) {
241         shift @jscStressDriverCmd; # Remove /usr/bin/env
242     }
243
244     if ($envVars ne "") {
245             push(@jscStressDriverCmd, "--env-vars");
246             push(@jscStressDriverCmd, $envVars);
247     }
248
249     if ($runQuickMode) {
250         push(@jscStressDriverCmd, "--quick");
251     }
252
253     if (!$runJITStressTests) {
254         push(@jscStressDriverCmd, "--no-jit");
255     } else {
256         if ($enableFTL) {
257             push(@jscStressDriverCmd, "--ftl-jit");
258         }
259     }
260     if ($createTarball) {
261         push(@jscStressDriverCmd, "--tarball");
262     }
263
264     if ($remoteHost) {
265         push(@jscStressDriverCmd, "--remote");
266         push(@jscStressDriverCmd, $remoteHost);
267     }
268
269     if ($remoteConfigFile) {
270         push(@jscStressDriverCmd, "--remote-config-file");
271         push(@jscStressDriverCmd, $remoteConfigFile);
272     }
273
274     if ($childProcesses) {
275         push(@jscStressDriverCmd, "--child-processes");
276         push(@jscStressDriverCmd, $childProcesses);
277     }
278
279     if ($shellRunner) {
280         push(@jscStressDriverCmd, "--shell-runner");
281     }
282
283     if ($makeRunner) {
284         push(@jscStressDriverCmd, "--make-runner");
285     }
286     
287     if ($filter) {
288         push(@jscStressDriverCmd, "--filter");
289         push(@jscStressDriverCmd, $filter);
290     }
291
292     # End option processing, the rest of the arguments are tests
293     push(@jscStressDriverCmd, "--");
294
295     if (defined($extraTests)) {
296         push(@jscStressDriverCmd, $extraTests);
297     }
298     if (defined($ENV{"EXTRA_JSC_TESTS"})) {
299         push(@jscStressDriverCmd, $ENV{"EXTRA_JSC_TESTS"});
300     }
301     print "Running: " . join(" ", @jscStressDriverCmd) . "\n";
302     my $result = system(@jscStressDriverCmd);
303     exit exitStatus($result) if $result;
304
305     my @jscStressFailList = readAllLines($jscStressResultsDir . "/failed");
306     @jscStressFailList = sort @jscStressFailList;
307     my $numJSCStressFailures = @jscStressFailList;
308
309     if ($numJSCStressFailures) {
310         print "\n** The following JSC stress test failures have been introduced:\n";
311         foreach my $testFailure (@jscStressFailList) {
312             print "\t$testFailure";
313         }
314     }
315     print "\n";
316
317     print "Results for JSC stress tests:\n";
318     printThingsFound($numJSCStressFailures, "failure", "failures", "found");
319     print "    OK.\n" if $numJSCStressFailures == 0;
320
321     print "\n";
322
323     exit(1) if $numJSCStressFailures;
324 }
325
326 sub readAllLines
327 {
328     my ($filename) = @_;
329     my @array = ();
330     eval {
331         open FILE, $filename or die;
332         while (<FILE>) {
333             push @array, $_;
334         }
335         close FILE;
336     };
337     return @array;
338 }
339
340 sub printThingsFound
341 {
342     my ($number, $label, $pluralLabel, $verb) = @_;
343     print "    $number ";
344     if ($number == 1) {
345         print $label;
346     } else {
347         print $pluralLabel;
348     }
349     print " $verb.\n";
350 }