tests: introduce `do_req' helper sub
[unicorn.git] / t / winch_ttin.t
blob509b118f2435fad0e505546c675e4f5a4293984a
1 #!perl -w
2 # Copyright (C) unicorn hackers <unicorn-public@yhbt.net>
3 # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
4 use v5.14; BEGIN { require './t/lib.perl' };
5 use autodie;
6 use POSIX qw(mkfifo);
7 my $u_conf = "$tmpdir/u.conf.rb";
8 my $u_sock = "$tmpdir/u.sock";
9 my $fifo = "$tmpdir/fifo";
10 mkfifo($fifo, 0666) or die "mkfifo($fifo): $!";
12 open my $fh, '>', $u_conf;
13 print $fh <<EOM;
14 pid "$tmpdir/pid"
15 listen "$u_sock"
16 stderr_path "$err_log"
17 after_fork do |server, worker|
18   # test script will block while reading from $fifo,
19   File.open("$fifo", "wb") { |fp| fp.syswrite worker.nr.to_s }
20 end
21 EOM
22 close $fh;
24 unicorn('-D', '-c', $u_conf, 't/integration.ru')->join;
25 is($?, 0, 'daemonized properly');
26 open $fh, '<', "$tmpdir/pid";
27 chomp(my $pid = <$fh>);
28 ok(kill(0, $pid), 'daemonized PID works');
29 my $quit = sub { kill('QUIT', $pid) if $pid; $pid = undef };
30 END { $quit->() };
32 open $fh, '<', $fifo;
33 my $worker_nr = <$fh>;
34 close $fh;
35 is($worker_nr, '0', 'initial worker spawned');
37 my ($status, $hdr, $worker_pid) = do_req($u_sock, 'GET /pid HTTP/1.0');
38 like($status, qr/ 200\b/, 'got 200 response');
39 like($worker_pid, qr/\A[0-9]+\n\z/s, 'PID in response');
40 chomp $worker_pid;
41 ok(kill(0, $worker_pid), 'worker_pid is valid');
43 ok(kill('WINCH', $pid), 'SIGWINCH can be sent');
45 my $tries = 1000;
46 while (CORE::kill(0, $worker_pid) && --$tries) {
47         select undef, undef, undef, 0.01;
49 ok(!CORE::kill(0, $worker_pid), 'worker not running');
51 ok(kill('TTIN', $pid), 'SIGTTIN to restart worker');
53 open $fh, '<', $fifo;
54 $worker_nr = <$fh>;
55 close $fh;
56 is($worker_nr, '0', 'worker restarted');
58 ($status, $hdr, my $new_worker_pid) = do_req($u_sock, 'GET /pid HTTP/1.0');
59 like($status, qr/ 200\b/, 'got 200 response');
60 like($new_worker_pid, qr/\A[0-9]+\n\z/, 'got new worker PID');
61 chomp $new_worker_pid;
62 ok(kill(0, $new_worker_pid), 'got a valid worker PID');
63 isnt($worker_pid, $new_worker_pid, 'worker PID changed');
65 $quit->();
67 check_stderr;
68 undef $tmpdir;
69 done_testing;