diff options
Diffstat (limited to 'testing/fulltests/support/simple_eval_tools.sh')
-rw-r--r-- | testing/fulltests/support/simple_eval_tools.sh | 695 |
1 files changed, 695 insertions, 0 deletions
diff --git a/testing/fulltests/support/simple_eval_tools.sh b/testing/fulltests/support/simple_eval_tools.sh new file mode 100644 index 0000000..314d9bb --- /dev/null +++ b/testing/fulltests/support/simple_eval_tools.sh @@ -0,0 +1,695 @@ +# +# eval_tools.sh +# +# Output functions for script tests. Source this from other test scripts +# to establish a standardized repertory of test functions. +# +# +# Except where noted, all functions return: +# 0 On success, (Bourne Shell's ``true'') +# non-0 Otherwise. +# +# Input arguments to each function are documented with each function. +# +# +# XXX Suggestions: +# DEBUG ON|OFF +# dump CAPTURE output to stdout as well as to junkoutputfile. +# + +# +# Only allow ourselves to be eval'ed once +# +if [ "x$EVAL_TOOLS_SH_EVALED" != "xyes" ]; then + EVAL_TOOLS_SH_EVALED=yes + +# +# Variables used in global environment of calling script. +# +failcount=0 +testnum=0 +errnum=0 +junkoutputfilebase="$SNMP_TMPDIR/output-`basename $0`$$" +junkoutputfile=$junkoutputfilebase +outputcount=0 +separator="-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" +if [ -z "$OK_TO_SAVE_RESULT" ] ; then +OK_TO_SAVE_RESULT=1 +export OK_TO_SAVE_RESULT +fi + +# +# HEADER: returns a single line when SNMP_HEADERONLY mode and exits. +# +HEADER() { + if [ "x$SNMP_HEADERONLY" != "x" ]; then + echo test $* + exit 0; + else + { echo "# testing $*"; echo ""; } >> $SNMP_TMPDIR/invoked + fi +} + + +#------------------------------------ -o- +# +OUTPUT() { # <any_arguments> + cat <<GRONK + + +$* + + +GRONK +} + +CAN_USLEEP() { + if [ "$SNMP_CAN_USLEEP" = 0 -o "$SNMP_CAN_USLEEP" = 1 ] ; then + return 0 + fi + sleep .1 > /dev/null 2>&1 + if [ $? = 0 ] ; then + SNMP_CAN_USLEEP=1 + else + SNMP_CAN_USLEEP=0 + fi + export SNMP_CAN_USLEEP +} + + +#------------------------------------ -o- +# +SUCCESS() { # <any_arguments> + [ "$failcount" -ne 0 ] && return + cat <<GROINK + +SUCCESS: $* + +GROINK +} + + + +#------------------------------------ -o- +# +FAILED() { # <return_value>, <any_arguments> + [ "$1" -eq 0 ] && return + shift + + failcount=`expr $failcount + 1` + cat <<GRONIK + +FAILED: $* + +GRONIK +} + +#------------------------------------ -o- +# +SKIP() { + REMOVETESTDATA + echo "1..0 # SKIP $*" + exit 0 +} + +ISDEFINED() { + grep "^#define $1 " ${builddir}/include/net-snmp/net-snmp-config.h ${builddir}/include/net-snmp/agent/mib_module_config.h ${builddir}/include/net-snmp/agent/agent_module_config.h > /dev/null +} + +SKIPIFNOT() { + ISDEFINED "$1" || SKIP "$1 is not defined" +} + +SKIPIF() { + ISDEFINED "$1" && SKIP "$1 is defined" +} + +#------------------------------------ -o- +# +VERIFY() { # <path_to_file(s)> + local missingfiles= + + for f in $*; do + [ -f "$f" ] && continue + echo "FAILED: Cannot find file \"$f\"." + missingfiles=true + done + + [ "$missingfiles" = true ] && exit 1000 +} + +NEWOUTPUTFILE() { + outputcount=`expr $outputcount + 1` + junkoutputfile="${junkoutputfilebase}-$outputcount" +} + +#------------------------------------ -o- +# +STARTTEST() { + NEWOUTPUTFILE + [ ! -f "$junkoutputfile" ] && { + touch $junkoutputfile + return + } + echo "FAILED: Output file already exists: \"$junkoutputfile\"." + exit 1000 +} + + +#------------------------------------ -o- +# +STOPTEST() { + rm -f "$junkoutputfile" +} + + +#------------------------------------ -o- +# +REMOVETESTDATA() { +# ECHO "removing $SNMP_TMPDIR " + rm -rf $SNMP_TMPDIR +} + +#------------------------------------ -o- +# +OUTPUTENVVARS() { + echo "SNMPCONFPATH=$SNMPCONFPATH" >> $1 + echo "SNMP_PERSISTENT_DIR=$SNMP_PERSISTENT_DIR" >> $1 + echo "MIBDIRS=$MIBDIRS" >> $1 + echo "PATH=$PATH" >> $1 + echo "export SNMPCONFPATH" >> $1 + echo "export SNMP_PERSISTENT_DIR" >> $1 + echo "export MIBDIRS" >> $1 + echo "export PATH" >> $1 +} + +#------------------------------------ -o- +# Captures output from command, and returns the command's exit code. +loggedvars=0 +CAPTURE() { # <command_with_arguments_to_execute> + NEWOUTPUTFILE + + # track invoked command per test when verbose + if [ $SNMP_VERBOSE -gt 0 ]; then + OUTPUTENVVARS $junkoutputfile.invoked + echo $* >> $junkoutputfile.invoked + fi + + if [ $loggedvars = 0 ]; then + OUTPUTENVVARS $SNMP_TMPDIR/invoked + loggedvars=1 + fi + echo $* >> $SNMP_TMPDIR/invoked + + if [ $SNMP_VERBOSE -gt 0 ]; then + cat <<KNORG + +EXECUTING: $* + +KNORG + + fi + echo "RUNNING: $*" > $junkoutputfile + ( $* 2>&1 ) >> $junkoutputfile 2>&1 + RC=$? + + if [ $SNMP_VERBOSE -gt 1 ]; then + echo "Command Output: " + echo "MIBDIR $MIBDIRS $MIBS" + echo "$separator" + cat $junkoutputfile | sed 's/^/ /' + echo "$separator" + fi + return $RC +} + +#------------------------------------ -o- +# Delay to let processes settle +DELAY() { + if [ "$SNMP_SLEEP" != "0" ] ; then + sleep $SNMP_SLEEP + fi +} + +SAVE_RESULTS() { + real_return_value=$return_value +} + +# +# Checks the output result against what we expect. +# Sets return_value to 0 or 1. +# +EXPECTRESULT() { + if [ $OK_TO_SAVE_RESULT -ne 0 ] ; then + if [ "$snmp_last_test_result" = "$1" ]; then + return_value=0 + else + return_value=1 + fi + fi +} + +CHECKCOUNT() { + CHECKFILECOUNT "$junkoutputfile" $@ +} + +CHECKVALUEIS() { + value1=$1 + value2=$2 + if [ "x$value1" = "x$value2" ]; then + GOOD "$3" + else + BAD "$3" + fi +} + +CHECKVALUEISNT() { + value1=$1 + value2=$2 + if [ "x$value1" = "x$value2" ]; then + BAD "$3" + else + GOOD "$3" + fi +} + +#------------------------------------ -o- +# Returns: Count of matched lines. +# +CHECKFILECOUNT() { # <pattern_to_match> + chkfile=$1 + ckfcount=$2 + shift + shift + if [ $SNMP_VERBOSE -gt 0 ]; then + echo -n "checking $chkfile for $ckfcount \"$*\"..." + fi + + if [ -f $chkfile ]; then + rval=`grep -c "$*" "$chkfile" 2>/dev/null` + else + COMMENT "Note: file $chkfile does not exist and we were asked to check it" + rval=0 + fi + + if [ $SNMP_VERBOSE -gt 0 ]; then + echo "$rval matches found" + fi + + snmp_last_test_result=$rval + EXPECTRESULT $ckfcount # default + if [ "$ckfcount" != "noerror" ]; then + if [ "$ckfcount" = "atleastone" ]; then + if [ "$rval" -ne "0" ]; then + GOOD "found $ckfcount copies of '$*' in output ($chkfile); needed one" + else + BAD "found $rval copies of '$*' in output ($chkfile); expected 1" + COMMENT "Outputfile: $chkfile" + fi + else + if [ "$rval" = "$ckfcount" ]; then + GOOD "found $ckfcount copies of '$*' in output ($chkfile)" + else + BAD "found $rval copies of '$*' in output ($chkfile); expected $ckfcount" + COMMENT "Outputfile: $chkfile" + fi + fi + fi + return $rval +} + +CHECK() { + CHECKCOUNT 1 $@ +} + +CHECKFILE() { + file=$1 + shift + CHECKFILECOUNT $file 1 $@ +} + +CHECKTRAPD() { + CHECKFILE $SNMP_SNMPTRAPD_LOG_FILE $@ +} + +CHECKTRAPDCOUNT() { + count=$1 + shift + CHECKFILECOUNT $SNMP_SNMPTRAPD_LOG_FILE $count $@ +} + +CHECKTRAPDORDIE() { + CHECKORDIE $@ $SNMP_SNMPTRAPD_LOG_FILE +} + +CHECKAGENT() { + CHECKFILE $SNMP_SNMPD_LOG_FILE $@ +} + +CHECKAGENTCOUNT() { + count=$1 + shift + CHECKFILECOUNT $SNMP_SNMPD_LOG_FILE $count $@ +} + +# Return 0 (true) if a process with pid $1 exists and 1 (false) if no process +# with pid $1 exists. Do not use this function on MinGW: the PIDs written by +# snmpd and snmptrapd to their pid files are not visible in the MinGW/MSYS +# process table. +ISRUNNING() { + #ps -e 2>/dev/null | egrep "^[ ]*$1[ ]+" >/dev/null 2>&1 + kill -0 "$pid" 2>/dev/null +} + +# Echo a command that asks the process with pid $1 to stop. +ECHOSENDSIGTERM() { + if [ "x$OSTYPE" = "xmsys" ]; then + echo pskill.exe $1 + else + echo kill -TERM $1 + fi +} + +# Echo a command that stops the process with pid $1 forcibly. +ECHOSENDSIGKILL() { + if [ "x$OSTYPE" = "xmsys" ]; then + echo pskill.exe $1 + else + echo kill -KILL $1 + fi +} + +# Wait until the shell statement "$@" evaluates to false. +WAITFORNOTCOND() { + CAN_USLEEP + if [ $SNMP_CAN_USLEEP = 1 ] ; then + sleeptime=`expr $SNMP_SLEEP '*' 50` + else + sleeptime=`expr $SNMP_SLEEP '*' 5` + fi + while [ $sleeptime -gt 0 ] && eval "$@"; do + if [ $SNMP_CAN_USLEEP = 1 ]; then + sleep .1 + else + sleep 1 + fi + sleeptime=`expr $sleeptime - 1` + done +} + +# Wait until the shell statement "$@" evaluates to true. +WAITFORCOND() { + WAITFORNOTCOND if "$@;" then false ";" else true ";" fi +} + +WAITFORAGENT() { + WAITFOR "$@" $SNMP_SNMPD_LOG_FILE +} + +WAITFORTRAPD() { + WAITFOR "$@" $SNMP_SNMPTRAPD_LOG_FILE +} + +# Wait until pattern "$1" appears in file "$2". +WAITFOR() { + WAITFORCOND grep "$1" "$2" ">/dev/null" "2>&1" +} + +GOOD() { + testnum=`expr $testnum + 1` + echo "ok $testnum - $1" + echo "# ok $testnum - $1" >> $SNMP_TMPDIR/invoked +} + +BAD() { + testnum=`expr $testnum + 1` + errnum=`expr $errnum + 1` + echo "not ok $testnum - $1" + echo "# not ok $testnum - $1" >> $SNMP_TMPDIR/invoked +} + +COMMENT() { + echo "# $@" + echo "# $@" >> $SNMP_TMPDIR/invoked +} + +# CHECKORDIE "grep string" ["file"] .. FAIL if "grep string" is *not* found +CHECKORDIE() { + if [ "x$2" = "x" ]; then + CHECKFILE "$junkoutputfile" "$1" + else + CHECKFILECOUNT "$2" 1 "$1" + fi +} + +# CHECKANDDIE "grep string" ["file"] .. FAIL if "grep string" *is* found +CHECKANDDIE() { + if [ "x$2" = "x" ]; then + CHECKFILECOUNT "$junkoutputfile" 0 "$1" + else + CHECKFILECOUNT "$2" 0 "$1" + fi +} + +#------------------------------------ -o- +# Returns: Count of matched lines. +# +CHECKEXACT() { # <pattern_to_match_exactly> + rval=`egrep -c "^$*\$|^$*[^a-zA-Z0-9_]|[^a-zA-Z0-9_]$*\$|[^a-zA-Z0-9_]$*[^a-zA-Z0-9_]" "$junkoutputfile" 2>/dev/null` + snmp_last_test_result=$rval + EXPECTRESULT 1 # default + return $rval +} + +CONFIGAGENT() { + if [ "x$SNMP_CONFIG_FILE" = "x" ]; then + echo "$0: failed because var: SNMP_CONFIG_FILE wasn't set" + exit 1; + fi + echo $* >> $SNMP_CONFIG_FILE +} + +CONFIGTRAPD() { + if [ "x$SNMPTRAPD_CONFIG_FILE" = "x" ]; then + echo "$0: failed because var: SNMPTRAPD_CONFIG_FILE wasn't set" + exit 1; + fi + echo $* >> $SNMPTRAPD_CONFIG_FILE +} + +CONFIGAPP() { + if [ "x$SNMPAPP_CONFIG_FILE" = "x" ]; then + echo "$0: failed because var: SNMPAPP_CONFIG_FILE wasn't set" + exit 1; + fi + echo $* >> $SNMPAPP_CONFIG_FILE +} + +# +# common to STARTAGENT and STARTTRAPD +# log command to "invoked" file +# +STARTPROG() { + if [ "x$DYNAMIC_ANALYZER" != "x" ]; then + COMMAND="$DYNAMIC_ANALYZER $COMMAND" + fi + if [ $SNMP_VERBOSE -gt 1 ]; then + echo "$CFG_FILE contains: " + if [ -f $CFG_FILE ]; then + cat $CFG_FILE + else + echo "[no config file]" + fi + fi + if test -f $CFG_FILE; then + COMMAND="$COMMAND -C -c $CFG_FILE" + fi + if [ "x$PORT_SPEC" != "x" ]; then + COMMAND="$COMMAND $PORT_SPEC" + fi + if [ $SNMP_VERBOSE -gt 0 ]; then + echo "running: $COMMAND" + fi + echo $COMMAND >> $SNMP_TMPDIR/invoked + if [ $SNMP_VERBOSE -gt 0 ]; then + OUTPUTENVVARS $LOG_FILE.command + echo $COMMAND >> $LOG_FILE.command + fi + if [ "x$OSTYPE" = "xmsys" ]; then + $COMMAND > $LOG_FILE.stdout 2>&1 & + ## COMMAND="cmd.exe //c start //min $COMMAND" + ## start $COMMAND > $LOG_FILE.stdout 2>&1 + else + $COMMAND > $LOG_FILE.stdout 2>&1 + fi +} + +#------------------------------------ -o- +STARTAGENT() { + SNMPDSTARTED=1 + COMMAND="snmpd $SNMP_FLAGS -r -U -p $SNMP_SNMPD_PID_FILE -Lf $SNMP_SNMPD_LOG_FILE $AGENT_FLAGS" + CFG_FILE=$SNMP_CONFIG_FILE + LOG_FILE=$SNMP_SNMPD_LOG_FILE + PORT_SPEC="$SNMP_SNMPD_PORT" + if [ "x$SNMP_TRANSPORT_SPEC" != "x" ]; then + PORT_SPEC="${SNMP_TRANSPORT_SPEC}:${SNMP_TEST_DEST}${PORT_SPEC}" + fi + STARTPROG + WAITFORCOND test -f $SNMP_SNMPD_PID_FILE + WAITFORAGENT "NET-SNMP version" +} + +#------------------------------------ -o- +STARTTRAPD() { + TRAPDSTARTED=1 + COMMAND="snmptrapd -d -p $SNMP_SNMPTRAPD_PID_FILE -Lf $SNMP_SNMPTRAPD_LOG_FILE $TRAPD_FLAGS" + CFG_FILE=$SNMPTRAPD_CONFIG_FILE + LOG_FILE=$SNMP_SNMPTRAPD_LOG_FILE + PORT_SPEC="$SNMP_SNMPTRAPD_PORT" + if [ "x$SNMP_TRANSPORT_SPEC" != "x" ]; then + PORT_SPEC="${SNMP_TRANSPORT_SPEC}:${SNMP_TEST_DEST}${PORT_SPEC}" + fi + STARTPROG + WAITFORCOND test -f $SNMP_SNMPTRAPD_PID_FILE + WAITFORTRAPD "NET-SNMP version" +} + +## sending SIGHUP for reconfiguration +# +HUPPROG() { + if [ -f $1 ]; then + if [ "x$OSTYPE" = "xmsys" ]; then + COMMAND='echo "Skipping SIGHUP (not possible with MinGW)"' + else + COMMAND="kill -HUP `cat $1`" + fi + echo $COMMAND >> $SNMP_TMPDIR/invoked + VERBOSE_OUT 0 $COMMAND + $COMMAND > /dev/null 2>&1 + fi +} + +HUPAGENT() { + HUPPROG $SNMP_SNMPD_PID_FILE + if [ "x$OSTYPE" != "xmsys" ]; then + WAITFORAGENT "restarted" + fi +} + +HUPTRAPD() { + HUPPROG $SNMP_SNMPTRAPD_PID_FILE + if [ "x$OSTYPE" != "xmsys" ]; then + WAITFORTRAPD "restarted" + fi +} + + +## used by STOPAGENT and STOPTRAPD +# delay before kill to allow previous action to finish +# this is especially important for interaction between +# master agent and sub agent. +STOPPROG() { + pid="`cat $1 2>/dev/null`" + if [ "x$pid" != "x" ]; then + COMMAND="`ECHOSENDSIGTERM $pid`" + echo "$COMMAND ($1)" >> $SNMP_TMPDIR/invoked + VERBOSE_OUT 0 "$COMMAND ($1)" + $COMMAND >/dev/null 2>&1 + if [ "x$OSTYPE" = "xmsys" ]; then + # Wait until $pid and its parent have stopped. + sleep 1 + else + WAITFORNOTCOND "ISRUNNING $pid" + fi + fi +} + +#------------------------------------ -o- +# +STOPAGENT() { + SAVE_RESULTS + STOPPROG $SNMP_SNMPD_PID_FILE + if [ $SNMP_VERBOSE -gt 1 ]; then + echo "Agent Output:" + echo "$separator [stdout]" + cat $SNMP_SNMPD_LOG_FILE.stdout + echo "$separator [logfile]" + cat $SNMP_SNMPD_LOG_FILE + echo "$separator" + fi +} + +#------------------------------------ -o- +# +STOPTRAPD() { + SAVE_RESULTS + STOPPROG $SNMP_SNMPTRAPD_PID_FILE + if [ $SNMP_VERBOSE -gt 1 ]; then + echo "snmptrapd Output:" + echo "$separator [stdout]" + cat $SNMP_SNMPTRAPD_LOG_FILE.stdout + echo "$separator [logfile]" + cat $SNMP_SNMPTRAPD_LOG_FILE + echo "$separator" + fi +} + +#------------------------------------ -o- +# +FINISHED() { + + ## no more changes to test result. + OK_TO_SAVE_RESULT=0 + + pids="`cat $SNMP_TMPDIR/*pid* 2>/dev/null`" + if [ "$SNMPDSTARTED" = "1" ] ; then + STOPAGENT + fi + if [ "$TRAPDSTARTED" = "1" ] ; then + STOPTRAPD + fi + for pid in $pids; do + if [ "x$OSTYPE" = "xmsys" ] || ISRUNNING $pid; then + if [ "x$OSTYPE" != "xmsys" ]; then + SNMP_SAVE_TMPDIR=yes + fi + COMMAND="`ECHOSENDSIGKILL $pid`" + echo "$COMMAND ($pfile)" >> $SNMP_TMPDIR/invoked + VERBOSE_OUT 0 "$COMMAND ($pfile)" + $COMMAND > /dev/null 2>&1 + return_value=1 + fi + done + + # report the number of tests done + GOOD "got to FINISHED" + echo "1..$testnum" + + if [ "x$errnum" != "x0" ]; then + if [ -s core ] ; then + # XX hope that only one prog cores ! + cp core $SNMP_TMPDIR/core.$$ + rm -f core + fi + echo "$headerStr...FAIL" >> $SNMP_TMPDIR/invoked + exit 1 + fi + + echo "$headerStr...ok" >> $SNMP_TMPDIR/invoked + + if [ "x$SNMP_SAVE_TMPDIR" != "xyes" ]; then + REMOVETESTDATA + fi + exit 0 +} + +#------------------------------------ -o- +# +VERBOSE_OUT() { + if [ $SNMP_VERBOSE -gt $1 ]; then + shift + echo "$*" + fi +} + +fi # Only allow ourselves to be eval'ed once |