Acme-Parataxis

 view release on metacpan or  search on metacpan

t/003_signals.t  view on Meta::CPAN

use v5.40;
use Test2::V1 -ipP;
use blib;
use Acme::Parataxis;
use experimental 'class';
$|++;
#
skip_all 'Signals on Windows? Ha!', 2 if $^O eq 'MSWin32';
diag 'Testing signal handling during fiber execution...';
subtest 'Signal handled inside coroutine' => sub {
    diag 'Case 1: Sending signal while inside a fiber...';
    my $signaled = 0;
    local $SIG{INT} = sub {
        diag 'Parent SIGINT handler reached';
        $signaled++;
    };
    my $fiber = Acme::Parataxis->new(
        code => sub {
            diag "Inside fiber: About to kill 'INT' self ($$)...";
            kill 'INT', $$;
            diag 'Inside fiber: Signal sent. Continuing...';
            return 'Done';
        }
    );
    diag 'Calling fiber...';
    $fiber->call();
    is $signaled, 1, 'Signal was caught and handled by Perl';
    diag 'Signal count: ' . $signaled;
};
subtest 'Signal during yield/resume' => sub {
    diag 'Case 2: Sending signal while fiber is suspended...';
    my $signaled = 0;
    local $SIG{INT} = sub {
        diag 'Parent SIGINT handler reached during suspension';
        $signaled++;
    };
    my $fiber = Acme::Parataxis->new(
        code => sub {
            diag 'Inside fiber: Yielding READY...';
            Acme::Parataxis->yield('READY');
            diag 'Inside fiber: Resumed after signal delivery.';
            return 'Finished';
        }
    );
    diag 'Calling fiber (First step)...';
    my $y = $fiber->call();
    is $y, 'READY', 'Fiber suspended at yield';
    diag 'Sending signal to parent process...';
    kill 'INT', $$;
    diag 'Signal count before resume: ' . $signaled;
    diag 'Resuming fiber...';
    $fiber->call();
    is $signaled, 1, 'Signal handled between yield and resume';
    diag "Signal count final: $signaled";
};
done_testing();



( run in 1.382 second using v1.01-cache-2.11-cpan-995e09ba956 )