vpp/test/scripts/test-loop.sh
Tom Jones c3b416c492 build: Explicitly use bash for shell scripts
VPP requires bash for all shell scripts. Align shebang lines in build
and test scripts to look up the location of bash rather than hard coding
'/bin/bash'.

Look up the location of bash for makefiles.

Type: improvement
Change-Id: I23b705d81d60389fa8af61c680cf0abd74f0ea24
Signed-off-by: Tom Jones <thj@freebsd.org>
2024-01-19 12:30:01 +00:00

124 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
function usage() {
echo "$0" 1>&2
echo "" 1>&2
echo "Usage: $0 [-p <pre-exec-cmd>] [-m <email>] -- <make test options|verify>" 1>&2
echo "" 1>&2
echo "Parameters:" 1>&2
echo " -p <pre-exec-cmd> - run a command before each test loop (e.g. 'git pull')" 1>&2
echo " -m <email> - if set, email is sent to this address on failure" 1>&2
echo "" 1>&2
echo "Examples:" 1>&2
echo " $0 -m <somebody@cisco.com> -- test-debug TEST=l2bd" 1>&2
echo " $0 -m <somebody@cisco.com> -- verify" 1>&2
exit 1;
}
PRE_EXEC_CMD=""
EMAIL=""
while getopts "p:m:h" o; do
case "${o}" in
p)
PRE_EXEC_CMD=${OPTARG}
;;
m)
regex="^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"
m=${OPTARG}
if [[ ! $m =~ $regex ]]
then
echo "Invalid -m parameter value: \`$m'" >&2
usage
fi
EMAIL="$m"
;;
h)
usage
;;
?)
usage
;;
esac
done
shift $((OPTIND-1))
if ! echo $* | grep test >/dev/null
then
if ! echo $* | grep verify >/dev/null
then
echo "Error: command line doesn't look right - should contain \`test' or \`verify' token..." >&2
usage
fi
fi
function finish {
NOW=`date +%s`
RUNTIME=$((NOW - START))
AVG=$(echo "scale=2; $RUNTIME/$COUNT" | bc)
OUT="*********************************************************************"
OUT="$OUT\n* tail -n 30 $TMP:"
OUT="$OUT\n*********************************************************************"
OUT="$OUT\n`tail -n 30 $TMP`"
OUT="$OUT\n*********************************************************************"
OUT="$OUT\n* Total runtime: ${RUNTIME}s"
OUT="$OUT\n* Iterations: ${COUNT}"
OUT="$OUT\n* Average time: ${AVG}s"
OUT="$OUT\n* Log file: ${TMP}"
OUT="$OUT\n*********************************************************************"
echo -e "$OUT"
if [[ "$EMAIL" != "" && "$REASON" != "" ]]
then
SUBJECT="test loop finished ($REASON)"
echo -e "$OUT" | mail -s "$SUBJECT" $EMAIL
fi
}
trap "echo Caught signal, exiting...; REASON=\"received signal\"; finish; exit -1" SIGINT SIGTERM
TMP=`mktemp`
START=`date +%s`
COUNT=0
if ! test -f "$TMP"
then
echo "Couldn't create temporary file!"
exit -1
fi
echo "Temporary file is $TMP"
CMD="make $*"
echo "Command line is \`$CMD'"
REASON=""
while true
do
COUNT=$((COUNT+1))
BEFORE=`date +%s`
if [[ "$PRE_EXEC_CMD" != "" ]]
then
echo "Executing \`$PRE_EXEC_CMD' before test.."
if ! ($PRE_EXEC_CMD 2>&1 | tee $TMP)
then
echo "\`$PRE_EXEC_CMD' failed!" >&2
REASON="$PRE_EXEC_CMD failed"
break
fi
fi
echo -n "Running test iteration #$COUNT..."
if ! ($CMD >$TMP 2>&1)
then
AFTER=`date +%s`
RUNTIME=$((AFTER-BEFORE))
echo "FAILED! (after ${RUNTIME}s)"
REASON="test failed"
break
fi
AFTER=`date +%s`
RUNTIME=$((AFTER-BEFORE))
echo "PASSED (after ${RUNTIME}s)"
done
finish
exit 1