206 lines
5.8 KiB
Bash
Executable file
206 lines
5.8 KiB
Bash
Executable file
#!/bin/sh
|
|
set -e
|
|
|
|
TESTTORUN=''
|
|
while [ -n "$1" ]; do
|
|
if [ "$1" = "-q" ]; then
|
|
export MSGLEVEL=2
|
|
elif [ "$1" = "-qq" ]; then
|
|
export MSGLEVEL=1
|
|
elif [ "$1" = "-v" ]; then
|
|
export MSGLEVEL=4
|
|
elif [ "$1" = '--color=no' ]; then
|
|
export MSGCOLOR='NO'
|
|
elif [ "$1" = '--color=yes' ]; then
|
|
export MSGCOLOR='YES'
|
|
elif [ "$1" = '--color' ]; then
|
|
export MSGCOLOR="$(echo "$2" | tr 'a-z' 'A-Z')"
|
|
shift
|
|
elif [ "$1" = '--level' ]; then
|
|
export MSGLEVEL=$2
|
|
shift
|
|
elif [ "$1" = '-j' ]; then
|
|
APT_TEST_JOBS=$2
|
|
shift
|
|
elif [ "$1" = '--solver' ]; then
|
|
export APT_SOLVER="$2"
|
|
shift
|
|
elif [ "$1" = '--skip' ]; then
|
|
export APT_SKIP_TEST_FILE="$2"
|
|
shift
|
|
elif [ "$1" = '--only' ]; then
|
|
TESTLIST="$2"
|
|
shift
|
|
elif [ -e "$1" ]; then
|
|
TESTTORUN="$1"
|
|
else
|
|
echo >&2 "WARNING: Unknown parameter »$1« will be ignored"
|
|
fi
|
|
shift
|
|
done
|
|
export MSGLEVEL="${MSGLEVEL:-3}"
|
|
|
|
if [ "${MSGCOLOR:-YES}" = 'YES' ]; then
|
|
if [ ! -t 1 ]; then # but check that we output to a terminal
|
|
export MSGCOLOR='NO'
|
|
fi
|
|
fi
|
|
if [ "$MSGCOLOR" != 'NO' ]; then
|
|
CTEST='\033[1;32m'
|
|
CHIGH='\033[1;35m'
|
|
CRESET='\033[0m'
|
|
else
|
|
CTEST=''
|
|
CHIGH=''
|
|
CRESET=''
|
|
fi
|
|
|
|
if [ -n "$TESTTORUN" ]; then
|
|
# collecting the output of one test to have it together
|
|
OUTPUT="$(mktemp)"
|
|
CURRENTTRAP="rm -f \"$OUTPUT\"; $CURRENTTRAP"
|
|
trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
|
|
{
|
|
if [ "$APT_SKIP_TEST_FILE" ] && sed 's/ *#.*//' "$APT_SKIP_TEST_FILE" | grep -qFx "${TESTTORUN##*/}"; then
|
|
if [ "$MSGLEVEL" -le 2 ]; then
|
|
printf "${CTEST}Skip Testcase ${CHIGH}${TESTTORUN##*/}${CRESET}"
|
|
else
|
|
printf "${CTEST}Skip Testcase ${CHIGH}${TESTTORUN##*/}${CRESET}\n"
|
|
fi
|
|
SKIP='yes'
|
|
elif [ "$MSGLEVEL" -le 1 ]; then
|
|
printf "${TESTTORUN##*/}"
|
|
elif [ "$MSGLEVEL" -le 2 ]; then
|
|
printf "${CTEST}Testcase ${CHIGH}${TESTTORUN##*/}${CRESET}: "
|
|
else
|
|
printf "${CTEST}Run Testcase ${CHIGH}${TESTTORUN##*/}${CRESET}\n"
|
|
fi
|
|
|
|
if [ "$SKIP" != "yes" ] && ! "$TESTTORUN"; then
|
|
FAIL='yes'
|
|
if [ "$MSGLEVEL" -le 2 ]; then
|
|
printf >&2 "\n${CHIGH}Running ${TESTTORUN##*/} -> FAILED${CRESET}\n"
|
|
elif [ "$MSGLEVEL" -le 2 ]; then
|
|
printf >&2 "\n${CHIGH}Running ${TESTTORUN##*/} -> FAILED${CRESET}"
|
|
else
|
|
echo >&2 "${CHIGH}Running ${TESTTORUN##*/} -> FAILED${CRESET}"
|
|
fi
|
|
else
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
printf " "
|
|
fi
|
|
fi
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
:
|
|
elif [ "$MSGLEVEL" -le 2 ]; then
|
|
echo
|
|
fi
|
|
} >"$OUTPUT" 2>&1
|
|
# without we end up getting stepped output 'randomly'
|
|
stty sane || true
|
|
cat >&2 "$OUTPUT"
|
|
stty sane || true
|
|
if [ "$STATS_FILE" ]; then
|
|
flock "$STATS_FILE" -c "echo $TESTTORUN skip=${SKIP:-no} fail=${FAIL:-no} >> \"$STATS_FILE\""
|
|
fi
|
|
if [ "$FAIL" = 'yes' ]; then
|
|
exit 1
|
|
else
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
FAIL=0
|
|
PASS=0
|
|
ALL=0
|
|
FAILED_TESTS=""
|
|
DIR="$(readlink -f "$(dirname "$0")")"
|
|
cd "$DIR"
|
|
if [ -e "$TESTLIST" ]; then
|
|
TESTLIST="$(sort < "$TESTLIST" | sed 's#^#./#;s/ *#.*//')"
|
|
else
|
|
TESTLIST="$(find . -mindepth 1 -maxdepth 1 -regex '^\./test-[^/]*$' | sort)"
|
|
fi
|
|
if [ -n "$APT_TEST_JOBS" ]; then
|
|
export STATS_FILE="$(mktemp)"
|
|
CURRENTTRAP="rm -f \"$STATS_FILE\"; $CURRENTTRAP"
|
|
trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
|
|
if [ "$MSGCOLOR" != 'NO' ]; then
|
|
export MSGCOLOR='ALWAYS'
|
|
fi
|
|
parallel=parallel
|
|
if command -v moreutils-parallel >/dev/null 2>&1; then
|
|
parallel=moreutils-parallel
|
|
elif command -v parallel.moreutils >/dev/null 2>&1; then
|
|
parallel=parallel.moreutils
|
|
fi
|
|
$parallel -j "$APT_TEST_JOBS" "./$(basename "$0")" -- $(echo "$TESTLIST") || true
|
|
ALL=$(wc -l < "$STATS_FILE")
|
|
SKIP=$(grep -c "skip=yes" "$STATS_FILE" || true)
|
|
PASS=$(grep -c "skip=no fail=no" "$STATS_FILE" || true)
|
|
FAIL=$(grep -c "fail=yes" "$STATS_FILE" || true)
|
|
PASSED_TESTS=$(awk '! /fail=yes/ {print $1}' < "$STATS_FILE" | cut -f2 -d/ | sort | xargs)
|
|
SKIPPED_TESTS=$(awk '/fail=skip/ {print $1}' < "$STATS_FILE" | cut -f2 -d/ | sort | xargs)
|
|
FAILED_TESTS=$(awk '/fail=yes/ {print $1}' < "$STATS_FILE" | cut -f2 -d/ | sort | xargs)
|
|
echo >&2 "Statistics: $ALL tests were run: $PASS successfully and $FAIL failed, $SKIP skipped"
|
|
if [ -n "$FAILED_TESTS" ]; then
|
|
if [ $PASS -lt $FAIL ]; then
|
|
echo >&2 "Passed tests: $PASSED_TESTS"
|
|
else
|
|
echo >&2 "Failed tests: $FAILED_TESTS"
|
|
fi
|
|
else
|
|
echo >&2 'All tests seem to have been run successfully. What could possibly go wrong?'
|
|
fi
|
|
# ensure we don't overflow
|
|
exit $((FAIL <= 255 ? FAIL : 255))
|
|
fi
|
|
|
|
TOTAL="$(echo "$TESTLIST" | wc -l)"
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
printf "${CTEST}Running testcases${CRESET}: "
|
|
fi
|
|
for testcase in $TESTLIST; do
|
|
if [ "$APT_SKIP_TEST_FILE" ] && grep -qFx "${testcase##*/}" "$APT_SKIP_TEST_FILE"; then
|
|
printf "${CTEST}Skipping Testcase ${CHIGH}${testcase##*/}${CRESET}\n"
|
|
continue
|
|
fi
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
printf "${testcase##*/}"
|
|
elif [ "$MSGLEVEL" -le 2 ]; then
|
|
printf "($(($ALL+1))/${TOTAL}) ${CTEST}Testcase ${CHIGH}${testcase##*/}${CRESET}: "
|
|
else
|
|
printf "${CTEST}Run Testcase ($(($ALL+1))/${TOTAL}) ${CHIGH}${testcase##*/}${CRESET}\n"
|
|
fi
|
|
if ! ${testcase}; then
|
|
FAIL=$((FAIL+1))
|
|
FAILED_TESTS="$FAILED_TESTS ${testcase##*/}"
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
printf >&2 "\n${CHIGH}Running ${testcase##*/} -> FAILED${CRESET}\n"
|
|
elif [ "$MSGLEVEL" -le 2 ]; then
|
|
printf >&2 "\n${CHIGH}Running ${testcase##*/} -> FAILED${CRESET}"
|
|
else
|
|
echo >&2 "${CHIGH}Running ${testcase##*/} -> FAILED${CRESET}"
|
|
fi
|
|
else
|
|
PASS=$((PASS+1))
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
printf " "
|
|
fi
|
|
fi
|
|
ALL=$((ALL+1))
|
|
if [ "$MSGLEVEL" -le 1 ]; then
|
|
:
|
|
elif [ "$MSGLEVEL" -le 2 ]; then
|
|
echo
|
|
fi
|
|
done
|
|
|
|
echo >&2 "Statistics: $ALL tests were run: $PASS successfully and $FAIL failed"
|
|
if [ -n "$FAILED_TESTS" ]; then
|
|
echo >&2 "Failed tests: $FAILED_TESTS"
|
|
else
|
|
echo >&2 'All tests seem to have been run successfully. What could possibly go wrong?'
|
|
fi
|
|
# ensure we don't overflow
|
|
exit $((FAIL <= 255 ? FAIL : 255))
|