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
9116set_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+
0 commit comments