X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fspawn.t;h=aba1a26c7ce66e6571511196d5bcb5b743fe78ee;hb=4821798351defce82c102e46d6f5f84f0cdc0e34;hp=0f756462d02999831eff5307a87a8312acc419ca;hpb=e748f75979046724ead380bd00eadc677bdc07e9;p=public-inbox.git diff --git a/t/spawn.t b/t/spawn.t index 0f756462..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; @@ -81,15 +81,23 @@ use PublicInbox::Spawn qw(which spawn popen_rd); isnt($?, 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(9, $pid), 1, 'child process killed early'); - is(waitpid($pid, 0), $pid, 'child process reapable'); - 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();