use FindBin;
use Getopt::Long;
use IPC::Open2;
+use IPC::Open3;
use Time::HiRes qw(time);
use lib $FindBin::Bin;
sub openDumpTool();
sub closeDumpTool();
+sub dumpToolCrashed();
sub closeHTTPD();
sub countAndPrintLeaks($$$);
sub fileNameWithNumber($$);
sub splitpath($);
sub isTextOnlyTest($);
sub expectedDirectoryForTest($);
+sub printFailureMessageForTest($$);
sub toURL($);
sub toWindowsPath($);
sub closeCygpaths();
sub validateSkippedArg($$;$);
+sub htmlForExpectedAndActualResults($);
+sub deleteExpectedAndActualResults($);
+sub recordActualResultsAndDiff($$);
# Argument handling
my $shouldCheckLeaks = '';
my $expectedTag = "expected";
my $actualTag = "actual";
my $diffsTag = "diffs";
+my $errorTag = "stderr";
my $programName = basename($0);
my $launchSafariDefault = $launchSafari ? "launch" : "do not launch";
}
}
- if (!defined $expected) {
+ if (dumpToolCrashed()) {
+ $result = "crash";
+
+ printFailureMessageForTest($test, "crashed");
+
+ my $dir = "$testResultsDirectory/$base";
+ $dir =~ s|/([^/]+)$|| or die "Failed to find test name from base\n";
+ mkpath $dir;
+
+ open CRASH, ">", "$testResultsDirectory/$base-$errorTag.txt" or die;
+ print CRASH <ERROR>;
+ close CRASH;
+
+ deleteExpectedAndActualResults($base);
+ recordActualResultsAndDiff($base, $actual);
+
+ closeDumpTool();
+ } elsif (!defined $expected) {
if ($verbose) {
print "new " . ($resetResults ? "result" : "test") ."\n";
$atLineStart = 1;
print EXPECTED $actual;
close EXPECTED;
}
- unlink "$testResultsDirectory/$base-$actualTag.txt";
- unlink "$testResultsDirectory/$base-$diffsTag.txt";
+ deleteExpectedAndActualResults($base);
unless ($resetResults) {
# Always print the file name for new tests, as they will probably need some manual inspection.
# in verbose mode we already printed the test case, so no need to do it again.
$atLineStart = 1;
}
$result = "match";
- unlink "$testResultsDirectory/$base-$actualTag.txt";
- unlink "$testResultsDirectory/$base-$diffsTag.txt";
+ deleteExpectedAndActualResults($base);
} else {
- unless ($verbose) {
- print "\n" unless $atLineStart;
- print "$test -> ";
- }
- print "failed\n";
- $atLineStart = 1;
-
$result = "mismatch";
+ printFailureMessageForTest($test, "failed");
+
my $dir = "$testResultsDirectory/$base";
$dir =~ s|/([^/]+)$|| or die "Failed to find test name from base\n";
my $testName = $1;
mkpath $dir;
- open ACTUAL, ">", "$testResultsDirectory/$base-$actualTag.txt" or die;
- print ACTUAL $actual;
- close ACTUAL;
-
- system "diff -u \"$expectedDir/$base-$expectedTag.txt\" \"$testResultsDirectory/$base-$actualTag.txt\" > \"$testResultsDirectory/$base-$diffsTag.txt\"";
+ deleteExpectedAndActualResults($base);
+ recordActualResultsAndDiff($base, $actual);
if ($pixelTests && $diffPNG && $diffPNG ne "") {
$imagesPresent{$base} = 1;
match => "succeeded",
mismatch => "had incorrect layout",
new => "were new",
- fail => "failed (tool did not execute successfully)",
+ crash => "crashed",
);
-for my $type ("match", "mismatch", "new", "fail") {
+for my $type ("match", "mismatch", "new", "crash") {
my $c = $counts{$type};
if ($c) {
my $t = $text{$type};
for my $test (@{$tests{mismatch}}) {
my $base = $test;
$base =~ s/\.[a-zA-Z]+$//;
- my $expectedDir = expectedDirectoryForTest($base);
- copy("$expectedDir/$base-$expectedTag.txt", "$testResultsDirectory/$base-$expectedTag.txt");
print HTML "<tr>\n";
print HTML "<td><a href=\"" . toURL("$testDirectory/$test") . "\">$test</a></td>\n";
- if (-s "$testResultsDirectory/$base-$diffsTag.txt") {
- print HTML "<td><a href=\"$base-$expectedTag.txt\">expected</a></td>\n";
- print HTML "<td><a href=\"$base-$actualTag.txt\">actual</a></td>\n";
- print HTML "<td><a href=\"$base-$diffsTag.txt\">diffs</a></td>\n";
- } else {
- print HTML "<td></td><td></td><td></td>\n";
- }
+ print HTML htmlForExpectedAndActualResults($base);
if ($pixelTests) {
if ($imagesPresent{$base}) {
print HTML "<td><a href=\"$base-$expectedTag.png\">expected image</a></td>\n";
print HTML "</table>\n";
}
-if ($counts{fail}) {
- print HTML "<p>Tests that caused the DumpRenderTree tool to fail:</p>\n";
+if ($counts{crash}) {
+ print HTML "<p>Tests that caused the DumpRenderTree tool to crash:</p>\n";
print HTML "<table>\n";
- for my $test (@{$tests{fail}}) {
+ for my $test (@{$tests{crash}}) {
my $base = $test;
$base =~ s/\.[a-zA-Z]+$//;
my $expectedDir = expectedDirectoryForTest($base);
print HTML "<tr>\n";
print HTML "<td><a href=\"" . toURL("$testDirectory/$test") . "\">$base</a></td>\n";
+ print HTML htmlForExpectedAndActualResults($base);
+ print HTML "<td><a href=\"$base-$errorTag.txt\">stderr</a></td>\n";
print HTML "</tr>\n";
}
print HTML "</table>\n";
if ($useValgrind) {
$dumpTool = "valgrind";
}
- $dumpToolPID = open2(\*IN, \*OUT, $dumpTool, @args) or die "Failed to start tool: $dumpTool\n";
+ $dumpToolPID = open3(\*OUT, \*IN, \*ERROR, $dumpTool, @args) or die "Failed to start tool: $dumpTool\n";
$isDumpToolOpen = 1;
}
close IN;
close OUT;
+ close ERROR;
waitpid $dumpToolPID, 0;
$isDumpToolOpen = 0;
}
+sub dumpToolCrashed()
+{
+ return 0 unless $isDumpToolOpen;
+
+ my $pid = waitpid(-1, WNOHANG);
+ return $pid == $dumpToolPID;
+}
+
sub openHTTPDIfNeeded()
{
return if $isHttpdOpen;
return (-f "$platformTestDirectory/$base-$expectedTag.txt") ? $platformTestDirectory : $expectedDirectory;
}
+sub printFailureMessageForTest($$)
+{
+ my ($test, $description) = @_;
+
+ unless ($verbose) {
+ print "\n" unless $atLineStart;
+ print "$test -> ";
+ }
+ print "$description\n";
+ $atLineStart = 1;
+}
+
my %cygpaths = ();
sub openCygpathIfNeeded($)
die "Invalid argument '" . $value . "' for option $option" unless $validSkippedValues{$value};
$treatSkipped = $value;
}
+
+sub htmlForExpectedAndActualResults($)
+{
+ my ($base) = @_;
+
+ return "<td></td><td></td><td></td>\n" unless -s "$testResultsDirectory/$base-$diffsTag.txt";
+
+ return "<td><a href=\"$base-$expectedTag.txt\">expected</a></td>\n"
+ . "<td><a href=\"$base-$actualTag.txt\">actual</a></td>\n"
+ . "<td><a href=\"$base-$diffsTag.txt\">diffs</a></td>\n";
+}
+
+sub deleteExpectedAndActualResults($)
+{
+ my ($base) = @_;
+
+ unlink "$testResultsDirectory/$base-$actualTag.txt";
+ unlink "$testResultsDirectory/$base-$diffsTag.txt";
+ unlink "$testResultsDirectory/$base-$errorTag.txt";
+}
+
+sub recordActualResultsAndDiff($$)
+{
+ my ($base, $actual) = @_;
+
+ return unless length($actual);
+
+ open ACTUAL, ">", "$testResultsDirectory/$base-$actualTag.txt" or die "Couldn't open actual results file for $base";
+ print ACTUAL $actual;
+ close ACTUAL;
+
+ my $expectedDir = expectedDirectoryForTest($base);
+ copy("$expectedDir/$base-$expectedTag.txt", "$testResultsDirectory/$base-$expectedTag.txt");
+
+ system "diff -u \"$testResultsDirectory/$base-$expectedTag.txt\" \"$testResultsDirectory/$base-$actualTag.txt\" > \"$testResultsDirectory/$base-$diffsTag.txt\"";
+}