1#!/bin/sh 2############################################################ 3## Convenience functions for reporting, asserting, etc. ## 4############################################################ 5 6# warn(TEXT) 7# 8# Issues a warning message to stderr 9# 10warn() 11{ 12 echo $1 1>&2 13} 14 15# assert() 16# 17# Basic assertion support. Use it like this: 18# 19# a=5 20# b=4 21# condition="$a -lt $b" # Error message and exit from script. 22# # Try setting "condition" to something else, 23# #+ and see what happens. 24# 25# assert "$condition" $LINENO 26# 27# Note that $LINENO is a built-in 28# 29assert () # If condition false, 30{ #+ exit from script with error message. 31 E_PARAM_ERR=98 32 E_ASSERT_FAILED=99 33 34 35 if [ -z "$2" ] # Not enough parameters passed. 36 then 37 return $E_PARAM_ERR # No damage done. 38 fi 39 40 lineno=$2 41 42 if [ ! $1 ] 43 then 44 echo "Assertion failed: \"$1\"" 45 echo "File \"$0\", line $lineno" 46 exit $E_ASSERT_FAILED 47 # else 48 # return 49 # and continue executing script. 50 fi 51} 52 53############################################################ 54## Process management ## 55############################################################ 56 57# pid_is_valid(PID) 58# 59# Checks if the given $PID is still running. Returns a true value if 60# it is, false otherwise. 61# 62pid_is_valid() 63{ 64 PID=$1 65 ps --pid ${PID} --no-header | grep ${PID} 66 return $? 67} 68 69# kill_pid(PID) 70# 71# Forcibly kills the process ID and prevents it from 72# displaying any messages (to stdout, stderr, or otherwise) 73# 74kill_pid() 75{ 76 PID=$1 77 kill -9 $PID > /dev/null 2>&1 78} 79 80############################################################ 81## Timing ## 82############################################################ 83 84# Routines in this library are set up to allow timing to be done 85# by defining $TIME to a timing command. You can define your 86# own handler by defining $TIME before or after including this 87# library. 88TIME=${TIME:-""} 89 90# Allows overriding the filename to use for storing time 91# measurements. Required in order to 92TIME_TMP_FILE=${TIME_TMP_FILE:-"${TMP:-/tmp}/cpu_$$"} 93 94# perform_timings() 95# 96# This turns on timings for operations that support timing 97# via the $TIME variable. It does this by setting $TIME to 98# a general purpose time command. 99set_timing_on() 100{ 101 TIME="/usr/bin/time -o $TIME_TMP_FILE -f \"%e\"" 102} 103 104report_timing() 105{ 106 MSG=${1:-"perform operation"} 107 if [ ! -z "${TIME}" ]; then 108 TM=`cat $TIME_TMP_FILE` 109 echo "Time to ${MSG} : $TM" 110 fi 111} 112 113############################################################ 114## Interrupt handling and cleanup ## 115############################################################ 116 117# do_clean() 118# 119# Virtual function called by do_intr(). Override this to 120# provide custom cleanup handling. 121# 122do_clean() 123{ 124 return 0 125} 126 127# do_testsuite_clean() 128# 129# Internal routine to do cleanup specific to other routines 130# in this testsuite. You may override this routine if you 131# do not want this behavior. 132# 133do_testsuite_clean() 134{ 135 /bin/rm -rf $TIME_TMP_FILE 136} 137 138# exit_clean(EXIT_CODE) 139# 140# Replacement for exit command. Prints the date, then calls do_clean 141# and exits with the given $EXIT_CODE, or 0 if none specified. 142# 143exit_clean() 144{ 145 EXIT_CODE=${1:-0} 146 date 147 do_clean 148 exit $EXIT_CODE 149} 150 151# do_intr() 152# 153# Handler for trapped interrupts (i.e., signals 1 2 15). 154# 155# This will result in a call do do_clean() when the user 156# interrupts the test, allowing you to do whatever final 157# cleanup work is needed (removing tmp files, restoring 158# resources to initial states, etc.) This routine will 159# exit with error code 1 when done. 160# 161do_intr() 162{ 163 echo "## Cleaning up... user interrupt" 164 do_testsuite_clean 165 do_clean 166 exit 1 167} 168 169trap "do_intr" 1 2 15 170 171