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