about summary refs log tree commit homepage
path: root/t/t0402-async-keepalive.sh
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-01-10 18:07:21 -0800
committerEric Wong <normalperson@yhbt.net>2011-01-11 13:24:23 -0800
commit69d8ec2f167eb99a1efec4a770ba5951e7c366f0 (patch)
tree4a809940fdcfa1f596d48401f7d7e2426ae3453b /t/t0402-async-keepalive.sh
parentbf6eb8f1f79ed57ee317b2e6f73c70a59708739f (diff)
downloadrainbows-69d8ec2f167eb99a1efec4a770ba5951e7c366f0.tar.gz
The lack of an equivlent to EM::Deferrable prevents us from
doing streaming/trickling responses, but a one-shot body
should work fine for Coolio and generating dynamic responses.
Diffstat (limited to 't/t0402-async-keepalive.sh')
-rw-r--r--t/t0402-async-keepalive.sh126
1 files changed, 126 insertions, 0 deletions
diff --git a/t/t0402-async-keepalive.sh b/t/t0402-async-keepalive.sh
new file mode 100644
index 0000000..fdf4cbc
--- /dev/null
+++ b/t/t0402-async-keepalive.sh
@@ -0,0 +1,126 @@
+#!/bin/sh
+DELAY=${DELAY-1}
+. ./test-lib.sh
+case $model in
+Coolio|NeverBlock|EventMachine) ;;
+*)
+        t_info "skipping $T since it's not compatible with $model"
+        exit 0
+        ;;
+esac
+
+t_plan 11 "async_chunk_app test for test for $model"
+
+CONFIG_RU=async_chunk_app.ru
+
+t_begin "setup and start" && {
+        rainbows_setup
+        rtmpfiles a b c curl_err expect
+
+        # this does not does not support Rack::Lint
+        rainbows -E none -D $CONFIG_RU -c $unicorn_config
+        rainbows_wait_start
+
+        echo 'Hello World /0' >> $expect
+        echo 'Hello World /1' >> $expect
+        echo 'Hello World /2' >> $expect
+}
+
+t_begin "async.callback supports pipelining" && {
+        rm -f $tmp
+        t0=$(date +%s)
+        (
+                cat $fifo > $tmp &
+                printf 'GET /0 HTTP/1.1\r\nHost: example.com\r\n\r\n'
+                printf 'GET /1 HTTP/1.1\r\nHost: example.com\r\n\r\n'
+                printf 'GET /2 HTTP/1.0\r\nHost: example.com\r\n\r\n'
+                wait
+        ) | socat - TCP:$listen > $fifo
+        t1=$(date +%s)
+        elapsed=$(( $t1 - $t0 ))
+        t_info "elapsed=$elapsed $model.$0 ($t_current)"
+        test 3 -eq "$(fgrep 'HTTP/1.1 200 OK' $tmp | wc -l)"
+        test 3 -eq "$(grep '^Hello ' $tmp | wc -l)"
+        test 3 -eq "$(grep 'World ' $tmp | wc -l)"
+}
+
+t_begin "async.callback supports pipelining with delay $DELAY" && {
+        rm -f $tmp
+        t0=$(date +%s)
+        (
+                cat $fifo > $tmp &
+                printf 'GET /0 HTTP/1.1\r\nX-Delay: %d\r\n' $DELAY
+                printf 'Host: example.com\r\n\r\n'
+                printf 'GET /1 HTTP/1.1\r\nX-Delay: %d\r\n' $DELAY
+                printf 'Host: example.com\r\n\r\n'
+                printf 'GET /2 HTTP/1.0\r\nX-Delay: %d\r\n' $DELAY
+                printf 'Host: example.com\r\n\r\n'
+                wait
+        ) | socat - TCP:$listen > $fifo
+        t1=$(date +%s)
+        elapsed=$(( $t1 - $t0 ))
+        min=$(( $DELAY * 3 ))
+        t_info "elapsed=$elapsed $model.$0 ($t_current) min=$min"
+        test $elapsed -ge $min
+        test 3 -eq "$(fgrep 'HTTP/1.1 200 OK' $tmp | wc -l)"
+        test 3 -eq "$(grep '^Hello ' $tmp | wc -l)"
+        test 3 -eq "$(grep 'World ' $tmp | wc -l)"
+}
+
+t_begin "async.callback supports keepalive" && {
+        t0=$(date +%s)
+        curl -v --no-buffer -sSf http://$listen/[0-2] > $tmp 2>> $curl_err
+        t1=$(date +%s)
+        elapsed=$(( $t1 - $t0 ))
+        t_info "elapsed=$elapsed $model.$0 ($t_current)"
+        cmp $expect $tmp
+        test 2 -eq "$(fgrep 'Re-using existing connection!' $curl_err |wc -l)"
+        rm -f $curl_err
+}
+
+t_begin "async.callback supports keepalive with delay $DELAY" && {
+        t0=$(date +%s)
+        curl -v --no-buffer -sSf -H "X-Delay: $DELAY" \
+          http://$listen/[0-2] > $tmp 2>> $curl_err
+        t1=$(date +%s)
+        elapsed=$(( $t1 - $t0 ))
+        min=$(( $DELAY * 3 ))
+        t_info "elapsed=$elapsed $model.$0 ($t_current) min=$min"
+        test $elapsed -ge $min
+        cmp $expect $tmp
+        test 2 -eq "$(fgrep 'Re-using existing connection!' $curl_err |wc -l)"
+        rm -f $curl_err
+}
+
+t_begin "send async requests off in parallel" && {
+        t0=$(date +%s)
+        curl --no-buffer -sSf http://$listen/[0-2] > $a 2>> $curl_err &
+        curl --no-buffer -sSf http://$listen/[0-2] > $b 2>> $curl_err &
+        curl --no-buffer -sSf http://$listen/[0-2] > $c 2>> $curl_err &
+}
+
+t_begin "wait for curl terminations" && {
+        wait
+        t1=$(date +%s)
+        elapsed=$(( $t1 - $t0 ))
+        t_info "elapsed=$elapsed"
+}
+
+t_begin "termination signal sent" && {
+        kill $rainbows_pid
+}
+
+t_begin "no errors from curl" && {
+        test ! -s $curl_err
+}
+
+t_begin "no errors in stderr" && check_stderr
+
+t_begin "responses match expected" && {
+        cmp $expect $a
+        cmp $expect $b
+        cmp $expect $c
+}
+
+t_done
+