]> git.pond.sub.org Git - empserver/blob - tests/test-common.sh
tests: Factor feed_dir out of fire-test and smoke-test
[empserver] / tests / test-common.sh
1 export EMPIREHOST=127.0.0.1 LOGNAME=tester
2
3 if [ -x ./config.status ] && ./config.status --version | grep -q '^Wolfpack Empire'
4 then :
5 else echo "$0: Must be run in root of build tree" >&2; exit 1
6 fi
7
8 test=${0##*/}
9 test=${test%-test}
10
11 empthread=`sed -n 's/empthread *:= *\(.*\)/\1/p' <GNUmakefile`
12 warn_empthread=y
13
14 check_empthread()
15 {
16     if [ "$warn_empthread" ] && [ "$empthread" != "LWP" ]
17     then
18         echo "Warning: test not expected to work with thread package $empthread!" >&2
19         warn_empthread=
20     fi
21 }
22
23 create_sandbox()
24 {
25     rm -rf sandbox
26     mkdir -p sandbox/etc/empire sandbox/share/empire/builtin sandbox/var/empire
27     touch sandbox/etc/empire/schedule
28     cat >sandbox/etc/empire/econfig <<EOF
29 data "../../var/empire"
30 info "../../../../info.nr"
31 builtin "../../share/empire/builtin"
32 listen_addr "$EMPIREHOST"
33 keep_journal 2
34 EOF
35     cp `git ls-files "$srcdir"/src/lib/global | grep '\.config$'` sandbox/share/empire/builtin
36 }
37
38 now()
39 {
40     # date +%s isn't portable...
41     perl -e 'printf "%s\n", time'
42 }
43
44 start_server()
45 {
46     local pidfile=sandbox/var/empire/server.pid
47     local timeout
48
49     #
50     # Currently expected to work only with thread package LWP,
51     # because:
52     #
53     # - Thread scheduling is reliably deterministic only with LWP
54     # - Shell builtin kill appears not to do the job in MinGW
55     # - The Windows server tries to run as service when -d isn't
56     #   specified
57     #
58     # TODO address these shortcomings.
59     #
60     check_empthread
61
62     pid=
63     trap 'if [ "$pid" ]; then kill -9 "$pid" 2>/dev/null || true; fi' EXIT
64     src/server/emp_server -e sandbox/etc/empire/econfig -R 1 -s
65     timeout=$((`now`+5))
66     until pid=`cat $pidfile 2>/dev/null` && [ -n "$pid" ]
67     do
68         if [ `now` -gt $timeout ]
69         then
70             echo "Timed out waiting for server to create $pidfile" >&2
71             exit 1
72         fi
73     done
74     while src/client/empire red herring 2>&1 | grep -q "Connection refused"
75     do
76         if [ `now` -gt $timeout ]
77         then
78             echo "Timed out waiting for server to accept connections" >&2
79             exit 1
80         fi
81     done
82 }
83
84 stop_server()
85 {
86     local timeout
87     kill "$pid"
88     timeout=$((`now`+5))
89     while kill -0 "$pid" 2>/dev/null
90     do
91         if [ `now` -gt $timeout ]
92         then
93             echo "Timed out waiting for server to terminate" >&2
94             exit 1
95         fi
96     done
97 }
98
99 feed_input()
100 {
101     c=$1
102     r=$2
103     shift 2
104     sed '/^|/d' "$@" | src/client/empire "$c" "$r" >/dev/null
105 }
106
107 feed_files()
108 {
109     for i
110     do
111         c="${i##*/*-}"
112         r=`echo $c | sed 's/^POGO$/peter/'`
113         feed_input "$c" "$r" "$i"
114     done
115 }
116
117 feed_dir()
118 {
119     feed_files `git ls-files "$@" | grep '/[0-9][0-9]-[^/]*$'`
120 }
121
122 begin_test()
123 {
124     src/util/files -e sandbox/etc/empire/econfig -f >/dev/null
125     local xd=
126     case "$1" in
127     *.xdump)
128         xd="$1"
129         src/util/empdump -e sandbox/etc/empire/econfig -i "$xd"
130         shift
131         ;;
132     esac
133     if [ -z "$xd" ] || [ "$#" -ne 0 ]
134     then
135         cp -r sandbox/var/empire/tel sandbox/var/empire/empty.tel
136         start_server
137         feed_input POGO peter "$@"
138         stop_server
139         mv sandbox/var/empire/tel sandbox/var/empire/init.tel
140         mv sandbox/var/empire/empty.tel sandbox/var/empire/tel
141         mv sandbox/var/empire/journal.log sandbox/var/empire/init.journal.log
142         mv sandbox/var/empire/server.log sandbox/var/empire/init.server.log
143     fi
144     start_server
145 }
146
147 end_test ()
148 {
149     stop_server
150     src/util/empdump -e sandbox/etc/empire/econfig -x >sandbox/$test.xdump
151 }
152
153 cmp_out()
154 {
155     local opt exp act nrm msg ret=0
156     for i
157     do
158         case "$i" in
159         */journal.log)  opt=-j ;;
160         */server.log)   opt=-s ;;
161         *)              opt= ;;
162         esac
163         exp="$srcdir/tests/$test/${i##*/}"
164         act="sandbox/$i"
165         nrm="sandbox/normalized-${i##*/}"
166         perl "$srcdir"/tests/normalize.pl $opt "$act" >"$nrm"
167         if msg=`diff -q "$exp" "$nrm"`
168         then
169             echo "$exp OK"
170         else
171             ret=$?
172             echo "$exp FAIL"
173             echo $msg
174         fi
175     done
176     return $ret
177 }