]> git.pond.sub.org Git - empserver/blob - tests/test-common.sh
Suppress duplicates in output of git ls-files
[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 GODNEWS 0
35 running_test_suite 1
36 EOF
37     cp `git ls-files "$srcdir"/src/lib/global | uniq | grep '\.config$'` sandbox/share/empire/builtin
38 }
39
40 now()
41 {
42     # date +%s isn't portable...
43     perl -e 'printf "%s\n", time'
44 }
45
46 start_server()
47 {
48     local pidfile=sandbox/var/empire/server.pid
49     local timeout
50
51     #
52     # Currently expected to work only with thread package LWP,
53     # because:
54     #
55     # - Thread scheduling is reliably deterministic only with LWP
56     # - Shell builtin kill appears not to do the job in MinGW
57     # - The Windows server tries to run as service when -d isn't
58     #   specified
59     # - The Windows server does not implement -E crash-dump
60     #
61     # TODO address these shortcomings.
62     #
63     check_empthread
64
65     pid=
66     trap 'if [ "$pid" ]; then kill -9 "$pid" 2>/dev/null || true; fi' EXIT
67     src/server/emp_server -e sandbox/etc/empire/econfig -R 1 -s -E crash-dump
68     timeout=$((`now`+5))
69     until pid=`cat $pidfile 2>/dev/null` && [ -n "$pid" ]
70     do
71         if [ `now` -gt $timeout ]
72         then
73             echo "Timed out waiting for server to create $pidfile" >&2
74             exit 1
75         fi
76     done
77     while src/client/empire red herring 2>&1 | grep -q "Connection refused"
78     do
79         if [ `now` -gt $timeout ]
80         then
81             echo "Timed out waiting for server to accept connections" >&2
82             exit 1
83         fi
84     done
85 }
86
87 stop_server()
88 {
89     local timeout
90     kill "$pid"
91     timeout=$((`now`+5))
92     while kill -0 "$pid" 2>/dev/null
93     do
94         if [ `now` -gt $timeout ]
95         then
96             echo "Timed out waiting for server to terminate" >&2
97             exit 1
98         fi
99     done
100 }
101
102 feed_input()
103 {
104     c=$1
105     r=$2
106     shift 2
107     sed '/^|/d' "$@" | src/client/empire "$c" "$r" >/dev/null
108 }
109
110 feed_files()
111 {
112     for i
113     do
114         c="${i##*/*-}"
115         r=`echo $c | sed 's/^POGO$/peter/'`
116         feed_input "$c" "$r" "$i"
117     done
118 }
119
120 feed_dir()
121 {
122     feed_files `git ls-files "$@" | uniq | grep '/[0-9][0-9]-[^/]*$'`
123 }
124
125 begin_test()
126 {
127     src/util/files -e sandbox/etc/empire/econfig -f >/dev/null
128     local xd=
129     case "$1" in
130     *.xdump)
131         xd="$1"
132         src/util/empdump -e sandbox/etc/empire/econfig -i "$xd"
133         shift
134         ;;
135     esac
136     if [ -z "$xd" ] || [ "$#" -ne 0 ]
137     then
138         cp -r sandbox/var/empire/tel sandbox/var/empire/empty.tel
139         start_server
140         if [ "$#" -eq 0 ]
141         then feed_input POGO peter
142         else feed_files "$@"
143         fi
144         echo 'edit c * ?tgms>0 t 0' | feed_input POGO peter
145         stop_server
146         mv sandbox/var/empire/tel sandbox/var/empire/setup.tel
147         mv sandbox/var/empire/empty.tel sandbox/var/empire/tel
148         mv sandbox/var/empire/news sandbox/var/empire/setup.news
149         >sandbox/var/empire/news
150         mv sandbox/var/empire/lostitems sandbox/var/empire/setup.lostitems
151         >sandbox/var/empire/lostitems
152         mv sandbox/var/empire/journal.log sandbox/var/empire/setup.journal.log
153         mv sandbox/var/empire/server.log sandbox/var/empire/setup.server.log
154     fi
155     start_server
156 }
157
158 end_test ()
159 {
160     stop_server
161     src/util/empdump -e sandbox/etc/empire/econfig -x >sandbox/final.xdump
162 }
163
164 cmp_out()
165 {
166     local opt exp act nrm msg ret=0
167     for i
168     do
169         case "$i" in
170         */journal.log)  opt=-j ;;
171         */server.log)   opt=-s ;;
172         *)              opt= ;;
173         esac
174         exp="$srcdir/tests/$test/${i##*/}"
175         act="sandbox/$i"
176         nrm="sandbox/normalized-${i##*/}"
177         perl "$srcdir"/tests/normalize.pl $opt "$act" >"$nrm"
178         if msg=`diff -q "$exp" "$nrm"`
179         then
180             echo "$i OK"
181         elif [ "$EMPIRE_CHECK_ACCEPT" ]
182         then
183             echo "$i CHANGED"
184             cp "$nrm" "$exp"
185         else
186             ret=$?
187             echo "$i FAIL"
188             echo $msg
189         fi
190     done
191     return $ret
192 }