blob: f76860285017148a7ece2de7edcc7f8a503feb75 [file] [log] [blame]
############################################################
## Convenience functions for reporting, asserting, etc. ##
############################################################
# warn(TEXT)
#
# Issues a warning message to stderr
#
warn()
{
echo $1 1>&2
}
# assert()
#
# Basic assertion support. Use it like this:
#
# a=5
# b=4
# condition="$a -lt $b" # Error message and exit from script.
# # Try setting "condition" to something else,
# #+ and see what happens.
#
# assert "$condition" $LINENO
#
# Note that $LINENO is a built-in
#
assert () # If condition false,
{ #+ exit from script with error message.
E_PARAM_ERR=98
E_ASSERT_FAILED=99
if [ -z "$2" ] # Not enough parameters passed.
then
return $E_PARAM_ERR # No damage done.
fi
lineno=$2
if [ ! $1 ]
then
echo "Assertion failed: \"$1\""
echo "File \"$0\", line $lineno"
exit $E_ASSERT_FAILED
# else
# return
# and continue executing script.
fi
}
############################################################
## Process management ##
############################################################
# pid_is_valid(PID)
#
# Checks if the given $PID is still running. Returns a true value if
# it is, false otherwise.
#
pid_is_valid()
{
PID=$1
ps --pid ${PID} --no-header | grep ${PID}
return $?
}
# kill_pid(PID)
#
# Forcibly kills the process ID and prevents it from
# displaying any messages (to stdout, stderr, or otherwise)
#
kill_pid()
{
PID=$1
disown $PID
kill -9 $PID > /dev/null 2>&1
}
############################################################
## Timing ##
############################################################
# Routines in this library are set up to allow timing to be done
# by defining $TIME to a timing command. You can define your
# own handler by defining $TIME before or after including this
# library.
TIME=${TIME:-""}
# Allows overriding the filename to use for storing time
# measurements. Required in order to
TIME_TMP_FILE=${TIME_TMP_FILE:-"${TMP:-/tmp}/cpu_$$"}
# perform_timings()
#
# This turns on timings for operations that support timing
# via the $TIME variable. It does this by setting $TIME to
# a general purpose time command.
set_timing_on()
{
TIME="/usr/bin/time -o $TIME_TMP_FILE -f \"%e\""
}
report_timing()
{
MSG=${1:-"perform operation"}
if [ ! -z "${TIME}" ]; then
TM=`cat $TIME_TMP_FILE`
echo "Time to ${MSG} : $TM"
fi
}
############################################################
## Interrupt handling and cleanup ##
############################################################
# do_clean()
#
# Virtual function called by do_intr(). Override this to
# provide custom cleanup handling.
#
do_clean()
{
return 0
}
# do_testsuite_clean()
#
# Internal routine to do cleanup specific to other routines
# in this testsuite. You may override this routine if you
# do not want this behavior.
#
do_testsuite_clean()
{
/bin/rm -rf $TIME_TMP_FILE
}
# exit_clean(EXIT_CODE)
#
# Replacement for exit command. Prints the date, then calls do_clean
# and exits with the given $EXIT_CODE, or 0 if none specified.
#
exit_clean()
{
EXIT_CODE=${1:-0}
date
do_clean
exit $EXIT_CODE
}
# do_intr()
#
# Handler for trapped interrupts (i.e., signals 1 2 15).
#
# This will result in a call do do_clean() when the user
# interrupts the test, allowing you to do whatever final
# cleanup work is needed (removing tmp files, restoring
# resources to initial states, etc.) This routine will
# exit with error code 1 when done.
#
do_intr()
{
echo "## Cleaning up... user interrupt"
do_testsuite_clean
do_clean
exit 1
}
trap "do_intr" 1 2 15