| #!/usr/bin/perl -w |
| |
| # Copyright (C) 2010, 2011 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| # THE POSSIBILITY OF SUCH DAMAGE. |
| |
| # Features to add: |
| # - Command line option to run a single test. |
| # - Command line option to run all tests in a suite. |
| |
| use strict; |
| use warnings; |
| |
| use File::Basename; |
| use FindBin; |
| use Getopt::Long qw(:config pass_through); |
| use IPC::Open3; |
| use lib $FindBin::Bin; |
| use webkitdirs; |
| use Term::ANSIColor qw(:constants); |
| |
| sub dumpAllTests(); |
| sub runAllTests(); |
| sub runAllTestsInSuite($); |
| sub runTest($$); |
| sub populateTests(); |
| sub buildTestTool(); |
| |
| my $showHelp = 0; |
| my $verbose = 0; |
| my $dump = 0; |
| |
| my $programName = basename($0); |
| my $usage = <<EOF; |
| Usage: $programName [options] |
| --help Show this help message |
| -v|--verbose Verbose output |
| -d|--dump-tests Dump the names of testcases without running them |
| EOF |
| |
| GetOptions( |
| 'help' => \$showHelp, |
| 'verbose|v' => \$verbose, |
| 'dump|d' => \$dump, |
| ); |
| |
| if ($showHelp) { |
| print STDERR $usage; |
| exit 1; |
| } |
| |
| setConfiguration(); |
| buildTestTool(); |
| setPathForRunningWebKitApp(\%ENV); |
| my %testsToRun = populateTests(); |
| |
| if ($dump) { |
| dumpAllTests(); |
| exit 0; |
| } |
| |
| runAllTests(); |
| |
| sub dumpAllTests() |
| { |
| print "Dumping test cases\n"; |
| print "------------------\n"; |
| for my $suite (keys %testsToRun) { |
| print $suite . ":\n"; |
| print map { " " . $_ . "\n" } @{ $testsToRun{$suite} }; |
| } |
| print "------------------\n"; |
| } |
| |
| sub runAllTests() |
| { |
| my $anyFailures = 0; |
| for my $suite (keys %testsToRun) { |
| my $failed = runAllTestsInSuite($suite); |
| if ($failed) { |
| $anyFailures = 1; |
| } |
| } |
| return $anyFailures; |
| } |
| |
| sub runAllTestsInSuite($) |
| { |
| my ($suite) = @_; |
| print "Suite: $suite\n"; |
| |
| my $anyFailures = 0; |
| for my $test (@{$testsToRun{$suite}}) { |
| my $failed = runTest($suite, $test); |
| if ($failed) { |
| $anyFailures = 1; |
| } |
| } |
| |
| return $anyFailures; |
| } |
| |
| sub runTest($$) |
| { |
| my ($suite, $testName) = @_; |
| my $test = $suite . "/" . $testName; |
| |
| print " Test: $testName -> "; |
| |
| my $result = 0; |
| if (isAppleMacWebKit()) { |
| my $productDir = productDir(); |
| $ENV{DYLD_FRAMEWORK_PATH} = $productDir; |
| $ENV{WEBKIT_UNSET_DYLD_FRAMEWORK_PATH} = "YES"; |
| my $apiTesterPath = "$productDir/TestWebKitAPI"; |
| |
| local *DEVNULL; |
| my ($childIn, $childOut, $childErr); |
| unless ($verbose) { |
| open(DEVNULL, ">", File::Spec->devnull()) or die "Failed to open /dev/null"; |
| $childOut = ">&DEVNULL"; |
| $childErr = ">&DEVNULL"; |
| } else { |
| $childOut = ">&STDOUT"; |
| $childErr = ">&STDERR"; |
| } |
| |
| my $pid; |
| if (architecture()) { |
| $pid = open3($childIn, $childOut, $childErr, "arch", "-" . architecture(), $apiTesterPath, $test, @ARGV) or die "Failed to run test: $test."; |
| } else { |
| $pid = open3($childIn, $childOut, $childErr, $apiTesterPath, $test, @ARGV) or die "Failed to run test: $test."; |
| } |
| |
| close($childIn); |
| close($childOut); |
| close($childErr); |
| close(DEVNULL) unless ($verbose); |
| |
| waitpid($pid, 0); |
| $result = $?; |
| } elsif (isAppleWinWebKit()) { |
| my $apiTesterNameSuffix; |
| if (configurationForVisualStudio() ne "Debug_All") { |
| $apiTesterNameSuffix = ""; |
| } else { |
| $apiTesterNameSuffix = "_debug"; |
| } |
| my $apiTesterPath = File::Spec->catfile(productDir(), "TestWebKitAPI$apiTesterNameSuffix.exe"); |
| $result = system $apiTesterPath, $test, @ARGV; |
| } else { |
| die "run-api-tests is not supported on this platform.\n" |
| } |
| |
| if ($result == 0) { |
| print BOLD GREEN, "Passed", RESET, "\n"; |
| } else { |
| print BOLD RED, "Failed", RESET, "\n"; |
| } |
| } |
| |
| sub populateTests() |
| { |
| my @tests; |
| |
| if (isAppleMacWebKit()) { |
| my $productDir = productDir(); |
| $ENV{DYLD_FRAMEWORK_PATH} = $productDir; |
| $ENV{WEBKIT_UNSET_DYLD_FRAMEWORK_PATH} = "YES"; |
| my $apiTesterPath = "$productDir/TestWebKitAPI"; |
| |
| local *DEVNULL; |
| my ($childIn, $childOut, $childErr); |
| unless ($verbose) { |
| open(DEVNULL, ">", File::Spec->devnull()) or die "Failed to open /dev/null"; |
| $childErr = ">&DEVNULL"; |
| } else { |
| $childErr = ">&STDERR"; |
| } |
| |
| my $pid; |
| if (architecture()) { |
| $pid = open3($childIn, $childOut, $childErr, "arch", "-" . architecture(), $apiTesterPath, "--dump-tests") or die "Failed to build list of tests!"; |
| } else { |
| $pid = open3($childIn, $childOut, $childErr, $apiTesterPath, "--dump-tests") or die "Failed to build list of tests!"; |
| } |
| |
| close($childIn); |
| @tests = <$childOut>; |
| close($childOut); |
| close($childErr); |
| close(DEVNULL) unless ($verbose); |
| |
| waitpid($pid, 0); |
| my $result = $?; |
| |
| if ($result) { |
| print STDERR "Failed to build list of tests!\n"; |
| exit exitStatus($result); |
| } |
| } elsif (isAppleWinWebKit()) { |
| my $apiTesterNameSuffix; |
| if (configurationForVisualStudio() ne "Debug_All") { |
| $apiTesterNameSuffix = ""; |
| } else { |
| $apiTesterNameSuffix = "_debug"; |
| } |
| my $apiTesterPath = File::Spec->catfile(productDir(), "TestWebKitAPI$apiTesterNameSuffix.exe"); |
| open(TESTS, "-|", $apiTesterPath, "--dump-tests") or die $!; |
| @tests = <TESTS>; |
| close(TESTS) or die $!; |
| } else { |
| die "run-api-tests is not supported on this platform.\n" |
| } |
| |
| my %keyedTests = (); |
| for my $test (@tests) { |
| $test =~ s/[\r\n]*$//; |
| my ($suite, $testName) = split(/\//, $test); |
| push @{$keyedTests{$suite}}, $testName; |
| } |
| |
| return %keyedTests; |
| } |
| |
| sub buildTestTool() |
| { |
| chdirWebKit(); |
| |
| my $buildTestTool = "build-api-tests"; |
| print STDERR "Running $buildTestTool\n"; |
| |
| local *DEVNULL; |
| my ($childIn, $childOut, $childErr); |
| unless ($verbose) { |
| open(DEVNULL, ">", File::Spec->devnull()) or die "Failed to open /dev/null"; |
| $childOut = ">&DEVNULL"; |
| $childErr = ">&DEVNULL"; |
| } else { |
| # When not quiet, let the child use our stdout/stderr. |
| $childOut = ">&STDOUT"; |
| $childErr = ">&STDERR"; |
| } |
| |
| my @args = argumentsForConfiguration(); |
| my $buildProcess = open3($childIn, $childOut, $childErr, "Tools/Scripts/$buildTestTool", @args) or die "Failed to run " . $buildTestTool; |
| |
| close($childIn); |
| close($childOut); |
| close($childErr); |
| close(DEVNULL) unless ($verbose); |
| |
| waitpid($buildProcess, 0); |
| my $buildResult = $?; |
| |
| if ($buildResult) { |
| print STDERR "Compiling TestWebKitAPI failed!\n"; |
| exit exitStatus($buildResult); |
| } |
| } |