The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Forks::Super ':test', MAX_PROC => 5, ON_BUSY => 'queue';
use Test::More tests => 5;
use strict;
use warnings;

# as of v0.30, the kill and kill_all functions are not very well speced out.
# these tests should pass in the current incarnation, though.

if (${^TAINT}) {
    require Cwd;

    $ENV{PATH} = '';
    ($^X) = $^X =~ /(.*)/;

    my $ipc_dir = Forks::Super::Job::Ipc::_choose_dedicated_dirname();
    if (! eval {$ipc_dir = Cwd::abs_path($ipc_dir)}) {
	$ipc_dir = Cwd::getcwd() . "/" . $ipc_dir;
    }
    ($ipc_dir) = $ipc_dir =~ /(.*)/;
    Forks::Super::Job::Ipc::set_ipc_dir($ipc_dir);
}

our $INT = $^O eq 'cygwin' ? 'TERM' : 'INT';

SKIP: {
    if ($^O eq "MSWin32" && !Forks::Super::Config::CONFIG("Win32::API")) {
	skip "kill is unsafe on MSWin32 without Win32::API", 5;
    }


    # kill on <xxx>deferred jobs</xxx>

    my $pid1 = fork { sub => sub { sleep 5 } };
    my $pid2 = fork { sub => sub { sleep 5 } };
    my $pid3 = fork { sub => sub { sleep 5 }, depend_on => $pid1 };
    my $j1 = Forks::Super::Job::get($pid1);
    sleep 1;

    #my $zero = Forks::Super::kill('ZERO', $pid1, $pid2, $pid3);
    my $zero = 4*!!Forks::Super::kill('ZERO',$pid1)
	+ 2*!!Forks::Super::kill('ZERO',$pid2)
	+ !!Forks::Super::kill('ZERO',$pid3);
    ok($zero==7, "SIGZERO successfully sent to 2 active and 1 deferred proc")
	or diag("result was $zero, expected 4(a)+2(a)+1(d)");

    # failure point on MSWin32 - terminates the script
    if ($^O eq 'MSWin32') {
	diag("Sending SIG$INT to $pid1");
    }
    my $y = Forks::Super::kill($INT, $pid1);
    sleep 2;
    Forks::Super::Queue::run_queue();
    ok($y == 1, "sent SUG$INT to $y==1 proc active job");

    $zero = Forks::Super::kill('ZERO', $pid1, $pid2, $pid3);
    ok($zero==2, "SIGZERO successfully sent to 2 processes")
	or diag("sent to $zero procs, expected 2");

    # (fails under forked_harness, but passes as standalone?)
    ok($j1->is_complete, 
       "killed active job is complete " . $j1->{state}); ### 7 ###
    waitall;

    $y = Forks::Super::kill($INT, $pid1, $pid2, $pid3);
    ok($y == 0, "kill to complete jobs returns 0");

}