rainbows 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +12 -6
- data/README +3 -2
- data/Rakefile +3 -3
- data/TODO +2 -9
- data/lib/rainbows.rb +1 -0
- data/lib/rainbows/app_pool.rb +10 -6
- data/lib/rainbows/base.rb +1 -1
- data/lib/rainbows/const.rb +1 -1
- data/lib/rainbows/ev_core.rb +88 -0
- data/lib/rainbows/event_machine.rb +218 -0
- data/lib/rainbows/http_server.rb +4 -1
- data/lib/rainbows/rev.rb +21 -89
- data/lib/rainbows/revactor.rb +4 -10
- data/local.mk.sample +13 -7
- data/rainbows.gemspec +17 -2
- data/t/.gitignore +1 -0
- data/t/GNUmakefile +63 -40
- data/t/README +6 -2
- data/t/async_sinatra.ru +13 -0
- data/t/bin/unused_listen +1 -1
- data/t/large-file-response.ru +1 -0
- data/t/my-tap-lib.sh +200 -0
- data/t/simple-http_Base.ru +3 -0
- data/t/simple-http_EventMachine.ru +9 -0
- data/t/simple-http_Rev.ru +9 -0
- data/t/simple-http_Revactor.ru +10 -0
- data/t/simple-http_ThreadPool.ru +10 -0
- data/t/simple-http_ThreadSpawn.ru +10 -0
- data/t/t0000-simple-http.sh +142 -0
- data/t/t0001-unix-http.sh +103 -0
- data/t/t0002-graceful.sh +32 -0
- data/t/t0002-parser-error.sh +31 -0
- data/t/t0003-reopen-logs.sh +97 -0
- data/t/t0005-large-file-response.sh +83 -0
- data/t/t0100-rack-input-hammer.sh +45 -0
- data/t/t0101-rack-input-trailer.sh +68 -0
- data/t/t0200-async-response.sh +66 -0
- data/t/t0201-async-response-no-autochunk.sh +3 -0
- data/t/t0300-async_sinatra.sh +65 -0
- data/t/t9000-rack-app-pool.sh +45 -33
- data/t/test-lib.sh +67 -56
- metadata +26 -56
- data/t/lib-async-response-no-autochunk.sh +0 -6
- data/t/lib-async-response.sh +0 -45
- data/t/lib-graceful.sh +0 -40
- data/t/lib-input-trailer.sh +0 -63
- data/t/lib-large-file-response.sh +0 -45
- data/t/lib-parser-error.sh +0 -29
- data/t/lib-rack-input-hammer.sh +0 -38
- data/t/lib-reopen-logs.sh +0 -60
- data/t/lib-simple-http.sh +0 -92
- data/t/t0000-basic.sh +0 -2
- data/t/t1000-thread-pool-basic.sh +0 -2
- data/t/t1002-thread-pool-graceful.sh +0 -2
- data/t/t1003-thread-pool-reopen-logs.sh +0 -2
- data/t/t1004-thread-pool-async-response.sh +0 -45
- data/t/t1005-thread-pool-large-file-response.sh +0 -45
- data/t/t1006-thread-pool-async-response-no-autochunk.sh +0 -6
- data/t/t1100-thread-pool-rack-input.sh +0 -2
- data/t/t1101-thread-pool-input-trailer.sh +0 -2
- data/t/t2000-thread-spawn-basic.sh +0 -2
- data/t/t2002-thread-spawn-graceful.sh +0 -2
- data/t/t2003-thread-spawn-reopen-logs.sh +0 -2
- data/t/t2004-thread-spawn-async-response.sh +0 -45
- data/t/t2005-thread-spawn-large-file-response.sh +0 -45
- data/t/t2006-thread-spawn-async-response-no-autochunk.sh +0 -6
- data/t/t2100-thread-spawn-rack-input.sh +0 -2
- data/t/t2101-thread-spawn-input-trailer.sh +0 -2
- data/t/t3000-revactor-basic.sh +0 -2
- data/t/t3002-revactor-graceful.sh +0 -2
- data/t/t3003-revactor-reopen-logs.sh +0 -2
- data/t/t3004-revactor-async-response.sh +0 -45
- data/t/t3005-revactor-large-file-response.sh +0 -2
- data/t/t3006-revactor-async-response-no-autochunk.sh +0 -6
- data/t/t3100-revactor-rack-input.sh +0 -2
- data/t/t3101-revactor-rack-input-trailer.sh +0 -2
- data/t/t4000-rev-basic.sh +0 -2
- data/t/t4002-rev-graceful.sh +0 -2
- data/t/t4003-rev-parser-error.sh +0 -2
- data/t/t4003-rev-reopen-logs.sh +0 -2
- data/t/t4004-rev-async-response.sh +0 -45
- data/t/t4005-rev-large-file-response.sh +0 -2
- data/t/t4006-rev-async-response-no-autochunk.sh +0 -6
- data/t/t4100-rev-rack-input.sh +0 -2
- data/t/t4101-rev-rack-input-trailer.sh +0 -2
data/t/t0002-graceful.sh
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
|
4
|
+
t_plan 4 "graceful exit test for $model"
|
5
|
+
|
6
|
+
t_begin "setup and startup" && {
|
7
|
+
rtmpfiles curl_out
|
8
|
+
rainbows_setup $model
|
9
|
+
rainbows -D sleep.ru -c $unicorn_config
|
10
|
+
rainbows_wait_start
|
11
|
+
}
|
12
|
+
|
13
|
+
t_begin "send a request and SIGQUIT while request is processing" && {
|
14
|
+
curl -sSfv -T- </dev/null http://$listen/5 > $curl_out 2> $fifo &
|
15
|
+
awk -v rainbows_pid=$rainbows_pid '
|
16
|
+
{ print $0 }
|
17
|
+
/100 Continue/ {
|
18
|
+
print "awk: sending SIGQUIT to", rainbows_pid
|
19
|
+
system("kill -QUIT "rainbows_pid)
|
20
|
+
}' $fifo
|
21
|
+
wait
|
22
|
+
}
|
23
|
+
|
24
|
+
dbgcat r_err
|
25
|
+
|
26
|
+
t_begin 'response returned "Hello"' && {
|
27
|
+
test x$(cat $curl_out) = xHello
|
28
|
+
}
|
29
|
+
|
30
|
+
t_begin 'stderr has no errors' && check_stderr
|
31
|
+
|
32
|
+
t_done
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 5 "parser error test for $model"
|
4
|
+
|
5
|
+
t_begin "setup and startup" && {
|
6
|
+
rainbows_setup $model
|
7
|
+
rainbows -D env.ru -c $unicorn_config
|
8
|
+
rainbows_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "send request" && {
|
12
|
+
(
|
13
|
+
printf 'GET / HTTP/1/1\r\nHost: example.com\r\n\r\n'
|
14
|
+
cat $fifo > $tmp &
|
15
|
+
wait
|
16
|
+
echo ok > $ok
|
17
|
+
) | socat - TCP:$listen > $fifo
|
18
|
+
test xok = x$(cat $ok)
|
19
|
+
}
|
20
|
+
|
21
|
+
dbgcat tmp
|
22
|
+
|
23
|
+
t_begin "response should be a 400" && {
|
24
|
+
grep -F 'HTTP/1.1 400 Bad Request' $tmp
|
25
|
+
}
|
26
|
+
|
27
|
+
t_begin "server stderr should be clean" && check_stderr
|
28
|
+
|
29
|
+
t_begin "term signal sent" && kill $rainbows_pid
|
30
|
+
|
31
|
+
t_done
|
@@ -0,0 +1,97 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# don't set nr_client for Rev, only _one_ app running at once :x
|
3
|
+
nr_client=${nr_client-2}
|
4
|
+
. ./test-lib.sh
|
5
|
+
|
6
|
+
t_plan 18 "reopen rotated logs"
|
7
|
+
|
8
|
+
t_begin "setup and startup" && {
|
9
|
+
rtmpfiles curl_out curl_err r_rot
|
10
|
+
rainbows_setup $model
|
11
|
+
rainbows -D sleep.ru -c $unicorn_config
|
12
|
+
rainbows_wait_start
|
13
|
+
}
|
14
|
+
|
15
|
+
t_begin "ensure server is responsive" && {
|
16
|
+
curl -sSf http://$listen/ >/dev/null
|
17
|
+
}
|
18
|
+
|
19
|
+
t_begin "start $nr_client concurrent requests" && {
|
20
|
+
start=$(date +%s)
|
21
|
+
for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
|
22
|
+
do
|
23
|
+
( curl -sSf http://$listen/2 >> $curl_out 2>> $curl_err ) &
|
24
|
+
done
|
25
|
+
}
|
26
|
+
|
27
|
+
t_begin "ensure stderr log is clean" && check_stderr
|
28
|
+
|
29
|
+
t_begin "external log rotation" && {
|
30
|
+
rm -f $r_rot
|
31
|
+
mv $r_err $r_rot
|
32
|
+
}
|
33
|
+
|
34
|
+
t_begin "send reopen log signal (USR1)" && {
|
35
|
+
kill -USR1 $rainbows_pid
|
36
|
+
}
|
37
|
+
|
38
|
+
t_begin "wait for rotated log to reappear" && {
|
39
|
+
nr=60
|
40
|
+
while ! test -f $r_err && test $nr -ge 0
|
41
|
+
do
|
42
|
+
sleep 1
|
43
|
+
nr=$(( $nr - 1 ))
|
44
|
+
done
|
45
|
+
}
|
46
|
+
|
47
|
+
dbgcat r_rot
|
48
|
+
dbgcat r_err
|
49
|
+
|
50
|
+
t_begin "wait curl requests to finish" && {
|
51
|
+
wait
|
52
|
+
t_info elapsed=$(( $(date +%s) - $start ))
|
53
|
+
}
|
54
|
+
|
55
|
+
t_begin "ensure no errors from curl" && {
|
56
|
+
test ! -s $curl_err
|
57
|
+
}
|
58
|
+
|
59
|
+
t_begin "curl got $nr_client responses" && {
|
60
|
+
test "$(wc -l < $curl_out)" -eq $nr_client
|
61
|
+
}
|
62
|
+
|
63
|
+
t_begin "all responses were identical" && {
|
64
|
+
nr=$(sort < $curl_out | uniq | wc -l)
|
65
|
+
test "$nr" -eq 1
|
66
|
+
}
|
67
|
+
|
68
|
+
t_begin 'response was "Hello"' && {
|
69
|
+
test x$(sort < $curl_out | uniq) = xHello
|
70
|
+
}
|
71
|
+
|
72
|
+
t_begin "current server stderr is clean" && check_stderr
|
73
|
+
|
74
|
+
t_begin "rotated stderr is clean" && {
|
75
|
+
check_stderr $r_rot
|
76
|
+
}
|
77
|
+
|
78
|
+
t_begin "server is now writing logs to new stderr" && {
|
79
|
+
before_rot=$(wc -c < $r_rot)
|
80
|
+
before_err=$(wc -c < $r_err)
|
81
|
+
curl -sSfv http://$listen/
|
82
|
+
after_rot=$(wc -c < $r_rot)
|
83
|
+
after_err=$(wc -c < $r_err)
|
84
|
+
test $after_rot -eq $before_rot
|
85
|
+
test $after_err -gt $before_err
|
86
|
+
}
|
87
|
+
|
88
|
+
t_begin "stop server" && {
|
89
|
+
kill $rainbows_pid
|
90
|
+
}
|
91
|
+
|
92
|
+
dbgcat r_err
|
93
|
+
|
94
|
+
t_begin "current server stderr is clean" && check_stderr
|
95
|
+
t_begin "rotated stderr is clean" && check_stderr $r_rot
|
96
|
+
|
97
|
+
t_done
|
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
test -r random_blob || die "random_blob required, run with 'make $0'"
|
4
|
+
|
5
|
+
if ! grep -v ^VmRSS: /proc/self/status >/dev/null 2>&1
|
6
|
+
then
|
7
|
+
t_info "skipping, can't read RSS from /proc/self/status"
|
8
|
+
exit 0
|
9
|
+
fi
|
10
|
+
|
11
|
+
t_plan 10 "large file response slurp avoidance for $model"
|
12
|
+
|
13
|
+
t_begin "setup and startup" && {
|
14
|
+
rtmpfiles curl_out
|
15
|
+
rainbows_setup $model
|
16
|
+
# can't load Rack::Lint here since it'll cause Rev to slurp
|
17
|
+
rainbows -E none -D large-file-response.ru -c $unicorn_config
|
18
|
+
rainbows_wait_start
|
19
|
+
}
|
20
|
+
|
21
|
+
t_begin "read random blob size" && {
|
22
|
+
random_blob_size=$(wc -c < random_blob)
|
23
|
+
}
|
24
|
+
|
25
|
+
t_begin "read current RSS" && {
|
26
|
+
curl -v http://$listen/rss
|
27
|
+
dbgcat r_err
|
28
|
+
rss_before=$(curl -sSfv http://$listen/rss)
|
29
|
+
t_info "rss_before=$rss_before"
|
30
|
+
}
|
31
|
+
|
32
|
+
t_begin "send a series HTTP/1.1 requests sequentially" && {
|
33
|
+
for i in a b c
|
34
|
+
do
|
35
|
+
size=$( (curl -sSfv http://$listen/random_blob &&
|
36
|
+
echo ok >$ok) |wc -c)
|
37
|
+
test $size -eq $random_blob_size
|
38
|
+
test xok = x$(cat $ok)
|
39
|
+
done
|
40
|
+
}
|
41
|
+
|
42
|
+
# this was a problem during development
|
43
|
+
t_begin "HTTP/1.0 test" && {
|
44
|
+
size=$( (curl -0 -sSfv http://$listen/random_blob &&
|
45
|
+
echo ok >$ok) |wc -c)
|
46
|
+
test $size -eq $random_blob_size
|
47
|
+
test xok = x$(cat $ok)
|
48
|
+
}
|
49
|
+
|
50
|
+
t_begin "HTTP/0.9 test" && {
|
51
|
+
(
|
52
|
+
printf 'GET /random_blob\r\n'
|
53
|
+
cat $fifo > $tmp &
|
54
|
+
wait
|
55
|
+
echo ok > $ok
|
56
|
+
) | socat - TCP:$listen > $fifo
|
57
|
+
cmp $tmp random_blob
|
58
|
+
test xok = x$(cat $ok)
|
59
|
+
}
|
60
|
+
|
61
|
+
dbgcat r_err
|
62
|
+
|
63
|
+
t_begin "read RSS again" && {
|
64
|
+
curl -v http://$listen/rss
|
65
|
+
rss_after=$(curl -sSfv http://$listen/rss)
|
66
|
+
t_info "rss_after=$rss_after"
|
67
|
+
}
|
68
|
+
|
69
|
+
t_begin "shutdown server" && {
|
70
|
+
kill -QUIT $rainbows_pid
|
71
|
+
}
|
72
|
+
|
73
|
+
t_begin "compare RSS before and after" && {
|
74
|
+
diff=$(( $rss_after - $rss_before ))
|
75
|
+
t_info "test diff=$diff < orig=$random_blob_size"
|
76
|
+
test $diff -le $random_blob_size
|
77
|
+
}
|
78
|
+
|
79
|
+
dbgcat r_err
|
80
|
+
|
81
|
+
t_begin "check stderr" && check_stderr
|
82
|
+
|
83
|
+
t_done
|
@@ -0,0 +1,45 @@
|
|
1
|
+
nr_client=${nr_client-4}
|
2
|
+
. ./test-lib.sh
|
3
|
+
test -r random_blob || die "random_blob required, run with 'make $0'"
|
4
|
+
|
5
|
+
t_plan 7 "concurrent rack.input hammer stress test"
|
6
|
+
|
7
|
+
t_begin "setup and startup" && {
|
8
|
+
rtmpfiles curl_out curl_err
|
9
|
+
rainbows_setup $model
|
10
|
+
rainbows -D sha1.ru -c $unicorn_config
|
11
|
+
rainbows_wait_start
|
12
|
+
}
|
13
|
+
|
14
|
+
t_begin "send $nr_client concurrent requests" && {
|
15
|
+
start=$(date +%s)
|
16
|
+
for i in $(awk "BEGIN{for(i=0;i<$nr_client;++i) print i}" </dev/null)
|
17
|
+
do
|
18
|
+
(
|
19
|
+
curl -sSf -T- http://$listen/$i \
|
20
|
+
< random_blob >> $curl_out 2>> $curl_err
|
21
|
+
) &
|
22
|
+
done
|
23
|
+
wait
|
24
|
+
t_info elapsed=$(( $(date +%s) - $start ))
|
25
|
+
}
|
26
|
+
|
27
|
+
t_begin "kill server" && kill $rainbows_pid
|
28
|
+
|
29
|
+
t_begin "got $nr_client responses" && {
|
30
|
+
test $nr_client -eq $(wc -l < $curl_out)
|
31
|
+
}
|
32
|
+
|
33
|
+
t_begin "all responses identical" && {
|
34
|
+
test 1 -eq $(sort < $curl_out | uniq | wc -l)
|
35
|
+
}
|
36
|
+
|
37
|
+
t_begin "sha1 matches on-disk sha1" && {
|
38
|
+
blob_sha1=$( expr "$(sha1sum < random_blob)" : '\([a-f0-9]\+\)')
|
39
|
+
t_info blob_sha1=$blob_sha1
|
40
|
+
test x"$blob_sha1" = x"$(sort < $curl_out | uniq)"
|
41
|
+
}
|
42
|
+
|
43
|
+
t_begin "no errors in stderr log" && check_stderr
|
44
|
+
|
45
|
+
t_done
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
test -r random_blob || die "random_blob required, run with 'make $0'"
|
4
|
+
|
5
|
+
t_plan 11 "input trailer test $model"
|
6
|
+
|
7
|
+
t_begin "setup and startup" && {
|
8
|
+
rtmpfiles curl_out
|
9
|
+
rainbows_setup $model
|
10
|
+
rainbows -D content-md5.ru -c $unicorn_config
|
11
|
+
rainbows_wait_start
|
12
|
+
}
|
13
|
+
|
14
|
+
t_begin "upload small blob" && {
|
15
|
+
(
|
16
|
+
cat $fifo > $tmp &
|
17
|
+
echo hello world | content-md5-put
|
18
|
+
wait
|
19
|
+
echo ok > $ok
|
20
|
+
) | socat - TCP:$listen > $fifo
|
21
|
+
test xok = x"$(cat $ok)"
|
22
|
+
}
|
23
|
+
|
24
|
+
t_begin "HTTP response is OK" && fgrep 'HTTP/1.1 200 OK' $tmp
|
25
|
+
t_begin "no errors in stderr log" && check_stderr
|
26
|
+
|
27
|
+
t_begin "big blob request" && {
|
28
|
+
(
|
29
|
+
cat $fifo > $tmp &
|
30
|
+
content-md5-put < random_blob
|
31
|
+
wait
|
32
|
+
echo ok > $ok
|
33
|
+
) | socat - TCP:$listen > $fifo
|
34
|
+
test xok = x"$(cat $ok)"
|
35
|
+
}
|
36
|
+
|
37
|
+
t_begin "HTTP response is OK" && fgrep 'HTTP/1.1 200 OK' $tmp
|
38
|
+
t_begin "no errors in stderr log" && check_stderr
|
39
|
+
|
40
|
+
t_begin "staggered blob upload" && {
|
41
|
+
(
|
42
|
+
cat $fifo > $tmp &
|
43
|
+
(
|
44
|
+
dd bs=164 count=1 < random_blob
|
45
|
+
sleep 2
|
46
|
+
dd bs=4545 count=1 < random_blob
|
47
|
+
sleep 2
|
48
|
+
dd bs=1234 count=1 < random_blob
|
49
|
+
echo subok > $ok
|
50
|
+
) 2>/dev/null | content-md5-put
|
51
|
+
test xsubok = x"$(cat $ok)"
|
52
|
+
wait
|
53
|
+
echo ok > $ok
|
54
|
+
) | socat - TCP:$listen > $fifo
|
55
|
+
test xok = x"$(cat $ok)"
|
56
|
+
}
|
57
|
+
|
58
|
+
t_begin "HTTP response is OK" && {
|
59
|
+
fgrep 'HTTP/1.1 200 OK' $tmp
|
60
|
+
}
|
61
|
+
|
62
|
+
t_begin "no errors in stderr log" && check_stderr
|
63
|
+
|
64
|
+
t_begin "kill server" && {
|
65
|
+
kill $rainbows_pid
|
66
|
+
}
|
67
|
+
|
68
|
+
t_done
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
CONFIG_RU=${CONFIG_RU-'async-response.ru'}
|
3
|
+
. ./test-lib.sh
|
4
|
+
|
5
|
+
case $CONFIG_RU in
|
6
|
+
*no-autochunk.ru)
|
7
|
+
t_plan 7 "async response w/o autochunk for $model"
|
8
|
+
skip_autochunk=true
|
9
|
+
;;
|
10
|
+
*)
|
11
|
+
t_plan 6 "async response for $model"
|
12
|
+
skip_autochunk=false
|
13
|
+
;;
|
14
|
+
esac
|
15
|
+
|
16
|
+
t_begin "setup and start" && {
|
17
|
+
rainbows_setup
|
18
|
+
rtmpfiles a b c curl_err
|
19
|
+
# can't load Rack::Lint here since it'll cause Rev to slurp
|
20
|
+
rainbows -E none -D $CONFIG_RU -c $unicorn_config
|
21
|
+
rainbows_wait_start
|
22
|
+
}
|
23
|
+
|
24
|
+
t_begin "send async requests off in parallel" && {
|
25
|
+
t0=$(date +%s)
|
26
|
+
( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $a) &
|
27
|
+
( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $b) &
|
28
|
+
( curl --no-buffer -sSf http://$listen/ 2>> $curl_err | utee $c) &
|
29
|
+
wait
|
30
|
+
t1=$(date +%s)
|
31
|
+
}
|
32
|
+
|
33
|
+
t_begin "ensure elapsed requests were processed in parallel" && {
|
34
|
+
elapsed=$(( $t1 - $t0 ))
|
35
|
+
echo "elapsed=$elapsed < 30"
|
36
|
+
test $elapsed -lt 30
|
37
|
+
}
|
38
|
+
|
39
|
+
t_begin "termination signal sent" && {
|
40
|
+
kill $rainbows_pid
|
41
|
+
}
|
42
|
+
|
43
|
+
dbgcat a
|
44
|
+
dbgcat b
|
45
|
+
dbgcat c
|
46
|
+
dbgcat r_err
|
47
|
+
dbgcat curl_err
|
48
|
+
|
49
|
+
t_begin "no errors from curl" && {
|
50
|
+
test ! -s $curl_err
|
51
|
+
}
|
52
|
+
|
53
|
+
t_begin "no errors in stderr" && check_stderr
|
54
|
+
|
55
|
+
dbgcat r_err
|
56
|
+
|
57
|
+
if $skip_autochunk
|
58
|
+
then
|
59
|
+
t_begin "no responses are chunked" && {
|
60
|
+
test x"$(cat $a)" = x0123456789
|
61
|
+
test x"$(cat $b)" = x0123456789
|
62
|
+
test x"$(cat $c)" = x0123456789
|
63
|
+
}
|
64
|
+
fi
|
65
|
+
|
66
|
+
t_done
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
|
4
|
+
# n - number of seconds to sleep
|
5
|
+
n=10
|
6
|
+
CONFIG_RU=async_sinatra.ru
|
7
|
+
case $model in
|
8
|
+
EventMachine) ;;
|
9
|
+
*)
|
10
|
+
t_info "skipping $T since it's not compatible with $model"
|
11
|
+
exit 0
|
12
|
+
;;
|
13
|
+
esac
|
14
|
+
|
15
|
+
t_plan 7 "async_sinatra test for EM"
|
16
|
+
|
17
|
+
t_begin "setup and start" && {
|
18
|
+
rainbows_setup
|
19
|
+
rtmpfiles a b c curl_err
|
20
|
+
|
21
|
+
# Async Sinatra does not support Rack::Lint
|
22
|
+
rainbows -E none -D $CONFIG_RU -c $unicorn_config
|
23
|
+
rainbows_wait_start
|
24
|
+
}
|
25
|
+
|
26
|
+
t_begin "send async requests off in parallel" && {
|
27
|
+
t0=$(date +%s)
|
28
|
+
( curl --no-buffer -sSf http://$listen/$n 2>> $curl_err | utee $a) &
|
29
|
+
( curl --no-buffer -sSf http://$listen/$n 2>> $curl_err | utee $b) &
|
30
|
+
( curl --no-buffer -sSf http://$listen/$n 2>> $curl_err | utee $c) &
|
31
|
+
}
|
32
|
+
|
33
|
+
t_begin "ensure elapsed requests were processed in parallel" && {
|
34
|
+
wait
|
35
|
+
t1=$(date +%s)
|
36
|
+
elapsed=$(( $t1 - $t0 ))
|
37
|
+
echo "elapsed=$elapsed < 30"
|
38
|
+
test $elapsed -lt 30
|
39
|
+
}
|
40
|
+
|
41
|
+
t_begin "termination signal sent" && {
|
42
|
+
kill $rainbows_pid
|
43
|
+
}
|
44
|
+
|
45
|
+
dbgcat a
|
46
|
+
dbgcat b
|
47
|
+
dbgcat c
|
48
|
+
dbgcat r_err
|
49
|
+
dbgcat curl_err
|
50
|
+
|
51
|
+
t_begin "no errors from curl" && {
|
52
|
+
test ! -s $curl_err
|
53
|
+
}
|
54
|
+
|
55
|
+
t_begin "no errors in stderr" && check_stderr
|
56
|
+
|
57
|
+
dbgcat r_err
|
58
|
+
|
59
|
+
t_begin "no responses are chunked" && {
|
60
|
+
test x"$(cat $a)" = x"delayed for $n seconds"
|
61
|
+
test x"$(cat $b)" = x"delayed for $n seconds"
|
62
|
+
test x"$(cat $c)" = x"delayed for $n seconds"
|
63
|
+
}
|
64
|
+
|
65
|
+
t_done
|