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