From f4b084225b7115efecfbfb2b5d16da1f1da5c39e Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 20 May 2011 15:17:21 -0700 Subject: add tests for Kgio autopush on Linux We can support it fully for a subset of concurrency models where we have full control over buffering and HTTP/1.1 keepalive clients. --- t/large-file-response.ru | 3 ++ t/t0044-autopush.sh | 119 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 t/t0044-autopush.sh (limited to 't') diff --git a/t/large-file-response.ru b/t/large-file-response.ru index 84163c1..aaa11c9 100644 --- a/t/large-file-response.ru +++ b/t/large-file-response.ru @@ -9,6 +9,9 @@ map "/rss" do [ 200, {}, [ ($1.to_i * 1024).to_s ] ] } end +map "/pid" do + run lambda { |env| [ 200, {}, [ "#{Process.pid}\n" ] ] } +end map "/" do run Rack::File.new(Dir.pwd) end diff --git a/t/t0044-autopush.sh b/t/t0044-autopush.sh new file mode 100644 index 0000000..e7705d6 --- /dev/null +++ b/t/t0044-autopush.sh @@ -0,0 +1,119 @@ +#!/bin/sh +. ./test-lib.sh +STRACE=$(which strace 2>/dev/null || :) +if ! test -x "$STRACE" +then + t_info "strace not found, skipping $T" + exit 0 +fi +if test x"$(uname -s)" != xLinux +then + t_info "Linux is the only supported OS for $T" + exit 0 +fi + +# these buffer internally in external libraries, so we can't detect when +# to use TCP_CORK +skip_models EventMachine NeverBlock +skip_models Coolio CoolioThreadPool CoolioThreadSpawn +skip_models Revactor Rev RevThreadPool RevThreadSpawn + +# not sure why, but we don't have time to care about Ruby 1.8 too much +case $RUBY_VERSION in +1.8.*) skip_models WriterThreadSpawn WriterThreadPool ;; +esac + +t_plan 13 "Kgio autopush tests" + +t_begin "setup and start" && { + rainbows_setup $model 1 + rtmpfiles strace_out + ed -s $unicorn_config < true, :tcp_nopush => true/ +w +EOF + rainbows -D large-file-response.ru -c $unicorn_config -E none + rainbows_wait_start +} + +t_begin "read worker pid" && { + worker_pid=$(curl -sSf http://$listen/pid) + kill -0 $worker_pid +} + +t_begin "start strace on worker" && { + strace -p $worker_pid -e '!futex' -f -o $strace_out & + strace_pid=$! + sleep 1 +} + +t_begin "reading RSS uncorks" && { + curl -sSf http://$listen/rss >/dev/null + sleep 2 + grep TCP_CORK $strace_out || : + test 2 -eq $(grep TCP_CORK $strace_out |wc -l) + fgrep 'SOL_TCP, TCP_CORK, [0], 4) = 0' $strace_out + fgrep 'SOL_TCP, TCP_CORK, [1], 4) = 0' $strace_out +} + +t_begin "restart strace on worker" && { + kill -9 $strace_pid + wait + + # dbgcat strace_out + > $strace_out + strace -p $worker_pid -e '!futex' -f -o $strace_out & + strace_pid=$! + sleep 1 +} + +t_begin "reading static file uncorks" && { + curl -sSf http://$listen/random_blob >/dev/null + sleep 2 + test 2 -eq $(grep TCP_CORK $strace_out |wc -l) + fgrep 'SOL_TCP, TCP_CORK, [0], 4) = 0' $strace_out + fgrep 'SOL_TCP, TCP_CORK, [1], 4) = 0' $strace_out +} + +t_begin "stop strace on worker" && { + kill -9 $strace_pid + wait +} + +t_begin "enable sendfile" && { + echo >> $unicorn_config 'require "sendfile"' + kill -HUP $rainbows_pid + test xSTART = x"$(cat $fifo)" +} + +t_begin "reread worker pid" && { + worker_pid=$(curl -sSf http://$listen/pid) + kill -0 $worker_pid +} + +t_begin "restart strace on the worker" && { + # dbgcat strace_out + > $strace_out + strace -p $worker_pid -e '!futex' -f -o $strace_out & + strace_pid=$! + sleep 1 +} + +t_begin "HTTP/1.x GET on static file with sendfile uncorks" && { + curl -sSf http://$listen/random_blob >/dev/null + sleep 1 + test 2 -eq $(grep TCP_CORK $strace_out |wc -l) + fgrep 'SOL_TCP, TCP_CORK, [0], 4) = 0' $strace_out + fgrep 'SOL_TCP, TCP_CORK, [1], 4) = 0' $strace_out +} + +t_begin "killing succeeds" && { + kill -9 $strace_pid + wait + # dbgcat strace_out + kill $rainbows_pid +} + +t_begin "check stderr" && check_stderr + +t_done -- cgit v1.2.3-24-ge0c7