From 761fd595b620bc91f2a7393b7ba00fbb3daabf75 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Thu, 20 Mar 2014 13:52:06 -0500 Subject: [PATCH] wvtest.sh: print a backtrace on failure when running under bash. Very handy when there are nested WV* calls, i.e. foo() { ... WVPASS bar; ... } ... WVPASS foo Signed-off-by: Rob Browning --- wvtest-bash.sh | 32 ++++++++++++++++++++++++++++++++ wvtest.sh | 23 ++++++++++++++++++----- 2 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 wvtest-bash.sh mode change 100644 => 100755 wvtest.sh diff --git a/wvtest-bash.sh b/wvtest-bash.sh new file mode 100644 index 0000000..61f8dce --- /dev/null +++ b/wvtest-bash.sh @@ -0,0 +1,32 @@ + +declare -a _wvbtstack + +_wvpushcall() +{ + _wvbtstack[${#_wvbtstack[@]}]="$*" +} + +_wvpopcall() +{ + unset _wvbtstack[$((${#_wvbtstack[@]} - 1))] +} + +_wvbacktrace() +{ + local i loc + local call=$((${#_wvbtstack[@]} - 1)) + for ((i=0; i <= ${#FUNCNAME[@]}; i++)); do + local name="${FUNCNAME[$i]}" + if test "${name:0:2}" == WV; then + loc="${BASH_SOURCE[$i+1]}:${BASH_LINENO[$i]}" + echo "called from $loc ${FUNCNAME[$i]} ${_wvbtstack[$call]}" 1>&2 + ((call--)) + fi + done +} + +_wvfind_caller() +{ + WVCALLER_FILE=${BASH_SOURCE[2]} + WVCALLER_LINE=${BASH_LINENO[1]} +} diff --git a/wvtest.sh b/wvtest.sh old mode 100644 new mode 100755 index daaa6c4..05f6f34 --- a/wvtest.sh +++ b/wvtest.sh @@ -14,12 +14,12 @@ _wvtextclean() if [ -n "$BASH_VERSION" ]; then - _wvfind_caller() - { - WVCALLER_FILE=${BASH_SOURCE[2]} - WVCALLER_LINE=${BASH_LINENO[1]} - } + . ./wvtest-bash.sh # This keeps sh from choking on the syntax. else + _wvbacktrace() { true; } + _wvpushcall() { true; } + _wvpopcall() { true; } + _wvfind_caller() { WVCALLER_FILE="unknown" @@ -38,6 +38,7 @@ _wvcheck() fi echo "! $WVCALLER_FILE:$WVCALLER_LINE $TEXT $OK" >&2 if [ "$CODE" -ne 0 ]; then + _wvbacktrace exit $CODE else return 0 @@ -48,9 +49,11 @@ _wvcheck() WVPASS() { local TEXT="$*" + _wvpushcall "$@" _wvfind_caller if "$@"; then + _wvpopcall _wvcheck 0 "$TEXT" return 0 else @@ -64,6 +67,7 @@ WVPASS() WVFAIL() { local TEXT="$*" + _wvpushcall "$@" _wvfind_caller if "$@"; then @@ -72,6 +76,7 @@ WVFAIL() return 1 else _wvcheck 0 "NOT($TEXT)" + _wvpopcall return 0 fi } @@ -86,6 +91,7 @@ _wvgetrv() WVPASSEQ() { + _wvpushcall "$@" _wvfind_caller _wvcheck $(_wvgetrv [ "$#" -eq 2 ]) "exactly 2 arguments" echo "Comparing:" >&2 @@ -93,11 +99,13 @@ WVPASSEQ() echo "--" >&2 echo "$2" >&2 _wvcheck $(_wvgetrv [ "$1" = "$2" ]) "'$1' = '$2'" + _wvpopcall } WVPASSNE() { + _wvpushcall "$@" _wvfind_caller _wvcheck $(_wvgetrv [ "$#" -eq 2 ]) "exactly 2 arguments" echo "Comparing:" >&2 @@ -105,22 +113,27 @@ WVPASSNE() echo "--" >&2 echo "$2" >&2 _wvcheck $(_wvgetrv [ "$1" != "$2" ]) "'$1' != '$2'" + _wvpopcall } WVPASSRC() { local RC=$? + _wvpushcall "$@" _wvfind_caller _wvcheck $(_wvgetrv [ $RC -eq 0 ]) "return code($RC) == 0" + _wvpopcall } WVFAILRC() { local RC=$? + _wvpushcall "$@" _wvfind_caller _wvcheck $(_wvgetrv [ $RC -ne 0 ]) "return code($RC) != 0" + _wvpopcall } -- 2.39.2