]> Sergey Matveev's repositories - public-inbox.git/blobdiff - t/spawn.t
cmd_ipc: send FDs with buffer payload
[public-inbox.git] / t / spawn.t
index 552bba3302e8c969610b9759e6addaa07068dae1..0eed79bbbb5802343717a4590ab2e79406c9ccd6 100644 (file)
--- a/t/spawn.t
+++ b/t/spawn.t
@@ -32,7 +32,7 @@ elsif ($pid > 0) {
        select(undef, undef, undef, 0.01) while 1;
 }
 EOF
-       my $oldset = PublicInbox::Sigfd::block_signals();
+       my $oldset = PublicInbox::DS::block_signals();
        my $rd = popen_rd([$^X, '-e', $script]);
        diag 'waiting for child to reap grandchild...';
        chomp(my $line = readline($rd));
@@ -41,7 +41,7 @@ EOF
        ok(kill('CHLD', $pid), 'sent SIGCHLD to child');
        is(readline($rd), "HI\n", '$SIG{CHLD} works in child');
        ok(close $rd, 'popen_rd close works');
-       PublicInbox::Sigfd::sig_setmask($oldset);
+       PublicInbox::DS::sig_setmask($oldset);
 }
 
 {
@@ -98,6 +98,44 @@ EOF
        isnt($?, 0, '$? set properly: '.$?);
 }
 
+{ # ->CLOSE vs ->DESTROY waitpid caller distinction
+       my @c;
+       my $fh = popen_rd(['true'], undef, { cb => sub { @c = caller } });
+       ok(close($fh), '->CLOSE fired and successful');
+       ok(scalar(@c), 'callback fired by ->CLOSE');
+       ok(grep(!m[/PublicInbox/DS\.pm\z], @c), 'callback not invoked by DS');
+
+       @c = ();
+       $fh = popen_rd(['true'], undef, { cb => sub { @c = caller } });
+       undef $fh; # ->DESTROY
+       ok(scalar(@c), 'callback fired by ->DESTROY');
+       ok(grep(!m[/PublicInbox/ProcessPipe\.pm\z], @c),
+               'callback not invoked by ProcessPipe');
+}
+
+{ # children don't wait on siblings
+       use POSIX qw(_exit);
+       pipe(my ($r, $w)) or BAIL_OUT $!;
+       my $cb = sub { warn "x=$$\n" };
+       my $fh = popen_rd(['cat'], undef, { 0 => $r, cb => $cb });
+       my $pp = tied *$fh;
+       my $pid = fork // BAIL_OUT $!;
+       local $SIG{__WARN__} = sub { _exit(1) };
+       if ($pid == 0) {
+               local $SIG{__DIE__} = sub { _exit(2) };
+               undef $fh;
+               _exit(0);
+       }
+       waitpid($pid, 0);
+       is($?, 0, 'forked process exited');
+       my @w;
+       local $SIG{__WARN__} = sub { push @w, @_ };
+       close $w;
+       close $fh;
+       is($?, 0, 'cat exited');
+       is_deeply(\@w, [ "x=$$\n" ], 'callback fired from owner');
+}
+
 SKIP: {
        eval {
                require BSD::Resource;