| ############################################################ |
| ## 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 |
| |