diff --git a/t/lib/Daemon.t b/t/lib/Daemon.t index 810e03e3..80737a27 100644 --- a/t/lib/Daemon.t +++ b/t/lib/Daemon.t @@ -9,8 +9,9 @@ BEGIN { use strict; use warnings FATAL => 'all'; use English qw(-no_match_vars); -use Test::More tests => 21; +use Test::More tests => 22; use Time::HiRes qw(sleep); +use File::Temp qw( tempfile ); use Daemon; use OptionParser; use PerconaTest; @@ -23,7 +24,8 @@ my $d = new Daemon(o=>$o); my $pid_file = '/tmp/daemonizes.pl.pid'; my $log_file = '/tmp/daemonizes.output'; sub rm_tmp_files() { - `rm $pid_file $log_file >/dev/null 2>&1` + 1 while unlink $pid_file; + 1 while unlink $log_file; } # ############################################################################ @@ -32,21 +34,22 @@ sub rm_tmp_files() { rm_tmp_files(); my $cmd = "$trunk/t/lib/samples/daemonizes.pl"; -my $ret_val = system("$cmd 2 --daemonize --pid $pid_file >/dev/null 2>&1"); +my $ret_val = system("$cmd 5 --daemonize --pid $pid_file >/dev/null 2>&1"); die 'Cannot test Daemon.pm because t/daemonizes.pl is not working' unless $ret_val == 0; PerconaTest::wait_for_files($pid_file); -my $output = `ps wx | grep '$cmd 2' | grep -v grep`; +my $output = `ps wx | grep '$cmd 5' | grep -v grep`; like($output, qr/$cmd/, 'Daemonizes'); ok(-f $pid_file, 'Creates PID file'); my ($pid) = $output =~ /\s*(\d+)\s+/; -$output = `cat $pid_file`; +$output = slurp_file($pid_file); is($output, $pid, 'PID file has correct PID'); -sleep 2; +# Wait until the process goes away +PerconaTest::wait_until(sub { !kill(0, $pid) }); ok(! -f $pid_file, 'Removes PID file upon exit'); # ############################################################################ @@ -58,7 +61,7 @@ system("$cmd 0 --daemonize --log $log_file"); PerconaTest::wait_for_files($log_file); ok(-f $log_file, 'Log file exists'); -$output = `cat $log_file`; +$output = slurp_file($log_file); like($output, qr/STDOUT\nSTDERR\n/, 'STDOUT and STDERR went to log file'); my $log_size = -s $log_file; @@ -67,7 +70,7 @@ PTDEVDEBUG && PerconaTest::_d('log size', $log_size); # Check that the log file is appended to. system("$cmd 0 --daemonize --log $log_file"); PerconaTest::wait_until(sub { -s $log_file > $log_size }); -$output = `cat $log_file`; +$output = slurp_file($log_file); like( $output, qr/STDOUT\nSTDERR\nSTDOUT\nSTDERR\n/, @@ -106,9 +109,9 @@ SKIP: { skip 'No /proc', 1 unless -d '/proc'; skip 'No fd in /proc', 1 unless -l "/proc/$PID/0" || -l "/proc/$PID/fd/0"; - system("$cmd 1 --daemonize --pid $pid_file --log $log_file"); + system("$cmd 5 --daemonize --pid $pid_file --log $log_file"); PerconaTest::wait_for_files($pid_file); - chomp($pid = `cat $pid_file`); + chomp($pid = slurp_file($pid_file)); my $proc_fd_0 = -l "/proc/$pid/0" ? "/proc/$pid/0" : -l "/proc/$pid/fd/0" ? "/proc/$pid/fd/0" : die "Cannot find fd 0 symlink in /proc/$pid"; @@ -121,22 +124,25 @@ SKIP: { 'Reopens STDIN to /dev/null' ); -# sleep 1; -# system("echo foo | $cmd 1 --daemonize --pid $pid_file --log $log_file"); -# PerconaTest::wait_for_files($pid_file, $log_file); -# chomp($pid = `cat $pid_file`); -# $proc_fd_0 = -l "/proc/$pid/0" ? "/proc/$pid/0" -# : -l "/proc/$pid/fd/0" ? "/proc/$pid/fd/0" -# : die "Cannot find fd 0 symlink in /proc/$pid"; -# PTDEVDEBUG && PerconaTest::_d('pid_file', $pid_file, -# 'pid', $pid, 'proc_fd_0', $proc_fd_0, `ls -l $proc_fd_0`); -# $stdin = readlink $proc_fd_0; -# like( -# $stdin, -# qr/pipe/, -# 'Does not reopen STDIN to /dev/null when piped', -# ); - sleep 1; + TODO: { + local $::TODO = "?"; + rm_tmp_files(); + system("echo foo | $cmd 5 --daemonize --pid $pid_file --log $log_file"); + PerconaTest::wait_for_files($pid_file, $log_file); + chomp($pid = slurp_file($pid_file)); + $proc_fd_0 = -l "/proc/$pid/0" ? "/proc/$pid/0" + : -l "/proc/$pid/fd/0" ? "/proc/$pid/fd/0" + : die "Cannot find fd 0 symlink in /proc/$pid"; + PTDEVDEBUG && PerconaTest::_d('pid_file', $pid_file, + 'pid', $pid, 'proc_fd_0', $proc_fd_0, `ls -l $proc_fd_0`); + $stdin = readlink $proc_fd_0; + like( + $stdin, + qr/pipe/, + 'Does not reopen STDIN to /dev/null when piped', + ); + rm_tmp_files(); + } }; # ########################################################################## @@ -146,7 +152,7 @@ SKIP: { rm_tmp_files(); system("$cmd 5 --daemonize --pid $pid_file >/dev/null 2>&1"); PerconaTest::wait_for_files($pid_file); -chomp($pid = `cat $pid_file`); +chomp($pid = slurp_file($pid_file)); kill 9, $pid; sleep 0.25; $output = `ps wx | grep '^[ ]*$pid' | grep -v grep`; @@ -160,10 +166,12 @@ ok( 'PID file remains after kill 9 (issue 419)' ); -system("$cmd 1 --daemonize --log $log_file --pid $pid_file 2>/tmp/pre-daemonizes"); +my (undef, $tempfile) = tempfile(); + +system("$cmd 5 --daemonize --log $log_file --pid $pid_file 2>$tempfile"); PerconaTest::wait_for_files($log_file); -$output = `ps wx | grep '$cmd 1' | grep -v grep`; -chomp(my $new_pid = `cat $pid_file`); +$output = `ps wx | grep '$cmd 5' | grep -v grep`; +chomp(my $new_pid = slurp_file($pid_file)); sleep 1; like( $output, @@ -171,7 +179,7 @@ like( 'Runs when PID file exists but old process is dead (issue 419)' ); like( - `cat /tmp/pre-daemonizes`, + slurp_file($tempfile), qr/$pid, is not running/, 'Says that old PID is not running (issue 419)' ); @@ -189,9 +197,9 @@ diag(`rm -rf /tmp/pre-daemonizes`); # Check that it actually checks the running process. # ############################################################################ rm_tmp_files(); -system("$cmd 1 --daemonize --log $log_file --pid $pid_file"); +system("$cmd 10 --daemonize --log $log_file --pid $pid_file"); PerconaTest::wait_for_files($pid_file, $log_file); -chomp($pid = `cat $pid_file`); +chomp($pid = slurp_file($pid_file)); $output = `$cmd 0 --daemonize --pid $pid_file 2>&1`; like( $output,