diff options
author | Eric Wong <BOFH@YHBT.net> | 2023-09-10 07:13:11 +0000 |
---|---|---|
committer | Eric Wong <BOFH@YHBT.net> | 2023-09-10 19:01:03 +0000 |
commit | 1607ac966f604ec4cf383025c4c3ee296f638fff (patch) | |
tree | 821be17a5c6cf9404c3ab22c377efe70ebde7075 | |
parent | d67284a692683bca59effd9c0670bd5dd47e4fa3 (diff) | |
download | unicorn-1607ac966f604ec4cf383025c4c3ee296f638fff.tar.gz |
Being able to do subsecond sleeps is one welcome advantage over POSIX (not GNU) sleep(1) in portable Bourne sh.
-rw-r--r-- | t/reopen-logs.ru (renamed from t/t0006.ru) | 0 | ||||
-rw-r--r-- | t/reopen-logs.t | 43 | ||||
-rwxr-xr-x | t/t0006-reopen-logs.sh | 83 |
3 files changed, 43 insertions, 83 deletions
diff --git a/t/t0006.ru b/t/reopen-logs.ru index c39e8f6..c39e8f6 100644 --- a/t/t0006.ru +++ b/t/reopen-logs.ru diff --git a/t/reopen-logs.t b/t/reopen-logs.t new file mode 100644 index 0000000..e1bf524 --- /dev/null +++ b/t/reopen-logs.t @@ -0,0 +1,43 @@ +#!perl -w +# Copyright (C) unicorn hackers <unicorn-public@yhbt.net> +# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt> +use v5.14; BEGIN { require './t/lib.perl' }; +use autodie; +my $srv = tcp_server(); +my $u_conf = "$tmpdir/u.conf.rb"; +my $out_log = "$tmpdir/out.log"; +open my $fh, '>', $u_conf; +print $fh <<EOM; +stderr_path "$err_log" +stdout_path "$out_log" +EOM +close $fh; + +my $auto_reap = unicorn('-c', $u_conf, 't/reopen-logs.ru', { 3 => $srv } ); +my $c = tcp_start($srv, 'GET / HTTP/1.0'); +my ($status, $hdr) = slurp_hdr($c); +my $bdy = do { local $/; <$c> }; +is($bdy, "true\n", 'logs opened'); + +rename($err_log, "$err_log.rot"); +rename($out_log, "$out_log.rot"); + +$auto_reap->do_kill('USR1'); + +my $tries = 1000; +while (!-f $err_log && --$tries) { select undef, undef, undef, 0.01 }; +while (!-f $out_log && --$tries) { select undef, undef, undef, 0.01 }; + +ok(-f $out_log, 'stdout_path recreated after USR1'); +ok(-f $err_log, 'stderr_path recreated after USR1'); + +$c = tcp_start($srv, 'GET / HTTP/1.0'); +($status, $hdr) = slurp_hdr($c); +$bdy = do { local $/; <$c> }; +is($bdy, "true\n", 'logs reopened with sync==true'); + +$auto_reap->join('QUIT'); +is($?, 0, 'no error on exit'); +check_stderr; +undef $tmpdir; +done_testing; diff --git a/t/t0006-reopen-logs.sh b/t/t0006-reopen-logs.sh deleted file mode 100755 index a6e7a17..0000000 --- a/t/t0006-reopen-logs.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/sh -. ./test-lib.sh - -t_plan 15 "reopen rotated logs" - -t_begin "setup and startup" && { - rtmpfiles curl_out curl_err r_rot - unicorn_setup - unicorn -D t0006.ru -c $unicorn_config - unicorn_wait_start -} - -t_begin "ensure server is responsive" && { - test xtrue = x$(curl -sSf http://$listen/ 2> $curl_err) -} - -t_begin "ensure stderr log is clean" && check_stderr - -t_begin "external log rotation" && { - rm -f $r_rot - mv $r_err $r_rot -} - -t_begin "send reopen log signal (USR1)" && { - kill -USR1 $unicorn_pid -} - -t_begin "wait for rotated log to reappear" && { - nr=60 - while ! test -f $r_err && test $nr -ge 0 - do - sleep 1 - nr=$(( $nr - 1 )) - done -} - -t_begin "ensure server is still responsive" && { - test xtrue = x$(curl -sSf http://$listen/ 2> $curl_err) -} - -t_begin "wait for worker to reopen logs" && { - nr=60 - re="worker=.* done reopening logs" - while ! grep "$re" < $r_err >/dev/null && test $nr -ge 0 - do - sleep 1 - nr=$(( $nr - 1 )) - done -} - -dbgcat r_rot -dbgcat r_err - -t_begin "ensure no errors from curl" && { - test ! -s $curl_err -} - -t_begin "current server stderr is clean" && check_stderr - -t_begin "rotated stderr is clean" && { - check_stderr $r_rot -} - -t_begin "server is now writing logs to new stderr" && { - before_rot=$(count_bytes < $r_rot) - before_err=$(count_bytes < $r_err) - test xtrue = x$(curl -sSf http://$listen/ 2> $curl_err) - after_rot=$(count_bytes < $r_rot) - after_err=$(count_bytes < $r_err) - test $after_rot -eq $before_rot - test $after_err -gt $before_err -} - -t_begin "stop server" && { - kill $unicorn_pid -} - -dbgcat r_err - -t_begin "current server stderr is clean" && check_stderr -t_begin "rotated stderr is clean" && check_stderr $r_rot - -t_done |