RevThreadSpawn is still experimental
[rainbows.git] / t / test-lib.sh
blob1e22cb3cd9d191ae3022dcdfc3afe2fe123349be
1 #!/bin/sh
2 # Copyright (c) 2009 Rainbows! developers
3 . ./my-tap-lib.sh
5 set +u
6 if test -z "$model"
7 then
8 # defaulting to Base would unfortunately fail some concurrency tests
9 model=ThreadSpawn
10 t_info "model undefined, defaulting to $model"
13 set -e
14 RUBY="${RUBY-ruby}"
15 RUBY_VERSION=${RUBY_VERSION-$($RUBY -e 'puts RUBY_VERSION')}
16 t_pfx=$PWD/trash/$model.$T-$RUBY_VERSION
17 set -u
19 PATH=$PWD/bin:$PATH
20 export PATH
22 test -x $PWD/bin/unused_listen || die "must be run in 't' directory"
24 wait_for_pid () {
25 path="$1"
26 nr=30
27 while ! test -s "$path" && test $nr -gt 0
29 nr=$(($nr - 1))
30 sleep 1
31 done
34 # requires $1 and prints out the value of $2
35 require_check () {
36 lib=$1
37 const=$2
38 if ! $RUBY -r$lib -e "puts $const" >/dev/null 2>&1
39 then
40 t_info "skipping $T since we don't have $lib"
41 exit 0
45 # given a list of variable names, create temporary files and assign
46 # the pathnames to those variables
47 rtmpfiles () {
48 for id in "$@"
50 name=$id
51 _tmp=$t_pfx.$id
52 eval "$id=$_tmp"
54 case $name in
55 *fifo)
56 rm -f $_tmp
57 mkfifo $_tmp
58 T_RM_LIST="$T_RM_LIST $_tmp"
60 *socket)
61 rm -f $_tmp
62 T_RM_LIST="$T_RM_LIST $_tmp"
65 > $_tmp
66 T_OK_RM_LIST="$T_OK_RM_LIST $_tmp"
68 esac
69 done
72 dbgcat () {
73 id=$1
74 eval '_file=$'$id
75 echo "==> $id <=="
76 sed -e "s/^/$id:/" < $_file
79 check_stderr () {
80 set +u
81 _r_err=${1-${r_err}}
82 set -u
83 if grep Error $_r_err
84 then
85 die "Errors found in $_r_err"
86 elif grep SIGKILL $_r_err
87 then
88 die "SIGKILL found in $_r_err"
92 # rainbows_setup [ MODEL [ WORKER_CONNECTIONS ] ]
93 rainbows_setup () {
94 eval $(unused_listen)
95 rtmpfiles unicorn_config pid r_err r_out fifo tmp ok
96 cat > $unicorn_config <<EOF
97 listen "$listen"
98 pid "$pid"
99 stderr_path "$r_err"
100 stdout_path "$r_out"
102 # close my-tap-lib.sh FDs
103 unless ENV['UNICORN_FD']
104 IO.for_fd(3).close rescue nil
105 IO.for_fd(4).close rescue nil
108 before_fork do |server, worker|
109 # test script will block while reading from $fifo,
110 # so notify the script on the first worker we spawn
111 # by opening the FIFO
112 if worker.nr == 0
113 File.open("$fifo", "wb") { |fp| fp.syswrite "START" }
118 if test $# -ge 1
119 then
120 echo 'Rainbows! do'
121 echo " use :$1"
122 test $# -eq 2 && echo " worker_connections $2"
123 echo end
124 else
125 echo "Rainbows! { use :$model }"
127 } >> $unicorn_config
130 rainbows_wait_start () {
131 # "cat $fifo" will block until the before_fork hook is called in
132 # the Unicorn config file
133 test xSTART = x"$(cat $fifo)"
134 rainbows_pid=$(cat $pid)
137 rsha1 () {
138 _cmd="$(which sha1sum 2>/dev/null || :)"
139 test -n "$_cmd" || _cmd="$(which openssl 2>/dev/null || :) sha1"
140 test "$_cmd" != " sha1" || _cmd="$(which gsha1sum 2>/dev/null || :)"
142 # last resort, see comments in sha1sum.rb for reasoning
143 test -n "$_cmd" || _cmd=sha1sum.rb
144 expr "$($_cmd < random_blob)" : '\([a-f0-9]\{40\}\)'
147 case $model in
148 Rev) require_check rev Rev::VERSION ;;
149 Revactor) require_check revactor Revactor::VERSION ;;
150 EventMachine) require_check eventmachine EventMachine::VERSION ;;
151 esac