aboutsummaryrefslogtreecommitdiffstats
path: root/tests/TESTonce
diff options
context:
space:
mode:
Diffstat (limited to 'tests/TESTonce')
-rwxr-xr-xtests/TESTonce127
1 files changed, 110 insertions, 17 deletions
diff --git a/tests/TESTonce b/tests/TESTonce
index 7026624bfe69..425abaab36d1 100755
--- a/tests/TESTonce
+++ b/tests/TESTonce
@@ -1,6 +1,17 @@
#!/usr/bin/env perl
-system("mkdir -p NEW DIFF");
+$TCPDUMP = "./tcpdump";
+if ($^O eq 'MSWin32') {
+ $TCPDUMP = "windump";
+}
+if($ENV{TCPDUMP_BIN}) {
+ $TCPDUMP = $ENV{TCPDUMP_BIN};
+}
+
+use File::Basename;
+use POSIX qw( WEXITSTATUS WIFEXITED);
+
+system("mkdir -p tests/NEW tests/DIFF");
if(@ARGV != 4) {
print "Usage: TESTonce name input output options\n";
@@ -13,39 +24,121 @@ $output=$ARGV[2];
$options=$ARGV[3];
my $r;
+my $debug = 0; # change to suit.
+
+$outputbase = basename($output);
+my $coredump = false;
+my $status = 0;
+my $linecount = 0;
+my $rawstderrlog = "tests/NEW/${outputbase}.raw.stderr";
+my $stderrlog = "tests/NEW/${outputbase}.stderr";
+my $diffstat = 0;
+my $errdiffstat = 0;
+my $cmd;
if ($^O eq 'MSWin32') {
- $r = system "..\\windump -n -t -r $input $options 2>NUL | sed 's/\\r//' | tee NEW/$output | diff $output - >DIFF/$output.diff";
+ $r = system ".\\${TCPDUMP} -t -n -r $input $options 2>NUL | sed 's/\\r//' | tee tests/NEW/${outputbase} | diff $output - >tests/DIFF/${outputbase}.diff";
# need to do same as below for Cygwin.
}
else {
# we used to do this as a nice pipeline, but the problem is that $r fails to
# to be set properly if the tcpdump core dumps.
- $r = system "../tcpdump 2>/dev/null -n -t -r $input $options >NEW/$output";
+ $cmd = "$TCPDUMP 2>${rawstderrlog} -t -n -r $input $options >tests/NEW/${outputbase}";
+ print "CMD: $cmd\n" if $debug;
+ $r = system $cmd;
+ if($r == -1) {
+ # failed to start due to error.
+ $status = $!;
+ }
if($r != 0) {
- # this means tcpdump failed.
- open(OUTPUT, ">>"."NEW/$output") || die "fail to open $output\n";
- printf OUTPUT "EXIT CODE %08x\n", $r;
+ $coredump = false;
+ $status = 0;
+ # this means tcpdump failed, which however, might be expected.
+ open(OUTPUT, ">>"."tests/NEW/${outputbase}") || die "fail to open ${outputbase}\n";
+ if( $r & 128 ) {
+ $coredump = $r & 127;
+ }
+ if( WIFEXITED($r)) {
+ $status = WEXITSTATUS($r);
+ }
+
+ if($coredump || $status) {
+ printf OUTPUT "\nEXIT CODE %08x: dump:%d code: %d\n", $r, $coredump, $status;
+ } else {
+ printf OUTPUT "\nEXIT CODE %08x\n", $r;
+ }
close(OUTPUT);
- $r = 0;
+ $r = 0; # clear the error so that the diff will occur.
+ }
+ print "RUNNING DIFF after ${r}\n" if $debug;
+
+ # always run diff.
+ $cmd = "cat tests/NEW/${outputbase} | diff $output - >tests/DIFF/${outputbase}.diff";
+ print "RUNNING: $cmd\n" if $debug;
+ $r = system $cmd;
+ if(WIFEXITED($r)) {
+ $diffstat = WEXITSTATUS($r);
}
+
+ #system("/bin/sh");
+
+ # process the file, sanitize "reading from" line, and count lines
+ $linecount = 0;
+ open(ERRORRAW, "<" . $rawstderrlog);
+ open(ERROROUT, ">" . $stderrlog);
+ while(<ERRORRAW>) {
+ next if /^\s*$/; # blank lines are boring
+ if(/^(reading from file )(.*)(,.*)$/) {
+ my $filename = basename($2);
+ print ERROROUT "${1}${filename}${3}\n";
+ next;
+ }
+ print ERROROUT;
+ $linecount++;
+ }
+ close(ERROROUT);
+ close(ERRORRAW);
+
+ if ( -f "$output.stderr" ) {
+ $nr = system "cat $stderrlog | diff $output.stderr - >tests/DIFF/$outputbase.stderr.diff";
+ if($r == 0) {
+ $r = $nr;
+ }
+ $errdiffstat = WEXITSTATUS($nr);
+ } else {
+ $errdiffstat = "-"
+ }
+
if($r == 0) {
- $r = system "cat NEW/$output | diff $output - >DIFF/$output.diff";
+ if($linecount == 0 && $status == 0) {
+ print "UNLINK: ${stderrlog}\n" if $debug;
+ unlink($stderrlog) unless $debug;
+ } else {
+ $errdiffstat = "+";
+ }
}
- #print sprintf("END: %08x\n", $r);
+
+ print sprintf("END: %08x\n", $r) if $debug;
}
if($r == 0) {
- printf " %-35s: passed\n", $name;
- unlink "DIFF/$output.diff";
- exit 0;
+ my $stderrlog="";
+ if($linecount > 0 && $errdiffstat != "-") {
+ $stderrlog=sprintf("-- %d lines extra in stderr", $linecount);
+ }
+ if(!defined($ENV{"SKIPPASSED"})) {
+ printf " %-35s: passed%s\n", $name, $stderrlog;
+ }
+ unlink "tests/DIFF/$outputbase.diff" unless $debug;
+ exit 0;
}
-printf " %-35s: TEST FAILED", $name;
-open FOUT, '>>failure-outputs.txt';
-printf FOUT "Failed test: $name\n\n";
+# must have failed!
+printf " %-35s: TEST FAILED(exit core=%d/diffstat=%d,%d/r=%d)", $name, $coredump, $diffstat, $errdiffstat, $r;
+open FOUT, '>>tests/failure-outputs.txt';
+printf FOUT "\nFailed test: $name\n\n";
close FOUT;
-if(-f "DIFF/$output.diff") {
- system "cat DIFF/$output.diff >> failure-outputs.txt";
+if(-f "tests/DIFF/$outputbase.diff") {
+ system "cat tests/DIFF/$outputbase.diff >> tests/failure-outputs.txt";
}
if($r == -1) {