| #!/bin/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 |