unicorn-shopify 4.8.2.5.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.CHANGELOG.old +25 -0
- data/.document +28 -0
- data/.gitignore +25 -0
- data/.mailmap +26 -0
- data/.olddoc.yml +15 -0
- data/Application_Timeouts +77 -0
- data/CONTRIBUTORS +35 -0
- data/COPYING +674 -0
- data/DESIGN +97 -0
- data/Documentation/.gitignore +5 -0
- data/Documentation/GNUmakefile +30 -0
- data/Documentation/unicorn.1.txt +185 -0
- data/Documentation/unicorn_rails.1.txt +175 -0
- data/FAQ +61 -0
- data/GIT-VERSION-GEN +39 -0
- data/GNUmakefile +252 -0
- data/HACKING +120 -0
- data/ISSUES +100 -0
- data/KNOWN_ISSUES +79 -0
- data/LICENSE +67 -0
- data/Links +59 -0
- data/PHILOSOPHY +145 -0
- data/README +145 -0
- data/Rakefile +16 -0
- data/SIGNALS +123 -0
- data/Sandbox +103 -0
- data/TODO +5 -0
- data/TUNING +101 -0
- data/archive/.gitignore +3 -0
- data/archive/slrnpull.conf +4 -0
- data/bin/unicorn +126 -0
- data/bin/unicorn_rails +209 -0
- data/examples/big_app_gc.rb +2 -0
- data/examples/echo.ru +27 -0
- data/examples/init.sh +74 -0
- data/examples/logger_mp_safe.rb +25 -0
- data/examples/logrotate.conf +29 -0
- data/examples/nginx.conf +156 -0
- data/examples/unicorn.conf.minimal.rb +13 -0
- data/examples/unicorn.conf.rb +113 -0
- data/ext/unicorn_http/CFLAGS +13 -0
- data/ext/unicorn_http/c_util.h +124 -0
- data/ext/unicorn_http/common_field_optimization.h +111 -0
- data/ext/unicorn_http/ext_help.h +82 -0
- data/ext/unicorn_http/extconf.rb +10 -0
- data/ext/unicorn_http/global_variables.h +97 -0
- data/ext/unicorn_http/httpdate.c +78 -0
- data/ext/unicorn_http/unicorn_http.rl +934 -0
- data/ext/unicorn_http/unicorn_http_common.rl +76 -0
- data/lib/unicorn.rb +112 -0
- data/lib/unicorn/app/old_rails.rb +35 -0
- data/lib/unicorn/app/old_rails/static.rb +59 -0
- data/lib/unicorn/cgi_wrapper.rb +147 -0
- data/lib/unicorn/configurator.rb +686 -0
- data/lib/unicorn/const.rb +21 -0
- data/lib/unicorn/http_request.rb +125 -0
- data/lib/unicorn/http_response.rb +73 -0
- data/lib/unicorn/http_server.rb +816 -0
- data/lib/unicorn/launcher.rb +62 -0
- data/lib/unicorn/oob_gc.rb +81 -0
- data/lib/unicorn/preread_input.rb +33 -0
- data/lib/unicorn/socket_helper.rb +197 -0
- data/lib/unicorn/stream_input.rb +146 -0
- data/lib/unicorn/tee_input.rb +133 -0
- data/lib/unicorn/tmpio.rb +27 -0
- data/lib/unicorn/util.rb +90 -0
- data/lib/unicorn/worker.rb +140 -0
- data/setup.rb +1586 -0
- data/t/.gitignore +4 -0
- data/t/GNUmakefile +74 -0
- data/t/README +42 -0
- data/t/before_murder.ru +7 -0
- data/t/bin/content-md5-put +36 -0
- data/t/bin/sha1sum.rb +17 -0
- data/t/bin/unused_listen +40 -0
- data/t/broken-app.ru +12 -0
- data/t/detach.ru +11 -0
- data/t/env.ru +3 -0
- data/t/fails-rack-lint.ru +5 -0
- data/t/heartbeat-timeout.ru +12 -0
- data/t/hijack.ru +42 -0
- data/t/listener_names.ru +4 -0
- data/t/my-tap-lib.sh +201 -0
- data/t/oob_gc.ru +20 -0
- data/t/oob_gc_path.ru +20 -0
- data/t/pid.ru +3 -0
- data/t/preread_input.ru +17 -0
- data/t/rack-input-tests.ru +21 -0
- data/t/t0000-http-basic.sh +50 -0
- data/t/t0001-reload-bad-config.sh +53 -0
- data/t/t0002-config-conflict.sh +49 -0
- data/t/t0002-parser-error.sh +94 -0
- data/t/t0003-working_directory.sh +51 -0
- data/t/t0004-heartbeat-timeout.sh +69 -0
- data/t/t0004-working_directory_broken.sh +24 -0
- data/t/t0005-working_directory_app.rb.sh +40 -0
- data/t/t0006-reopen-logs.sh +83 -0
- data/t/t0006.ru +13 -0
- data/t/t0007-working_directory_no_embed_cli.sh +44 -0
- data/t/t0008-back_out_of_upgrade.sh +110 -0
- data/t/t0009-broken-app.sh +56 -0
- data/t/t0009-winch_ttin.sh +59 -0
- data/t/t0010-reap-logging.sh +55 -0
- data/t/t0011-active-unix-socket.sh +79 -0
- data/t/t0012-reload-empty-config.sh +85 -0
- data/t/t0013-rewindable-input-false.sh +24 -0
- data/t/t0013.ru +12 -0
- data/t/t0014-rewindable-input-true.sh +24 -0
- data/t/t0014.ru +12 -0
- data/t/t0015-configurator-internals.sh +25 -0
- data/t/t0018-write-on-close.sh +23 -0
- data/t/t0019-max_header_len.sh +49 -0
- data/t/t0020-at_exit-handler.sh +49 -0
- data/t/t0021-process_detach.sh +29 -0
- data/t/t0022-listener_names-preload_app.sh +32 -0
- data/t/t0023-before-murder.sh +40 -0
- data/t/t0024-before-murder_once.sh +52 -0
- data/t/t0100-rack-input-tests.sh +124 -0
- data/t/t0116-client_body_buffer_size.sh +80 -0
- data/t/t0116.ru +16 -0
- data/t/t0200-rack-hijack.sh +27 -0
- data/t/t0300-no-default-middleware.sh +20 -0
- data/t/t9000-preread-input.sh +48 -0
- data/t/t9001-oob_gc.sh +47 -0
- data/t/t9002-oob_gc-path.sh +75 -0
- data/t/test-lib.sh +128 -0
- data/t/write-on-close.ru +11 -0
- data/test/aggregate.rb +15 -0
- data/test/benchmark/README +50 -0
- data/test/benchmark/dd.ru +18 -0
- data/test/benchmark/stack.ru +8 -0
- data/test/exec/README +5 -0
- data/test/exec/test_exec.rb +1047 -0
- data/test/test_helper.rb +297 -0
- data/test/unit/test_configurator.rb +175 -0
- data/test/unit/test_droplet.rb +28 -0
- data/test/unit/test_http_parser.rb +854 -0
- data/test/unit/test_http_parser_ng.rb +622 -0
- data/test/unit/test_request.rb +182 -0
- data/test/unit/test_response.rb +93 -0
- data/test/unit/test_server.rb +268 -0
- data/test/unit/test_signals.rb +188 -0
- data/test/unit/test_socket_helper.rb +197 -0
- data/test/unit/test_stream_input.rb +203 -0
- data/test/unit/test_tee_input.rb +304 -0
- data/test/unit/test_upload.rb +306 -0
- data/test/unit/test_util.rb +105 -0
- data/unicorn.gemspec +41 -0
- metadata +311 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 11 "existing UNIX domain socket check"
|
|
4
|
+
|
|
5
|
+
read_pid_unix () {
|
|
6
|
+
x=$(printf 'GET / HTTP/1.0\r\n\r\n' | \
|
|
7
|
+
socat - UNIX:$unix_socket | \
|
|
8
|
+
tail -1)
|
|
9
|
+
test -n "$x"
|
|
10
|
+
y="$(expr "$x" : '\([0-9][0-9]*\)')"
|
|
11
|
+
test x"$x" = x"$y"
|
|
12
|
+
test -n "$y"
|
|
13
|
+
echo "$y"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
t_begin "setup and start" && {
|
|
17
|
+
rtmpfiles unix_socket unix_config
|
|
18
|
+
rm -f $unix_socket
|
|
19
|
+
unicorn_setup
|
|
20
|
+
grep -v ^listen < $unicorn_config > $unix_config
|
|
21
|
+
echo "listen '$unix_socket'" >> $unix_config
|
|
22
|
+
unicorn -D -c $unix_config pid.ru
|
|
23
|
+
unicorn_wait_start
|
|
24
|
+
orig_master_pid=$unicorn_pid
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
t_begin "get pid of worker" && {
|
|
28
|
+
worker_pid=$(read_pid_unix)
|
|
29
|
+
t_info "worker_pid=$worker_pid"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
t_begin "fails to start with existing pid file" && {
|
|
33
|
+
rm -f $ok
|
|
34
|
+
unicorn -D -c $unix_config pid.ru || echo ok > $ok
|
|
35
|
+
test x"$(cat $ok)" = xok
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
t_begin "worker pid unchanged" && {
|
|
39
|
+
test x"$(read_pid_unix)" = x$worker_pid
|
|
40
|
+
> $r_err
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
t_begin "fails to start with listening UNIX domain socket bound" && {
|
|
44
|
+
rm $ok $pid
|
|
45
|
+
unicorn -D -c $unix_config pid.ru || echo ok > $ok
|
|
46
|
+
test x"$(cat $ok)" = xok
|
|
47
|
+
> $r_err
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
t_begin "worker pid unchanged (again)" && {
|
|
51
|
+
test x"$(read_pid_unix)" = x$worker_pid
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
t_begin "nuking the existing Unicorn succeeds" && {
|
|
55
|
+
kill -9 $unicorn_pid $worker_pid
|
|
56
|
+
while kill -0 $unicorn_pid
|
|
57
|
+
do
|
|
58
|
+
sleep 1
|
|
59
|
+
done
|
|
60
|
+
check_stderr
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
t_begin "succeeds in starting with leftover UNIX domain socket bound" && {
|
|
64
|
+
test -S $unix_socket
|
|
65
|
+
unicorn -D -c $unix_config pid.ru
|
|
66
|
+
unicorn_wait_start
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
t_begin "worker pid changed" && {
|
|
70
|
+
test x"$(read_pid_unix)" != x$worker_pid
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
t_begin "killing succeeds" && {
|
|
74
|
+
kill $unicorn_pid
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
t_begin "no errors" && check_stderr
|
|
78
|
+
|
|
79
|
+
t_done
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 9 "reloading unset config resets defaults"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
rtmpfiles unicorn_config_orig before_reload after_reload
|
|
8
|
+
cat $unicorn_config > $unicorn_config_orig
|
|
9
|
+
cat >> $unicorn_config <<EOF
|
|
10
|
+
logger Logger.new(STDOUT)
|
|
11
|
+
preload_app true
|
|
12
|
+
timeout 0x7fffffff
|
|
13
|
+
worker_processes 2
|
|
14
|
+
after_fork { |s,w| }
|
|
15
|
+
\$dump_cfg = lambda { |fp,srv|
|
|
16
|
+
defaults = Unicorn::Configurator::DEFAULTS
|
|
17
|
+
defaults.keys.map { |x| x.to_s }.sort.each do |key|
|
|
18
|
+
next if key =~ %r{\Astd(?:err|out)_path\z}
|
|
19
|
+
key = key.to_sym
|
|
20
|
+
def_value = defaults[key]
|
|
21
|
+
srv_value = srv.__send__(key)
|
|
22
|
+
fp << "#{key}|#{srv_value}|#{def_value}\\n"
|
|
23
|
+
end
|
|
24
|
+
}
|
|
25
|
+
before_fork { |s,w|
|
|
26
|
+
File.open("$before_reload", "a") { |fp| \$dump_cfg.call(fp, s) }
|
|
27
|
+
}
|
|
28
|
+
before_exec { |s| }
|
|
29
|
+
EOF
|
|
30
|
+
unicorn -D -c $unicorn_config env.ru
|
|
31
|
+
unicorn_wait_start
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
t_begin "ensure worker is started" && {
|
|
35
|
+
curl -sSf http://$listen/ > $tmp
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
t_begin "replace config file with original(-ish)" && {
|
|
39
|
+
grep -v ^pid < $unicorn_config_orig > $unicorn_config
|
|
40
|
+
cat >> $unicorn_config <<EOF
|
|
41
|
+
before_fork { |s,w|
|
|
42
|
+
File.open("$after_reload", "a") { |fp| \$dump_cfg.call(fp, s) }
|
|
43
|
+
}
|
|
44
|
+
EOF
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
t_begin "reload signal succeeds" && {
|
|
48
|
+
kill -HUP $unicorn_pid
|
|
49
|
+
while ! egrep '(done|error) reloading' $r_err >/dev/null
|
|
50
|
+
do
|
|
51
|
+
sleep 1
|
|
52
|
+
done
|
|
53
|
+
while ! grep reaped < $r_err >/dev/null
|
|
54
|
+
do
|
|
55
|
+
sleep 1
|
|
56
|
+
done
|
|
57
|
+
grep 'done reloading' $r_err >/dev/null
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
t_begin "ensure worker is started" && {
|
|
61
|
+
curl -sSf http://$listen/ > $tmp
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
t_begin "pid file no longer exists" && {
|
|
65
|
+
if test -f $pid
|
|
66
|
+
then
|
|
67
|
+
die "pid=$pid should not exist"
|
|
68
|
+
fi
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
t_begin "killing succeeds" && {
|
|
72
|
+
kill $unicorn_pid
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
t_begin "check stderr" && {
|
|
76
|
+
check_stderr
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
t_begin "ensure reloading restored settings" && {
|
|
80
|
+
awk < $after_reload -F'|' '
|
|
81
|
+
$1 != "before_fork" && $2 != $3 { print $0; exit(1) }
|
|
82
|
+
'
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
t_done
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 4 "rewindable_input toggled to false"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
echo rewindable_input false >> $unicorn_config
|
|
8
|
+
unicorn -D -c $unicorn_config t0013.ru
|
|
9
|
+
unicorn_wait_start
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
t_begin "ensure worker is started" && {
|
|
13
|
+
test xOK = x$(curl -T t0013.ru -H Expect: -vsSf http://$listen/)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
t_begin "killing succeeds" && {
|
|
17
|
+
kill $unicorn_pid
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
t_begin "check stderr" && {
|
|
21
|
+
check_stderr
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
t_done
|
data/t/t0013.ru
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 4 "rewindable_input toggled to true"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
echo rewindable_input true >> $unicorn_config
|
|
8
|
+
unicorn -D -c $unicorn_config t0014.ru
|
|
9
|
+
unicorn_wait_start
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
t_begin "ensure worker is started" && {
|
|
13
|
+
test xOK = x$(curl -T t0014.ru -sSf http://$listen/)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
t_begin "killing succeeds" && {
|
|
17
|
+
kill $unicorn_pid
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
t_begin "check stderr" && {
|
|
21
|
+
check_stderr
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
t_done
|
data/t/t0014.ru
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 4 "configurator internals tests (from FAQ)"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
cat >> $unicorn_config <<EOF
|
|
8
|
+
HttpRequest::DEFAULTS["rack.url_scheme"] = "https"
|
|
9
|
+
Configurator::DEFAULTS[:logger].formatter = Logger::Formatter.new
|
|
10
|
+
EOF
|
|
11
|
+
unicorn -D -c $unicorn_config env.ru
|
|
12
|
+
unicorn_wait_start
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
t_begin "single request" && {
|
|
16
|
+
curl -sSfv http://$listen/ | grep '"rack.url_scheme"=>"https"'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
t_begin "killing succeeds" && {
|
|
20
|
+
kill $unicorn_pid
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
t_begin "no errors" && check_stderr
|
|
24
|
+
|
|
25
|
+
t_done
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 4 "write-on-close tests for funky response-bodies"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
unicorn -D -c $unicorn_config write-on-close.ru
|
|
8
|
+
unicorn_wait_start
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
t_begin "write-on-close response body succeeds" && {
|
|
12
|
+
test xGoodbye = x"$(curl -sSf http://$listen/)"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
t_begin "killing succeeds" && {
|
|
16
|
+
kill $unicorn_pid
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
t_begin "check stderr" && {
|
|
20
|
+
check_stderr
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
t_done
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
t_plan 5 "max_header_len setting (only intended for Rainbows!)"
|
|
4
|
+
|
|
5
|
+
t_begin "setup and start" && {
|
|
6
|
+
unicorn_setup
|
|
7
|
+
req='GET / HTTP/1.0\r\n\r\n'
|
|
8
|
+
len=$(printf "$req" | count_bytes)
|
|
9
|
+
echo Unicorn::HttpParser.max_header_len = $len >> $unicorn_config
|
|
10
|
+
unicorn -D -c $unicorn_config env.ru
|
|
11
|
+
unicorn_wait_start
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
t_begin "minimal request succeeds" && {
|
|
15
|
+
rm -f $tmp
|
|
16
|
+
(
|
|
17
|
+
cat $fifo > $tmp &
|
|
18
|
+
printf "$req"
|
|
19
|
+
wait
|
|
20
|
+
echo ok > $ok
|
|
21
|
+
) | socat - TCP:$listen > $fifo
|
|
22
|
+
test xok = x$(cat $ok)
|
|
23
|
+
|
|
24
|
+
fgrep "HTTP/1.1 200 OK" $tmp
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
t_begin "big request fails" && {
|
|
28
|
+
rm -f $tmp
|
|
29
|
+
(
|
|
30
|
+
cat $fifo > $tmp &
|
|
31
|
+
printf 'GET /xxxxxx HTTP/1.0\r\n\r\n'
|
|
32
|
+
wait
|
|
33
|
+
echo ok > $ok
|
|
34
|
+
) | socat - TCP:$listen > $fifo
|
|
35
|
+
test xok = x$(cat $ok)
|
|
36
|
+
fgrep "HTTP/1.1 413" $tmp
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
dbgcat tmp
|
|
40
|
+
|
|
41
|
+
t_begin "killing succeeds" && {
|
|
42
|
+
kill $unicorn_pid
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
t_begin "check stderr" && {
|
|
46
|
+
check_stderr
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
t_done
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
|
|
4
|
+
t_plan 5 "at_exit/END handlers work as expected"
|
|
5
|
+
|
|
6
|
+
t_begin "setup and startup" && {
|
|
7
|
+
unicorn_setup
|
|
8
|
+
cat >> $unicorn_config <<EOF
|
|
9
|
+
at_exit { \$stdout.syswrite("#{Process.pid} BOTH\\n") }
|
|
10
|
+
END { \$stdout.syswrite("#{Process.pid} END BOTH\\n") }
|
|
11
|
+
after_fork do |_,_|
|
|
12
|
+
at_exit { \$stdout.syswrite("#{Process.pid} WORKER ONLY\\n") }
|
|
13
|
+
END { \$stdout.syswrite("#{Process.pid} END WORKER ONLY\\n") }
|
|
14
|
+
end
|
|
15
|
+
EOF
|
|
16
|
+
|
|
17
|
+
unicorn -D pid.ru -c $unicorn_config
|
|
18
|
+
unicorn_wait_start
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
t_begin "read worker PID" && {
|
|
22
|
+
worker_pid=$(curl -sSf http://$listen/)
|
|
23
|
+
t_info "worker_pid=$worker_pid"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
t_begin "issue graceful shutdown (SIGQUIT) and wait for termination" && {
|
|
27
|
+
kill -QUIT $unicorn_pid
|
|
28
|
+
|
|
29
|
+
while kill -0 $unicorn_pid >/dev/null 2>&1
|
|
30
|
+
do
|
|
31
|
+
sleep 1
|
|
32
|
+
done
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
t_begin "check stderr" && check_stderr
|
|
36
|
+
|
|
37
|
+
dbgcat r_err
|
|
38
|
+
dbgcat r_out
|
|
39
|
+
|
|
40
|
+
t_begin "all at_exit handlers ran" && {
|
|
41
|
+
grep "$worker_pid BOTH" $r_out
|
|
42
|
+
grep "$unicorn_pid BOTH" $r_out
|
|
43
|
+
grep "$worker_pid END BOTH" $r_out
|
|
44
|
+
grep "$unicorn_pid END BOTH" $r_out
|
|
45
|
+
grep "$worker_pid WORKER ONLY" $r_out
|
|
46
|
+
grep "$worker_pid END WORKER ONLY" $r_out
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
t_done
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
|
|
4
|
+
t_plan 5 "Process.detach on forked background process works"
|
|
5
|
+
|
|
6
|
+
t_begin "setup and startup" && {
|
|
7
|
+
t_fifos process_detach
|
|
8
|
+
unicorn_setup
|
|
9
|
+
TEST_FIFO=$process_detach \
|
|
10
|
+
unicorn -E none -D detach.ru -c $unicorn_config
|
|
11
|
+
unicorn_wait_start
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
t_begin "read detached PID with HTTP/1.0" && {
|
|
15
|
+
detached_pid=$(curl -0 -sSf http://$listen/)
|
|
16
|
+
t_info "detached_pid=$detached_pid"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
t_begin "read background FIFO" && {
|
|
20
|
+
test xHIHI = x"$(cat $process_detach)"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
t_begin "killing succeeds" && {
|
|
24
|
+
kill $unicorn_pid
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
t_begin "check stderr" && check_stderr
|
|
28
|
+
|
|
29
|
+
t_done
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. ./test-lib.sh
|
|
3
|
+
|
|
4
|
+
# Raindrops::Middleware depends on Unicorn.listener_names,
|
|
5
|
+
# ensure we don't break Raindrops::Middleware when preload_app is true
|
|
6
|
+
|
|
7
|
+
t_plan 4 "Unicorn.listener_names available with preload_app=true"
|
|
8
|
+
|
|
9
|
+
t_begin "setup and startup" && {
|
|
10
|
+
unicorn_setup
|
|
11
|
+
echo preload_app true >> $unicorn_config
|
|
12
|
+
unicorn -E none -D listener_names.ru -c $unicorn_config
|
|
13
|
+
unicorn_wait_start
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
t_begin "read listener names includes listener" && {
|
|
17
|
+
resp=$(curl -sSf http://$listen/)
|
|
18
|
+
ok=false
|
|
19
|
+
t_info "resp=$resp"
|
|
20
|
+
case $resp in
|
|
21
|
+
*\"$listen\"*) ok=true ;;
|
|
22
|
+
esac
|
|
23
|
+
$ok
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
t_begin "killing succeeds" && {
|
|
27
|
+
kill $unicorn_pid
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
t_begin "check stderr" && check_stderr
|
|
31
|
+
|
|
32
|
+
t_done
|