]> Sergey Matveev's repositories - public-inbox.git/blobdiff - t/spawn.t
www_coderepo: tree: quiet and 404 on non-existent refs
[public-inbox.git] / t / spawn.t
index 6168c1f6171c83919efefa91d7194a5a8b069c1b..c22cfcfcef1234a62f84ceb213d5fcf547d47020 100644 (file)
--- a/t/spawn.t
+++ b/t/spawn.t
@@ -24,7 +24,18 @@ SKIP: {
        is(waitpid($pid, 0), $pid, 'waitpid succeeds on spawned process');
        is($?, 0, 'true exited successfully');
        pipe(my ($r, $w)) or BAIL_OUT;
-       $pid = eval { spawn(['true'], undef, { pgid => 1, 2 => $w }) };
+
+       # Find invalid PID to try to join its process group.
+       my $wrong_pgid = 1;
+       for (my $i=0x7fffffff; $i >= 2; $i--) {
+               if (kill(0, $i) == 0) {
+                       $wrong_pgid = $i;
+                       last;
+               }
+       }
+
+       # Test spawn behavior when it can't join the requested process group.
+       $pid = eval { spawn(['true'], undef, { pgid => $wrong_pgid, 2 => $w }) };
        close $w;
        my $err = do { local $/; <$r> };
        # diag "$err ($@)";
@@ -129,13 +140,13 @@ EOF
 
 { # ->CLOSE vs ->DESTROY waitpid caller distinction
        my @c;
-       my $fh = popen_rd(['true'], undef, { cb => sub { @c = caller } });
+       my $fh = popen_rd(['true'], undef, { cb_arg => [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 } });
+       $fh = popen_rd(['true'], undef, { cb_arg => [sub { @c = caller }] });
        undef $fh; # ->DESTROY
        ok(scalar(@c), 'callback fired by ->DESTROY');
        ok(grep(!m[/PublicInbox/ProcessPipe\.pm\z], @c),
@@ -145,8 +156,9 @@ EOF
 { # 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 @arg;
+       my $cb = [ sub { @arg = @_; warn "x=$$\n" }, 'hi' ];
+       my $fh = popen_rd(['cat'], undef, { 0 => $r, cb_arg => $cb });
        my $pp = tied *$fh;
        my $pid = fork // BAIL_OUT $!;
        local $SIG{__WARN__} = sub { _exit(1) };
@@ -162,6 +174,9 @@ EOF
        close $w;
        close $fh;
        is($?, 0, 'cat exited');
+       is(scalar(@arg), 2, 'callback got args');
+       is($arg[1], 'hi', 'passed arg');
+       like($arg[0], qr/\A\d+\z/, 'PID');
        is_deeply(\@w, [ "x=$$\n" ], 'callback fired from owner');
 }