]>
The Tcpdump Group git mirrors - tcpdump/blob - tests/TESTonce
3 $TCPDUMP = "tcpdump" if (!($TCPDUMP = $ENV{TCPDUMP_BIN
}));
6 use POSIX
qw( WEXITSTATUS WIFEXITED);
8 system("mkdir -p tests/NEW tests/DIFF");
11 print "Usage: TESTonce name input output options\n";
22 $outputbase = basename
($output);
26 my $rawstderrlog = "tests/NEW/${outputbase}.raw.stderr";
27 my $stderrlog = "tests/NEW/${outputbase}.stderr";
31 if ($^O
eq 'MSWin32') {
32 $r = system "..\\windump -t -n -r $input $options 2>NUL | sed 's/\\r//' | tee tests/NEW/$outputbase | diff $output - >tests/DIFF/$outputbase.diff";
33 # need to do same as below for Cygwin.
36 # we used to do this as a nice pipeline, but the problem is that $r fails to
37 # to be set properly if the tcpdump core dumps.
38 $r = system "$TCPDUMP 2>${rawstderrlog} -t -n -r $input $options >tests/NEW/${outputbase}";
40 # failed to start due to error.
46 # this means tcpdump failed, which however, might be expected.
47 open(OUTPUT
, ">>"."tests/NEW/${outputbase}") || die "fail to open ${outputbase}\n";
52 $status = WEXITSTATUS
($r);
55 if($coredump || $status) {
56 printf OUTPUT
"\nEXIT CODE %08x: dump:%d code: %d\n", $r, $coredump, $status;
58 printf OUTPUT
"\nEXIT CODE %08x\n", $r;
61 $r = 0; # clear the error so that the diff will occur.
63 #print "RUNNING DIFF after ${r}\n";
66 #print "RUNNING: cat tests/NEW/${outputbase} | diff $output - >tests/DIFF/${outputbase}.diff\n";
67 $r = system "cat tests/NEW/${outputbase} | diff $output - >tests/DIFF/${outputbase}.diff";
68 $diffstat = WEXITSTATUS
($r);
70 # process the file, sanitize "reading from" line, and count lines
72 open(ERRORRAW
, "<" . $rawstderrlog);
73 open(ERROROUT
, ">" . $stderrlog);
75 next if /^$/; # blank lines are boring
76 if(/^(reading from file )(.*)(,.*)$/) {
77 my $filename = basename
($2);
78 print ERROROUT
"${1}${filename}${3}\n";
87 if ( -f
"$output.stderr" ) {
88 $nr = system "cat $stderrlog | diff $output.stderr - >tests/DIFF/$outputbase.stderr.diff";
92 $errdiffstat = WEXITSTATUS
($nr);
98 if($linecount == 0 && $status == 0) {
99 #print "UNLINK: ${stderrlog}\n";
106 #print sprintf("END: %08x\n", $r);
112 $stderrlog=sprintf("-- %d lines extra in stderr", $linecount);
114 if(!defined($ENV{"SKIPPASSED"})) {
115 printf " %-35s: passed%s\n", $name, $stderrlog;
117 unlink "tests/DIFF/$outputbase.diff";
121 printf " %-35s: TEST FAILED(exit core=%d/diffstat=%d,%d/r=%d)", $name, $coredump, $diffstat, $errdiffstat, $r;
122 open FOUT
, '>>tests/failure-outputs.txt';
123 printf FOUT
"\nFailed test: $name\n\n";
125 if(-f
"tests/DIFF/$outputbase.diff") {
126 system "cat tests/DIFF/$outputbase.diff >> tests/failure-outputs.txt";
130 print " (failed to execute: $!)\n";
134 # this is not working right, $r == 0x8b00 when there is a core dump.
135 # clearly, we need some platform specific perl magic to take this apart, so look for "core"
137 # In particular, on Solaris 10 SPARC an alignment problem results in SIGILL,
138 # a core dump and $r set to 0x00008a00 ($? == 138 in the shell).
139 if($r & 127 || -f
"core") {
140 my $with = ($r & 128) ?
'with' : 'without';
144 printf " (terminated with signal %u, %s coredump)\n", ($r & 127), $with;
145 exit ($r & 128) ?
10 : 20;