Skip to content

Commit 30db997

Browse files
committed
ass-test-help: Remove lib/bats/helpers dependency
This helps ensure that the assertion library or test environment imports everything it needs rather than relying on this file.
1 parent 35f2b88 commit 30db997

File tree

2 files changed

+108
-13
lines changed

2 files changed

+108
-13
lines changed

lib/bats/assertion-test-helpers

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,19 @@ if [[ -z "$ASSERTION_SOURCE" ]]; then
3030
fi
3131

3232
. "$ASSERTION_SOURCE"
33-
. "${BASH_SOURCE%/*}/helpers"
33+
34+
# Temp directory for assertion test artifacts.
35+
#
36+
# Defined the same as `BATS_TEST_ROOTDIR` from `lib/bats/helpers`, but not
37+
# dependent on it, so this file remains self-contained.
38+
export ASSERTION_TEST_ROOTDIR="${BATS_TEST_ROOTDIR:-$BATS_TMPDIR/test rootdir}"
3439

3540
# This is the file written to by `printf_to_test_output_file`.
36-
export TEST_OUTPUT_FILE="$BATS_TEST_ROOTDIR/test-output.txt"
41+
export TEST_OUTPUT_FILE="$ASSERTION_TEST_ROOTDIR/test-output.txt"
3742

3843
# Path to the script generated by `expect_assertion_*` to test whether
3944
# `restore_bats_shell_options` was called or not.
40-
readonly ASSERTION_TEST_SCRIPT="$BATS_TEST_ROOTDIR/assertion-test.bats"
45+
readonly ASSERTION_TEST_SCRIPT="$ASSERTION_TEST_ROOTDIR/assertion-test.bats"
4146

