]> git.pond.sub.org Git - empserver/blob - tests/test-common.sh
tests: New helper cmp_out1
[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 failed=
12 trap 'if [ "$pid" ]; then kill -9 "$pid" 2>/dev/null || true; fi; [ "$failed" ] && exit 1' EXIT
13
14 # Abbreviations
15 testdir="$srcdir/tests/$test"
16 econfig=sandbox/etc/empire/econfig
17 schedule=sandbox/etc/empire/schedule
18 data=sandbox/var/empire
19 empdump="src/util/empdump -e $econfig"
20 files="src/util/files -e $econfig"
21 fairland="src/util/fairland -e $econfig"
22
23 empthread=`sed -n 's/empthread *:= *\(.*\)/\1/p' <GNUmakefile`
24 warn_empthread=y
25
26 check_empthread()
27 {
28     if [ "$warn_empthread" ] && [ "$empthread" != "LWP" ]
29     then
30         echo "Warning: test not expected to work with thread package $empthread!" >&2
31         warn_empthread=
32     fi
33 }
34
35 create_sandbox()
36 {
37     rm -rf sandbox
38     mkdir -p sandbox/etc/empire sandbox/share/empire/builtin $data
39     touch $schedule
40     cat >$econfig <<EOF
41 data "../../var/empire"
42 info "../../../../info.nr"
43 builtin "../../share/empire/builtin"
44 listen_addr "$EMPIREHOST"
45 keep_journal 2
46 GODNEWS 0
47 running_test_suite 1
48 EOF
49     cp `git ls-files "$srcdir"/src/lib/global | uniq | grep '\.config$'` sandbox/share/empire/builtin
50 }
51
52 run_and_cmp()
53 {
54     run "$@"
55     cmp_run "$1"
56 }
57
58 run()
59 {
60     local name=$1 ret
61     shift
62     set +e
63     "$@" >>sandbox/$name.out 2>>sandbox/$name.err
64     ret=$?
65     set -e
66     echo $ret >>sandbox/$name.status
67 }
68
69 now()
70 {
71     # date +%s isn't portable...
72     perl -e 'printf "%s\n", time'
73 }
74
75 start_server()
76 {
77     local pidfile=$data/server.pid
78     local timeout
79
80     #
81     # Currently expected to work only with thread package LWP,
82     # because:
83     #
84     # - Thread scheduling is reliably deterministic only with LWP
85     # - Shell builtin kill appears not to do the job in MinGW
86     # - The Windows server tries to run as service when -d isn't
87     #   specified
88     # - The Windows server does not implement -E crash-dump
89     #
90     # TODO address these shortcomings.
91     #
92     check_empthread
93
94     pid=
95     src/server/emp_server -e $econfig -R 1 -s -E crash-dump
96     timeout=$((`now`+5))
97     until pid=`cat $pidfile 2>/dev/null` && [ -n "$pid" ]
98     do
99         if [ `now` -gt $timeout ]
100         then
101             echo "Timed out waiting for server to create $pidfile" >&2
102             exit 1
103         fi
104     done
105     while src/client/empire red herring 2>&1 | grep -q "Connection refused"
106     do
107         if [ `now` -gt $timeout ]
108         then
109             echo "Timed out waiting for server to accept connections" >&2
110             exit 1
111         fi
112     done
113 }
114
115 stop_server()
116 {
117     local timeout
118     kill "$pid"
119     timeout=$((`now`+5))
120     while kill -0 "$pid" 2>/dev/null
121     do
122         if [ `now` -gt $timeout ]
123         then
124             echo "Timed out waiting for server to terminate" >&2
125             exit 1
126         fi
127     done
128 }
129
130 feed_input()
131 {
132     c=$1
133     r=$2
134     shift 2
135     sed '/^|/d' "$@" | src/client/empire "$c" "$r" >/dev/null
136 }
137
138 feed_files()
139 {
140     local i
141
142     for i
143     do
144         c="${i##*/*-}"
145         r=`echo $c | sed 's/^POGO$/peter/'`
146         feed_input "$c" "$r" "$i"
147     done
148 }
149
150 feed_dir()
151 {
152     feed_files `git ls-files "$@" | uniq | grep '/[0-9][0-9]-[^/]*$'`
153 }
154
155 begin_test()
156 {
157     $files -f >/dev/null
158     local xd=
159     case "$1" in
160     *.xdump)
161         xd="$1"
162         $empdump -i "$xd"
163         shift
164         ;;
165     esac
166     if [ -z "$xd" ] || [ "$#" -ne 0 ]
167     then
168         cp -r $data/tel $data/empty.tel
169         start_server
170         if [ "$#" -eq 0 ]
171         then feed_input POGO peter
172         else feed_files "$@"
173         fi
174         echo 'edit c * ?tgms>0 t 0' | feed_input POGO peter
175         stop_server
176         mv $data/tel $data/setup.tel
177         mv $data/empty.tel $data/tel
178         mv $data/news $data/setup.news
179         >$data/news
180         mv $data/lostitems $data/setup.lostitems
181         >$data/lostitems
182         mv $data/journal.log $data/setup.journal.log
183         mv $data/server.log $data/setup.server.log
184     fi
185     start_server
186 }
187
188 end_test ()
189 {
190     stop_server
191     $empdump -x >sandbox/final.xdump
192 }
193
194 cmp_run()
195 {
196     local i j exp
197
198     for i
199     do
200         for j in status out err
201         do cmp_out "$i.$j"
202         done
203     done
204 }
205
206 cmp_logs_xdump()
207 {
208     cmp_out var/empire/server.log var/empire/journal.log final.xdump
209 }
210
211 cmp_out()
212 {
213     local i
214
215     for i
216     do cmp_out1 "$i"
217     done
218 }
219
220 cmp_out1()
221 {
222     local i=$1 exp="${2-$testdir/${1##*/}}"
223     local act="sandbox/$i"
224     local nrm="sandbox/normalized-${i##*/}"
225
226     if [ ! -e "$exp" ]
227     then
228         case "$i" in
229         *.status)
230             exp=sandbox/ok.status
231             echo 0 >sandbox/ok.status
232             ;;
233         *)
234             [ ! -e "$act" ] && return
235             exp=/dev/null
236             ;;
237             *.status)   exp=sandbox/ok.status; echo 0 >sandbox/ok.status ;;
238             *)          exp=/dev/null ;;
239         esac
240     fi
241
242     case "$i" in
243     */journal.log)
244         perl "$srcdir"/tests/normalize.pl -j "$act" ;;
245     */server.log)
246         perl "$srcdir"/tests/normalize.pl -s "$act" ;;
247     *.xdump)
248         perl "$srcdir"/tests/normalize.pl "$act" ;;
249     *.err)
250         perl -pe 's/\s+$/\n/;' -e "s,\Q$srcdir/tests\E,tests," "$act" ;;
251     *)
252         perl -pe 's/\s+$/\n/;' "$act" ;;
253     esac >"$nrm"
254     if diff -u "$exp" "$nrm" >"$nrm.diff"
255     then
256         echo "$i OK"
257     elif [ "$EMPIRE_CHECK_ACCEPT" ]
258     then
259         echo "$i CHANGED"
260         cp "$nrm" "$exp"
261     else
262         failed=y
263         echo "$i FAIL"
264     fi
265 }