From 1607ac966f604ec4cf383025c4c3ee296f638fff Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 10 Sep 2023 07:13:11 +0000 Subject: tests: port reopen logs test over to Perl 5 Being able to do subsecond sleeps is one welcome advantage over POSIX (not GNU) sleep(1) in portable Bourne sh. --- t/reopen-logs.ru | 13 ++++++++ t/reopen-logs.t | 43 ++++++++++++++++++++++++++ t/t0006-reopen-logs.sh | 83 -------------------------------------------------- t/t0006.ru | 13 -------- 4 files changed, 56 insertions(+), 96 deletions(-) create mode 100644 t/reopen-logs.ru create mode 100644 t/reopen-logs.t delete mode 100755 t/t0006-reopen-logs.sh delete mode 100644 t/t0006.ru (limited to 't') diff --git a/t/reopen-logs.ru b/t/reopen-logs.ru new file mode 100644 index 0000000..c39e8f6 --- /dev/null +++ b/t/reopen-logs.ru @@ -0,0 +1,13 @@ +use Rack::ContentLength +use Rack::ContentType, "text/plain" +run lambda { |env| + + # our File objects for stderr/stdout should always have #path + # and be sync=true + ok = $stderr.sync && + $stdout.sync && + String === $stderr.path && + String === $stdout.path + + [ 200, {}, [ "#{ok}\n" ] ] +} 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 +# License: GPL-3.0+ +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 < $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 diff --git a/t/t0006.ru b/t/t0006.ru deleted file mode 100644 index c39e8f6..0000000 --- a/t/t0006.ru +++ /dev/null @@ -1,13 +0,0 @@ -use Rack::ContentLength -use Rack::ContentType, "text/plain" -run lambda { |env| - - # our File objects for stderr/stdout should always have #path - # and be sync=true - ok = $stderr.sync && - $stdout.sync && - String === $stderr.path && - String === $stdout.path - - [ 200, {}, [ "#{ok}\n" ] ] -} -- cgit v1.2.3-24-ge0c7