Developer-Dashboard
view release on metacpan or search on metacpan
t/07-core-units.t view on Meta::CPAN
pid => $$,
name => 'wrong-title',
process_name => 'foreign collector title',
status => 'running',
},
qr/title mismatch/,
],
[
'wrong-status',
{
pid => $$,
name => 'wrong-status',
process_name => 'dashboard collector: wrong-status',
status => 'stopped',
},
qr/status mismatch/,
],
) {
my ( $name, $state, $label ) = @$case;
if ( $label =~ /name mismatch/ ) {
my $statefile = File::Spec->catfile( $paths->collector_dir($name), 'loop.json' );
open my $fh, '>', $statefile or die $!;
print {$fh} json_encode($state);
close $fh;
}
else {
$runner->_write_loop_state( $name, $state );
}
ok(
!$runner->_state_confirms_managed_loop( $name, $$ ),
"_state_confirms_managed_loop rejects persisted loop state with $label",
);
$runner->_cleanup_loop_files($name);
}
}
{
my $pidfile = File::Spec->catfile( $paths->collectors_root, 'stubborn-state.pid' );
open my $stubborn_pid, '>', $pidfile or die $!;
print {$stubborn_pid} "424242\n";
close $stubborn_pid;
$runner->_write_loop_state(
'stubborn-state',
{
pid => 424242,
name => 'stubborn-state',
process_name => 'dashboard collector: stubborn-state',
status => 'running',
}
);
my $error = '';
{
no warnings 'redefine';
local *Developer::Dashboard::CollectorRunner::_reap_child_process = sub { return 0 };
local *Developer::Dashboard::CollectorRunner::_same_pid_namespace = sub { return 1 };
local *Developer::Dashboard::CollectorRunner::_is_managed_loop = sub { return 1 };
local *Developer::Dashboard::CollectorRunner::_pid_is_running = sub { return 1 };
local *Developer::Dashboard::CollectorRunner::sleep = sub { return 0 };
eval { $runner->stop_loop('stubborn-state'); 1 } or $error = $@;
}
like( $error, qr/Collector 'stubborn-state' did not stop after TERM and KILL/, 'stop_loop fails explicitly when a managed collector still appears alive after TERM and KILL' );
ok( -f $pidfile, 'stop_loop keeps the pidfile when a managed collector refuses to stop' );
ok( defined $runner->loop_state('stubborn-state'), 'stop_loop keeps loop state metadata when a managed collector refuses to stop' );
$runner->_cleanup_loop_files('stubborn-state');
}
{
my $pidfile = File::Spec->catfile( $paths->collectors_root, 'worker-shutdown.pid' );
open my $worker_pid, '>', $pidfile or die $!;
print {$worker_pid} "535353\n";
close $worker_pid;
my @terminated;
my $reaped = 0;
my $calls = 0;
{
no warnings 'redefine';
local *Developer::Dashboard::CollectorRunner::_reap_child_process = sub {
my ( undef, $pid ) = @_;
$reaped++;
return 0 if $reaped == 1;
return 1;
};
local *Developer::Dashboard::CollectorRunner::_same_pid_namespace = sub { return 1 };
local *Developer::Dashboard::CollectorRunner::_is_managed_loop = sub { return 1 };
local *Developer::Dashboard::CollectorRunner::_pid_is_running = sub {
$calls++;
return $calls <= 2 ? 1 : 0;
};
local *Developer::Dashboard::CollectorRunner::_state_active_worker_pids = sub { return ( 81, 82 ) };
local *Developer::Dashboard::CollectorRunner::_terminate_loop_workers = sub {
my ( undef, $workers ) = @_;
push @terminated, [ sort { $a <=> $b } keys %{$workers} ];
return 1;
};
local *Developer::Dashboard::CollectorRunner::sleep = sub { return 0 };
is( $runner->stop_loop('worker-shutdown'), '535353', 'stop_loop still returns the managed pid after terminating tracked worker pids' );
}
is_deeply( $terminated[0], [ 81, 82 ], 'stop_loop passes active worker pid hashes into _terminate_loop_workers during shutdown escalation' );
}
{
my $pidfile = File::Spec->catfile( $paths->collectors_root, 'foreign-loop.pid' );
open my $foreign_pid, '>', $pidfile or die $!;
print {$foreign_pid} "525252\n";
close $foreign_pid;
my $stopped_pid;
my @cleanup_names;
{
no warnings 'redefine';
local *Developer::Dashboard::CollectorRunner::_reap_child_process = sub { return 0 };
local *Developer::Dashboard::CollectorRunner::_same_pid_namespace = sub { return 0 };
local *Developer::Dashboard::CollectorRunner::_cleanup_loop_files = sub {
my ( undef, $name ) = @_;
push @cleanup_names, $name;
return 1;
};
$stopped_pid = $runner->stop_loop('foreign-loop');
}
is( $stopped_pid, '525252', 'stop_loop returns the recorded pid when the loop belongs to a different pid namespace' );
is_deeply( \@cleanup_names, ['foreign-loop'], 'stop_loop still delegates cleanup when the loop belongs to a different pid namespace' );
}
( run in 1.461 second using v1.01-cache-2.11-cpan-14f38c9f855 )