#
# 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
    . ../TESTCONF.sh

#
# Variables used in global environment of calling script.
#
failcount=0
junkoutputfile="$SNMP_TMPDIR/output-`basename $0`$$"
seperator="-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="

#
# HEADER: returns a single line when SNMP_HEADERONLY mode and exits.
#
HEADER() {
    if [ "x$SNMP_HEADERONLY" != "x" ]; then
        echo test $*
	exit 0;
    else
	echo -n "testing $*...  "
    fi
}


#------------------------------------ -o- 
#
OUTPUT() {	# <any_arguments>
	cat <<GRONK


$*


GRONK
}


#------------------------------------ -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- 
#
VERIFY() {	# <path_to_file(s)>
	local	missingfiles=

	for f in $*; do
		[ -e "$f" ] && continue
		echo "FAILED: Cannot find file \"$f\"."
		missingfiles=true
	done

	[ "$missingfiles" = true ] && exit 1000
}


#------------------------------------ -o- 
#
STARTTEST() {	
	[ ! -e "$junkoutputfile" ] && {
		touch $junkoutputfile
		return
	}
	echo "FAILED: Output file already exists: \"$junkoutputfile\"."
	exit 1000
}


#------------------------------------ -o- 
#
STOPTEST() {
	rm -rf "$junkoutputfile"
}


#------------------------------------ -o- 
#
CAPTURE() {	# <command_with_arguments_to_execute>
	if [ $SNMP_VERBOSE -gt 0 ]; then
		cat <<KNORG

EXECUTING: $*

KNORG

	fi
	( $* 2>&1 ) > $junkoutputfile

	if [ $SNMP_VERBOSE -gt 1 ]; then
		echo "Command Output: "
		echo "$seperator"
		cat $junkoutputfile | sed 's/^/  /'
		echo "$seperator"
	fi
}


#
# Checks the output result against what we expect.
#   Sets return_value to 0 or 1.
#
EXPECTRESULT() {
    if [ $snmp_last_test_result = $1 ]; then
	return_value=0
    else
	return_value=1
    fi
}

#------------------------------------ -o- 
# Returns: Count of matched lines.
#
CHECK() {	# <pattern_to_match>
	if [ $SNMP_VERBOSE -gt 0 ]; then
	    echo -n "checking output for \"$*\"..."
	fi

	rval=`grep -c "$*" "$junkoutputfile" 2>/dev/null`

	if [ $SNMP_VERBOSE -gt 0 ]; then
	    echo "$rval matches found"
	fi

	snmp_last_test_result=$rval
	EXPECTRESULT 1  # default
	return $rval
}


#------------------------------------ -o- 
# Returns: Count of matched lines.
#
CHECKEXACT() {	# <pattern_to_match_exactly>
	rval=`grep -wc "$*" "$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
}

STARTAGENT() {
    if [ $SNMP_VERBOSE -gt 1 ]; then
	echo "agent config: "
	cat $SNMP_CONFIG_FILE
    fi
    COMMANDARGS="$SNMP_FLAGS $SNMP_SNMPD_PORT -P $SNMP_SNMPD_PID_FILE -l $SNMP_SNMPD_LOG_FILE -C -c $SNMP_CONFIG_FILE $AGENT_FLAGS"
#    VERBOSE_OUT 2 "starting agent: snmpd $SNMP_SNMPD_PORT -P $SNMP_SNMPD_PID_FILE -l $SNMP_SNMPD_LOG_FILE -C -c $SNMP_CONFIG_FILE"
   if [ $SNMP_VERBOSE -gt 0 ]; then
	echo "running: snmpd $COMMANDARGS"
   fi
   snmpd $COMMANDARGS
}

STOPAGENT() {
    if [ -f $SNMP_SNMPD_PID_FILE ]; then
	kill `cat $SNMP_SNMPD_PID_FILE`
	# XXX: kill -9 later (after sleep and ps grok?)?
    fi
    if [ $SNMP_VERBOSE -gt 1 ]; then
	echo "Agent Output:"
	echo "$seperator"
	cat $SNMP_SNMPD_LOG_FILE
	echo "$seperator"
    fi
    rm $SNMP_SNMPD_PID_FILE
}

FINISHED() {
    if [ "x$SNMP_SAVE_TMPDIR" != "xyes" ]; then
	rm -rf $SNMP_TMPDIR
    fi
    if [ "x$return_value" = "x0" ]; then
	echo "ok"
    else
	echo "FAIL"
    fi
    exit $return_value
	
}

VERBOSE_OUT() {
    if [ $SNMP_VERBOSE > $1 ]; then
	shift
	echo "$*"
    fi
}

fi # Only allow ourselves to be eval'ed once
