#!/bin/sh -e # Smoke test for Empire if [ $# -ne 1 ] then echo "Usage: $0 SRCDIR" >&2; exit 1 fi srcdir="$1" export EMPIREHOST=127.0.0.1 LOGNAME=tester if [ -x ./config.status ] && ./config.status --version | grep -q '^Wolfpack Empire' then : else echo "$0: Must be run in root of build tree" >&2; exit 1 fi # # Currently expected to work only with thread package LWP and a # random() that behaves exactly like the one on my development system, # because: # # - Thread scheduling is reliably deterministic only with LWP # - The PRN sequence produced by random() isn't portable # - Shell builtin kill appears not to do the job in MinGW # - The Windows server tries to run as service when -d isn't # specified # # TODO address these shortcomings. # if [ "`uname -s`" != "Linux" ] # lame approx. of "random() behaves like mine" then echo "Warning: smoke test not expected to work on this system!" >&2 elif [ `sed -n 's/empthread *:= *\(.*\)/\1/p' &2 fi # Create sandbox rm -rf sandbox mkdir -p sandbox/etc/empire sandbox/share/empire/builtin sandbox/var/empire touch sandbox/etc/empire/schedule cat >sandbox/etc/empire/econfig <sandbox/smoke.out pid= trap 'if [ "$pid" ]; then kill "$pid" 2>/dev/null || true; fi' EXIT # Create world and start server src/util/files -e sandbox/etc/empire/econfig -f >&3 src/util/fairland -e sandbox/etc/empire/econfig -q -s sandbox/newcap_script -R 1 10 30 src/server/emp_server -e sandbox/etc/empire/econfig -R 1 while src/client/empire red herring 2>&1 | grep -q "Connection refused" do : # FIXME hangs here if server crashes on startup done pid=`cat sandbox/var/empire/server.pid` src/client/empire POGO peter /dev/null # Feed player input need_update= for i in "$srcdir"/tests/smoke/[0-9]* do t="${i##*/}" if [ "$need_update" ] then echo "Update Turn $t starting" >&3 src/client/empire POGO peter <&3 power new report * cen * ?own#0 comm * ?own#0 reso * ?own#0 force EOF echo "Update Turn $t completed successfully" >&3 fi for j in "$i"/* do p="${j##*/}" echo "Player $p Turn $t starting" >&3 if [ $p -eq 0 ] then c=POGO r=peter else c="${p#0}"; r="$c" fi src/client/empire "$c" "$r" <$j >&3 echo "Player $p Turn $t completed successfully" >&3 done need_update=y done # Stop server kill "$pid" while kill -0 "$pid" 2>/dev/null do : # FIXME hangs here if server fails to exit done exec 3>&- src/util/empdump -e sandbox/etc/empire/econfig -x >sandbox/smoke.xdump # Smoke test completed; compare results cmp_out() { local opt exp act nrm msg ret=0 for i do case "$i" in */journal.log) opt=-j ;; */server.log) opt=-s ;; *) opt= ;; esac exp="$srcdir/tests/smoke/${i##*/}" act="sandbox/$i" nrm="sandbox/normalized-${i##*/}" perl "$srcdir"/tests/normalize.pl $opt "$act" >"$nrm" if msg=`diff -q "$exp" "$nrm"` then echo "$exp OK" else ret=$? echo "$exp FAIL" echo $msg fi done return $ret } cmp_out smoke.out var/empire/server.log var/empire/journal.log smoke.xdump