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