
The use of a sub-shell for running the test_cmp of stdout/stderr for the test author was introduced in this form in565b6fa87b
(tests: refactor mechanics of testing in a sub test-lib, 2012-12-16), but from looking at the history that seemed to have diligently copied my original ad-hoc implementation in7b90511970
(t/t0000-basic.sh: Run the passing TODO test inside its own test-lib, 2010-08-19). There's no reason to use a subshell here, we try to avoid it in general. It also improves readability, if the test fails we print out the relative path in the trash directory that needs to be looked at. Before that was mostly obscured, since the "write_sub_test_lib_test" will pick the directory for you from the test name. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
95 lines
2.4 KiB
Bash
95 lines
2.4 KiB
Bash
write_sub_test_lib_test () {
|
|
name="$1" # stdin is the body of the test code
|
|
mkdir "$name" &&
|
|
write_script "$name/$name.sh" "$TEST_SHELL_PATH" <<-EOF &&
|
|
test_description='A test of test-lib.sh itself'
|
|
|
|
# Point to the t/test-lib.sh, which isn't in ../ as usual
|
|
. "\$TEST_DIRECTORY"/test-lib.sh
|
|
EOF
|
|
cat >>"$name/$name.sh"
|
|
}
|
|
|
|
_run_sub_test_lib_test_common () {
|
|
neg="$1" name="$2" # stdin is the body of the test code
|
|
shift 2
|
|
|
|
# intercept pseudo-options at the front of the argument list that we
|
|
# will not pass to child script
|
|
skip=
|
|
while test $# -gt 0
|
|
do
|
|
case "$1" in
|
|
--skip=*)
|
|
skip=${1#--*=}
|
|
shift
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
(
|
|
cd "$name" &&
|
|
|
|
# Pretend we're not running under a test harness, whether we
|
|
# are or not. The test-lib output depends on the setting of
|
|
# this variable, so we need a stable setting under which to run
|
|
# the sub-test.
|
|
sane_unset HARNESS_ACTIVE &&
|
|
|
|
export TEST_DIRECTORY &&
|
|
# The child test re-sources GIT-BUILD-OPTIONS and may thus
|
|
# override the test output directory. We thus pass it as an
|
|
# explicit override to the child.
|
|
TEST_OUTPUT_DIRECTORY_OVERRIDE=$(pwd) &&
|
|
export TEST_OUTPUT_DIRECTORY_OVERRIDE &&
|
|
GIT_SKIP_TESTS=$skip &&
|
|
export GIT_SKIP_TESTS &&
|
|
sane_unset GIT_TEST_FAIL_PREREQS &&
|
|
if test -z "$neg"
|
|
then
|
|
./"$name.sh" "$@" >out 2>err
|
|
else
|
|
! ./"$name.sh" "$@" >out 2>err
|
|
fi
|
|
)
|
|
}
|
|
|
|
write_and_run_sub_test_lib_test () {
|
|
name="$1" descr="$2" # stdin is the body of the test code
|
|
write_sub_test_lib_test "$@" || return 1
|
|
_run_sub_test_lib_test_common '' "$@"
|
|
}
|
|
|
|
write_and_run_sub_test_lib_test_err () {
|
|
name="$1" descr="$2" # stdin is the body of the test code
|
|
write_sub_test_lib_test "$@" || return 1
|
|
_run_sub_test_lib_test_common '!' "$@"
|
|
}
|
|
|
|
run_sub_test_lib_test () {
|
|
_run_sub_test_lib_test_common '' "$@"
|
|
}
|
|
|
|
run_sub_test_lib_test_err () {
|
|
_run_sub_test_lib_test_common '!' "$@"
|
|
}
|
|
|
|
check_sub_test_lib_test () {
|
|
name="$1" # stdin is the expected output from the test
|
|
test_must_be_empty "$name"/err &&
|
|
sed -e 's/^> //' -e 's/Z$//' >"$name"/expect &&
|
|
test_cmp "$name/"expect "$name"/out
|
|
}
|
|
|
|
check_sub_test_lib_test_err () {
|
|
name="$1" # stdin is the expected output from the test
|
|
# expected error output is in descriptor 3
|
|
sed -e 's/^> //' -e 's/Z$//' >"$name"/expect.out &&
|
|
test_cmp "$name"/expect.out "$name"/out &&
|
|
sed -e 's/^> //' -e 's/Z$//' <&3 >"$name"/expect.err &&
|
|
test_cmp "$name"/expect.err "$name"/err
|
|
}
|