1use strict;
2use warnings;
3
4use Test::More;
5use Test::SharedFork;
6
7use File::Temp;
8use POSIX ":sys_wait_h";
9
10use Search::Elasticsearch;
11use Search::Elasticsearch::TestServer;
12
13my $pids = [];
14
15SKIP: {
16    skip 'ES_HOME not set', 8 unless $ENV{ES_HOME};
17
18    my $tempdir = File::Temp->newdir( 'testserver-XXXXX', DIR => '/tmp' );
19    my $server = Search::Elasticsearch::TestServer->new();
20
21    my $nodes = $server->start();
22
23    ok( $nodes, "server->start returned nodes" )
24        or diag explain { server => $server };
25    ok( defined( $server->pids ), "server->pids defined" );
26    cmp_ok( scalar @{ $server->pids }, '>', 0, "more than 0 pids" );
27    $pids = \@{ $server->pids };
28
29    verify_pids_alive( $pids, 'ES pids are alive' );
30
31    {
32        my $pid = fork;
33        die "cannot fork" unless defined $pid;
34
35        if ( $pid == 0 ) {
36            verify_pids_alive( $pids, 'ES pids are alive in child' );
37            exit 0;
38        }
39        else {
40            verify_pids_alive( $pids, 'ES pids are alive in parent' );
41            waitpid( $pid, 0 );
42            sleep 5;
43            verify_pids_alive( $pids,
44                'ES pids are alive in parent after child dies' );
45        }
46    }
47
48    $server->shutdown;
49
50    note 'sleep to give ES time to die';
51    sleep 5;
52
53    verify_pids_dead( $pids, 'ES pids are dead after shutdown' );
54
55}
56done_testing;
57
58#important to waitpid or kill0 will return true for zombies.
59sub verify_pids_alive {
60    my ( $pids, $msg ) = @_;
61    $msg = '' if !defined $msg;
62    for my $pid (@$pids) {
63        waitpid( $pid, WNOHANG );
64        ok( kill( 0, $pid ), "$msg: pid $pid is alive" );
65    }
66}
67
68sub verify_pids_dead {
69    my ( $pids, $msg ) = @_;
70    $msg = '' if !defined $msg;
71    for my $pid (@$pids) {
72        waitpid( $pid, WNOHANG );
73        ok( !kill( 0, $pid ), "$msg: pid $pid is dead" );
74    }
75}
76