1#!/usr/local/bin/bash 2# testframe.sh DIR 3# bare-bones testing framework. 4# run the test suites in the given DIR; 5# exit with nonzero status if any of them failed. 6# see README.testframe.txt for details. 7# 8 9# echo labelled error/warning message to stderr 10report() 11{ 12 echo $PROG: $* 1>&2 13} 14 15# echo OK or BAD depending on argument (0 or not) 16status_word() 17{ 18 if [ "$1" -eq 0 ]; then 19 echo OK 20 else 21 echo BAD 22 fi 23} 24 25# run the given testsuite, return nonzero if any testcase failed. 26run_testsuite() 27{ 28 typeset testsuite="$1" 29 30 NFAIL=0 31 NSUCC=0 32 33 # add testsuite dir to PATH for convenience 34 typeset dir=$(dirname $testsuite) 35 PATH=$dir:$PATH 36 . testframe.inc 37 if [ -f $dir/common.inc ]; then 38 . $dir/common.inc 39 fi 40 . $testsuite 41 export TESTSUITE_NAME=$testsuite 42 43 echo "" 44 echo "# Begin $testsuite" 45 46 run 47 typeset runstat=$? 48 49 echo "# $testsuite summary: $NSUCC succeeded, $NFAIL failed" 50 if [ $runstat -ne 0 ]; then 51 ((NFAIL++)) 52 report "error: $testsuite run exit_status=$runstat!" 53 fi 54 echo "# End $testsuite -" $(status_word $NFAIL) 55 [ $NFAIL -eq 0 ] 56} 57 58# 59# list all testsuite scripts in the given directories. 60# a testsuite file must be a bash script whose name is of the form test_*.sh . 61# 62list_testsuites() 63{ 64 for dir in "$@"; do 65 ls $dir/test_*.sh 2>/dev/null 66 done 67} 68 69main() 70{ 71 TS_NFAIL=0 72 TS_NSUCC=0 73 74 echo "# Begin Test Suites in $*" 75 typeset testsuites=$(list_testsuites "$@") 76 77 if [ -z "$testsuites" ]; then 78 report "error: no testsuites found" 79 exit 1 80 fi 81 82 for testsuite in $testsuites; do 83 if run_testsuite $testsuite; then 84 ((TS_NSUCC++)) 85 else 86 ((TS_NFAIL++)) 87 fi 88 done 89 90 echo "" 91 echo "# Test Suites summary: $TS_NSUCC succeeded, $TS_NFAIL failed" 92 echo "# End Test Suites -" $(status_word $TS_NFAIL) 93 [ $TS_NFAIL -eq 0 ] 94} 95 96# ----- start of mainline code 97PROG=${0##*/} 98 99main "${@:-.}" 100