tests/run-tests
author Thomas Arendsen Hein <thomas@intevation.de>
Wed, 03 May 2006 10:45:20 +0200
changeset 2183 a56fc34d6e23
parent 2163 278f9b13c39a
permissions -rwxr-xr-x
Always clean the build directory before installing for running the tests. Otherwise tests might run an old version, when e.g. commands.py.orig is moved back after a revert (old timestamp).

#!/bin/sh -e
#
# environment variables:
#
# TEST_COVERAGE - set non-empty if you want to print test coverage report
# COVERAGE_STDLIB - set non-empty to report coverage of standard library

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
HGRCPATH=""; export HGRCPATH
OS=`uname`

case "$OS" in
  HP-UX|SunOS)
    DIFFOPTS=
    ;;
  *)
    DIFFOPTS=-u
    ;;
esac

if [ `echo -n HG` = "-n HG" ]
then
    ECHO_N=echo
    NNL="\c"
else
    ECHO_N="echo -n"
    NNL=
fi

umask 022

tests=0
failed=0

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

# Remove temporary files even if we get interrupted
trap "cleanup_exit" 0 # normal exit
trap "exit 255" 1 2 3 6 15 # HUP INT QUIT ABRT TERM

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

TESTDIR="`pwd`"
export TESTDIR
INST="$HGTMP/install"
PYTHONDIR="$INST/lib/python"
cd ..
if ${PYTHON-python} setup.py clean --all install --force --home="$INST" \
  --install-lib="$PYTHONDIR" > tests/install.err 2>&1
then
    rm tests/install.err
else
    cat tests/install.err
    exit 1
fi
cd "$TESTDIR"

BINDIR="$INST/bin"; export BINDIR
if [ -n "$TEST_COVERAGE" ]; then
    COVERAGE_FILE="$TESTDIR/.coverage"; export COVERAGE_FILE
    rm -f "$COVERAGE_FILE"
    mv "$BINDIR/hg" "$BINDIR/hg.py"
    {
        echo '#!/bin/sh'
        echo "exec \"${PYTHON-python}\" \"$TESTDIR/coverage.py\"" \
            "-x \"$BINDIR/hg.py\" \"\$@\""
    } > "$BINDIR/hg"
    chmod 700 "$BINDIR/hg"
fi
    
PATH="$BINDIR:$PATH"; export PATH
if [ -n "$PYTHON" ]; then
    {
        echo "#!/bin/sh"
        echo "exec \"$PYTHON"'" "$@"'
    } > "$BINDIR/python"
    chmod 755 "$BINDIR/python"
fi

PYTHONPATH="$PYTHONDIR"; 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 $DIFFOPTS "$OUTOK" "$OUT" > /dev/null; then
	    : no differences
	else
	    cp "$OUT" "$ERR"
	    echo
	    echo "$1 output changed:"
	    diff $DIFFOPTS "$OUTOK" "$ERR" || true
	    fail=1
	fi
    fi

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

# list of prerequisite programs
# stuff from coreutils (cat, rm, etc) are not tested
prereqs="python merge diff grep unzip gunzip bunzip2 sed"
missing=''
for pre in $prereqs ; do
    if type $pre > /dev/null 2>&1 ; then
        : prereq exists
    else
        missing="$pre $missing"
    fi
done

if [ "$missing" != ''  ] ; then
    echo "ERROR: the test suite needs some programs to execute correctly."
    echo "The following programs are missing: "
    for pre in $missing; do
        echo "   $pre"
    done
    exit 1
fi

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

for f in $TESTS ; do
    $ECHO_N ".${NNL}"
    run_one $f || failed=`expr $failed + 1`
    tests=`expr $tests + 1`
done

echo
echo "Ran $tests tests, $failed failed."

if [ -n "$TEST_COVERAGE" ]; then
    unset PYTHONPATH
    $ECHO_N "$BINDIR,$TESTDIR,$HGTMP/test-," > "$HGTMP/omit"
    if [ -z "$COVERAGE_STDLIB" ]; then
        "${PYTHON-python}" -c 'import sys; print ",".join(sys.path)' \
            >> "$HGTMP/omit"
    fi
    cd "$PYTHONDIR"
    "${PYTHON-python}" "$TESTDIR/coverage.py" -r --omit="`cat \"$HGTMP/omit\"`"
fi

if [ $failed -gt 0 ] ; then
    exit 1
fi
exit 0