winbind: Fix a memleak
[vlendec/samba-autobuild/.git] / ctdb / tests / scripts / unit.sh
1 # Hey Emacs, this is a -*- shell-script -*- !!!  :-)
2
3 . "${TEST_SCRIPTS_DIR}/common.sh"
4
5 # Common variables and functions for CTDB unit tests.
6
7 trap -- '' PIPE
8
9 # Set the required result for a test.
10 # - Argument 1 is exit code.
11 # - Argument 2, if present is the required test output but "--"
12 #   indicates empty output.
13 # If argument 2 is not present or null then read required test output
14 # from stdin.
15 required_result ()
16 {
17     required_rc="${1:-0}"
18     if [ -n "$2" ] ; then
19         if [ "$2" = "--" ] ; then
20             required_output=""
21         else
22             required_output="$2"
23         fi
24     else
25         if ! tty -s ; then
26             required_output=$(cat)
27         else
28             required_output=""
29         fi
30     fi
31 }
32
33 required_error ()
34 {
35         rc=$(errcode "$1")
36         shift
37         required_result "$rc" "$@"
38 }
39
40 ok ()
41 {
42     required_result 0 "$@"
43 }
44
45 ok_null ()
46 {
47     ok --
48 }
49
50 reset_extra_header ()
51 {
52     # Re-define this function to output extra header information
53     extra_header ()
54     {
55         :
56     }
57 }
58
59 reset_extra_footer ()
60 {
61     # Re-define this function to output extra footer information
62     extra_footer ()
63     {
64         :
65     }
66 }
67
68 reset_extra_header
69 reset_extra_footer
70
71 result_print ()
72 {
73     _passed="$1"
74     _out="$2"
75     _rc="$3"
76
77     if "$CTDB_TEST_VERBOSE" || ! $_passed ; then
78         extra_header
79
80 cat <<EOF
81 --------------------------------------------------
82 Output (Exit status: ${_rc}):
83 --------------------------------------------------
84 EOF
85         # Avoid echo, which might expand unintentional escapes
86         printf '%s\n' "$_out" | \
87                 result_filter | \
88                 cat "${CTDB_TEST_CAT_RESULTS_OPTS:--}"
89     fi
90
91     if ! $_passed ; then
92         cat <<EOF
93 --------------------------------------------------
94 Required output (Exit status: ${required_rc}):
95 --------------------------------------------------
96 EOF
97         # Avoid echo, which might expand unintentional escapes
98         printf '%s\n' "$required_output" | \
99                 cat "${CTDB_TEST_CAT_RESULTS_OPTS:--}"
100
101         if $CTDB_TEST_DIFF_RESULTS ; then
102             _outr=$(mktemp)
103             # Avoid echo, which might expand unintentional escapes
104             printf '%s\n' "$required_output" >"$_outr"
105
106             _outf=$(mktemp)
107             # Avoid echo, which might expand unintentional escapes
108             printf '%s\n' "$_fout" >"$_outf"
109
110             cat <<EOF
111 --------------------------------------------------
112 Diff:
113 --------------------------------------------------
114 EOF
115             diff -u "$_outr" "$_outf" | cat -A
116             rm "$_outr" "$_outf"
117         fi
118     fi
119 }
120
121 result_footer ()
122 {
123     _passed="$1"
124
125     if "$CTDB_TEST_VERBOSE" || ! $_passed ; then
126         extra_footer
127     fi
128
129     if $_passed ; then
130         echo "PASSED"
131         return 0
132     else
133         echo
134         echo "FAILED"
135         return 1
136     fi
137 }
138
139 # Result filtering is (usually) used to replace the date/time/PID
140 # prefix on some CTDB tool/client log messages with the literal string
141 # "DATE TIME [PID]".  This allows tests to loosely match this output,
142 # since it can't otherwise be matched.
143 result_filter_default ()
144 {
145     _date_time_pid='[0-9/][0-9/]*\ [0-9:\.][0-9:\.]*\ \[[\ 0-9][\ 0-9]*\]'
146     sed -e "s@^${_date_time_pid}:@DATE\ TIME\ \[PID\]:@"
147 }
148 # Used in testcases
149 # shellcheck disable=SC2034
150 TEST_DATE_STAMP=""
151
152 # Override this function to customise output filtering.
153 result_filter ()
154 {
155     result_filter_default
156 }
157
158 result_check ()
159 {
160     _rc=$?
161
162     # Avoid echo, which might expand unintentional escapes
163     _fout=$(printf '%s\n' "$_out" | result_filter)
164
165     if [ "$_fout" = "$required_output" ] && [ "$_rc" = "$required_rc" ] ; then
166         _passed=true
167     else
168         _passed=false
169     fi
170
171     result_print "$_passed" "$_out" "$_rc"
172     result_footer "$_passed"
173 }
174
175 test_fail ()
176 {
177     _passed=false
178     return 1
179 }
180
181 test_header_default ()
182 {
183     echo "=================================================="
184     echo "Running \"$*\""
185 }
186
187 reset_test_header ()
188 {
189     # Re-define this function to get different header
190     test_header ()
191     {
192         test_header_default "$@"
193     }
194 }
195
196 reset_test_header
197
198 # Simple test harness for running binary unit tests
199 unit_test ()
200 {
201     test_header "$@"
202
203     _wrapper="$VALGRIND"
204     if $CTDB_TEST_COMMAND_TRACE ; then
205         _wrapper="strace"
206     fi
207     _out=$($_wrapper "$@" 2>&1)
208
209     result_check || exit $?
210 }
211
212 # Simple test harness for running shell script unit tests
213 script_test ()
214 {
215     test_header "$@"
216
217     _shell=""
218     if ${CTDB_TEST_COMMAND_TRACE} ; then
219         _shell="sh -x"
220     else
221         _shell="sh"
222     fi
223
224     _out=$($_shell "$@" 2>&1)
225
226     result_check || exit $?
227 }
228
229 # Simple test harness for running tests without tracing
230 unit_test_notrace ()
231 {
232     test_header "$@"
233
234     _out=$("$@" 2>&1)
235
236     result_check || exit $?
237 }
238
239 test_cleanup_hooks=""
240
241 test_cleanup ()
242 {
243     test_cleanup_hooks="${test_cleanup_hooks}${test_cleanup_hooks:+ ; }$*"
244 }
245
246 trap 'eval $test_cleanup_hooks' 0
247
248 local="${CTDB_TEST_SUITE_DIR}/scripts/local.sh"
249 if [ -r "$local" ] ; then
250     . "$local"
251 fi