1 # vim:et:ft=sh:sts=2:sw=2 2 # 3 # shFlags unit test common functions 4 5 __th_skipping=0 6 7 # treat unset variables as an error 8 set -u 9 10 # set shwordsplit for zsh 11 [ -n "${ZSH_VERSION:-}" ] && setopt shwordsplit 12 13 # my name 14 TH_MY_NAME=`basename "$0"` 15 16 # path to shFlags library. can be overridden by setting SHFLAGS_INC 17 TH_SHFLAGS=${SHFLAGS_INC:-./shflags} 18 19 # path to shUnit2 library. can be overridden by setting SHUNIT_INC 20 TH_SHUNIT=${SHUNIT_INC:-../lib/shunit2} 21 22 TH_BOOL_VALID='true t 0 false f 1' 23 TH_BOOL_INVALID='123 123.0 invalid' 24 TH_FLOAT_VALID='-1234.0 -1.0 -.123 0.0 0. .123 1.0 1234.0' 25 TH_FLOAT_INVALID='true false 1.2.3 -1.2.3 ""' 26 TH_INT_VALID='-1234 -1 0 1 1234' 27 TH_INT_INVALID='true false -1.0 -.123 0.0 .123 1.0 ""' 28 29 # 30 # test helper functions 31 # 32 33 # message functions 34 th_trace() { echo "test:TRACE $@" >&2; } 35 th_debug() { echo "test:DEBUG $@" >&2; } 36 th_info() { echo "test:INFO $@" >&2; } 37 th_warn() { echo "test:WARN $@" >&2; } 38 th_error() { echo "test:ERROR $@" >&2; } 39 th_fatal() { echo "test:FATAL $@" >&2; } 40 41 th_oneTimeSetUp() 42 { 43 # load shFlags 44 [ -n "${ZSH_VERSION:-}" ] && FLAGS_PARENT=$0 45 . ${TH_SHFLAGS} 46 47 # these files will be cleaned up automatically by shUnit2 48 tmpDir=${SHUNIT_TMPDIR} 49 stdoutF="${tmpDir}/stdout" 50 stderrF="${tmpDir}/stderr" 51 returnF="${tmpDir}/return" 52 expectedF="${tmpDir}/expected" 53 } 54 55 th_showOutput() 56 { 57 _th_rtrn=$1 58 _th_stdout=$2 59 _th_stderr=$3 60 61 isSkipping 62 if [ $? -eq ${SHUNIT_FALSE} -a ${_th_rtrn} != ${FLAGS_TRUE} ]; then 63 if [ -n "${_th_stdout}" -a -s "${_th_stdout}" ]; then 64 echo '>>> STDOUT' >&2 65 cat "${_th_stdout}" >&2 66 fi 67 if [ -n "${_th_stderr}" -a -s "${_th_stderr}" ]; then 68 echo '>>> STDERR' >&2 69 cat "${_th_stderr}" >&2 70 fi 71 if [ -n "${_th_stdout}" -o -n "${_th_stderr}" ]; then 72 echo '<<< end output' >&2 73 fi 74 fi 75 76 unset _th_rtrn _th_stdout _th_stderr 77 } 78 79 # Some shells, zsh on Solaris in particular, return immediately from a sub-shell 80 # when a non-zero return value is encountered. To properly catch these values, 81 # they are either written to disk, or recognized as an error the file is empty. 82 th_clearReturn() { cp /dev/null "${returnF}"; } 83 th_queryReturn() 84 { 85 if [ -s "${returnF}" ]; then 86 th_return=`cat "${returnF}"` 87 else 88 th_return=${SHUNIT_ERROR} 89 fi 90 } 91 92 _th_assertMsg() 93 { 94 _th_alert_type_=$1 95 _th_alert_msg_=$2 96 _th_msg_=$3 97 98 case ${_th_alert_type_} in 99 WARN) _th_alert_str_='a warning' ;; 100 ERROR) _th_alert_str_='an error' ;; 101 FATAL) _th_alert_str_='a fatal' ;; 102 esac 103 [ -z "${_th_alert_msg_}" ] && _th_alert_msg_='.*' 104 [ -n "${_th_msg_}" ] && _th_msg_="(${_th_msg_}) " 105 106 grep -- "^flags:${_th_alert_type_} ${_th_alert_msg_}" "${stderrF}" \ 107 >/dev/null 108 assertTrue \ 109 "FLAGS ${_th_msg_}failure did not generate ${_th_alert_str_} message" $? 110 111 unset _th_alert_type_ _th_alert_msg_ _th_alert_str_ _th_msg_ 112 } 113 114 assertWarnMsg() { _th_assertMsg 'WARN' "${1:-}" "${2:-}"; } 115 assertErrorMsg() { _th_assertMsg 'ERROR' "${1:-}" "${2:-}"; } 116 assertFatalMsg() { _th_assertMsg 'FATAL' "${1:-}" "${2:-}"; } 117