exit 1
fi
-declare -i CHILD_PID=0
-PASSED_TESTS=()
-FAILED_TESTS=()
+declare -i _CHILD_PID=0
+_PASSED_TESTS=()
+_FAILED_TESTS=()
# Like trap, but passes the signal name as the first argument
-trap_with_sig() {
+_trap_with_sig() {
local fun="${1:?}"
local sig
shift
}
# Propagate the caught signal to the current child process
-handle_signal() {
+_handle_signal() {
local sig="${1:?}"
- if [[ $CHILD_PID -gt 0 ]]; then
- echo "Propagating signal $sig to child process $CHILD_PID"
- kill -s "$sig" "$CHILD_PID"
+ if [[ $_CHILD_PID -gt 0 ]]; then
+ echo "Propagating signal $sig to child process $_CHILD_PID"
+ kill -s "$sig" "$_CHILD_PID"
fi
}
-# In order to make the handle_signal() stuff above work, we have to execute
+# In order to make the _handle_signal() stuff above work, we have to execute
# each script asynchronously, since bash won't execute traps until the currently
# executed command finishes. This, however, introduces another issue regarding
# how bash's wait works. Quoting:
#
# In other words - every time we propagate a signal, wait returns with
# 128+signal, so we have to wait again - repeat until the process dies.
-wait_harder() {
+_wait_harder() {
local pid="${1:?}"
while kill -0 "$pid" &>/dev/null; do
wait "$pid"
}
+_show_summary() {(
+ set +x
+
+ if [[ ${#_PASSED_TESTS[@]} -eq 0 && ${#_FAILED_TESTS[@]} -eq 0 ]]; then
+ echo >&2 "No tests were executed, this is most likely an error"
+ exit 1
+ fi
+
+ printf "PASSED TESTS: %3d:\n" "${#_PASSED_TESTS[@]}"
+ echo "------------------"
+ for t in "${_PASSED_TESTS[@]}"; do
+ echo "$t"
+ done
+
+ if [[ "${#_FAILED_TESTS[@]}" -ne 0 ]]; then
+ printf "FAILED TESTS: %3d:\n" "${#_FAILED_TESTS[@]}"
+ echo "------------------"
+ for t in "${_FAILED_TESTS[@]}"; do
+ echo "$t"
+ done
+ fi
+
+ [[ "${#_FAILED_TESTS[@]}" -eq 0 ]]
+)}
+
# Like run_subtests, but propagate specified signals to the subtest script
run_subtests_with_signals() {
local subtests=("${0%.sh}".*.sh)
exit 1
fi
- trap_with_sig handle_signal "$@"
+ _trap_with_sig _handle_signal "$@"
for subtest in "${subtests[@]}"; do
: "--- $subtest BEGIN ---"
"./$subtest" &
- CHILD_PID=$!
- wait_harder "$CHILD_PID" && PASSED_TESTS+=("$subtest") || FAILED_TESTS+=("$subtest")
+ _CHILD_PID=$!
+ _wait_harder "$_CHILD_PID" && _PASSED_TESTS+=("$subtest") || _FAILED_TESTS+=("$subtest")
: "--- $subtest END ---"
done
- show_summary
+ _show_summary
}
# Run all subtests (i.e. files named as testsuite-<testid>.<subtest_name>.sh)
for subtest in "${subtests[@]}"; do
: "--- $subtest BEGIN ---"
- "./$subtest" && PASSED_TESTS+=("$subtest") || FAILED_TESTS+=("$subtest")
+ "./$subtest" && _PASSED_TESTS+=("$subtest") || _FAILED_TESTS+=("$subtest")
: "--- $subtest END ---"
done
- show_summary
+ _show_summary
}
# Run all test cases (i.e. functions prefixed with testcase_ in the current namespace)
: "+++ $testcase END +++"
done
}
-
-show_summary() {(
- set +x
-
- if [[ ${#PASSED_TESTS[@]} -eq 0 && ${#FAILED_TESTS[@]} -eq 0 ]]; then
- echo >&2 "No tests were executed, this is most likely an error"
- exit 1
- fi
-
- printf "PASSED TESTS: %3d:\n" "${#PASSED_TESTS[@]}"
- echo "------------------"
- for t in "${PASSED_TESTS[@]}"; do
- echo "$t"
- done
-
- if [[ "${#FAILED_TESTS[@]}" -ne 0 ]]; then
- printf "FAILED TESTS: %3d:\n" "${#FAILED_TESTS[@]}"
- echo "------------------"
- for t in "${FAILED_TESTS[@]}"; do
- echo "$t"
- done
- fi
-
- [[ "${#FAILED_TESTS[@]}" -eq 0 ]]
-)}