230 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
| # $Id$
 | |
| # vim:et:ft=sh:sts=2:sw=2
 | |
| #
 | |
| # Copyright 2008 Kate Ward. All Rights Reserved.
 | |
| # Released under the LGPL (GNU Lesser General Public License)
 | |
| #
 | |
| # Author: kate.ward@forestent.com (Kate Ward)
 | |
| #
 | |
| # shUnit2 unit test common functions
 | |
| 
 | |
| # treat unset variables as an error when performing parameter expansion
 | |
| set -u
 | |
| 
 | |
| # set shwordsplit for zsh
 | |
| [ -n "${ZSH_VERSION:-}" ] && setopt shwordsplit
 | |
| 
 | |
| #
 | |
| # constants
 | |
| #
 | |
| 
 | |
| # path to shUnit2 library. can be overridden by setting SHUNIT_INC
 | |
| TH_SHUNIT=${SHUNIT_INC:-./shunit2}
 | |
| 
 | |
| # configure debugging. set the DEBUG environment variable to any
 | |
| # non-empty value to enable debug output, or TRACE to enable trace
 | |
| # output.
 | |
| TRACE=${TRACE:+'th_trace '}
 | |
| [ -n "${TRACE}" ] && DEBUG=1
 | |
| [ -z "${TRACE}" ] && TRACE=':'
 | |
| 
 | |
| DEBUG=${DEBUG:+'th_debug '}
 | |
| [ -z "${DEBUG}" ] && DEBUG=':'
 | |
| 
 | |
| #
 | |
| # variables
 | |
| #
 | |
| 
 | |
| th_RANDOM=0
 | |
| 
 | |
| #
 | |
| # functions
 | |
| #
 | |
| 
 | |
| # message functions
 | |
| th_trace() { echo "${MY_NAME}:TRACE $@" >&2; }
 | |
| th_debug() { echo "${MY_NAME}:DEBUG $@" >&2; }
 | |
| th_info() { echo "${MY_NAME}:INFO $@" >&2; }
 | |
| th_warn() { echo "${MY_NAME}:WARN $@" >&2; }
 | |
| th_error() { echo "${MY_NAME}:ERROR $@" >&2; }
 | |
| th_fatal() { echo "${MY_NAME}:FATAL $@" >&2; }
 | |
| 
 | |
| # output subtest name
 | |
| th_subtest() { echo " $@" >&2; }
 | |
| 
 | |
| th_oneTimeSetUp()
 | |
| {
 | |
|   # these files will be cleaned up automatically by shUnit2
 | |
|   stdoutF="${SHUNIT_TMPDIR}/stdout"
 | |
|   stderrF="${SHUNIT_TMPDIR}/stderr"
 | |
|   returnF="${SHUNIT_TMPDIR}/return"
 | |
|   expectedF="${SHUNIT_TMPDIR}/expected"
 | |
| }
 | |
| 
 | |
| # generate a random number
 | |
| th_generateRandom()
 | |
| {
 | |
|   tfgr_random=${th_RANDOM}
 | |
| 
 | |
|   while [ "${tfgr_random}" = "${th_RANDOM}" ]; do
 | |
|     if [ -n "${RANDOM:-}" ]; then
 | |
|       # $RANDOM works
 | |
|       tfgr_random=${RANDOM}${RANDOM}${RANDOM}$$
 | |
|     elif [ -r '/dev/urandom' ]; then
 | |
|       tfgr_random=`od -vAn -N4 -tu4 </dev/urandom |sed 's/^[^0-9]*//'`
 | |
|     else
 | |
|       tfgr_date=`date '+%H%M%S'`
 | |
|       tfgr_random=`expr ${tfgr_date} \* $$`
 | |
|       unset tfgr_date
 | |
|     fi
 | |
|     [ "${tfgr_random}" = "${th_RANDOM}" ] && sleep 1
 | |
|   done
 | |
| 
 | |
|   th_RANDOM=${tfgr_random}
 | |
|   unset tfgr_random
 | |
| }
 | |
| 
 | |
| # this section returns the data section from the specified section of a file. a
 | |
| # datasection is defined by a [header], one or more lines of data, and then a
 | |
| # blank line.
 | |
| th_getDataSect()
 | |
| {
 | |
|   th_sgrep "\\[$1\\]" "$2" |sed '1d'
 | |
| }
 | |
| 
 | |
| # this function greps a section from a file. a section is defined as a group of
 | |
| # lines preceeded and followed by blank lines.
 | |
| th_sgrep()
 | |
| {
 | |
|   th_pattern_=$1
 | |
|   shift
 | |
| 
 | |
|   sed -e '/./{H;$!d;}' -e "x;/${th_pattern_}/"'!d;' $@ |sed '1d'
 | |
| 
 | |
|   unset th_pattern_
 | |
| }
 | |
| 
 | |
| # Custom assert that checks for true return value (0), and no output to STDOUT
 | |
| # or STDERR. If a non-zero return value is encountered, the output of STDERR
 | |
| # will be output.
 | |
| #
 | |
| # Args:
 | |
| #  th_test_: string: name of the subtest
 | |
| #  th_rtrn_: integer: the return value of the subtest performed
 | |
| #  th_stdout_: string: filename where stdout was redirected to
 | |
| #  th_stderr_: string: filename where stderr was redirected to
 | |
| th_assertTrueWithNoOutput()
 | |
