Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / Tools / Scripts / run-api-tests
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2010 Apple 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 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 # THE POSSIBILITY OF SUCH DAMAGE.
25
26 # Features to add:
27 #   - Command line option to run a single test.
28 #   - Command line option to run all tests in a suite.
29
30 use strict;
31 use warnings;
32
33 use File::Basename;
34 use FindBin;
35 use Getopt::Long qw(:config pass_through);
36 use IPC::Open3;
37 use lib $FindBin::Bin;
38 use webkitdirs;
39 use Term::ANSIColor qw(:constants);
40
41 sub dumpAllTests();
42 sub runAllTests();
43 sub runAllTestsInSuite($);
44 sub runTest($$);
45 sub populateTests();
46 sub buildTestTool();
47
48 my $showHelp = 0;
49 my $quiet = 0;
50 my $dump = 0;
51
52 my $programName = basename($0);
53 my $usage = <<EOF;
54 Usage: $programName [options]
55   --help                Show this help message
56   -q|--quite            Less verbose output
57   -d|--dump-tests       Dump the names of testcases without running them
58 EOF
59
60 GetOptions(
61     'help' => \$showHelp,
62     'quiet|q' => \$quiet,
63     'dump|d' => \$dump,
64 );
65
66 if ($showHelp) {
67    print STDERR $usage;
68    exit 1;
69 }
70
71 setConfiguration();
72 buildTestTool();
73 setPathForRunningWebKitApp(\%ENV);
74 my %testsToRun = populateTests();
75
76 if ($dump) {
77     dumpAllTests();
78     exit 0;
79 }
80
81 runAllTests();
82
83 sub dumpAllTests()
84 {
85     print "Dumping test cases\n";
86     print "------------------\n";
87     for my $suite (keys %testsToRun) {
88         print $suite . ":\n";
89         print map { "    " . $_ . "\n" } @{ $testsToRun{$suite} };
90     }
91     print "------------------\n";
92 }
93
94 sub runAllTests()
95 {
96     my $anyFailures = 0;
97     for my $suite (keys %testsToRun) {
98         my $failed = runAllTestsInSuite($suite);
99         if ($failed) {
100             $anyFailures = 1;
101         }
102     }
103     return $anyFailures;
104 }
105
106 sub runAllTestsInSuite($)
107 {
108     my ($suite) = @_;
109     print "Suite: $suite\n";
110
111     my $anyFailures = 0;
112     for my $test (@{$testsToRun{$suite}}) {
113         my $failed = runTest($suite, $test);
114         if ($failed) {
115             $anyFailures = 1;
116         }
117     }
118     
119     return $anyFailures;
120 }
121
122 sub runTest($$)
123 {
124     my ($suite, $testName) = @_;
125     my $test = $suite . "/" . $testName;
126
127     print "    Test: $testName -> ";
128
129     my $result = 0;
130     if (isAppleMacWebKit()) {
131         my $productDir = productDir();
132         $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
133         $ENV{WEBKIT_UNSET_DYLD_FRAMEWORK_PATH} = "YES";
134         my $apiTesterPath = "$productDir/TestWebKitAPI";
135         if (architecture()) {
136             $result = system "arch", "-" . architecture(), $apiTesterPath, $test, @ARGV;
137         } else {
138             $result = system $apiTesterPath, $test, @ARGV;
139         }
140     } elsif (isAppleWinWebKit()) {
141         my $apiTesterNameSuffix;
142         if (configurationForVisualStudio() ne "Debug_All") {
143             $apiTesterNameSuffix = "";
144         } else {
145             $apiTesterNameSuffix = "_debug";
146         }
147         my $apiTesterPath = File::Spec->catfile(productDir(), "TestWebKitAPI$apiTesterNameSuffix.exe");
148         $result = system $apiTesterPath, $test, @ARGV;
149     } else {
150         die "run-api-tests is not supported on this platform.\n"
151     }
152     
153     if ($result == 0) {
154         print BOLD GREEN, "Passed", RESET, "\n";
155     } else {
156         print BOLD RED, "Failed", RESET, "\n";
157     }
158 }
159
160
161 sub populateTests()
162 {
163     my @tests;
164
165     if (isAppleMacWebKit()) {
166         my $productDir = productDir();
167         $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
168         $ENV{WEBKIT_UNSET_DYLD_FRAMEWORK_PATH} = "YES";
169         my $apiTesterPath = "$productDir/TestWebKitAPI";
170
171         my ($pid, $childIn, $childOut);
172         if (architecture()) {
173             $pid = open3($childIn, $childOut, ">&STDERR", "arch", "-" . architecture(), $apiTesterPath, "--dump-tests") or die "Failed to build list of tests!";
174         } else {
175             $pid = open3($childIn, $childOut, ">&STDERR", $apiTesterPath, "--dump-tests") or die "Failed to build list of tests!";
176         }
177         close($childIn);
178         @tests = <$childOut>;
179         close($childOut);
180
181         waitpid($pid, 0);
182         my $result = $?;
183
184         if ($result) {
185             print STDERR "Failed to build list of tests!\n";
186             exit exitStatus($result);
187         }
188     } elsif (isAppleWinWebKit()) {
189         my $apiTesterNameSuffix;
190         if (configurationForVisualStudio() ne "Debug_All") {
191             $apiTesterNameSuffix = "";
192         } else {
193             $apiTesterNameSuffix = "_debug";
194         }
195         my $apiTesterPath = File::Spec->catfile(productDir(), "TestWebKitAPI$apiTesterNameSuffix.exe");
196         open(TESTS, "-|", $apiTesterPath, "--dump-tests") or die $!;
197         @tests = <TESTS>;
198         close(TESTS) or die $!;
199     } else {
200         die "run-api-tests is not supported on this platform.\n"
201     }
202
203     my %keyedTests = ();
204     for my $test (@tests) {
205         $test =~ s/[\r\n]*$//;
206         my ($suite, $testName) = split(/\//, $test);
207         push @{$keyedTests{$suite}}, $testName;
208     }
209     
210     return %keyedTests;
211 }
212
213 sub buildTestTool()
214 {
215     chdirWebKit();
216
217     my $buildTestTool = "build-api-tests";
218     print STDERR "Running $buildTestTool\n";
219
220     local *DEVNULL;
221     my ($childIn, $childOut, $childErr);
222     if ($quiet) {
223         open(DEVNULL, ">", File::Spec->devnull()) or die "Failed to open /dev/null";
224         $childOut = ">&DEVNULL";
225         $childErr = ">&DEVNULL";
226     } else {
227         # When not quiet, let the child use our stdout/stderr.
228         $childOut = ">&STDOUT";
229         $childErr = ">&STDERR";
230     }
231
232     my @args = argumentsForConfiguration();
233     my $buildProcess = open3($childIn, $childOut, $childErr, "Tools/Scripts/$buildTestTool", @args) or die "Failed to run " . $buildTestTool;
234     close($childIn);
235     waitpid $buildProcess, 0;
236     my $buildResult = $?;
237     close($childOut);
238     close($childErr);
239
240     close DEVNULL if ($quiet);
241
242     if ($buildResult) {
243         print STDERR "Compiling TestWebKitAPI failed!\n";
244         exit exitStatus($buildResult);
245     }
246 }