tests/run-tests
author Vadim Gelfer <vadim.gelfer@gmail.com>
Wed, 29 Mar 2006 10:27:16 -0800
changeset 2019 ced2d3620f95
parent 1952 f4df34b6987f
child 2023 3bdd3bf17cfa
permissions -rwxr-xr-x
add merge command. means same thing as "update -m". repo.addchangegroup method now returns number of heads modified and added, so command line can tell whether update or merge needed. this makes tiny change to ssh wire protocol, but change is backwards compatible. pull command now returns 0 if no changes to pull.

#!/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
HGRCPATH=""; export HGRCPATH

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 install --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"
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 -u "$OUTOK" "$OUT" > /dev/null; then
	    : no differences
	else
	    cp "$OUT" "$ERR"
	    echo
	    echo "$1 output changed:"
	    diff -u "$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 [ $failed -gt 0 ] ; then
    exit 1
fi
exit 0