| {
 | |
|   th_test_=$1
 | |
|   th_rtrn_=$2
 | |
|   th_stdout_=$3
 | |
|   th_stderr_=$4
 | |
| 
 | |
|   assertTrue "${th_test_}; expected return value of zero" ${th_rtrn_}
 | |
|   [ ${th_rtrn_} -ne ${SHUNIT_TRUE} ] && cat "${th_stderr_}"
 | |
|   assertFalse "${th_test_}; expected no output to STDOUT" \
 | |
|       "[ -s '${th_stdout_}' ]"
 | |
|   assertFalse "${th_test_}; expected no output to STDERR" \
 | |
|       "[ -s '${th_stderr_}' ]"
 | |
| 
 | |
|   unset th_test_ th_rtrn_ th_stdout_ th_stderr_
 | |
| }
 | |
| 
 | |
| # Custom assert that checks for non-zero return value, output to STDOUT, but no
 | |
| # output to STDERR.
 | |
| #
 | |
| # Args:
 | |
| #  th_test_: string: name of the subtest
 | |
| #  th_rtrn_: integer: the return value of the subtest performed
 | |
| #  th_stdout_: string: filename where stdout was redirected to
 | |
| #  th_stderr_: string: filename where stderr was redirected to
 | |
| th_assertFalseWithOutput()
 | |
| {
 | |
|   th_test_=$1
 | |
|   th_rtrn_=$2
 | |
|   th_stdout_=$3
 | |
|   th_stderr_=$4
 | |
| 
 | |
|   assertFalse "${th_test_}; expected non-zero return value" ${th_rtrn_}
 | |
|   assertTrue "${th_test_}; expected output to STDOUT" \
 | |
|       "[ -s '${th_stdout_}' ]"
 | |
|   assertFalse "${th_test_}; expected no output to STDERR" \
 | |
|       "[ -s '${th_stderr_}' ]"
 | |
|   [ -s "${th_stdout_}" -a ! -s "${th_stderr_}" ] || \
 | |
|       _th_showOutput ${SHUNIT_FALSE} "${th_stdout_}" "${th_stderr_}"
 | |
| 
 | |
|   unset th_test_ th_rtrn_ th_stdout_ th_stderr_
 | |
| }
 | |
| 
 | |
| # Custom assert that checks for non-zero return value, no output to STDOUT, but
 | |
| # output to STDERR.
 | |
| #
 | |
| # Args:
 | |
| #  th_test_: string: name of the subtest
 | |
| #  th_rtrn_: integer: the return value of the subtest performed
 | |
| #  th_stdout_: string: filename where stdout was redirected to
 | |
| #  th_stderr_: string: filename where stderr was redirected to
 | |
| th_assertFalseWithError()
 | |
| {
 | |
|   th_test_=$1
 | |
|   th_rtrn_=$2
 | |
|   th_stdout_=$3
 | |
|   th_stderr_=$4
 | |
| 
 | |
|   assertFalse "${th_test_}; expected non-zero return value" ${th_rtrn_}
 | |
|   assertFalse "${th_test_}; expected no output to STDOUT" \
 | |
|       "[ -s '${th_stdout_}' ]"
 | |
|   assertTrue "${th_test_}; expected output to STDERR" \
 | |
|       "[ -s '${th_stderr_}' ]"
 | |
|   [ ! -s "${th_stdout_}" -a -s "${th_stderr_}" ] || \
 | |
|       _th_showOutput ${SHUNIT_FALSE} "${th_stdout_}" "${th_stderr_}"
 | |
| 
 | |
|   unset th_test_ th_rtrn_ th_stdout_ th_stderr_
 | |
| }
 | |
| 
 | |
| # Some shells, zsh on Solaris in particular, return immediately from a sub-shell
 | |
| # when a non-zero return value is encountered. To properly catch these values,
 | |
| # they are either written to disk, or recognized as an error the file is empty.
 | |
| th_clearReturn() { cp /dev/null "${returnF}"; }
 | |
| th_queryReturn()
 | |
| {
 | |
|   if [ -s "${returnF}" ]; then
 | |
|     th_return=`cat "${returnF}"`
 | |
|   else
 | |
|     th_return=${SHUNIT_ERROR}
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # Providing external and internal calls to the showOutput helper function.
 | |
| th_showOutput() { _th_showOutput $@; }
 | |
| _th_showOutput()
 | |
| {
 | |
|   _th_return_=$1
 | |
|   _th_stdout_=$2
 | |
|   _th_stderr_=$3
 | |
| 
 | |
|   isSkipping
 | |
|   if [ $? -eq ${SHUNIT_FALSE} -a ${_th_return_} != ${SHUNIT_TRUE} ]; then
 | |
|     if [ -n "${_th_stdout_}" -a -s "${_th_stdout_}" ]; then
 | |
|       echo '>>> STDOUT' >&2
 | |
|       cat "${_th_stdout_}" >&2
 | |
|     fi
 | |
|     if [ -n "${_th_stderr_}" -a -s "${_th_stderr_}" ]; then
 | |
|       echo '>>> STDERR' >&2
 | |
|       cat "${_th_stderr_}" >&2
 | |
|     fi
 | |
|     if [ -n "${_th_stdout_}" -o -n "${_th_stderr_}" ]; then
 | |
|       echo '<<< end output' >&2
 | |
|     fi
 | |
|   fi
 | |
| 
 | |
|   unset _th_return_ _th_stdout_ _th_stderr_
 | |
| }
 | |
| 
 | |
| #
 | |
| # main
 | |
| #
 | |
| 
 | |
| ${TRACE} 'trace output enabled'
 | |
| ${DEBUG} 'debug output enabled'
 |