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