Feersum
view release on metacpan or search on metacpan
xt/runner-04-combos.t view on Meta::CPAN
for (1..3) {
my $b = http_get($port1);
$first_pid //= extract_pid($b);
}
$n_tests += 4; # 3 simple_client + 1 ok
ok $first_pid, "hot_restart+max_reqs: got initial pid ($first_pid)";
# Wait for generation to recycle via max_requests_per_worker
# The master should detect the generation died and fork a replacement
select undef, undef, undef, 4.0 * TIMEOUT_MULT;
my $new_body = http_get($port1);
$n_tests += 2; # 1 simple_client + 1 ok/isnt
my $new_pid = extract_pid($new_body);
ok $new_pid && $new_pid ne $first_pid,
"hot_restart+max_reqs: generation recycled (new pid $new_pid)";
kill 'QUIT', $m1; waitpid $m1, 0;
$n_tests++;
pass "hot_restart+max_reqs clean shutdown";
###############################################################################
# Test 2: preload_app=0 + access_log
###############################################################################
my $app2 = "$dir/combo2.feersum";
open my $fh2, '>', $app2 or die;
print $fh2 'sub { $_[0]->send_response(200,["Content-Type"=>"text/plain"],\"pid=$$\n") }';
close $fh2;
my $log_file = "$dir/access.log";
my (undef, $port2) = get_listen_socket();
my $m2 = fork // die "fork: $!";
if (!$m2) {
require Feersum::Runner;
eval {
Feersum::Runner->new(
listen => ["localhost:$port2"], app_file => $app2,
pre_fork => 1, preload_app => 0,
access_log => sub {
my ($method, $uri, $elapsed) = @_;
open my $fh, '>>', $log_file;
print $fh "$method $uri\n";
close $fh;
},
quiet => 1,
)->run();
};
POSIX::_exit(0);
}
select undef, undef, undef, 1.5 * TIMEOUT_MULT;
http_get($port2);
$n_tests++; # simple_client
select undef, undef, undef, 0.5 * TIMEOUT_MULT;
$n_tests += 2;
ok -f $log_file, "preload_app=0 + access_log: log file created";
my $log = do { local (@ARGV, $/) = ($log_file); <> } // '';
like $log, qr/^GET \//, "preload_app=0 + access_log: entry logged";
kill 'QUIT', $m2; waitpid $m2, 0;
$n_tests++;
pass "preload_app=0 + access_log clean shutdown";
###############################################################################
# Test 3: hot_restart + pre_fork + reuseport (if available)
###############################################################################
SKIP: {
skip "hot_restart+reuseport is timing-sensitive; run individually with prove -bv", 5
unless $ENV{FEERSUM_TEST_REUSEPORT};
my $app3 = "$dir/combo3.feersum";
open my $fh3, '>', $app3 or die;
print $fh3 'sub { $_[0]->send_response(200,["Content-Type"=>"text/plain"],\"pid=$$\n") }';
close $fh3;
my ($sock3, $port3) = get_listen_socket();
close $sock3; # must release for reuseport workers
my $m3 = fork // die "fork: $!";
if (!$m3) {
require Feersum::Runner;
eval {
Feersum::Runner->new(
listen => ["localhost:$port3"], app_file => $app3,
hot_restart => 1, pre_fork => 2, reuseport => 1,
quiet => 1,
)->run();
};
POSIX::_exit(0);
}
select undef, undef, undef, 4.0 * TIMEOUT_MULT;
my $body3 = http_get($port3);
$n_tests += 2; # simple_client + ok
ok $body3, "hot_restart+prefork+reuseport responds";
kill 'HUP', $m3;
select undef, undef, undef, 5.0 * TIMEOUT_MULT;
my $body3b = http_get($port3);
$n_tests += 2; # simple_client + ok
ok $body3b, "hot_restart+prefork+reuseport responds after HUP";
kill 'QUIT', $m3; waitpid $m3, 0;
$n_tests++;
pass "hot_restart+prefork+reuseport clean shutdown";
}
done_testing;
( run in 1.016 second using v1.01-cache-2.11-cpan-194103478d8 )