From d4514174ee7eadea89003f380acacf32d52acd9d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 7 Sep 2023 23:18:16 +0000 Subject: tests: port working_directory tests to Perl 5 We can fold a bunch of them into one test to save startup time, inodes, and FS activity. --- t/t0003-working_directory.sh | 51 ------------- t/t0004-working_directory_broken.sh | 24 ------ t/t0005-working_directory_app.rb.sh | 40 ---------- t/t0007-working_directory_no_embed_cli.sh | 44 ----------- t/working_directory.t | 122 ++++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 159 deletions(-) delete mode 100755 t/t0003-working_directory.sh delete mode 100755 t/t0004-working_directory_broken.sh delete mode 100755 t/t0005-working_directory_app.rb.sh delete mode 100755 t/t0007-working_directory_no_embed_cli.sh create mode 100644 t/working_directory.t (limited to 't') diff --git a/t/t0003-working_directory.sh b/t/t0003-working_directory.sh deleted file mode 100755 index 79988d8..0000000 --- a/t/t0003-working_directory.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -. ./test-lib.sh - -t_plan 4 "config.ru inside alt working_directory" - -t_begin "setup and start" && { - unicorn_setup - rtmpfiles unicorn_config_tmp - rm -rf $t_pfx.app - mkdir $t_pfx.app - - cat > $t_pfx.app/config.ru < $unicorn_config_tmp - - # the whole point of this exercise - echo "working_directory '$t_pfx.app'" >> $unicorn_config_tmp - - # allows ppid to be 1 in before_fork - echo "preload_app true" >> $unicorn_config_tmp - cat >> $unicorn_config_tmp <<\EOF -before_fork do |server,worker| - $master_ppid = Process.ppid # should be zero to detect daemonization -end -EOF - - mv $unicorn_config_tmp $unicorn_config - - # rely on --daemonize switch, no & or -D - unicorn -c $unicorn_config - unicorn_wait_start -} - -t_begin "hit with curl" && { - body=$(curl -sSf http://$listen/) -} - -t_begin "killing succeeds" && { - kill $unicorn_pid -} - -t_begin "response body ppid == 1 (daemonized)" && { - test "$body" -eq 1 -} - -t_done diff --git a/t/t0004-working_directory_broken.sh b/t/t0004-working_directory_broken.sh deleted file mode 100755 index ca9d382..0000000 --- a/t/t0004-working_directory_broken.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -. ./test-lib.sh - -t_plan 3 "config.ru is missing inside alt working_directory" - -t_begin "setup" && { - unicorn_setup - rtmpfiles unicorn_config_tmp ok - rm -rf $t_pfx.app - mkdir $t_pfx.app - - # the whole point of this exercise - echo "working_directory '$t_pfx.app'" >> $unicorn_config_tmp -} - -t_begin "fails to start up w/o config.ru" && { - unicorn -c $unicorn_config_tmp || echo ok > $ok -} - -t_begin "fallback code was run" && { - test x"$(cat $ok)" = xok -} - -t_done diff --git a/t/t0005-working_directory_app.rb.sh b/t/t0005-working_directory_app.rb.sh deleted file mode 100755 index 0fbab4f..0000000 --- a/t/t0005-working_directory_app.rb.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh -. ./test-lib.sh - -t_plan 4 "fooapp.rb inside alt working_directory" - -t_begin "setup and start" && { - unicorn_setup - rm -rf $t_pfx.app - mkdir $t_pfx.app - - cat > $t_pfx.app/fooapp.rb <<\EOF -class Fooapp - def self.call(env) - # Rack::Lint in 1.5.0 requires headers to be a hash - h = [%w(Content-Type text/plain), %w(Content-Length 2)] - h = Rack::Utils::HeaderHash.new(h) - [ 200, h, %w(HI) ] - end -end -EOF - # the whole point of this exercise - echo "working_directory '$t_pfx.app'" >> $unicorn_config - cd / - unicorn -D -c $unicorn_config -I. fooapp.rb - unicorn_wait_start -} - -t_begin "hit with curl" && { - body=$(curl -sSf http://$listen/) -} - -t_begin "killing succeeds" && { - kill $unicorn_pid -} - -t_begin "response body expected" && { - test x"$body" = xHI -} - -t_done diff --git a/t/t0007-working_directory_no_embed_cli.sh b/t/t0007-working_directory_no_embed_cli.sh deleted file mode 100755 index 77d6707..0000000 --- a/t/t0007-working_directory_no_embed_cli.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh -. ./test-lib.sh - -t_plan 4 "config.ru inside alt working_directory (no embedded switches)" - -t_begin "setup and start" && { - unicorn_setup - rm -rf $t_pfx.app - mkdir $t_pfx.app - - cat > $t_pfx.app/config.ru <> $unicorn_config - - # allows ppid to be 1 in before_fork - echo "preload_app true" >> $unicorn_config - cat >> $unicorn_config <<\EOF -before_fork do |server,worker| - $master_ppid = Process.ppid # should be zero to detect daemonization -end -EOF - - cd / - unicorn -D -c $unicorn_config - unicorn_wait_start -} - -t_begin "hit with curl" && { - body=$(curl -sSf http://$listen/) -} - -t_begin "killing succeeds" && { - kill $unicorn_pid -} - -t_begin "response body ppid == 1 (daemonized)" && { - test "$body" -eq 1 -} - -t_done diff --git a/t/working_directory.t b/t/working_directory.t new file mode 100644 index 0000000..e7ff43a --- /dev/null +++ b/t/working_directory.t @@ -0,0 +1,122 @@ +#!perl -w +# Copyright (C) unicorn hackers +# License: GPL-3.0+ +use v5.14; BEGIN { require './t/lib.perl' }; +use autodie; +mkdir "$tmpdir/alt"; +my $u_sock = "$tmpdir/u.sock"; +my $ru = "$tmpdir/alt/config.ru"; +my $u_conf = "$tmpdir/u.conf.rb"; +open my $fh, '>', $u_conf; +print $fh <', $ru; +print $fh <(1) if defined $pid }; + +unicorn('-c', $u_conf)->join; # will daemonize +chomp($pid = slurp("$tmpdir/pid")); + +my $c = unix_start($u_sock, 'GET / HTTP/1.0'); +my ($status, $hdr) = slurp_hdr($c); +chomp(my $bdy = do { local $/; <$c> }); +is($bdy, 1, 'got expected $master_ppid'); + +$stop_daemon->(); +check_stderr; + +if ('test without CLI switches in config.ru') { + truncate $err_log, 0; + open $fh, '>', $ru; + print $fh $common_ru; + close $fh; + + unicorn('-D', '-l', $u_sock, '-c', $u_conf)->join; # will daemonize + chomp($pid = slurp("$tmpdir/pid")); + + $c = unix_start($u_sock, 'GET / HTTP/1.0'); + ($status, $hdr) = slurp_hdr($c); + chomp($bdy = do { local $/; <$c> }); + is($bdy, 1, 'got expected $master_ppid'); + + $stop_daemon->(); + check_stderr; +} + +if ('ensures broken working_directory (missing config.ru) is OK') { + truncate $err_log, 0; + unlink $ru; + + my $auto_reap = unicorn('-c', $u_conf); + $auto_reap->join; + isnt($?, 0, 'exited with error due to missing config.ru'); + + like(slurp($err_log), qr/rackup file \Q(config.ru)\E not readable/, + 'noted unreadability of config.ru in stderr'); +} + +if ('fooapp.rb (not config.ru) works with working_directory') { + truncate $err_log, 0; + my $fooapp = "$tmpdir/alt/fooapp.rb"; + open $fh, '>', $fooapp; + print $fh < 'text/plain', 'content-length' => b.bytesize.to_s } + [ 200, h, [ b ] ] + end +end +EOM + close $fh; + my $srv = tcp_server; + my $auto_reap = unicorn(qw(-c), $u_conf, qw(-I. fooapp.rb), + { -C => '/', 3 => $srv }); + $c = tcp_start($srv, 'GET / HTTP/1.0'); + ($status, $hdr) = slurp_hdr($c); + chomp($bdy = do { local $/; <$c> }); + is($bdy, "dir=$tmpdir/alt", + 'fooapp.rb (w/o config.ru) w/ working_directory'); + close $c; + $auto_reap->join('TERM'); + is($?, 0, 'fooapp.rb process exited'); + check_stderr; +} + +undef $tmpdir; +done_testing; -- cgit v1.2.3-24-ge0c7