9f4cc04382d8f28ff020ba2bf9f8ecc85debab9e
[WebKit-https.git] / WebKitTools / Scripts / run-javascriptcore-tests
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 #
9 # 1.  Redistributions of source code must retain the above copyright
10 #     notice, this list of conditions and the following disclaimer. 
11 # 2.  Redistributions in binary form must reproduce the above copyright
12 #     notice, this list of conditions and the following disclaimer in the
13 #     documentation and/or other materials provided with the distribution. 
14 # 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15 #     its contributors may be used to endorse or promote products derived
16 #     from this software without specific prior written permission. 
17 #
18 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 # Script to run the Web Kit Open Source Project JavaScriptCore tests (adapted from Mozilla).
30
31 use strict;
32 use FindBin;
33 use Getopt::Long qw(:config pass_through);
34 use lib $FindBin::Bin;
35 use webkitdirs;
36 use POSIX;
37
38 my $coverageSupport = 0;
39 GetOptions('coverage!' => \$coverageSupport);
40
41 my @coverageSupportOption = ();
42 if ($coverageSupport) {
43     push @coverageSupportOption, "GCC_GENERATE_TEST_COVERAGE_FILES=YES";
44     push @coverageSupportOption, "GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES";
45     push @coverageSupportOption, "EXTRA_LINK= -ftest-coverage -fprofile-arcs";
46     push @coverageSupportOption, "OTHER_CFLAGS= -MD";
47     push @coverageSupportOption, "OTHER_LDFLAGS= -ftest-coverage -fprofile-arcs -framework AppKit";
48 }
49
50 # determine configuration
51 my $configuration;
52 setConfiguration();
53 $configuration = configuration();
54
55 my @jsArgs;
56 my @xcodeArgs;
57 my $root;
58
59 # pre-evaluate arguments.  jsDriver args have - preceding, xcode args do not.
60 # special arguments
61 #     --root=<path to webkit root> use pre-built root
62 #     --gtk build gtk 
63 foreach my $arg(@ARGV) {
64     print $arg."\n";
65     if( $arg =~ /root=(.*)/ ){
66         $root = $1;
67     } elsif( $arg =~ /^--gtk$/i ){
68     } elsif( $arg =~ /^-/ or !($arg =~/=/)){
69         push( @jsArgs, $arg );
70     } else {
71         push( @xcodeArgs, $arg );
72     }
73 }
74
75 setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));
76
77 # Find JavaScriptCore directory
78 chdirWebKit();
79 chdir("JavaScriptCore");
80
81 #compile TestKJS
82 my @options = XcodeOptions();
83 my $result;
84 if (!defined($root)){
85     if (isOSX()) {
86         $result = system "xcodebuild", "-project", "JavaScriptCore.xcodeproj", "-target", "testkjs", @options, @coverageSupportOption, @xcodeArgs;
87     }elsif (isCygwin()) {
88         $result = buildVisualStudioProject("JavaScriptCore.vcproj/JavaScriptCore.sln");
89     }
90     exit WEXITSTATUS($result) if WEXITSTATUS($result);
91 }
92
93 my $productDir = productDir();
94 chdir "tests/mozilla" or die;
95
96 $productDir .= "/JavaScriptCore" if (isQt() or isGtk());
97 $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
98 setPathForRunningWebKitApp(\%ENV) if isCygwin();
99
100 my $testkjsName;
101 sub determineTestkjsName
102 {
103     return if $testkjsName;
104     if (isCygwin() && ($configuration eq "Debug")) {
105         $testkjsName = "testkjs_debug";
106     } else {
107         $testkjsName = "testkjs";
108     }
109 }
110 $testkjsName = determineTestkjsName();
111
112 $result = system "perl", "jsDriver.pl", "-e", "kjs", "-s", "$productDir/$testkjsName", "-f", "actual.html", @jsArgs;
113
114 exit $result if $result;
115
116 my %failures;
117
118 open EXPECTED, "expected.html" or die;
119 while (<EXPECTED>) {
120     last if /failures reported\.$/;
121 }
122 while (<EXPECTED>) {
123     chomp;
124     $failures{$_} = 1;
125 }
126 close EXPECTED;
127
128 my %newFailures;
129
130 open ACTUAL, "actual.html" or die;
131 while (<ACTUAL>) {
132     last if /failures reported\.$/;
133 }
134 while (<ACTUAL>) {
135     chomp;
136     if ($failures{$_}) {
137         delete $failures{$_};
138     } else {
139         $newFailures{$_} = 1;
140     }
141 }
142 close ACTUAL;
143
144 my $numNewFailures = keys %newFailures;
145 if ($numNewFailures) {
146     print "\n** Danger, Will Robinson! Danger! The following failures have been introduced:\n";
147     foreach my $failure (sort keys %newFailures) {
148         print "\t$failure\n";
149     }
150 }
151
152 my $numOldFailures = keys %failures;
153 if ($numOldFailures) {
154     print "\nYou fixed the following test";
155     print "s" if $numOldFailures != 1;
156     print ":\n";
157     foreach my $failure (sort keys %failures) {
158         print "\t$failure\n";
159     }
160 }
161
162 print "\n";
163
164 print "$numNewFailures regression";
165 print "s" if $numNewFailures != 1;
166 print " found.\n";
167
168 print "$numOldFailures test";
169 print "s" if $numOldFailures != 1;
170 print " fixed.\n";
171
172 print "OK.\n" if $numNewFailures == 0;