]> git.pond.sub.org Git - empserver/blobdiff - tests/test-common.sh
tests: Rewrite the previous commit's sed_i helper
[empserver] / tests / test-common.sh
index 806452063048d03e193b650b6bd4f208ee4383a5..f54ba4521e0b93a965030dff40b79e29e26a8b19 100644 (file)
@@ -8,6 +8,18 @@ fi
 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"
+
 empthread=`sed -n 's/empthread *:= *\(.*\)/\1/p' <GNUmakefile`
 warn_empthread=y
 
@@ -23,16 +35,69 @@ check_empthread()
 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
+    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" .* norm/d;/^#.*"c" .* cana/s/^#/ /' sandbox/etc/empire/sect.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
+    "$@" >>sandbox/$name.out 2>>sandbox/$name.err
+    ret=$?
+    set -e
+    echo $ret >>sandbox/$name.status
 }
 
 now()
@@ -43,7 +108,7 @@ now()
 
 start_server()
 {
-    local pidfile=sandbox/var/empire/server.pid
+    local pidfile=$data/server.pid
     local timeout
 
     #
@@ -54,14 +119,14 @@ start_server()
     # - 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
+    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
@@ -104,27 +169,54 @@ feed_input()
     sed '/^|/d' "$@" | src/client/empire "$c" "$r" >/dev/null
 }
 
+feed_files()
+{
+    local i
+
+    for i
+    do
+       c="${i##*/*-}"
+       r=`echo $c | sed 's/^POGO$/peter/'`
+       feed_input "$c" "$r" "$i"
+    done
+}
+
+feed_dir()
+{
+    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
 }
@@ -132,31 +224,86 @@ begin_test()
 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 exp="${2-$testdir/${1##*/}}"
+    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
+           ;;
+           *.status)   exp=sandbox/ok.status; echo 0 >sandbox/ok.status ;;
+           *)          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" "$exp"
+    else
+       failed=y
+       echo "$i FAIL"
+    fi
 }