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 )