use Pod::Usage;
use Time::HiRes qw(time);
+my $per_test_warn_time = 100000; # upstream was 500
+my $per_test_bad_time = 100000; # upstream was 1000
+my $overall_test_warn_time = 100000; # upstream was 2000
+my $overall_test_bad_time = 100000; # upstream was 5000
+
my $pid;
my $istty = -t STDOUT;
my @log = ();
{
$stop = time();
if ($start) {
- printf " %s %s\n", mstime($stop - $start, 500, 1000), colourize("ok");
+ printf " %s %s\n",
+ mstime($stop - $start, $per_test_warn_time, $per_test_bad_time),
+ colourize("ok");
}
}
-sub run()
+sub run
{
+ # dup_msgs should be true when "watching". In that case all top
+ # level wvtest protocol messages should be duplicated to stderr so
+ # that they can be safely captured for report to process later.
+ my ($dup_msgs) = @_;
my $show_counts = 1;
GetOptionsFromArray(\@ARGV, 'counts!', \$show_counts)
or pod2usage();
# always flush
$| = 1;
- print STDERR "Testing \"all\" in @ARGV:\n";
+ {
+ my $msg = "Testing \"all\" in @ARGV:\n";
+ print $msg;
+ print STDERR $msg if $dup_msgs;
+ }
$pid = open(my $fh, "-|");
if (!$pid) {
local $SIG{INT} = sub { bigkill($pid); };
local $SIG{TERM} = sub { bigkill($pid); };
local $SIG{ALRM} = sub {
- print STDERR "Alarm timed out! No test results for too long.\n";
+ print STDERR resultline('Alarm timed out! No test results for too long.\n',
+ 'FAILED');
bigkill($pid);
};
if (/^\s*Testing "(.*)" in (.*):\s*$/)
{
- alarm(120);
+ alarm(300);
my ($sect, $file) = ($1, $2);
endsect();
}
elsif (/^!\s*(.*?)\s+(\S+)\s*$/)
{
- alarm(120);
+ alarm(300);
my ($name, $result) = ($1, $2);
my $pass = ($result eq "ok");
}
if ($code != 0) {
- print resultline("Program returned non-zero exit code ($ret)", "FAILED");
+ my $msg = resultline("Program returned non-zero exit code ($ret)",
+ 'FAILED');
+ print $msg;
+ print STDERR "$msg\n" if $dup_msgs;
}
print "\n";
if ($show_counts) {
my $gtotal = $gpasses + $gfails;
- printf("WvTest: %d test%s, %d failure%s\n",
- $gtotal, $gtotal==1 ? "" : "s",
- $gfails, $gfails==1 ? "" : "s");
+ my $msg = sprintf("WvTest: %d test%s, %d failure%s\n",
+ $gtotal, $gtotal == 1 ? "" : "s", $gfails,
+ $gfails == 1 ? "" : "s");
+ print $msg;
+ print STDERR $msg if $dup_msgs;
+ }
+ {
+ my $msg = sprintf("WvTest: result code $ret, total time %s\n",
+ mstime(time() - $allstart,
+ $overall_test_warn_time,
+ $overall_test_bad_time));
+ print $msg;
+ print STDERR $msg if $dup_msgs;
}
- printf("WvTest: result code $ret, total time %s\n",
- mstime(time() - $allstart, 2000, 5000));
return ($ret ? $ret : ($gfails ? 125 : 0));
}
my $action = $ARGV[0];
shift @ARGV;
-if ($action eq 'run') { exit run(); }
-elsif ($action eq 'watch') { run(); }
+if ($action eq 'run') { exit run(0); }
+elsif ($action eq 'watch') { run(1); }
elsif ($action eq 'report') { exit report(); }
else { pod2usage(-msg => "$0: invalid action $action", -verbose => 1); }
# Fine if ./tests doesn't produce any output in parallel.
wvtest run ./tests
- # Use watch and report for parallel tests.
+ # Use watch and report for parallel tests. Note that watch's stderr will
+ # include copies of any top level messages - reporting non-zero
+ # test command exits, etc., and so must be included in the report arguments.
wvtest watch --no-counts \
- sh -c '(test-1 2>&1 | tee test-1.log)& (test-2 2>&1 | tee test-2.log)&'
- wvtest report test-1.log test-2.log
+ "sh -c '(test-1 2>&1 | tee test-1.log)& (test-2 2>&1 | tee test-2.log)&'" \
+ 2>test-3.log \
+ wvtest report test-1.log test-2.log test-3.log
=cut