App-watcher
view release on metacpan or search on metacpan
xt/003_signal.t view on Meta::CPAN
use Time::HiRes qw(time);
# This test can't run under the prove.
# I don't know why it doesn't works.
plan skip_all => 'There is HARNESS_ACTIVE tag' if $ENV{HARNESS_ACTIVE};
my $tmpdir = tempdir(CLEANUP => 0);
my $tmpdir2 = tempdir(CLEANUP => 0);
$ENV{TMPDIR2} = $tmpdir2;
my @cmd = ($^X, 'script/watcher', "--dir=$tmpdir", '--send_only', '--signal=HUP', '--', $^X, '-e', q[
warn "GO";
open my $fh, '>>', "$ENV{TMPDIR2}/x.txt" or die $!;
select $fh; $|++; select STDOUT;
print {$fh} "XXX $$\n";
$SIG{HUP} = sub { print {$fh} "HUP $$\n" };
$SIG{TERM} = sub { die "TERM" };
warn "Going to sleep $$";
for (1..100) {
sleep(100);
warn "hmm.. $$";
}
sleep(100);
warn "WROTE $$";
]);
note "@cmd";
my $pid = fork();
die "Cannot fork: $!" unless defined $pid;
if ($pid==0) { # child
exec @cmd;
die "Cannot exec: $!";
} else { # parent
sleep 1;
like(read_file(), qr{^XXX \d+\n$}, 'first');
update();
sleep 2;
like(read_file(), qr{^XXX \d+\nHUP \d+\n$}, 'HUP');
update();
sleep 2;
like(read_file(), qr{^XXX \d+\nHUP \d+\nHUP \d+\n$}, 'HUP');
kill 'TERM' => $pid;
waitpid($pid, 0);
ok(1, 'done');
}
done_testing;
sub read_file {
my $fname = "$tmpdir2/x.txt";
open my $fh, '<', "$tmpdir2/x.txt" or die "$fname: $!";
my $src = do { local $/; <$fh> };
return $src;
}
sub update {
my $fname = "$tmpdir/@{[ rand ]}.txt";
diag "updating $fname";
open my $ofh, '>', $fname or die "$fname: $!";
print $ofh "YAY " . rand();
close $ofh;
}
( run in 1.224 second using v1.01-cache-2.11-cpan-98e64b0badf )