We can also enable the SIGALRM test by default as we're killing manually in a loop to ensure the signal handler eventually fires.
Followup-to: 2a6063fbc4580315 ("ipc: assume SOCK_SEQPACKET exists") --- t/cmd_ipc.t | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/t/cmd_ipc.t b/t/cmd_ipc.t index 7edfc92f..461d2140 100644 --- a/t/cmd_ipc.t +++ b/t/cmd_ipc.t @@ -1,22 +1,20 @@ #!perl -w # Copyright (C) all contributors <meta@public-inbox.org> # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> -use strict; -use v5.10.1; -use Test::More; +use v5.12; use PublicInbox::TestCommon; -use Socket qw(AF_UNIX SOCK_STREAM); -pipe(my ($r, $w)) or BAIL_OUT; +use autodie; +use Socket qw(AF_UNIX SOCK_STREAM SOCK_SEQPACKET); +pipe(my $r, my $w); my ($send, $recv); require_ok 'PublicInbox::Spawn'; -my $SOCK_SEQPACKET = eval { Socket::SOCK_SEQPACKET() } // undef; +require POSIX; my $do_test = sub { SKIP: { my ($type, $flag, $desc) = @_; - defined $type or skip 'SOCK_SEQPACKET missing', 7; my ($s1, $s2); my $src = 'some payload' x 40; - socketpair($s1, $s2, AF_UNIX, $type, 0) or BAIL_OUT $!; + socketpair($s1, $s2, AF_UNIX, $type, 0); my $sfds = [ fileno($r), fileno($w), fileno($s1) ]; $send->($s1, $sfds, $src, $flag); my (@fds) = $recv->($s2, my $buf, length($src) + 1); @@ -37,7 +35,7 @@ my $do_test = sub { SKIP: { @exp = stat $s1; @cur = stat $s1a; is("$exp[0]\0$exp[1]", "$cur[0]\0$cur[1]", '$s1 dev/ino matches'); - if (defined($SOCK_SEQPACKET) && $type == $SOCK_SEQPACKET) { + if ($type == SOCK_SEQPACKET) { $r1 = $w1 = $s1a = undef; $src = (',' x 1023) . '-' .('.' x 1024); $send->($s1, $sfds, $src, $flag); @@ -52,17 +50,16 @@ my $do_test = sub { SKIP: { is_deeply(\@fds, [ undef ], "EAGAIN $desc"); $s2->blocking(1); - if ($ENV{TEST_ALRM}) { + if ('test ALRM') { my $alrm = 0; local $SIG{ALRM} = sub { $alrm++ }; my $tgt = $$; - my $pid = fork // xbail "fork: $!"; + my $pid = fork; if ($pid == 0) { # need to loop since Perl signals are racy # (the interpreter doesn't self-pipe) - while (tick(0.01)) { - kill 'ALRM', $tgt; - } + CORE::kill('ALRM', $tgt) while (tick(0.05)); + POSIX::_exit(1); } @fds = $recv->($s2, $buf, length($src) + 1); ok($!{EINTR}, "EINTR set by ($desc)"); @@ -77,7 +74,7 @@ my $do_test = sub { SKIP: { is_deeply(\@fds, [], "no FDs on EOF $desc"); is($buf, '', "buffer cleared on EOF ($desc)"); - socketpair($s1, $s2, AF_UNIX, $type, 0) or BAIL_OUT $!; + socketpair($s1, $s2, AF_UNIX, $type, 0); $s1->blocking(0); my $nsent = 0; my $srclen = length($src); @@ -90,7 +87,7 @@ my $do_test = sub { SKIP: { or diag "send failed with: $! (nsent=$nsent)"; ok($nsent > 0, 'sent some bytes'); - socketpair($s1, $s2, AF_UNIX, $type, 0) or BAIL_OUT $!; + socketpair($s1, $s2, AF_UNIX, $type, 0); is($send->($s1, [], $src, $flag), length($src), 'sent w/o FDs'); $buf = 'nope'; @fds = $recv->($s2, $buf, length($src)); @@ -123,7 +120,7 @@ SKIP: { $send = $send_ic; $recv = $recv_ic; $do_test->(SOCK_STREAM, 0, 'Inline::C stream'); - $do_test->($SOCK_SEQPACKET, 0, 'Inline::C seqpacket'); + $do_test->(SOCK_SEQPACKET, 0, 'Inline::C seqpacket'); } SKIP: { @@ -132,13 +129,13 @@ SKIP: { $send = PublicInbox::CmdIPC4->can('send_cmd4'); $recv = PublicInbox::CmdIPC4->can('recv_cmd4'); $do_test->(SOCK_STREAM, 0, 'MsgHdr stream'); - $do_test->($SOCK_SEQPACKET, 0, 'MsgHdr seqpacket'); + $do_test->(SOCK_SEQPACKET, 0, 'MsgHdr seqpacket'); SKIP: { ($send_ic && $recv_ic) or skip 'Inline::C not installed/enabled', 12; $recv = $recv_ic; $do_test->(SOCK_STREAM, 0, 'Inline::C -> MsgHdr stream'); - $do_test->($SOCK_SEQPACKET, 0, 'Inline::C -> MsgHdr seqpacket'); + $do_test->(SOCK_SEQPACKET, 0, 'Inline::C -> MsgHdr seqpacket'); } } @@ -150,7 +147,7 @@ SKIP: { $recv = PublicInbox::Syscall->can('recv_cmd4') or skip 'recv_cmd4 not defined for arch'; $do_test->(SOCK_STREAM, 0, 'PP Linux stream'); - $do_test->($SOCK_SEQPACKET, 0, 'PP Linux seqpacket'); + $do_test->(SOCK_SEQPACKET, 0, 'PP Linux seqpacket'); } done_testing;