diff options
-rw-r--r-- | Bugzilla/DaemonControl.pm | 3 | ||||
-rw-r--r-- | t/daemon-control-catch-signal.t | 85 |
2 files changed, 88 insertions, 0 deletions
diff --git a/Bugzilla/DaemonControl.pm b/Bugzilla/DaemonControl.pm index 1de8350c1..05aaf8130 100644 --- a/Bugzilla/DaemonControl.pm +++ b/Bugzilla/DaemonControl.pm @@ -49,7 +49,10 @@ sub catch_signal { my $signal = IO::Async::Signal->new( name => $name, on_receipt => sub { + my ($self) = @_; + my $l = IO::Async::Loop->new; $signal_f->done(@done); + $l->remove($self); } ); $signal_f->on_cancel( diff --git a/t/daemon-control-catch-signal.t b/t/daemon-control-catch-signal.t new file mode 100644 index 000000000..c42e26fc1 --- /dev/null +++ b/t/daemon-control-catch-signal.t @@ -0,0 +1,85 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +use 5.10.1; +use strict; +use warnings; +use lib qw( . lib local/lib/perl5 ); +use IO::Async::Process; +use IO::Async::Loop; +use IO::Async::Timer::Countdown; +use Test::More; + +use ok 'Bugzilla::DaemonControl', qw(catch_signal); + +my $loop = IO::Async::Loop->new; +my $signal_test_out = ''; +my $signal_test = IO::Async::Process->new( + code => sub { + my $f = catch_signal("TERM", 42); + say $f->isa('Future') ? "I have a Future" : ''; + my $val = $f->get; + say "Got $val from TERM"; + sleep 30; + say "I Failed My Mission"; + }, + stdout => { into => \$signal_test_out }, + on_finish => sub { + $loop->stop; + }, + on_exception => sub { + diag "@_"; + fail("got exception"); + $loop->stop; + } +); +diag "starting signal test"; +$loop->add($signal_test); +ok( $signal_test->is_running, "signal test is running"); + +my $send_first_term = IO::Async::Timer::Countdown->new( + delay => 5, + on_expire => sub { + diag "sending first TERM"; + ok($signal_test->is_running, "signal test is still running"); + $signal_test->kill('TERM'); + } +); + +$send_first_term->start; +$loop->add($send_first_term); + +my $send_second_term = IO::Async::Timer::Countdown->new( + delay => 10, + on_expire => sub { + diag "sending second TERM"; + ok($signal_test->is_running, "signal test is still running"); + $signal_test->kill('TERM'); + } +); +$send_second_term->start; + +$loop->add($send_second_term); + +my $timeout = IO::Async::Timer::Countdown->new( + delay => 60, + on_expire => sub { + fail("test ran for too long"); + $loop->stop; + }, +); +$timeout->start; + +$loop->add($timeout); + +$loop->run; + +diag $signal_test_out; +like($signal_test_out, qr/I have a Future/, "catch_signal() returned a future"); +like($signal_test_out, qr/Got 42 from TERM/, "catch_signal() returned the right value when done"); +unlike($signal_test_out, qr/I Failed My Mission/, "catch_signal() only happened once"); + +done_testing();
\ No newline at end of file |