Daemon-Device
view release on metacpan or search on metacpan
use Test2::V0;
use Daemon::Device;
my $my_process = $$;
my $my_log = 'daemon_device_test_' . $my_process . '.log';
my @module_params = (
daemon => {
name => 'daemon_device_test',
pid_file => 'daemon_device_test_' . $my_process . '.pid',
stderr_file => $my_log,
stdout_file => $my_log,
quiet => 1,
},
spawn => 3,
parent => sub {
my ($device) = @_;
warn "PARENT $$ start\n";
sleep 1 while (1);
},
child => sub {
my ($device) = @_;
warn "CHILD $$ start\n";
while (1) {
exit unless ( $device->parent_alive );
sleep 1;
}
},
on_startup => sub { warn "EVENT $$ on_startup\n" },
on_shutdown => sub { warn "EVENT $$ on_shutdown\n" },
on_spawn => sub { warn "EVENT $$ on_spawn\n" },
on_parent_hup => sub { warn "EVENT $$ on_parent_hup\n" },
on_child_hup => sub { warn "EVENT $$ on_child_hup\n" },
on_parent_death => sub { warn "EVENT $$ on_parent_death\n" },
on_child_death => sub { warn "EVENT $$ on_child_death\n" },
on_replace_child => sub { warn "EVENT $$ on_replace_child\n" },
);
my $obj;
ok( $obj = Daemon::Device->new(@module_params), 'Daemon::Device->new()' );
is( ref $obj, 'Daemon::Device', 'ref $object' );
$obj->{_daemon}->do_start;
sub get_log_file {
open( my $log_file, '<', $my_log );
my @log_file = map { chomp; $_ } <$log_file>;
close($log_file);
return \@log_file;
}
sub time_test {
my ( $code, $limit, $label ) = @_;
my ( $count, $result );
while (1) {
$result = $code->();
$count++;
last if ( $result or $count >= $limit );
sleep 1;
}
ok( $result, $label );
note("Previous test took $count wait iterations to complete");
}
time_test( sub {
my $log_file = &get_log_file;
return 1 if (
scalar( grep { $_ =~ /PARENT \d+ start/ } @$log_file ) and
scalar( grep { $_ =~ /CHILD \d+ start/ } @$log_file ) == 3
);
}, 120, 'Parent and 3 (and no more) children started' );
my @pids = map { /(\d+)/; $1 } grep { $_ =~ /CHILD \d+ start/ } @{&get_log_file};
kill( 'TERM', shift @pids );
kill( 'KILL', pop @pids );
time_test( sub {
my $log_file = &get_log_file;
return 1 if ( scalar( grep { $_ =~ /on_replace_child/ } @$log_file ) == 2 );
}, 120, '2 children were appropriately replaced' );
( run in 1.613 second using v1.01-cache-2.11-cpan-39bf76dae61 )