client connection should always be nonblocking
[MogileFS-Server.git] / t / mogstored-shutdown.t
blob60892ea63583179d507f3887fc8965fdf885b339
1 # -*-perl-*-
3 use strict;
4 use warnings;
5 use Test::More;
6 use FindBin qw($Bin);
7 use IO::Socket::INET;
9 use MogileFS::Test;
11 unless ((`netstat -nap --inet` || "") =~ m!PID/Program!) {
12     plan skip_all => "netstat output not how expected; skipping test.\n";
13     exit 0;
16 my $TEST_IP = '127.0.1.1';
18 my $rv;
20 use File::Temp;
21 my $dir = File::Temp::tempdir( CLEANUP => 1 );
22 my $ms = eval { create_mogstored($TEST_IP, $dir, "--daemonize") };
23 unless (ok($ms, "started daemonized mogstored")) {
24     # Must wait a moment on startup
25     select undef, undef, undef, 0.5;
26     # Now safe
27     my $exist = eval { exist_pid() };
28     warn "exist = $exist\n";
29     if ($exist) {
30         warn "killing existing test mogstored pid of $exist\n";
31         kill 9, $exist;
32     }
33     die "wasn't able to start up.";
36 # what's its pid?
37 my $real_pid = exist_pid();
39 warn "real_pid = $real_pid\n";
40 #scalar <STDIN>;
42 my $sock = try(5, 0.5, sub { IO::Socket::INET->new(PeerAddr => "$TEST_IP:7501",
43                                                    Timeout  => 3) });
44 ok($sock, "got mgmt connection") or die;
47 print $sock "shutdown\n";
49 my $rin = '';
50 vec($rin,fileno($sock),1) = 1;
51 my $rout;
52 my $n = select($rout=$rin,undef,undef,2);
53 is($n, 1, "mgmt port readable");
55 unless ($n == 1) {
56     kill 9, $real_pid;
57     die "killed pid of $real_pid\n";
60 my $tries = 0;
61 my $alive;
62 while ($tries++ < 10 && ($alive = kill(0, $real_pid))) {
63     select undef, undef, undef, 0.4;
65 ok(!$alive, "gone");
68 # dies when not able to find
69 sub exist_pid {
70     my $netstat = `netstat -nap --inet`;
71     my $ip = $TEST_IP;
72     $ip =~ s/\./\\./g;
73     unless ($netstat =~ m!${ip}:750[10].+LISTEN\s+(\d+)/!) {
74         die "Couldn't find pid of daemonized process.\n";
75     }
76     return $1;
79 sub try {
80     my ($tries, $delay, $code) = @_;
81     my $try = 0;
82     while ($try++ < $tries) {
83         my $ret = $code->();
84         return $ret if $ret;
85         select undef, undef, undef, $delay;
86     }
87     return undef;
90 done_testing();