blob: 1c1a0f23a2c4a40447a4b5e21d382b0e114a003e [file] [log] [blame]
#!/bin/sh
#
# eval_suite.sh [-h][<args_passed_to_getresults>]
#
# CALLS: eval_oneprogram.sh [-h][-lk] <program>
#
# RETURNS: Number of failed tests, regardless of how that failure occured
# or how many failures there were in a given test.
#
#
USAGE_LONG='
#
# HOW TO ENTER A NEW TEST
#
# To add a test to the testlist, add a line to the TESTLISTFILE (eval_testlist)
# using the following format:
#
# <#_of_expected_successes> [#]<program> <args>
#
# Any white space may be used as separator. If <program> is immediately
# preceeded by a pound sign (#) that test will be skipped. (No white space
# allowed after the pound. Eg, "#<program>".)
#
#
# HOW TESTS ARE RUN AND EVALUATED
#
# The harness for individual tests is the script "eval_oneprogram.sh".
# It expects that the test print FAILED when something fails, and SUCCESS
# when something succeeds. If a test executes properly there should be
# some SUCCESS strings and NO FAILED strings. If the reason for the
# success or failure of the test should be printed on the SAME line as the
# SUCCESS/FAILED string to allow the dianostic to be easilly grepped from
# the its output.
#
# The long form of the output (-l flag) will capture that output which may
# help to diagnosis the problem. For more information:
#
# % eval_oneprogram.sh -h
#
#
# MISSING TESTS ARE NOTED
#
# If an executable is found MISSING, a note is printed to that effect
# and TESTFAILURE is incremented by 1.
#
'
#
# Suggested improvement(s):
# Have two (or more?) arbitrary script(s) that may be associated
# with a given test. One could prepare the environment, the other
# could clean up the environment after running the test. This could
# help when testing large subsystems that might require legitimately
# building or changing things such that the testable item may be
# accessed in the first place (eg). ...
#
#------------------------------------ -o-
# Usage mess. (No, it works.)
#
USAGE="Usage: `basename $0` [-h][<args_for_getresults>]"
usage() { echo; echo $USAGE; cat <<BLIK | sed 's/^#//' | sed '1d' | $PAGER
$USAGE_LONG
BLIK
exit 0
}
[ "x$1" = "x-h" ] && usage
#------------------------------------ -o-
# Globals.
#
PROGRAM=
ARGUMENTS="$*"
umask 0077 # just to be on the safe side
SNMP_TMPDIR=/tmp/net-snmpd-eval-dir.$$
rm -rf $SNMP_TMPDIR
mkdir $SNMP_TMPDIR || exit -1
chmod 0700 $SNMP_TMPDIR
TMPFILE=$SNMP_TMPDIR/eval_suite.sh$$
TESTLISTFILE=eval_testlist
EXPECTEDSUCCESSES=
TESTFAILURE=0
testname=
success_count=
failed_count=
#
# TESTLISTFILE format:
# <expected_successes> <program> <arg(s)> ...
# <expected_successes> <program> <arg(s)> ...
# ...
#
TESTLIST="`cat $TESTLISTFILE | sed 's/$/ ===/'`"
#------------------------------------ -o-
# Run all tests in the testlist. For each test do the following:
#
# 1) Note whether the test is SKIPPED or MISSING.
#
# 2) Run the test; collect the number of FAILED strings from the
# return value of eval_oneprogram.sh.
#
# 3) Count the number of SUCCESSes from the test output.
#
# 4) Print the results. If there were no FAILED strings *and* the
# number of SUCCESS strings is what we expect, simply
# note that the test passed. Otherwise, cat the output
# generated by eval_oneprogram.sh and (possibly)
# print other details.
#
set x $TESTLIST
shift
while [ -n "$1" ] ; do
#
# Parse agument stream...
#
EXPECTEDSUCCESSES=$1
shift
PROGRAM=
while [ "$1" != "===" ] ; do { PROGRAM="$PROGRAM $1" ; shift ; } done
shift
testname="`echo $PROGRAM | grep '^#' | sed 's/^#//'`"
echo '+==================================-o-===+'
echo
#
# Decide whether to skip the test, if it's mising, else run it.
#
[ -n "$testname" ] && { # Skip the test?
echo "SKIPPING test for \"$testname\"."
echo
continue
}
[ ! -e "`echo $PROGRAM | awk '{ print $1 }'`" ] && { # Missing test?
TESTFAILURE=`expr $TESTFAILURE + 1`
echo "MISSING test for \"$PROGRAM\"."
echo
continue
}
echo "TESTING \"$PROGRAM\"..." # Announce test!
#
# Run the test and collect the failed_count and success_count.
#
eval_oneprogram.sh $ARGUMENTS $PROGRAM >$TMPFILE
failed_count=$?
success_count=`awk '$(NF-1) == "SUCCESS:" { print $NF; exit }' $TMPFILE`
[ -z "$success_count" ] && success_count=0
#
# Output best-effort results of the test -OR- a fully successful run.
#
[ "$failed_count" -eq 0 -a \
"$success_count" -eq "$EXPECTEDSUCCESSES" ] &&
{
echo
echo $PROGRAM PASSED # Successful, fully, completed
echo
true
} || {
TESTFAILURE=`expr $TESTFAILURE + 1`
echo
cat $TMPFILE
echo
[ "$success_count" -ne $EXPECTEDSUCCESSES ] && {
echo "Got $success_count SUCCESSes"\
"out of $EXPECTEDSUCCESSES."
echo
}
true
} # end -- evaluation of and output based upon test success.
done # endwhile
#------------------------------------ -o-
# Cleanup, exit.
#
rm -f $TMPFILE
rm -rf $SNMP_TMPDIR
exit $TESTFAILURE