X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fspawn.t;fp=t%2Fspawn.t;h=891a370211e28ff17035dc12d07d8b8bbe09021a;hb=b156cb4ef176b41131154a6d7632aed92b143fa0;hp=e5cb09d9e6ab907c6f5c3f238973981672cc2652;hpb=0939882b8a883e3f034bd059cdec4984d36f4ac7;p=public-inbox.git diff --git a/t/spawn.t b/t/spawn.t index e5cb09d9..891a3702 100644 --- a/t/spawn.t +++ b/t/spawn.t @@ -8,20 +8,31 @@ use PublicInbox::Sigfd; use Socket qw(AF_UNIX SOCK_STREAM); SKIP: { - my $recv_fd = PublicInbox::Spawn->can('recv_fd'); - my $send_fd = PublicInbox::Spawn->can('send_fd'); - skip 'Inline::C not enabled', 3 unless $send_fd && $recv_fd; + my $recv_3fds = PublicInbox::Spawn->can('recv_3fds'); + my $send_3fds = PublicInbox::Spawn->can('send_3fds'); + skip 'Inline::C not enabled', 3 unless $send_3fds && $recv_3fds; my ($s1, $s2); socketpair($s1, $s2, AF_UNIX, SOCK_STREAM, 0) or BAIL_OUT $!; pipe(my ($r, $w)) or BAIL_OUT $!; - ok($send_fd->(fileno($s1), fileno($r)), 'pipe sent'); - my $rfd = $recv_fd->(fileno($s2)); - like($rfd, qr/\A\d+\z/, 'got FD'); - open(my $rfh, '<&=', $rfd) or BAIL_OUT $!; - my @old = stat($r); - my @new = stat($rfh); - is("$old[0]\0$old[1]", "$new[0]\0$new[1]", - 'device/inode matches on received FD'); + my @orig = ($r, $w, $s2); + my @fd = map { fileno($_) } @orig; + ok($send_3fds->(fileno($s1), $fd[0], $fd[1], $fd[2]), + 'FDs sent'); + my (@fds) = $recv_3fds->(fileno($s2)); + is(scalar(@fds), 3, 'got 3 fds'); + use Data::Dumper; diag Dumper(\@fds); + is(scalar(grep(/\A\d+\z/, @fds)), 3, 'all valid FDs'); + my $i = 0; + my @cmp = map { + open my $new, $_, shift(@fds) or BAIL_OUT "open $! $i => $_"; + ($new, shift(@orig), $i++); + } (qw(<&= >&= +<&=)); + while (my ($new, $old, $fd) = splice(@cmp, 0, 3)) { + my @new = stat($new); + my @old = stat($old); + is("$old[0]\0$old[1]", "$new[0]\0$new[1]", + "device/inode matches on received FD:$fd"); + } } {