4247
# Format for the error message emitted when `ASSERTION_TEST_SCRIPT` fails.
4348
# Should be called as:
@@ -202,8 +207,8 @@ export -f printf_with_error
202207
# Arguments:
203208
# ...: Arguments to `printf`
204209
printf_to_test_output_file() {
205-
if [[ ! -d "$BATS_TEST_ROOTDIR" ]]; then
206-
mkdir "$BATS_TEST_ROOTDIR"
210+
if [[ ! -d "$ASSERTION_TEST_ROOTDIR" ]]; then
211+
mkdir "$ASSERTION_TEST_ROOTDIR"
207212
fi
208213
printf "$@" >"$TEST_OUTPUT_FILE"
209214
}
@@ -270,12 +275,26 @@ __run_command_and_assertion_in_subshell() {
270275
# Arguments:
271276
# ...: Body of the test case to execute
272277
__run_assertion_test_script() {
273-
create_bats_test_script "${ASSERTION_TEST_SCRIPT#$BATS_TEST_ROOTDIR/}" \
274-
'#! /usr/bin/env bats' \
275-
"load '$ASSERTION_SOURCE'" \
276-
"@test \"$BATS_TEST_DESCRIPTION\" {" \
277-
"$@" \
278-
'}'
278+
local script_dir="${ASSERTION_TEST_SCRIPT%/*}"
279+
local script_impl=('#! /usr/bin/env bats'
280+
"load '$ASSERTION_SOURCE'"
281+
"@test \"$BATS_TEST_DESCRIPTION\" {"
282+
"$@"
283+
'}')
284+
285+
if [[ ! -d "$script_dir" ]] && ! mkdir -p "$script_dir"; then
286+
printf 'Failed to create parent directory for assertion test script: %s\n' \
287+
"$ASSERTION_TEST_SCRIPT" >&2
288+
return '1'
289+
elif ! printf '%s\n' "${script_impl[@]}" >"$ASSERTION_TEST_SCRIPT"; then
290+
printf 'Failed to create assertion test script: %s\n' \
291+
"$ASSERTION_TEST_SCRIPT" >&2
292+
return '1'
293+
elif ! chmod 755 "$ASSERTION_TEST_SCRIPT"; then
294+
printf 'Failed to set permissions for assertion test script: %s\n' \
295+
"$ASSERTION_TEST_SCRIPT" >&2
296+
return '1'
297+
fi
279298
run "$ASSERTION_TEST_SCRIPT"
280299
}
281300

tests/assertion-test-helpers.bats

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,37 @@ setup() {
1717

1818
teardown() {
1919
remove_bats_test_dirs
20+
rm -rf "$BATS_TMPDIR/bin"
2021
}
2122

2223
emit_debug_info() {
2324
printf 'STATUS: %s\nOUTPUT:\n%s\n' "$status" "$output" >&2
2425
}
2526

27+
create_failing_test_stub() {
28+
local cmd_name="$1"
29+
local cmd_path="$BATS_TMPDIR/bin/$cmd_name"
30+
31+
if [[ ! -d "$BATS_TMPDIR/bin" ]]; then
32+
mkdir -p "$BATS_TMPDIR/bin"
33+
fi
34+
printf '%s\n' 'printf "ARG: \"%s\"\n" "$@"' 'exit 1' >"$cmd_path"
35+
chmod 755 "$cmd_path"
36+
PATH="$BATS_TMPDIR/bin:$PATH"
37+
hash "$cmd_name"
38+
}
39+
40+
remove_failing_test_stub() {
41+
local cmd_name="$1"
42+
rm -f "$BATS_TMPDIR/bin/$cmd_name"
43+
hash "$cmd_name"
44+
}
45+
2646
run_assertion_test() {
2747
set "$DISABLE_BATS_SHELL_OPTIONS"
2848
setup_assertion_test "$@"
2949
restore_bats_shell_options
30-
run "$BATS_TEST_ROOTDIR/$EXPECT_ASSERTION_TEST_SCRIPT"
50+
run "$ASSERTION_TEST_ROOTDIR/$EXPECT_ASSERTION_TEST_SCRIPT"
3151
}
3252

3353
setup_assertion_test() {
@@ -59,7 +79,7 @@ check_failure_output() {
5979
}
6080

6181
__check_failure_output() {
62-
local test_script="$BATS_TEST_ROOTDIR/$EXPECT_ASSERTION_TEST_SCRIPT"
82+
local test_script="$ASSERTION_TEST_ROOTDIR/$EXPECT_ASSERTION_TEST_SCRIPT"
6383
local assertion_line="${ASSERTION%%$'\n'*}"
6484
local expected_output
6585
local result='0'
@@ -83,6 +103,10 @@ __check_failure_output() {
83103
return "$result"
84104
}
85105

106+
check_matches() {
107+
[[ "$1" =~ $2 ]]
108+
}
109+
86110
@test "$SUITE: printf_with_error" {
87111
run printf_with_error 'foo bar baz'
88112
emit_debug_info
@@ -113,6 +137,58 @@ __check_failure_output() {
113137
[ "$output" == "$err_msg" ]
114138
}
115139

140+
@test "$SUITE: fail to create assertion test script parent dir" {
141+
create_failing_test_stub 'mkdir'
142+
run __run_assertion_test_script
143+
remove_failing_test_stub 'mkdir'
144+
145+
local expected
146+
printf -v expected '%s\n' 'ARG: "-p"' "ARG: \"${ASSERTION_TEST_SCRIPT%/*}\""
147+
expected+='Failed to create parent directory for assertion test script: '
148+
expected+="$ASSERTION_TEST_SCRIPT"
149+
150+
printf 'EXPECTED OUTPUT:\n%s\n' "$expected"
151+
emit_debug_info
152+
[ "$status" -eq '1' ]
153+
[ "$output" == "$expected" ]
154+
}
155+
156+
@test "$SUITE: fail to create the assertion test script" {
157+
skip_if_cannot_trigger_file_permission_failure
158+
mkdir "$ASSERTION_TEST_ROOTDIR"
159+
chmod ugo-w "$ASSERTION_TEST_ROOTDIR"
160+
run __run_assertion_test_script
161+
162+
local printf_err_pattern="$_GO_CORE_DIR/lib/bats/assertion-test-helpers: "
163+
printf_err_pattern+="line [1-9][0-9]*: $ASSERTION_TEST_SCRIPT: "
164+
printf_err_pattern+='Permission denied'
165+
printf 'EXPECTED PRINTF ERROR PATTERN:\n%s\n' "$printf_err_pattern" >&2
166+
167+
local err_msg="Failed to create assertion test script: $ASSERTION_TEST_SCRIPT"
168+
printf 'EXPECTED FAILURE MESSAGE:\n%s\n' "$err_msg" >&2
169+
170+
emit_debug_info
171+
[ "$status" -eq '1' ]
172+
check_matches "${lines[0]}" "$printf_err_pattern"
173+
[ "${lines[1]}" == "$err_msg" ]
174+
}
175+
176+
@test "$SUITE: fail to set permissions for the assertion test script" {
177+
create_failing_test_stub 'chmod'
178+
run __run_assertion_test_script
179+
remove_failing_test_stub 'chmod'
180+
181+
local expected
182+
printf -v expected '%s\n' 'ARG: "755"' "ARG: \"$ASSERTION_TEST_SCRIPT\""
183+
expected+='Failed to set permissions for assertion test script: '
184+
expected+="$ASSERTION_TEST_SCRIPT"
185+
186+
printf 'EXPECTED OUTPUT:\n%s\n' "$expected"
187+
emit_debug_info
188+
[ "$status" -eq '1' ]
189+
[ "$output" == "$expected" ]
190+
}
191+
116192
@test "$SUITE: successful assertion" {
117193
run_assertion_test 'success'
118194
emit_debug_info

0 commit comments

Comments
 (0)