]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
tests: t/run.perl: fix invocations with <10 tests
authorEric Wong <e@80x24.org>
Fri, 14 Jul 2023 09:28:47 +0000 (09:28 +0000)
committerEric Wong <e@80x24.org>
Fri, 14 Jul 2023 20:35:37 +0000 (20:35 +0000)
We must account for the maximum index of an array to avoid
filling unused slots with `undef' from out-of-bounds reads.
This is needed to avoid undefined entry errors in workers when
fewer than 10 tests are run.  We'll also silence the message
when a single test is run.

While I was diagnosing this, I also noticed a small
simplification and optimization in our generation of $todo_buf
since I initially thought that was the cause of undefined
entry errors in the $todo arrayref.

t/run.perl

index f68dab607f2693c53edb9d517b9ff93150fbae5a..9c8129d55d6393f9f4c4ab15572e50ca5cec05f5 100755 (executable)
@@ -85,9 +85,13 @@ if ($shuffle) {
        @tests = sort {
                ($t->{$b}->{elapsed} // 0) <=> ($t->{$a}->{elapsed} // 0)
        } @tests;
-       say "# top 10 longest tests (`make check' regenerates)";
-       for (@tests[0..9]) {
-               printf "# %0.6f %s\n", $t->{$_}->{elapsed}, $_;
+       if (scalar(@tests) > 1) {
+               my $end = $#tests > 9 ? 9 : $#tests;
+               my $nr = $end + 1;
+               say "# top $nr longest tests (`make check' regenerates)";
+               for (grep defined, @tests[0..$end]) {
+                       printf "# %0.6f %s\n", $t->{$_}->{elapsed}, $_;
+               }
        }
 }
 
@@ -208,7 +212,7 @@ for (my $i = $repeat; $i != 0; $i--) {
        # fill the queue before forking so children can start earlier
        $wr->autoflush(1);
        $wr->blocking(0);
-       my $todo_buf = join('', map { pack('I', $_) } (0..$#todo));
+       my $todo_buf = pack('I*', 0..$#todo);
        my $woff = syswrite($wr, $todo_buf) // DIE "syswrite: $!";
        substr($todo_buf, 0, $woff, '');
        $eof = undef;