@@ -97,5 +97,82 @@ subtest collect_status => sub {
9797 is(Mojo::IOLoop::ReadWriteProcess::Session-> singleton-> all-> size, 1);
9898};
9999
100+ subtest collect_from_signal_handler => sub {
101+ my $p = process(execute => ' /usr/bin/true' );
102+ my $collected = 0;
103+ my $orphan = 0;
104+ my $sig_chld = 0;
105+ $p -> session-> reset ();
106+ $p -> session-> collect_status(1); # needed, because previous test set it to 0
107+ $p -> session-> on(SIG_CHLD => sub { $sig_chld ++});
108+ $p -> session-> on(collected => sub { $collected ++ });
109+ $p -> session-> on(collected_orphan => sub { $orphan ++ });
110+ $p -> start();
111+
112+ attempt {
113+ attempts => 10,
114+ condition => sub { $sig_chld > 0 && $collected > 0},
115+ };
116+
117+ is($sig_chld , 1, " Event for SIG_CHILD was emitted" );
118+ is($collected , 1, " Event collected apear without doing active wait()" );
119+ is($orphan , 0, " No orphans where collected" );
120+
121+ $p -> wait_stop();
122+ is($collected , 1, " No more collect events emitted" );
123+ is($orphan , 0, " No more orphans events emitted" );
124+ is($p -> exit_status, 0 , ' /usr/bin/true exited with 0' );
125+
126+ exec (' /usr/bin/true' ) if (fork () == 0);
127+
128+ attempt {
129+ attempts => 10,
130+ condition => sub { $sig_chld > 1 && $orphan > 0},
131+ };
132+
133+ is($sig_chld , 2, " Event for SIG_CHILD was emitted" );
134+ is($collected , 1, " No more collect events emitted (2)" );
135+ is($orphan , 1, " Collect one orphan" );
136+ };
137+
138+ subtest emit_from_sigchld_off => sub {
139+ my $p = process(execute => ' /usr/bin/true' );
140+ my $collected = 0;
141+ my $orphan = 0;
142+ my $sig_chld = 0;
143+ $p -> session-> reset ();
144+ $p -> session-> collect_status(1);
145+ $p -> session-> emit_from_sigchld(0);
146+ $p -> session-> on(SIG_CHLD => sub { $sig_chld ++});
147+ $p -> session-> on(collected => sub { $collected ++ });
148+ $p -> session-> on(collected_orphan => sub { $orphan ++ });
149+ $p -> start();
150+
151+ attempt {
152+ attempts => 10,
153+ condition => sub { $sig_chld > 0},
154+ };
155+ is($sig_chld , 1, " Event for SIG_CHILD was emitted" );
156+ is($collected , 0, " Event collected didn't appear from sighandler" );
157+ is($orphan , 0, " No orphans where collected" );
158+
159+ $p -> wait_stop();
160+ is($collected , 1, " No more collect events emitted" );
161+ is($orphan , 0, " No more orphans events emitted" );
162+ is($p -> exit_status, 0 , ' /usr/bin/true exited with 0' );
163+
164+ exec (' /usr/bin/true' ) if (fork () == 0);
165+ attempt {
166+ attempts => 10,
167+ condition => sub { $sig_chld > 1},
168+ };
169+ is($collected , 1, " No more collect events emitted (2)" );
170+ is($orphan , 0, " collect_orphan didn't appear from sighandler" );
171+
172+ $p -> session-> consume_collected_info();
173+ is($sig_chld , 2, " Event for SIG_CHILD was emitted" );
174+ is($collected , 1, " No more collect events emitted (3)" );
175+ is($orphan , 1, " Collect one orphan" );
176+ };
100177
101178done_testing();
0 commit comments