summaryrefslogtreecommitdiff
path: root/t/30loop-fork.t
diff options
context:
space:
mode:
Diffstat (limited to 't/30loop-fork.t')
-rw-r--r--t/30loop-fork.t81
1 files changed, 81 insertions, 0 deletions
diff --git a/t/30loop-fork.t b/t/30loop-fork.t
new file mode 100644
index 0000000..927b6c9
--- /dev/null
+++ b/t/30loop-fork.t
@@ -0,0 +1,81 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use IO::Async::Test;
+
+use Test::More;
+
+use POSIX qw( SIGINT );
+
+use IO::Async::Loop;
+use IO::Async::OS;
+
+plan skip_all => "POSIX fork() is not available" unless IO::Async::OS->HAVE_POSIX_FORK;
+
+my $loop = IO::Async::Loop->new_builtin;
+
+testing_loop( $loop );
+
+{
+ my $exitcode;
+ $loop->fork(
+ code => sub { return 5; },
+ on_exit => sub { ( undef, $exitcode ) = @_ },
+ );
+
+ wait_for { defined $exitcode };
+
+ ok( ($exitcode & 0x7f) == 0, 'WIFEXITED($exitcode) after child exit' );
+ is( ($exitcode >> 8), 5, 'WEXITSTATUS($exitcode) after child exit' );
+}
+
+{
+ my $exitcode;
+ $loop->fork(
+ code => sub { die "error"; },
+ on_exit => sub { ( undef, $exitcode ) = @_ },
+ );
+
+ wait_for { defined $exitcode };
+
+ ok( ($exitcode & 0x7f) == 0, 'WIFEXITED($exitcode) after child die' );
+ is( ($exitcode >> 8), 255, 'WEXITSTATUS($exitcode) after child die' );
+}
+
+SKIP: {
+ skip "This OS does not have signals", 1 unless IO::Async::OS->HAVE_SIGNALS;
+
+ local $SIG{INT} = sub { exit( 22 ) };
+
+ my $exitcode;
+ $loop->fork(
+ code => sub { kill SIGINT, $$ },
+ on_exit => sub { ( undef, $exitcode ) = @_ },
+ );
+
+ wait_for { defined $exitcode };
+
+ is( ($exitcode & 0x7f), SIGINT, 'WTERMSIG($exitcode) after child SIGINT' );
+}
+
+SKIP: {
+ skip "This OS does not have signals", 2 unless IO::Async::OS->HAVE_SIGNALS;
+
+ local $SIG{INT} = sub { exit( 22 ) };
+
+ my $exitcode;
+ $loop->fork(
+ code => sub { kill SIGINT, $$ },
+ on_exit => sub { ( undef, $exitcode ) = @_ },
+ keep_signals => 1,
+ );
+
+ wait_for { defined $exitcode };
+
+ ok( ($exitcode & 0x7f) == 0, 'WIFEXITED($exitcode) after child SIGINT with keep_signals' );
+ is( ($exitcode >> 8), 22, 'WEXITSTATUS($exitcode) after child SIGINT with keep_signals' );
+}
+
+done_testing;