about summary refs log tree commit homepage
path: root/t
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-01-03 11:24:50 +0000
committerEric Wong <e@80x24.org>2021-01-03 18:24:08 +0000
commitb156cb4ef176b41131154a6d7632aed92b143fa0 (patch)
tree46b13794fbc87a2b0133a1f450328f0b35e0539d /t
parent0939882b8a883e3f034bd059cdec4984d36f4ac7 (diff)
downloadpublic-inbox-b156cb4ef176b41131154a6d7632aed92b143fa0.tar.gz
We'll always be transferring stdin, stdout, and stderr together
for lei.  Perhaps I lack imagination or foresight, but I can't
think of a reason to send more or less FDs.
Diffstat (limited to 't')
-rw-r--r--t/lei.t2
-rw-r--r--t/spawn.t33
2 files changed, 23 insertions, 12 deletions
diff --git a/t/lei.t b/t/lei.t
index 662fc545..42c0eb8f 100644
--- a/t/lei.t
+++ b/t/lei.t
@@ -195,7 +195,7 @@ SKIP: { # real socket
         require_mods(qw(Cwd), my $nr = 46);
         require PublicInbox::Spawn;
         skip "Inline::C not installed/configured or IO::FDPass missing", $nr
-                unless PublicInbox::Spawn->can('send_fd');
+                unless PublicInbox::Spawn->can('send_3fds');
 
         local $ENV{XDG_RUNTIME_DIR} = "$home/xdg_run";
         my $sock = "$ENV{XDG_RUNTIME_DIR}/lei/sock";
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");
+        }
 }
 
 {