unicorn-fork 6.1.1
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/.gitattributes +5 -0
- data/.gitignore +25 -0
- data/.mailmap +26 -0
- data/.manifest +144 -0
- data/.olddoc.yml +25 -0
- data/Application_Timeouts +77 -0
- data/CONTRIBUTORS +39 -0
- data/COPYING +674 -0
- data/DESIGN +99 -0
- data/Documentation/.gitignore +3 -0
- data/Documentation/unicorn.1 +222 -0
- data/Documentation/unicorn_rails.1 +207 -0
- data/FAQ +70 -0
- data/GIT-VERSION-FILE +1 -0
- data/GIT-VERSION-GEN +39 -0
- data/GNUmakefile +318 -0
- data/HACKING +117 -0
- data/ISSUES +102 -0
- data/KNOWN_ISSUES +79 -0
- data/LICENSE +67 -0
- data/Links +58 -0
- data/PHILOSOPHY +139 -0
- data/README +165 -0
- data/Rakefile +17 -0
- data/SIGNALS +123 -0
- data/Sandbox +104 -0
- data/TODO +1 -0
- data/TUNING +119 -0
- data/archive/.gitignore +3 -0
- data/archive/slrnpull.conf +4 -0
- data/bin/unicorn +129 -0
- data/bin/unicorn_rails +210 -0
- data/examples/big_app_gc.rb +3 -0
- data/examples/echo.ru +27 -0
- data/examples/init.sh +102 -0
- data/examples/logger_mp_safe.rb +26 -0
- data/examples/logrotate.conf +44 -0
- data/examples/nginx.conf +156 -0
- data/examples/unicorn.conf.minimal.rb +14 -0
- data/examples/unicorn.conf.rb +111 -0
- data/examples/unicorn.socket +11 -0
- data/examples/unicorn@.service +40 -0
- data/ext/unicorn_http/CFLAGS +13 -0
- data/ext/unicorn_http/c_util.h +115 -0
- data/ext/unicorn_http/common_field_optimization.h +128 -0
- data/ext/unicorn_http/epollexclusive.h +128 -0
- data/ext/unicorn_http/ext_help.h +38 -0
- data/ext/unicorn_http/extconf.rb +40 -0
- data/ext/unicorn_http/global_variables.h +97 -0
- data/ext/unicorn_http/httpdate.c +91 -0
- data/ext/unicorn_http/unicorn_http.c +4348 -0
- data/ext/unicorn_http/unicorn_http.rl +1054 -0
- data/ext/unicorn_http/unicorn_http_common.rl +76 -0
- data/lib/unicorn/app/old_rails/static.rb +60 -0
- data/lib/unicorn/app/old_rails.rb +36 -0
- data/lib/unicorn/cgi_wrapper.rb +148 -0
- data/lib/unicorn/configurator.rb +749 -0
- data/lib/unicorn/const.rb +22 -0
- data/lib/unicorn/http_request.rb +180 -0
- data/lib/unicorn/http_response.rb +95 -0
- data/lib/unicorn/http_server.rb +860 -0
- data/lib/unicorn/launcher.rb +63 -0
- data/lib/unicorn/oob_gc.rb +82 -0
- data/lib/unicorn/preread_input.rb +34 -0
- data/lib/unicorn/select_waiter.rb +7 -0
- data/lib/unicorn/socket_helper.rb +186 -0
- data/lib/unicorn/stream_input.rb +152 -0
- data/lib/unicorn/tee_input.rb +132 -0
- data/lib/unicorn/tmpio.rb +34 -0
- data/lib/unicorn/util.rb +91 -0
- data/lib/unicorn/version.rb +1 -0
- data/lib/unicorn/worker.rb +166 -0
- data/lib/unicorn.rb +137 -0
- data/man/man1/unicorn.1 +222 -0
- data/man/man1/unicorn_rails.1 +207 -0
- data/setup.rb +1587 -0
- data/t/.gitignore +4 -0
- data/t/GNUmakefile +5 -0
- data/t/README +49 -0
- data/t/active-unix-socket.t +110 -0
- data/t/back-out-of-upgrade.t +44 -0
- data/t/bin/unused_listen +40 -0
- data/t/client_body_buffer_size.ru +15 -0
- data/t/client_body_buffer_size.t +79 -0
- data/t/detach.ru +12 -0
- data/t/env.ru +4 -0
- data/t/fails-rack-lint.ru +6 -0
- data/t/heartbeat-timeout.ru +13 -0
- data/t/heartbeat-timeout.t +60 -0
- data/t/integration.ru +129 -0
- data/t/integration.t +509 -0
- data/t/lib.perl +309 -0
- data/t/listener_names.ru +5 -0
- data/t/my-tap-lib.sh +201 -0
- data/t/oob_gc.ru +18 -0
- data/t/oob_gc_path.ru +18 -0
- data/t/pid.ru +4 -0
- data/t/preread_input.ru +23 -0
- data/t/reload-bad-config.t +49 -0
- data/t/reopen-logs.ru +14 -0
- data/t/reopen-logs.t +36 -0
- data/t/t0010-reap-logging.sh +55 -0
- data/t/t0012-reload-empty-config.sh +86 -0
- data/t/t0013-rewindable-input-false.sh +24 -0
- data/t/t0013.ru +13 -0
- data/t/t0014-rewindable-input-true.sh +24 -0
- data/t/t0014.ru +13 -0
- data/t/t0015-configurator-internals.sh +25 -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/t0300-no-default-middleware.sh +20 -0
- data/t/t0301-no-default-middleware-ignored-in-config.sh +25 -0
- data/t/t0301.ru +14 -0
- data/t/t9001-oob_gc.sh +47 -0
- data/t/t9002-oob_gc-path.sh +75 -0
- data/t/test-lib.sh +125 -0
- data/t/winch_ttin.t +64 -0
- data/t/working_directory.t +86 -0
- data/test/aggregate.rb +16 -0
- data/test/benchmark/README +60 -0
- data/test/benchmark/dd.ru +19 -0
- data/test/benchmark/ddstream.ru +51 -0
- data/test/benchmark/readinput.ru +41 -0
- data/test/benchmark/stack.ru +9 -0
- data/test/benchmark/uconnect.perl +66 -0
- data/test/exec/README +5 -0
- data/test/exec/test_exec.rb +1030 -0
- data/test/test_helper.rb +307 -0
- data/test/unit/test_configurator.rb +176 -0
- data/test/unit/test_droplet.rb +29 -0
- data/test/unit/test_http_parser.rb +885 -0
- data/test/unit/test_http_parser_ng.rb +715 -0
- data/test/unit/test_server.rb +245 -0
- data/test/unit/test_signals.rb +189 -0
- data/test/unit/test_socket_helper.rb +160 -0
- data/test/unit/test_stream_input.rb +211 -0
- data/test/unit/test_tee_input.rb +304 -0
- data/test/unit/test_util.rb +132 -0
- data/test/unit/test_waiter.rb +35 -0
- data/unicorn.gemspec +49 -0
- metadata +266 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 9 "reap worker logging messages"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
cat >> $unicorn_config <<EOF
|
8
|
+
after_fork { |s,w| File.open('$fifo','w') { |f| f.write '.' } }
|
9
|
+
EOF
|
10
|
+
unicorn -c $unicorn_config pid.ru &
|
11
|
+
test '.' = $(cat $fifo)
|
12
|
+
unicorn_wait_start
|
13
|
+
}
|
14
|
+
|
15
|
+
t_begin "kill 1st worker=0" && {
|
16
|
+
pid_1=$(curl http://$listen/)
|
17
|
+
kill -9 $pid_1
|
18
|
+
}
|
19
|
+
|
20
|
+
t_begin "wait for 2nd worker to start" && {
|
21
|
+
test '.' = $(cat $fifo)
|
22
|
+
}
|
23
|
+
|
24
|
+
t_begin "ensure log of 1st reap is an ERROR" && {
|
25
|
+
dbgcat r_err
|
26
|
+
grep 'ERROR.*reaped.*worker=0' $r_err | grep $pid_1
|
27
|
+
dbgcat r_err
|
28
|
+
> $r_err
|
29
|
+
}
|
30
|
+
|
31
|
+
t_begin "kill 2nd worker gracefully" && {
|
32
|
+
pid_2=$(curl http://$listen/)
|
33
|
+
kill -QUIT $pid_2
|
34
|
+
}
|
35
|
+
|
36
|
+
t_begin "wait for 3rd worker=0 to start " && {
|
37
|
+
test '.' = $(cat $fifo)
|
38
|
+
}
|
39
|
+
|
40
|
+
t_begin "ensure log of 2nd reap is a INFO" && {
|
41
|
+
grep 'INFO.*reaped.*worker=0' $r_err | grep $pid_2
|
42
|
+
> $r_err
|
43
|
+
}
|
44
|
+
|
45
|
+
t_begin "killing succeeds" && {
|
46
|
+
kill $unicorn_pid
|
47
|
+
wait
|
48
|
+
kill -0 $unicorn_pid && false
|
49
|
+
}
|
50
|
+
|
51
|
+
t_begin "check stderr" && {
|
52
|
+
check_stderr
|
53
|
+
}
|
54
|
+
|
55
|
+
t_done
|
@@ -0,0 +1,86 @@
|
|
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.respond_to?(key) ? srv.__send__(key)
|
22
|
+
: srv.instance_variable_get("@#{key}")
|
23
|
+
fp << "#{key}|#{srv_value}|#{def_value}\\n"
|
24
|
+
end
|
25
|
+
}
|
26
|
+
before_fork { |s,w|
|
27
|
+
File.open("$before_reload", "a") { |fp| \$dump_cfg.call(fp, s) }
|
28
|
+
}
|
29
|
+
before_exec { |s| }
|
30
|
+
EOF
|
31
|
+
unicorn -D -c $unicorn_config env.ru
|
32
|
+
unicorn_wait_start
|
33
|
+
}
|
34
|
+
|
35
|
+
t_begin "ensure worker is started" && {
|
36
|
+
curl -sSf http://$listen/ > $tmp
|
37
|
+
}
|
38
|
+
|
39
|
+
t_begin "replace config file with original(-ish)" && {
|
40
|
+
grep -v ^pid < $unicorn_config_orig > $unicorn_config
|
41
|
+
cat >> $unicorn_config <<EOF
|
42
|
+
before_fork { |s,w|
|
43
|
+
File.open("$after_reload", "a") { |fp| \$dump_cfg.call(fp, s) }
|
44
|
+
}
|
45
|
+
EOF
|
46
|
+
}
|
47
|
+
|
48
|
+
t_begin "reload signal succeeds" && {
|
49
|
+
kill -HUP $unicorn_pid
|
50
|
+
while ! egrep '(done|error) reloading' $r_err >/dev/null
|
51
|
+
do
|
52
|
+
sleep 1
|
53
|
+
done
|
54
|
+
while ! grep reaped < $r_err >/dev/null
|
55
|
+
do
|
56
|
+
sleep 1
|
57
|
+
done
|
58
|
+
grep 'done reloading' $r_err >/dev/null
|
59
|
+
}
|
60
|
+
|
61
|
+
t_begin "ensure worker is started" && {
|
62
|
+
curl -sSf http://$listen/ > $tmp
|
63
|
+
}
|
64
|
+
|
65
|
+
t_begin "pid file no longer exists" && {
|
66
|
+
if test -f $pid
|
67
|
+
then
|
68
|
+
die "pid=$pid should not exist"
|
69
|
+
fi
|
70
|
+
}
|
71
|
+
|
72
|
+
t_begin "killing succeeds" && {
|
73
|
+
kill $unicorn_pid
|
74
|
+
}
|
75
|
+
|
76
|
+
t_begin "check stderr" && {
|
77
|
+
check_stderr
|
78
|
+
}
|
79
|
+
|
80
|
+
t_begin "ensure reloading restored settings" && {
|
81
|
+
awk < $after_reload -F'|' '
|
82
|
+
$1 != "before_fork" && $2 != $3 { print $0; exit(1) }
|
83
|
+
'
|
84
|
+
}
|
85
|
+
|
86
|
+
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,13 @@
|
|
1
|
+
#\ -E none
|
2
|
+
# frozen_string_literal: false
|
3
|
+
use Rack::ContentLength
|
4
|
+
use Rack::ContentType, 'text/plain'
|
5
|
+
app = lambda do |env|
|
6
|
+
case env['rack.input']
|
7
|
+
when Unicorn::StreamInput
|
8
|
+
[ 200, {}, %w(OK) ]
|
9
|
+
else
|
10
|
+
[ 500, {}, %w(NO) ]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
run app
|
@@ -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,13 @@
|
|
1
|
+
#\ -E none
|
2
|
+
# frozen_string_literal: false
|
3
|
+
use Rack::ContentLength
|
4
|
+
use Rack::ContentType, 'text/plain'
|
5
|
+
app = lambda do |env|
|
6
|
+
case env['rack.input']
|
7
|
+
when Unicorn::TeeInput
|
8
|
+
[ 200, {}, %w(OK) ]
|
9
|
+
else
|
10
|
+
[ 500, {}, %w(NO) ]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
run app
|
@@ -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,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
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 3 "test the -N / --no-default-middleware option"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
unicorn -N -D -c $unicorn_config fails-rack-lint.ru
|
8
|
+
unicorn_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "check exit status with Rack::Lint not present" && {
|
12
|
+
test 500 -ne "$(curl -sf -o/dev/null -w'%{http_code}' http://$listen/)"
|
13
|
+
}
|
14
|
+
|
15
|
+
t_begin "killing succeeds" && {
|
16
|
+
kill $unicorn_pid
|
17
|
+
check_stderr
|
18
|
+
}
|
19
|
+
|
20
|
+
t_done
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 3 "-N / --no-default-middleware option not supported in config.ru"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
RACK_ENV=development unicorn -D -c $unicorn_config t0301.ru
|
8
|
+
unicorn_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "check switches parsed as expected and -N ignored for Rack::Lint" && {
|
12
|
+
debug=false
|
13
|
+
lint=
|
14
|
+
eval "$(curl -sf http://$listen/vars)"
|
15
|
+
test x"$debug" = xtrue
|
16
|
+
test x"$lint" != x
|
17
|
+
test -f "$lint"
|
18
|
+
}
|
19
|
+
|
20
|
+
t_begin "killing succeeds" && {
|
21
|
+
kill $unicorn_pid
|
22
|
+
check_stderr
|
23
|
+
}
|
24
|
+
|
25
|
+
t_done
|
data/t/t0301.ru
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#\-N --debug
|
2
|
+
# frozen_string_literal: false
|
3
|
+
run(lambda do |env|
|
4
|
+
case env['PATH_INFO']
|
5
|
+
when '/vars'
|
6
|
+
b = "debug=#{$DEBUG.inspect}\n" \
|
7
|
+
"lint=#{caller.grep(%r{rack/lint\.rb})[0].split(':')[0]}\n"
|
8
|
+
end
|
9
|
+
h = {
|
10
|
+
'content-length' => b.size.to_s,
|
11
|
+
'content-type' => 'text/plain',
|
12
|
+
}
|
13
|
+
[ 200, h, [ b ] ]
|
14
|
+
end)
|
data/t/t9001-oob_gc.sh
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 9 "OobGC test"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
unicorn -D -c $unicorn_config oob_gc.ru
|
8
|
+
unicorn_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "test default interval (4 requests)" && {
|
12
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
13
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
14
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
15
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
16
|
+
}
|
17
|
+
|
18
|
+
t_begin "GC starting-request returns immediately" && {
|
19
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
20
|
+
}
|
21
|
+
|
22
|
+
t_begin "GC is started after 5 requests" && {
|
23
|
+
test xtrue = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
24
|
+
}
|
25
|
+
|
26
|
+
t_begin "reset GC" && {
|
27
|
+
test xfalse = x$(curl -vsSf -X POST http://$listen/gc_reset 2>> $tmp)
|
28
|
+
}
|
29
|
+
|
30
|
+
t_begin "test default interval again (3 requests)" && {
|
31
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
32
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
33
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
34
|
+
}
|
35
|
+
|
36
|
+
t_begin "GC is started after 5 requests" && {
|
37
|
+
test xtrue = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
38
|
+
}
|
39
|
+
|
40
|
+
t_begin "killing succeeds" && {
|
41
|
+
kill -QUIT $unicorn_pid
|
42
|
+
}
|
43
|
+
|
44
|
+
t_begin "check_stderr" && check_stderr
|
45
|
+
dbgcat r_err
|
46
|
+
|
47
|
+
t_done
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 12 "OobGC test with limited path"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
unicorn -D -c $unicorn_config oob_gc_path.ru
|
8
|
+
unicorn_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "test default is noop" && {
|
12
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
13
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
14
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
15
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
16
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
17
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
18
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
19
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
20
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
21
|
+
}
|
22
|
+
|
23
|
+
t_begin "4 bad requests to bump counter" && {
|
24
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
25
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
26
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
27
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
28
|
+
}
|
29
|
+
|
30
|
+
t_begin "GC-starting request returns immediately" && {
|
31
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
32
|
+
}
|
33
|
+
|
34
|
+
t_begin "GC was started after 5 requests" && {
|
35
|
+
test xtrue = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
36
|
+
}
|
37
|
+
|
38
|
+
t_begin "reset GC" && {
|
39
|
+
test xfalse = x$(curl -vsSf -X POST http://$listen/gc_reset 2>> $tmp)
|
40
|
+
}
|
41
|
+
|
42
|
+
t_begin "test default is noop" && {
|
43
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
44
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
45
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
46
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
47
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
48
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
49
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
50
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
51
|
+
test xfalse = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
52
|
+
}
|
53
|
+
|
54
|
+
t_begin "4 bad requests to bump counter" && {
|
55
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
56
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
57
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
58
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
59
|
+
}
|
60
|
+
|
61
|
+
t_begin "GC-starting request returns immediately" && {
|
62
|
+
test xfalse = x$(curl -vsSf http://$listen/BAD 2>> $tmp)
|
63
|
+
}
|
64
|
+
|
65
|
+
t_begin "GC was started after 5 requests" && {
|
66
|
+
test xtrue = x$(curl -vsSf http://$listen/ 2>> $tmp)
|
67
|
+
}
|
68
|
+
|
69
|
+
t_begin "killing succeeds" && {
|
70
|
+
kill -QUIT $unicorn_pid
|
71
|
+
}
|
72
|
+
|
73
|
+
t_begin "check_stderr" && check_stderr
|
74
|
+
|
75
|
+
t_done
|
data/t/test-lib.sh
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# Copyright (c) 2009 Rainbows! hackers
|
3
|
+
# Copyright (c) 2010 Unicorn hackers
|
4
|
+
. ./my-tap-lib.sh
|
5
|
+
|
6
|
+
set +u
|
7
|
+
|
8
|
+
# sometimes we rely on http_proxy to avoid wasting bandwidth with Isolate
|
9
|
+
# and multiple Ruby versions
|
10
|
+
NO_PROXY=${UNICORN_TEST_ADDR-127.0.0.1}
|
11
|
+
export NO_PROXY
|
12
|
+
|
13
|
+
set -e
|
14
|
+
RUBY="${RUBY-ruby}"
|
15
|
+
RUBY_VERSION=${RUBY_VERSION-$($RUBY -e 'puts RUBY_VERSION')}
|
16
|
+
RUBY_ENGINE=${RUBY_ENGINE-$($RUBY -e 'puts((RUBY_ENGINE rescue "ruby"))')}
|
17
|
+
t_pfx=$PWD/trash/$T-$RUBY_ENGINE-$RUBY_VERSION
|
18
|
+
set -u
|
19
|
+
|
20
|
+
PATH=$PWD/bin:$PATH
|
21
|
+
export PATH
|
22
|
+
|
23
|
+
test -x $PWD/bin/unused_listen || die "must be run in 't' directory"
|
24
|
+
|
25
|
+
wait_for_pid () {
|
26
|
+
path="$1"
|
27
|
+
nr=30
|
28
|
+
while ! test -s "$path" && test $nr -gt 0
|
29
|
+
do
|
30
|
+
nr=$(($nr - 1))
|
31
|
+
sleep 1
|
32
|
+
done
|
33
|
+
}
|
34
|
+
|
35
|
+
# "unix_time" is not in POSIX, but in GNU, and FreeBSD 9.0 (possibly earlier)
|
36
|
+
unix_time () {
|
37
|
+
$RUBY -e 'puts Time.now.to_i'
|
38
|
+
}
|
39
|
+
|
40
|
+
# "wc -l" outputs leading whitespace on *BSDs, filter it out for portability
|
41
|
+
count_lines () {
|
42
|
+
wc -l | tr -d '[:space:]'
|
43
|
+
}
|
44
|
+
|
45
|
+
# "wc -c" outputs leading whitespace on *BSDs, filter it out for portability
|
46
|
+
count_bytes () {
|
47
|
+
wc -c | tr -d '[:space:]'
|
48
|
+
}
|
49
|
+
|
50
|
+
# given a list of variable names, create temporary files and assign
|
51
|
+
# the pathnames to those variables
|
52
|
+
rtmpfiles () {
|
53
|
+
for id in "$@"
|
54
|
+
do
|
55
|
+
name=$id
|
56
|
+
|
57
|
+
case $name in
|
58
|
+
*fifo)
|
59
|
+
_tmp=$t_pfx.$id
|
60
|
+
eval "$id=$_tmp"
|
61
|
+
rm -f $_tmp
|
62
|
+
mkfifo $_tmp
|
63
|
+
T_RM_LIST="$T_RM_LIST $_tmp"
|
64
|
+
;;
|
65
|
+
*socket)
|
66
|
+
_tmp="$(mktemp -t $id.$$.XXXXXXXX)"
|
67
|
+
if test $(printf "$_tmp" |count_bytes) -gt 108
|
68
|
+
then
|
69
|
+
echo >&2 "$_tmp too long, tests may fail"
|
70
|
+
echo >&2 "Try to set TMPDIR to a shorter path"
|
71
|
+
fi
|
72
|
+
eval "$id=$_tmp"
|
73
|
+
rm -f $_tmp
|
74
|
+
T_RM_LIST="$T_RM_LIST $_tmp"
|
75
|
+
;;
|
76
|
+
*)
|
77
|
+
_tmp=$t_pfx.$id
|
78
|
+
eval "$id=$_tmp"
|
79
|
+
> $_tmp
|
80
|
+
T_OK_RM_LIST="$T_OK_RM_LIST $_tmp"
|
81
|
+
;;
|
82
|
+
esac
|
83
|
+
done
|
84
|
+
}
|
85
|
+
|
86
|
+
dbgcat () {
|
87
|
+
id=$1
|
88
|
+
eval '_file=$'$id
|
89
|
+
echo "==> $id <=="
|
90
|
+
sed -e "s/^/$id:/" < $_file
|
91
|
+
}
|
92
|
+
|
93
|
+
check_stderr () {
|
94
|
+
set +u
|
95
|
+
_r_err=${1-${r_err}}
|
96
|
+
set -u
|
97
|
+
if grep -v $T $_r_err | grep -i Error | \
|
98
|
+
grep -v NameError.*Unicorn::Waiter
|
99
|
+
then
|
100
|
+
die "Errors found in $_r_err"
|
101
|
+
elif grep SIGKILL $_r_err
|
102
|
+
then
|
103
|
+
die "SIGKILL found in $_r_err"
|
104
|
+
fi
|
105
|
+
}
|
106
|
+
|
107
|
+
# unicorn_setup
|
108
|
+
unicorn_setup () {
|
109
|
+
eval $(unused_listen)
|
110
|
+
port=$(expr $listen : '[^:]*:\([0-9]*\)')
|
111
|
+
host=$(expr $listen : '\([^:][^:]*\):[0-9][0-9]*')
|
112
|
+
|
113
|
+
rtmpfiles unicorn_config pid r_err r_out fifo tmp ok
|
114
|
+
cat > $unicorn_config <<EOF
|
115
|
+
listen "$listen"
|
116
|
+
pid "$pid"
|
117
|
+
stderr_path "$r_err"
|
118
|
+
stdout_path "$r_out"
|
119
|
+
EOF
|
120
|
+
}
|
121
|
+
|
122
|
+
unicorn_wait_start () {
|
123
|
+
# no need to play tricks with FIFOs since we got "ready_pipe" now
|
124
|
+
unicorn_pid=$(cat $pid)
|
125
|
+
}
|