comparison usr/src/test/test-runner/stf/contrib/include/logapi.shlib @ 13899:0bcf78798346

3311 Want a test framework for arbitrary OS unit tests 3312 Add a testrunner package for OS unit tests 3313 Add a testrunner package to convert ZFS tests from STF Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com> Reviewed by: Will Guyette <will.guyette@delphix.com> Reviewed by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Henrik Mattson <henrik.mattson@delphix.com> Reviewed by: Sonu Pillai <sonu.pillai@delphix.com> Reviewed by: Christopher Siden <chris.siden@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Approved by: Richard Lowe <richlowe@richlowe.net>
author John Wren Kennedy <john.kennedy@delphix.com>
date Wed, 05 Dec 2012 22:04:50 -0500
parents
children
comparison
equal deleted inserted replaced
13898:7f822b09519b 13899:0bcf78798346
1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21
22 #
23 # Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 # Use is subject to license terms.
25 #
26 # Copyright (c) 2012 by Delphix. All rights reserved.
27 #
28
29 . ${STF_TOOLS}/include/stf.shlib
30
31 # Output an assertion
32 #
33 # $@ - assertion text
34
35 function log_assert
36 {
37 _printline ASSERTION: "$@"
38 }
39
40 # Output a comment
41 #
42 # $@ - comment text
43
44 function log_note
45 {
46 _printline NOTE: "$@"
47 }
48
49 # Execute and print command with status where success equals non-zero result
50 #
51 # $@ - command to execute
52 #
53 # return 0 if command fails, otherwise return 1
54
55 function log_neg
56 {
57 log_neg_expect "" "$@"
58 return $?
59 }
60
61 # Execute a positive test and exit $STF_FAIL is test fails
62 #
63 # $@ - command to execute
64
65 function log_must
66 {
67 log_pos "$@"
68 (( $? != 0 )) && log_fail
69 }
70
71 # Execute a negative test and exit $STF_FAIL if test passes
72 #
73 # $@ - command to execute
74
75 function log_mustnot
76 {
77 log_neg "$@"
78 (( $? != 0 )) && log_fail
79 }
80
81 # Execute a negative test with keyword expected, and exit
82 # $STF_FAIL if test passes
83 #
84 # $1 - keyword expected
85 # $2-$@ - command to execute
86
87 function log_mustnot_expect
88 {
89 log_neg_expect "$@"
90 (( $? != 0 )) && log_fail
91 }
92
93 # Execute and print command with status where success equals non-zero result
94 # or output includes expected keyword
95 #
96 # $1 - keyword expected
97 # $2-$@ - command to execute
98 #
99 # return 0 if command fails, or the output contains the keyword expected,
100 # return 1 otherwise
101
102 function log_neg_expect
103 {
104 typeset out=""
105 typeset logfile="/tmp/log.$$"
106 typeset ret=1
107 typeset expect=$1
108 shift
109
110 while [[ -e $logfile ]]; do
111 logfile="$logfile.$$"
112 done
113
114 "$@" 2>$logfile
115 typeset status=$?
116 out="/usr/bin/cat $logfile"
117
118 # unexpected status
119 if (( $status == 0 )); then
120 print -u2 $($out)
121 _printerror "$@" "unexpectedly exited $status"
122 # missing binary
123 elif (( $status == 127 )); then
124 print -u2 $($out)
125 _printerror "$@" "unexpectedly exited $status (File not found)"
126 # bus error - core dump
127 elif (( $status == 138 )); then
128 print -u2 $($out)
129 _printerror "$@" "unexpectedly exited $status (Bus Error)"
130 # segmentation violation - core dump
131 elif (( $status == 139 )); then
132 print -u2 $($out)
133 _printerror "$@" "unexpectedly exited $status (SEGV)"
134 else
135 $out | /usr/bin/egrep -i "internal error|assertion failed" \
136 > /dev/null 2>&1
137 # internal error or assertion failed
138 if (( $? == 0 )); then
139 print -u2 $($out)
140 _printerror "$@" "internal error or assertion failure" \
141 " exited $status"
142 elif [[ -n $expect ]] ; then
143 $out | /usr/bin/grep -i "$expect" > /dev/null 2>&1
144 if (( $? == 0 )); then
145 ret=0
146 else
147 print -u2 $($out)
148 _printerror "$@" "unexpectedly exited $status"
149 fi
150 else
151 ret=0
152 fi
153
154 if (( $ret == 0 )); then
155 [[ -n $LOGAPI_DEBUG ]] && print $($out)
156 _printsuccess "$@" "exited $status"
157 fi
158 fi
159 _recursive_output $logfile "false"
160 return $ret
161 }
162
163 # Execute and print command with status where success equals zero result
164 #
165 # $@ command to execute
166 #
167 # return command exit status
168
169 function log_pos
170 {
171 typeset out=""
172 typeset logfile="/tmp/log.$$"
173
174 while [[ -e $logfile ]]; do
175 logfile="$logfile.$$"
176 done
177
178 "$@" 2>$logfile
179 typeset status=$?
180 out="/usr/bin/cat $logfile"
181
182 if (( $status != 0 )) ; then
183 print -u2 $($out)
184 _printerror "$@" "exited $status"
185 else
186 $out | /usr/bin/egrep -i "internal error|assertion failed" \
187 > /dev/null 2>&1
188 # internal error or assertion failed
189 if [[ $? -eq 0 ]]; then
190 print -u2 $($out)
191 _printerror "$@" "internal error or assertion failure" \
192 " exited $status"
193 status=1
194 else
195 [[ -n $LOGAPI_DEBUG ]] && print $($out)
196 _printsuccess "$@"
197 fi
198 fi
199 _recursive_output $logfile "false"
200 return $status
201 }
202
203 # Set an exit handler
204 #
205 # $@ - function(s) to perform on exit
206
207 function log_onexit
208 {
209 _CLEANUP="$@"
210 }
211
212 #
213 # Exit functions
214 #
215
216 # Perform cleanup and exit $STF_PASS
217 #
218 # $@ - message text
219
220 function log_pass
221 {
222 _endlog $STF_PASS "$@"
223 }
224
225 # Perform cleanup and exit $STF_FAIL
226 #
227 # $@ - message text
228
229 function log_fail
230 {
231 _endlog $STF_FAIL "$@"
232 }
233
234 # Perform cleanup and exit $STF_UNRESOLVED
235 #
236 # $@ - message text
237
238 function log_unresolved
239 {
240 _endlog $STF_UNRESOLVED "$@"
241 }
242
243 # Perform cleanup and exit $STF_NOTINUSE
244 #
245 # $@ - message text
246
247 function log_notinuse
248 {
249 _endlog $STF_NOTINUSE "$@"
250 }
251
252 # Perform cleanup and exit $STF_UNSUPPORTED
253 #
254 # $@ - message text
255
256 function log_unsupported
257 {
258 _endlog $STF_UNSUPPORTED "$@"
259 }
260
261 # Perform cleanup and exit $STF_UNTESTED
262 #
263 # $@ - message text
264
265 function log_untested
266 {
267 _endlog $STF_UNTESTED "$@"
268 }
269
270 # Perform cleanup and exit $STF_UNINITIATED
271 #
272 # $@ - message text
273
274 function log_uninitiated
275 {
276 _endlog $STF_UNINITIATED "$@"
277 }
278
279 # Perform cleanup and exit $STF_NORESULT
280 #
281 # $@ - message text
282
283 function log_noresult
284 {
285 _endlog $STF_NORESULT "$@"
286 }
287
288 # Perform cleanup and exit $STF_WARNING
289 #
290 # $@ - message text
291
292 function log_warning
293 {
294 _endlog $STF_WARNING "$@"
295 }
296
297 # Perform cleanup and exit $STF_TIMED_OUT
298 #
299 # $@ - message text
300
301 function log_timed_out
302 {
303 _endlog $STF_TIMED_OUT "$@"
304 }
305
306 # Perform cleanup and exit $STF_OTHER
307 #
308 # $@ - message text
309
310 function log_other
311 {
312 _endlog $STF_OTHER "$@"
313 }
314
315 #
316 # Internal functions
317 #
318
319 # Perform cleanup and exit
320 #
321 # $1 - stf exit code
322 # $2-$n - message text
323
324 function _endlog
325 {
326 typeset logfile="/tmp/log.$$"
327 _recursive_output $logfile
328
329 if [[ -n $_CLEANUP ]] ; then
330 typeset cleanup=$_CLEANUP
331 log_onexit ""
332 log_note "Performing local cleanup via log_onexit ($cleanup)"
333 $cleanup
334 fi
335 typeset exitcode=$1
336 shift
337 (( ${#@} > 0 )) && _printline "$@"
338 exit $exitcode
339 }
340
341 # Output a formatted line
342 #
343 # $@ - message text
344
345 function _printline
346 {
347 print "$@"
348 }
349
350 # Output an error message
351 #
352 # $@ - message text
353
354 function _printerror
355 {
356 _printline ERROR: "$@"
357 }
358
359 # Output a success message
360 #
361 # $@ - message text
362
363 function _printsuccess
364 {
365 _printline SUCCESS: "$@"
366 }
367
368 # Output logfiles recursively
369 #
370 # $1 - start file
371 # $2 - indicate whether output the start file itself, default as yes.
372
373 function _recursive_output #logfile
374 {
375 typeset logfile=$1
376
377 while [[ -e $logfile ]]; do
378 if [[ -z $2 || $logfile != $1 ]]; then
379 /usr/bin/cat $logfile
380 fi
381 /usr/bin/rm -f $logfile
382 logfile="$logfile.$$"
383 done
384 }