tests/run-tests
author Thomas Arendsen Hein <thomas@intevation.de>
Fri, 29 Jul 2005 15:59:10 +0100
changeset 802 69db1e34378b
parent 798 c28f9feb7c2e
child 803 3d47e7fc33a3
permissions -rwxr-xr-x
Allow tests for not yet fixed bugs to fail without generating error diff.

#!/bin/sh -e

LANG="C"; export LANG
LC_CTYPE="C"; export LC_CTYPE
LC_NUMERIC="C"; export LC_NUMERIC
LC_TIME="C"; export LC_TIME
LC_COLLATE="C"; export LC_COLLATE
LC_MONETARY="C"; export LC_MONETARY
LC_MESSAGES="C"; export LC_MESSAGES
LC_PAPER="C"; export LC_PAPER
LC_NAME="C"; export LC_NAME
LC_ADDRESS="C"; export LC_ADDRESS
LC_TELEPHONE="C"; export LC_TELEPHONE
LC_MEASUREMENT="C"; export LC_MEASUREMENT
LC_IDENTIFICATION="C"; export LC_IDENTIFICATION
LC_ALL=""; export LC_ALL
TZ=GMT; export TZ
HGEDITOR=true; export HGEDITOR
HGMERGE=true; export HGMERGE
HGUSER="test"; export HGUSER

umask 022

if [ "$[1+1]" = "2" ]; then
    use_arithmetic=true
else
    use_arithmetic=false
fi

tests=0
failed=0

HGTMP=""
cleanup_exit() {
    rm -rf "$HGTMP"
    exit $1
}

# Remove temporary files even if we get interrupted
trap "cleanup_exit 255" TERM KILL INT QUIT ABRT

HGTMP="${TMPDIR-/tmp}/hgtests.$RANDOM.$RANDOM.$RANDOM.$$"
(umask 077 && mkdir "$HGTMP") || {
    echo "Could not create temporary directory! Exiting." 1>&2
    exit 1
}

TESTDIR="$PWD"

if [ -d /usr/lib64 ]; then
    lib=lib64
else
    lib=lib
fi

INST="$HGTMP/install"
cd ..
if ${PYTHON:-python} setup.py install --home="$INST" > tests/install.err 2>&1
then
    rm tests/install.err
    mv "$INST/bin/hg" "$INST/bin/hg.real"
    (
        echo '#!/bin/sh'
        echo 'echo "+ hg $@"'
        echo 'exec hg.real "$@"'
    ) > "$INST/bin/hg"
    chmod 755 "$INST/bin/hg"
else
    cat tests/install.err
    cleanup_exit 1
fi
cd "$TESTDIR"

PATH="$INST/bin:$PATH"; export PATH
PYTHONPATH="$INST/$lib/python"; export PYTHONPATH


run_one() {
    rm -f "$1.err"

    mkdir "$HGTMP/$1"
    cd "$HGTMP/$1"
    fail=0
    HOME="$HGTMP/$1"; export HOME
    OUT="$HGTMP/$1.out"
    OUTOK="$TESTDIR/$1.out"
    ERR="$TESTDIR/$1.err"

    if "$TESTDIR/$1" > "$OUT" 2>&1; then
        : no error
    else
	echo "$1 failed with error code $?"
	fail=1
    fi

    if [ -s "$OUT" -a ! -s "$OUTOK" ] ; then
	cp "$OUT" "$ERR"
	echo
	echo "$1 generated unexpected output:"
	cat "$ERR"
	fail=1
    elif [ -r "$OUTOK" ]; then
        if diff -u "$OUTOK" "$OUT" > /dev/null; then
            : no differences
        else
            if FIXME="`grep 'FIXME' \"$TESTDIR/$1\"`"; then
                echo
                echo "$1 failed, but this is ignored because of:"
                echo "$FIXME"
            else
                cp "$OUT" "$ERR"
                echo
                echo "$1 output changed:"
                diff -u "$OUTOK" "$ERR" || true
                fail=1
            fi
        fi
    fi

    cd "$TESTDIR"
    rm -f "$HGTMP/$1.out"
    rm -rf "$HGTMP/$1"
    return $fail
}

TESTS="$@"
if [ -z "$TESTS" ] ; then
    TESTS=`ls test-* | grep -Ev "\.|~"`
fi

for f in $TESTS ; do
    echo -n "."
    if $use_arithmetic; then
	run_one $f || failed=$[$failed + 1]
	tests=$[$tests + 1]
    else
	run_one $f || failed=1
    fi
done

if $use_arithmetic; then
    echo
    echo "Ran $tests tests, $failed failed."

    if [ $failed -gt 0 ] ; then
	cleanup_exit 1
    fi
else
    echo
    if [ "$failed" = "1" ] ; then
	echo "Ran tests, at least one failed."
	cleanup_exit 1
    else
	echo "Ran tests, none failed."
    fi
fi
cleanup_exit 0