]> Sergey Matveev's repositories - public-inbox.git/blobdiff - t/spawn.t
send and receive all 3 FDs at once
[public-inbox.git] / t / spawn.t
index e5cb09d9e6ab907c6f5c3f238973981672cc2652..891a370211e28ff17035dc12d07d8b8bbe09021a 100644 (file)
--- 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");
+       }
 }
 
 {