test: prepare test-lib.sh for possible test system debug session

When something in tests fails one possibility to test is to run
the test script as `bash -x TXXX-testname.sh`. As stderr (fd 2) was
redirected to separate file during test execution also this set -x
(xtrace) output would also go there.
test-lib.sh saves the stderr to fd 7 from where it can be restored,
and bash has BASH_XTRACEFD variable, which is now given the same value
7, making bash to output all xtrade information (consistently) there.

This lib file used to save fd's 1 & 2 to 6 & 7 (respectively) in
test_begin_subtest(), but as those needs to be set *before* XTRACEFD
variable is set those are now saved at the beginning of the lib (once).
This is safe and simple thing to do.
To make xtrace output more verbose PS4 variable was set to contain the
source file, line number and if execution is in function, that function
name. Setting this variable has no effect when not xtracing.

As it is known that fd 6 is redirected stdout, printing status can now
use that fd, instead of saving stdout to fd 5 and use it.
This commit is contained in:
Tomi Ollila 2014-09-21 21:06:20 +03:00 committed by David Bremner
parent ef5b4947d8
commit 7fcd100a2f
2 changed files with 13 additions and 10 deletions

View file

@ -122,7 +122,7 @@ esac
test ! -z "$debug" || remove_tmp=$TMP_DIRECTORY test ! -z "$debug" || remove_tmp=$TMP_DIRECTORY
rm -fr "$test" || { rm -fr "$test" || {
GIT_EXIT_OK=t GIT_EXIT_OK=t
echo >&5 "FATAL: Cannot prepare test area" echo >&6 "FATAL: Cannot prepare test area"
exit 1 exit 1
} }

View file

@ -45,6 +45,12 @@ done,*)
;; ;;
esac esac
# Save STDOUT to fd 6 and STDERR to fd 7.
exec 6>&1 7>&2
# Make xtrace debugging (when used) use redirected STDERR, with verbose lead:
BASH_XTRACEFD=7
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
# Keep the original TERM for say_color and test_emacs # Keep the original TERM for say_color and test_emacs
ORIGINAL_TERM=$TERM ORIGINAL_TERM=$TERM
@ -204,8 +210,6 @@ then
print_test_description print_test_description
fi fi
exec 5>&1
test_failure=0 test_failure=0
test_count=0 test_count=0
test_fixed=0 test_fixed=0
@ -225,7 +229,7 @@ die () {
then then
exit $code exit $code
else else
exec >&5 exec >&6
say_color error '%-6s' FATAL say_color error '%-6s' FATAL
echo " $test_subtest_name" echo " $test_subtest_name"
echo echo
@ -236,7 +240,7 @@ die () {
die_signal () { die_signal () {
_die_common _die_common
echo >&5 "FATAL: $0: interrupted by signal" $((code - 128)) echo >&6 "FATAL: $0: interrupted by signal" $((code - 128))
exit $code exit $code
} }
@ -546,11 +550,10 @@ test_begin_subtest ()
fi fi
test_subtest_name="$1" test_subtest_name="$1"
test_reset_state_ test_reset_state_
# Remember stdout and stderr file descriptors and redirect test # Redirect test output to the previously prepared file descriptors
# output to the previously prepared file descriptors 3 and 4 (see # 3 and 4 (see below)
# below)
if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
exec 6>&1 7>&2 >&3 2>&4 exec >&3 2>&4
inside_subtest=t inside_subtest=t
} }
@ -941,7 +944,7 @@ test_expect_code () {
test_external () { test_external () {
test "$#" = 4 && { prereq=$1; shift; } || prereq= test "$#" = 4 && { prereq=$1; shift; } || prereq=
test "$#" = 3 || test "$#" = 3 ||
error >&5 "bug in the test script: not 3 or 4 parameters to test_external" error >&6 "bug in the test script: not 3 or 4 parameters to test_external"
test_subtest_name="$1" test_subtest_name="$1"
shift shift
test_reset_state_ test_reset_state_