X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fspawn.t;h=aba1a26c7ce66e6571511196d5bcb5b743fe78ee;hb=4821798351defce82c102e46d6f5f84f0cdc0e34;hp=d52b646562c45d38704869e2022cc129c931db17;hpb=617f35dacbd4e5972bf2d82411b45009bbc79a42;p=public-inbox.git diff --git a/t/spawn.t b/t/spawn.t index d52b6465..aba1a26c 100644 --- a/t/spawn.t +++ b/t/spawn.t @@ -1,4 +1,4 @@ -# Copyright (C) 2015 all contributors +# Copyright (C) 2015-2019 all contributors # License: AGPL-3.0+ use strict; use warnings; @@ -70,16 +70,34 @@ use PublicInbox::Spawn qw(which spawn popen_rd); is(sysread($fh, $buf, 6), 6, 'sysread got 6 bytes'); is($buf, "hello\n", 'tied gets works'); is(sysread($fh, $buf, 6), 0, 'sysread got EOF'); + $? = 1; + close $fh; + is($?, 0, '$? set properly'); } { - my ($fh, $pid) = popen_rd([qw(sleep 60)], undef, { Blocking => 0 }); - ok(defined $pid && $pid > 0, 'returned pid when array requested'); - is(kill(0, $pid), 1, 'child process is running'); - ok(!defined(sysread($fh, my $buf, 1)) && $!{EAGAIN}, - 'sysread returned quickly with EAGAIN'); - is(kill(15, $pid), 1, 'child process killed early'); - is(waitpid($pid, 0), $pid, 'child process reapable'); + my $fh = popen_rd([qw(false)]); + close $fh; + isnt($?, 0, '$? set properly: '.$?); +} + +SKIP: { + eval { + require BSD::Resource; + defined(BSD::Resource::RLIMIT_CPU()) + } or skip 'BSD::Resource::RLIMIT_CPU missing', 3; + my ($r, $w); + pipe($r, $w) or die "pipe: $!"; + my $cmd = ['sh', '-c', 'while true; do :; done']; + my $fd = fileno($w); + my $opt = { RLIMIT_CPU => [ 1, 1 ], RLIMIT_CORE => [ 0, 0 ], 1 => $fd }; + my $pid = spawn($cmd, undef, $opt); + close $w or die "close(w): $!"; + my $rset = ''; + vec($rset, fileno($r), 1) = 1; + ok(select($rset, undef, undef, 5), 'child died before timeout'); + is(waitpid($pid, 0), $pid, 'XCPU child process reaped'); + isnt($?, 0, 'non-zero exit status'); } done_testing();