X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Frun.perl;h=1c7bcfc34db6fc3a24f28e468ee3d0d2f6f0827c;hb=670e37954c1d91fb096dfc8604c2d6ab81d03e08;hp=017ca3e82c72be9f2e0665be26121129b3f9ac75;hpb=cffc7d4fc1c36169654f8447b23b3c5c43830eed;p=public-inbox.git diff --git a/t/run.perl b/t/run.perl index 017ca3e8..1c7bcfc3 100755 --- a/t/run.perl +++ b/t/run.perl @@ -11,10 +11,13 @@ # Usage: $PERL -I lib -w t/run.perl -j4 # Or via prove(1): prove -lvw t/run.perl :: -j4 use strict; +use v5.10.1; +use IO::Handle; # ->autoflush use PublicInbox::TestCommon; use Cwd qw(getcwd); use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev); use Errno qw(EINTR); +use Fcntl qw(:seek); use POSIX qw(_POSIX_PIPE_BUF WNOHANG); my $jobs = 1; my $repeat = 1; @@ -31,10 +34,10 @@ if (($ENV{TEST_RUN_MODE} // 2) == 0) { } my @tests = scalar(@ARGV) ? @ARGV : glob('t/*.t'); my $cwd = getcwd(); -open OLDOUT, '>&STDOUT' or die "dup STDOUT: $!"; -open OLDERR, '>&STDERR' or die "dup STDERR: $!"; -OLDOUT->autoflush(1); -OLDERR->autoflush(1); +open my $OLDOUT, '>&STDOUT' or die "dup STDOUT: $!"; +open my $OLDERR, '>&STDERR' or die "dup STDERR: $!"; +$OLDOUT->autoflush(1); +$OLDERR->autoflush(1); key2sub($_) for @tests; # precache @@ -52,7 +55,7 @@ if ($shuffle) { our $tb = Test::More->builder; sub DIE (;$) { - print OLDERR @_; + print $OLDERR @_; exit(1); } @@ -61,7 +64,33 @@ our ($worker, $worker_test); sub test_status () { $? = 255 if $? == 0 && !$tb->is_passing; my $status = $? ? 'not ok' : 'ok'; - print OLDOUT "$status $worker_test\n" if $log_suffix ne ''; + chdir($cwd) or DIE "chdir($cwd): $!"; + if ($log_suffix ne '') { + my $log = $worker_test; + $log =~ s/\.t\z/$log_suffix/; + my $skip = ''; + if (open my $fh, '<', $log) { + my @not_ok = grep(!/^(?:ok |[ \t]*#)/ms, <$fh>); + pop @not_ok if $not_ok[-1] =~ /^[0-9]+\.\.[0-9]+$/; + my $pfx = "# $log: "; + print $OLDERR map { $pfx.$_ } @not_ok; + seek($fh, 0, SEEK_SET) or die "seek: $!"; + + # show unique skip texts and the number of times + # each text was skipped + local $/; + my @sk = (<$fh> =~ m/^ok [0-9]+ (# skip [^\n]+)/mgs); + if (@sk) { + my %nr; + my @err = grep { !$nr{$_}++ } @sk; + print $OLDERR "$pfx$_ ($nr{$_})\n" for @err; + $skip = ' # total skipped: '.scalar(@sk); + } + } else { + print $OLDERR "could not open: $log: $!\n"; + } + print $OLDOUT "$status $worker_test$skip\n"; + } } # Test::Builder or Test2::Hub may call exit() from plan(skip_all => ...) @@ -112,7 +141,6 @@ my $start_worker = sub { my $t = unpack('I', $buf); run_test($todo->[$t]); $tb->reset; - chdir($cwd) or DIE "chdir: $!"; } kill 'USR1', $producer if !$eof; # sets $eof in $producer DIE join('', map { "E: $_\n" } @err) if @err; @@ -156,7 +184,7 @@ for (my $i = $repeat; $i != 0; $i--) { push @err, "job[$j] ($?)" if $?; # skip_all can exit(0), respawn if needed: if (!$eof) { - print OLDERR "# respawning job[$j]\n"; + print $OLDERR "# respawning job[$j]\n"; $start_worker->($i, $j, $rd, \@todo); } } @@ -179,4 +207,4 @@ for (my $i = $repeat; $i != 0; $i--) { DIE join('', map { "E: $_\n" } @err) if @err; } -print OLDOUT "1..".($repeat * scalar(@tests))."\n" if $repeat >= 0; +print $OLDOUT "1..".($repeat * scalar(@tests))."\n" if $repeat >= 0;