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