# vim:et:ft=sh:sts=2:sw=2 # # shUnit2 unit test common functions # # Copyright 2008-2021 Kate Ward. All Rights Reserved. # Released under the Apache 2.0 license. # http://www.apache.org/licenses/LICENSE-2.0 # # Author: kate.ward@forestent.com (Kate Ward) # https://github.com/kward/shunit2 # ### ShellCheck (http://www.shellcheck.net/) # expr may be antiquated, but it is the only solution in some cases. # shellcheck disable=SC2003 # $() are not fully portable (POSIX != portable). # shellcheck disable=SC2006 # Exit immediately if a simple command exits with a non-zero status. set -e # 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}; export TH_SHUNIT # 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. # # Logging functions. th_trace() { echo "test:TRACE $*" >&2; } th_debug() { echo "test:DEBUG $*" >&2; } th_info() { echo "test:INFO $*" >&2; } th_warn() { echo "test:WARN $*" >&2; } th_error() { echo "test:ERROR $*" >&2; } th_fatal() { echo "test: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" export stdoutF stderrF returnF expectedF } # Generate a random number. th_generateRandom() { tfgr_random=${th_RANDOM} while [ "${tfgr_random}" = "${th_RANDOM}" ]; do # shellcheck disable=SC2039 if [ -n "${RANDOM:-}" ]; then # $RANDOM works # shellcheck disable=SC2039 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 # data section 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 preceded and followed by blank lines.. th_sgrep() { th_pattern_=$1 shift # shellcheck disable=SC2068 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 assertEquals "${th_test_}: expected return value of true" "${SHUNIT_TRUE}" "${th_rtrn_}" assertFalse "${th_test_}: expected no output to STDOUT" "[ -s '${th_stdout_}' ]" assertFalse "${th_test_}: expected no output to STDERR" "[ -s '${th_stderr_}' ]" # shellcheck disable=SC2166 if [ -s "${th_stdout_}" -o -s "${th_stderr_}" ]; then _th_showOutput "${SHUNIT_FALSE}" "${th_stdout_}" "${th_stderr_}" fi 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 assertNotEquals "${th_test_}: expected non-true return value" "${SHUNIT_TRUE}" "${th_rtrn_}" assertTrue "${th_test_}: expected output to STDOUT" "[ -s '${th_stdout_}' ]" assertFalse "${th_test_}: expected no output to STDERR" "[ -s '${th_stderr_}' ]" # shellcheck disable=SC2166 if ! [ -s "${th_stdout_}" -a ! -s "${th_stderr_}" ]; then _th_showOutput "${SHUNIT_FALSE}" "${th_stdout_}" "${th_stderr_}" fi 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_}' ]" # shellcheck disable=SC2166 if ! [ ! -s "${th_stdout_}" -a -s "${th_stderr_}" ]; then _th_showOutput "${SHUNIT_FALSE}" "${th_stdout_}" "${th_stderr_}" fi 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 export th_return } # Providing external and internal calls to the showOutput helper function. th_showOutput() { _th_showOutput "$@"; } _th_showOutput() { if isSkipping; then return fi _th_return_="${1:-${returnF}}" _th_stdout_="${2:-${stdoutF}}" _th_stderr_="${3:-${stderrF}}" if [ "${_th_return_}" != "${SHUNIT_TRUE}" ]; then # shellcheck disable=SC2166 if [ -n "${_th_stdout_}" -a -s "${_th_stdout_}" ]; then echo '>>> STDOUT' >&2 cat "${_th_stdout_}" >&2 echo '<<< STDOUT' >&2 fi # shellcheck disable=SC2166 if [ -n "${_th_stderr_}" -a -s "${_th_stderr_}" ]; then echo '>>> STDERR' >&2 cat "${_th_stderr_}" >&2 echo '<<< STDERR' >&2 fi fi unset _th_return_ _th_stdout_ _th_stderr_ } # # Main. # ${TRACE} 'trace output enabled' ${DEBUG} 'debug output enabled'