test=${0##*/}
test=${test%-test}
+failed=
+trap 'if [ "$pid" ]; then kill -9 "$pid" 2>/dev/null || true; fi; [ "$failed" ] && exit 1' EXIT
+
+# Abbreviations
+testdir="$srcdir/tests/$test"
+econfig=sandbox/etc/empire/econfig
+schedule=sandbox/etc/empire/schedule
+data=sandbox/var/empire
+empdump="src/util/empdump -e $econfig"
+files="src/util/files -e $econfig"
+fairland="src/util/fairland -e $econfig"
+
+# GNU libc memory allocation checking, see mallopt(3)
+# $RANDOM isn't portable
+malloc_perturb=${EMPIRE_CHECK_MALLOC_PERTURB:-$(perl -e 'print int(rand(255))')}
+env="MALLOC_CHECK_=3 MALLOC_PERTURB_=$malloc_perturb"
+
empthread=`sed -n 's/empthread *:= *\(.*\)/\1/p' <GNUmakefile`
warn_empthread=y
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 <<EOF
+ mkdir -p sandbox/etc/empire sandbox/share/empire/builtin $data
+ echo $malloc_perturb >sandbox/malloc-perturb
+ touch $schedule
+ cat >$econfig <<EOF
data "../../var/empire"
info "../../../../info.nr"
builtin "../../share/empire/builtin"
listen_addr "$EMPIREHOST"
keep_journal 2
GODNEWS 0
+running_test_suite 1
EOF
- cp `git ls-files "$srcdir"/src/lib/global | grep '\.config$'` sandbox/share/empire/builtin
+ cp `perl "$srcdir"/src/scripts/ls-sources.pl "$srcdir"/src/lib/global '\.config$'` sandbox/share/empire/builtin
+}
+
+copy_tables()
+{
+ local t
+
+ for t
+ do [ -e sandbox/etc/empire/"$t".config ] || cp "$srcdir"/src/lib/global/$t.config sandbox/etc/empire
+ done
+}
+
+# sed -i isn't portable...
+sed_i()
+{
+ local script="$1"
+ shift
+ for i
+ do sed "$script" "$i" >sandbox/$$ && mv sandbox/$$ "$i"
+ done
+}
+
+customize()
+{
+ local key
+ for key
+ do
+ case $key in
+ big-city)
+ copy_tables sect
+ sed_i '/"c" .* "capital"/d;/^#.*"c" .* "city"/s/^#/ /;/"c" .* norm/d;/^#.*"c" .* cana/s/^#/ /' sandbox/etc/empire/sect.config
+ ;;
+ trade-ship)
+ copy_tables ship
+ sed_i '/"ts trade ship"//^#/ /' sandbox/etc/empire/ship.config
+ esac
+ done
+ echo "custom_tables \"`cd sandbox/etc/empire && echo *.config`\"" >>$econfig
+}
+
+run_and_cmp()
+{
+ run "$@"
+ cmp_run "$1"
+}
+
+run()
+{
+ local name=$1 ret
+ shift
+ set +e
+ env $env "$@" >>sandbox/$name.out 2>>sandbox/$name.err
+ ret=$?
+ set -e
+ echo $ret >>sandbox/$name.status
}
now()
start_server()
{
- local pidfile=sandbox/var/empire/server.pid
+ local pidfile=$data/server.pid
local timeout
#
# - Shell builtin kill appears not to do the job in MinGW
# - The Windows server tries to run as service when -d isn't
# specified
+ # - The Windows server does not implement -E crash-dump
#
# TODO address these shortcomings.
#
check_empthread
pid=
- trap 'if [ "$pid" ]; then kill -9 "$pid" 2>/dev/null || true; fi' EXIT
- src/server/emp_server -e sandbox/etc/empire/econfig -R 1 -s
+ env $env src/server/emp_server -e $econfig -R 1 -s -E crash-dump
timeout=$((`now`+5))
until pid=`cat $pidfile 2>/dev/null` && [ -n "$pid" ]
do
feed_files()
{
+ local i
+
for i
do
c="${i##*/*-}"
feed_dir()
{
- feed_files `git ls-files "$@" | grep '/[0-9][0-9]-[^/]*$'`
+ feed_files `perl "$srcdir"/src/scripts/ls-sources.pl "$@" '/[0-9][0-9]-[^/]*$'`
}
begin_test()
{
- src/util/files -e sandbox/etc/empire/econfig -f >/dev/null
+ $files -f >/dev/null
local xd=
case "$1" in
*.xdump)
xd="$1"
- src/util/empdump -e sandbox/etc/empire/econfig -i "$xd"
+ $empdump -i "$xd"
shift
;;
esac
if [ -z "$xd" ] || [ "$#" -ne 0 ]
then
- cp -r sandbox/var/empire/tel sandbox/var/empire/empty.tel
+ cp -r $data/tel $data/empty.tel
start_server
- feed_input POGO peter "$@"
+ if [ "$#" -eq 0 ]
+ then feed_input POGO peter
+ else feed_files "$@"
+ fi
+ echo 'edit c * ?tgms>0 t 0' | feed_input POGO peter
stop_server
- mv sandbox/var/empire/tel sandbox/var/empire/init.tel
- mv sandbox/var/empire/empty.tel sandbox/var/empire/tel
- mv sandbox/var/empire/journal.log sandbox/var/empire/init.journal.log
- mv sandbox/var/empire/server.log sandbox/var/empire/init.server.log
+ mv $data/tel $data/setup.tel
+ mv $data/empty.tel $data/tel
+ mv $data/news $data/setup.news
+ >$data/news
+ mv $data/lostitems $data/setup.lostitems
+ >$data/lostitems
+ mv $data/journal.log $data/setup.journal.log
+ normalize sandbox/var/empire/setup.journal.log
+ mv $data/server.log $data/setup.server.log
+ normalize sandbox/var/empire/setup.server.log
fi
start_server
}
end_test ()
{
stop_server
- src/util/empdump -e sandbox/etc/empire/econfig -x >sandbox/$test.xdump
+ $empdump -x >sandbox/final.xdump
}
-cmp_out()
+cmp_run()
{
- local opt exp act nrm msg ret=0
+ local i j exp
+
for i
do
+ for j in status out err
+ do cmp_out "$i.$j"
+ done
+ done
+}
+
+cmp_logs_xdump()
+{
+ cmp_out var/empire/server.log var/empire/journal.log final.xdump
+}
+
+cmp_out()
+{
+ local i
+
+ for i
+ do cmp_out1 "$i"
+ done
+}
+
+normalize()
+{
+ local act="$1"
+ local nrm="${2-sandbox/normalized-${1##*/}}"
+
+ case "$act" in
+ *journal.log)
+ perl "$srcdir"/tests/normalize.pl -j "$act" ;;
+ *server.log)
+ perl "$srcdir"/tests/normalize.pl -s "$act" ;;
+ *.xdump)
+ perl "$srcdir"/tests/normalize.pl "$act" ;;
+ *.err)
+ perl -pe 's/\s+$/\n/;' -e "s,\Q$srcdir/tests\E,tests," "$act" ;;
+ *)
+ perl -pe 's/\s+$/\n/;' "$act" ;;
+ esac >"$nrm"
+}
+
+cmp_out1()
+{
+ local i=$1 master="${2-$testdir/${1##*/}}"
+ local exp="$master"
+ local act="sandbox/$i"
+ local nrm="sandbox/normalized-${i##*/}"
+
+ if [ ! -e "$exp" ]
+ then
case "$i" in
- */journal.log) opt=-j ;;
- */server.log) opt=-s ;;
- *) opt= ;;
+ *.status)
+ exp=sandbox/ok.status
+ echo 0 >sandbox/ok.status
+ ;;
+ *)
+ [ ! -e "$act" ] && return
+ exp=/dev/null
+ ;;
esac
- exp="$srcdir/tests/$test/${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
+ fi
+
+ normalize "$act" "$nrm"
+ if diff -u "$exp" "$nrm" >"$nrm.diff"
+ then
+ echo "$i OK"
+ elif [ "$EMPIRE_CHECK_ACCEPT" ]
+ then
+ echo "$i CHANGED"
+ cp "$nrm" "$master"
+ else
+ failed=y
+ echo "$i FAIL"
+ fi
}