Skip to content

Commit 03162bd

Browse files
committed
lib/testing: Move log helpers to lib/testing/log
1 parent 4b562d9 commit 03162bd

File tree

9 files changed

+154
-138
lines changed

9 files changed

+154
-138
lines changed

lib/testing/log

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,113 @@
66

77
. "${BASH_SOURCE[0]%/*}/stack-trace"
88

9+
create_log_script(){
10+
create_test_go_script \
11+
". \"\$_GO_USE_MODULES\" 'log'" \
12+
'if [[ -n "$TEST_LOG_FILE" ]]; then' \
13+
' @go.log_add_output_file "$TEST_LOG_FILE"' \
14+
'fi' \
15+
"$@"
16+
}
17+
18+
run_log_script() {
19+
create_log_script "$@"
20+
run "$TEST_GO_SCRIPT"
21+
}
22+
23+
# For tests that run command scripts via @go, set _GO_CMD to make sure that's
24+
# the variable included in the log.
25+
test-go() {
26+
env _GO_CMD="$FUNCNAME" "$TEST_GO_SCRIPT" "$@"
27+
}
28+
29+
assert_log_equals() {
30+
set "$BATS_ASSERTION_DISABLE_SHELL_OPTIONS"
31+
local level
32+
local __padding=''
33+
local __log_level_label
34+
local expected=()
35+
local i
36+
local result=0
37+
38+
. "$_GO_USE_MODULES" 'log'
39+
40+
for level in "${_GO_LOG_LEVELS[@]}"; do
41+
while [[ "${#__padding}" -lt "${#level}" ]]; do
42+
__padding+=' '
43+
done
44+
done
45+
46+
for ((i=0; $# != 0; ++i)); do
47+
if __parse_log_level_label "$1"; then
48+
expected+=("$(__expected_log_line "$__log_level_label" "$2")")
49+
if ! shift 2; then
50+
echo "ERROR: Wrong number of arguments for log line $i." >&2
51+
return_from_bats_assertion 1
52+
return
53+
fi
54+
else
55+
expected+=("$1")
56+
shift
57+
fi
58+
done
59+
60+
if ! assert_lines_equal "${expected[@]}"; then
61+
return_from_bats_assertion '1'
62+
else
63+
return_from_bats_assertion
64+
fi
65+
}
66+
67+
assert_log_file_equals() {
68+
set "$BATS_ASSERTION_DISABLE_SHELL_OPTIONS"
69+
local log_file="$1"
70+
shift
71+
72+
if ! set_bats_output_and_lines_from_file "$log_file"; then
73+
return_from_bats_assertion '1'
74+
else
75+
assert_log_equals "$@"
76+
return_from_bats_assertion "$?"
77+
fi
78+
}
79+
80+
# Note that this must be called before any other log assertion, because it needs
81+
# to set _GO_LOG_FORMATTING before importing the `log` module.
82+
format_label() {
83+
local label="$1"
84+
85+
if [[ -n "$__GO_LOG_INIT" ]]; then
86+
echo "$FUNCNAME must be called before any other function or assertion" \
87+
"that calls \`. \$_GO_USE_MODULES 'log'\` because it needs to set" \
88+
"\`_GO_LOG_FORMATTING\`." >&2
89+
return 1
90+
fi
91+
92+
_GO_LOG_FORMATTING='true'
93+
. "$_GO_USE_MODULES" 'log'
94+
_@go.log_init
95+
96+
local __go_log_level_index=0
97+
if ! _@go.log_level_index "$label"; then
98+
echo "Unknown log level label: $label" >&2
99+
return 1
100+
fi
101+
echo "${__GO_LOG_LEVELS_FORMATTED[$__go_log_level_index]}"
102+
}
103+
104+
# Creates `LOG_COMMAND_STACK_TRACE_ITEMS` to help validate stack trace output.
105+
#
106+
# Call this before using "${LOG_COMMAND_STACK_TRACE_ITEMS[@]}" to inject
107+
# entries from `@go.log_command` into your expected stack trace output. This
108+
# helps validate stack trace output generated by logged commands, and ensures
109+
# that your stack trace validation stays up-to-date even when the internal
110+
# structure of `lib/log` changes.
111+
#
112+
# Globals:
113+
# LOG_COMMAND_STACK_TRACE_ITEMS:
114+
# Stack trace lines from `@go.log_command` comprising the command logging
115+
# mechanism
9116
set_log_command_stack_trace_items() {
10117
if [[ "${#LOG_COMMAND_STACK_TRACE_ITEMS[@]}" -eq '0' ]]; then
11118
export LOG_COMMAND_STACK_TRACE_ITEMS
@@ -18,3 +125,43 @@ set_log_command_stack_trace_items() {
18125
"$(stack_trace_item "$_GO_CORE_DIR/lib/log" '@go.log_command')")
19126
fi
20127
}
128+
129+
# --------------------------------
130+
# IMPLEMENTATION - HERE BE DRAGONS
131+
#
132+
# None of the functions below this line are part of the public interface.
133+
# --------------------------------
134+
135+
__parse_log_level_label() {
136+
local level="$1"
137+
local try_level="$level"
138+
if [[ "${level:0:3}" == '\e[' ]]; then
139+
try_level="${try_level//\\e\[[0-9]m}"
140+
try_level="${try_level//\\e\[[0-9][0-9]m}"
141+
try_level="${try_level//\\e\[[0-9][0-9][0-9]m}"
142+
try_level="${try_level%% *}"
143+
fi
144+
145+
if ! _@go.log_level_index "$try_level"; then
146+
return 1
147+
fi
148+
__log_level_label="$level"
149+
150+
# If it's a label formatted with `format_label`, it's already padded.
151+
if [[ "${level:0:3}" != '\e[' ]]; then
152+
__log_level_label+="${__padding:0:$((${#__padding} - ${#try_level}))}"
153+
fi
154+
}
155+
156+
__expected_log_line() {
157+
local level="$1"
158+
local message="$2"
159+
160+
if [[ "${level:0:3}" == '\e[' ]]; then
161+
printf '%b\n' "$level $message\e[0m"
162+
else
163+
printf '%b\n' "$level $message"
164+
fi
165+
}
166+
167+

tests/log/add-output-file.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4-
load helpers
4+
load "$_GO_CORE_DIR/lib/testing/log"
55

66
teardown() {
77
remove_test_go_rootdir

tests/log/add-update.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4-
load helpers
4+
load "$_GO_CORE_DIR/lib/testing/log"
55

66
INFO_FORMAT='\e[1m\e[36m'
77
START_FORMAT='\e[1m\e[32m'

tests/log/filters.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4-
load helpers
4+
load "$_GO_CORE_DIR/lib/testing/log"
55

66
teardown() {
77
remove_test_go_rootdir

tests/log/helpers.bash

Lines changed: 0 additions & 132 deletions
This file was deleted.

tests/log/log-command.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4-
load helpers
4+
load "$_GO_CORE_DIR/lib/testing/log"
55

66
setup() {
77
test_filter

tests/log/main.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4-
load helpers
4+
load "$_GO_CORE_DIR/lib/testing/log"
55

66
setup() {
77
test_filter

tests/log/setup-project.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4-
load helpers
4+
load "$_GO_CORE_DIR/lib/testing/log"
55

66
teardown() {
77
remove_test_go_rootdir

tests/log/timestamp.bats

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#! /usr/bin/env bats
22

33
load ../environment
4+
load "$_GO_CORE_DIR/lib/testing/log"
45

56
HAS_TIMESTAMP_BUILTIN=
67
DATE_CMD=

0 commit comments

Comments
 (0)