]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/atf/atf-sh/atf-check_test.sh
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / atf / atf-sh / atf-check_test.sh
1 # Copyright (c) 2008 The NetBSD Foundation, Inc.
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7 # 1. Redistributions of source code must retain the above copyright
8 #    notice, this list of conditions and the following disclaimer.
9 # 2. Redistributions in binary form must reproduce the above copyright
10 #    notice, this list of conditions and the following disclaimer in the
11 #    documentation and/or other materials provided with the distribution.
12 #
13 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14 # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15 # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20 # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22 # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24 # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26 # The Atf_Check and Atf-Shell variables are set by atf-sh.
27
28 h_pass()
29 {
30     cmd="$1"; shift
31
32     echo "Running [atf-check $*] against [${cmd}]"
33
34     cat >script.sh <<EOF
35 #! ${Atf_Shell}
36 ${cmd}
37 EOF
38     chmod +x script.sh
39
40     if ! ${Atf_Check} "${@}" ./script.sh >tmp; then
41         cat tmp
42         atf_fail "atf-check failed"
43     fi
44 }
45
46 h_fail()
47 {
48     cmd="$1"; shift
49
50     echo "Running [atf-check $*] against [${cmd}]"
51
52     cat >script.sh <<EOF
53 #! ${Atf_Shell}
54 ${cmd}
55 EOF
56     chmod +x script.sh
57
58     if ${Atf_Check} "${@}" ./script.sh 2>tmp; then
59         cat tmp
60         atf_fail "atf-check succeeded but should fail"
61     fi
62 }
63
64 atf_test_case sflag_eq_ne
65 sflag_eq_ne_head()
66 {
67     atf_set "descr" "Tests for the -s option using the 'eq' and 'ne' qualifiers"
68 }
69 sflag_eq_ne_body()
70 {
71     h_pass "true" -s eq:0
72     h_pass "false" -s ne:0
73     h_pass "exit 255" -s eq:255
74     h_pass "exit 0" -s ne:255
75
76     h_fail "exit 256" -s eq:256
77     h_fail "exit -1" -s eq:-1
78     h_fail "true" -s ne:256
79     h_fail "true" -s ne:-1
80 }
81
82 atf_test_case sflag_exit
83 sflag_exit_head()
84 {
85     atf_set "descr" "Tests for the -s option using the 'exit' qualifier"
86 }
87 sflag_exit_body()
88 {
89     h_pass 'true' -s exit:0
90     h_pass 'false' -s not-exit:0
91     h_pass 'exit 255' -s exit:255
92     h_pass 'exit 0' -s not-exit:255
93
94     h_fail 'exit 256' -s exit:256
95     h_fail 'exit -1' -s exit:-1
96     h_fail 'true' -s not-exit:256
97     h_fail 'true' -s not-exit:-1
98
99     h_pass 'true' -s exit
100     h_pass 'false' -s exit
101     if ${Atf_Check} -s exit -x 'kill $$'; then
102         atf_fail "Signal detected as clean exit"
103     fi
104 }
105
106 atf_test_case sflag_ignore
107 sflag_ignore_head()
108 {
109     atf_set "descr" "Tests for the -s option using the 'ignore' qualifier"
110 }
111 sflag_ignore_body()
112 {
113     h_pass 'true' -s ignore
114     h_pass 'false' -s ignore
115     if ${Atf_Check} -s ignored -x 'kill $$'; then
116         atf_fail "Signal not ignored"
117     fi
118 }
119
120 atf_test_case sflag_signal
121 sflag_signal_head()
122 {
123     atf_set "descr" "Tests for the -s option using the 'signal' qualifier"
124 }
125 sflag_signal_body()
126 {
127     ${Atf_Check} -s signal:hup -x 'kill -1 $$' || atf_fail "Signal not detected"
128     ${Atf_Check} -s signal:sighup -x 'kill -1 $$' || atf_fail "Signal not" \
129         "detected"
130     ${Atf_Check} -s signal:1 -x 'kill -1 $$' || atf_fail "Signal not detected"
131     ${Atf_Check} -s signal -x 'kill -1 $$' || atf_fail "Signal not detected"
132
133     ${Atf_Check} -s not-signal:kill -x 'kill -9 $$' && \
134         atf_fail "not-signal:kill matched kill -9"
135     ${Atf_Check} -s not-signal:kill -x 'kill -1 $$' || \
136         atf_fail "not-signal:kill did not match kill -1"
137
138     h_fail 'true' -s signal
139     h_fail 'false' -s signal
140 }
141
142 atf_test_case xflag
143 xflag_head()
144 {
145     atf_set "descr" "Tests for the -x option"
146 }
147 xflag_body()
148 {
149     ${Atf_Check} -s ne:0 -o ignore -e ignore "echo foo 2>&1" || \
150         atf_fail "Shell command succeeded without -x"
151
152     ${Atf_Check} -e inline:"foo\n" -x "echo foo 1>&2" || \
153         atf_fail "Cannot run command with -x"
154
155     ${Atf_Check} -o inline:"foo\n" -x echo foo || \
156         atf_fail "Using -x does not respect all provided arguments"
157 }
158
159 atf_test_case oflag_empty
160 oflag_empty_head()
161 {
162     atf_set "descr" "Tests for the -o option using the 'empty' argument"
163 }
164 oflag_empty_body()
165 {
166     h_pass "true" -o empty
167     h_fail "echo foo" -o empty
168 }
169
170 atf_test_case oflag_ignore
171 oflag_ignore_head()
172 {
173     atf_set "descr" "Tests for the -o option using the 'ignore' argument"
174 }
175 oflag_ignore_body()
176 {
177     h_pass "true" -o ignore
178     h_pass "echo foo" -o ignore
179 }
180
181 atf_test_case oflag_file
182 oflag_file_head()
183 {
184     atf_set "descr" "Tests for the -o option using the 'file:' argument"
185 }
186 oflag_file_body()
187 {
188     touch empty
189     h_pass "true" -o file:empty
190
191     echo foo >text
192     h_pass "echo foo" -o file:text
193     h_fail "echo bar" -o file:text
194
195     dd if=/dev/urandom of=bin bs=1k count=10
196     h_pass "cat bin" -o file:bin
197 }
198
199 atf_test_case oflag_inline
200 oflag_inline_head()
201 {
202     atf_set "descr" "Tests for the -o option using the 'inline:' argument"
203 }
204 oflag_inline_body()
205 {
206     h_pass "true" -o inline:
207     h_pass "echo foo bar" -o inline:"foo bar\n"
208     h_pass "printf 'foo bar'" -o inline:"foo bar"
209     h_pass "printf '\t\n\t\n'" -o inline:"\t\n\t\n"
210     h_pass "printf '\a\b\033\f\n\r\t\v'" -o inline:"\a\b\e\f\n\r\t\v"
211     h_pass "printf '\011\022\033\012'" -o inline:"\011\022\033\012"
212
213     h_fail "echo foo bar" -o inline:"foo bar"
214     h_fail "echo -n foo bar" -o inline:"foo bar\n"
215 }
216
217 atf_test_case oflag_match
218 oflag_match_head()
219 {
220     atf_set "descr" "Tests for the -o option using the 'match:' argument"
221 }
222 oflag_match_body()
223 {
224     h_pass "printf no-newline" -o "match:^no-newline"
225     h_pass "echo line1; echo foo bar" -o "match:^foo"
226     h_pass "echo foo bar" -o "match:o b"
227     h_fail "echo foo bar" -o "match:baz"
228     h_fail "echo foo bar" -o "match:^bar"
229 }
230
231 atf_test_case oflag_save
232 oflag_save_head()
233 {
234     atf_set "descr" "Tests for the -o option using the 'save:' argument"
235 }
236 oflag_save_body()
237 {
238     h_pass "echo foo" -o save:out
239     echo foo >exp
240     cmp -s out exp || atf_fail "Saved output does not match expected results"
241 }
242
243 atf_test_case oflag_multiple
244 oflag_multiple_head()
245 {
246     atf_set "descr" "Tests for multiple occurrences of the -o option"
247 }
248 oflag_multiple_body()
249 {
250     h_pass "echo foo bar" -o match:foo -o match:bar
251     h_pass "echo foo; echo bar" -o match:foo -o match:bar
252     h_fail "echo foo baz" -o match:bar -o match:foo
253     h_fail "echo foo; echo baz" -o match:bar -o match:foo
254 }
255
256 atf_test_case oflag_negated
257 oflag_negated_head()
258 {
259     atf_set "descr" "Tests for negated occurrences of the -o option"
260 }
261 oflag_negated_body()
262 {
263     h_fail "echo foo" -o empty
264     h_pass "echo foo" -o not-empty
265
266     h_pass "echo foo bar" -o match:foo
267     h_fail "echo foo bar" -o not-match:foo
268 }
269
270 atf_test_case eflag_empty
271 eflag_empty_head()
272 {
273     atf_set "descr" "Tests for the -e option using the 'empty' argument"
274 }
275 eflag_empty_body()
276 {
277     h_pass "true 1>&2" -e empty
278     h_fail "echo foo 1>&2" -e empty
279 }
280
281 atf_test_case eflag_ignore
282 eflag_ignore_head()
283 {
284     atf_set "descr" "Tests for the -e option using the 'ignore' argument"
285 }
286 eflag_ignore_body()
287 {
288     h_pass "true 1>&2" -e ignore
289     h_pass "echo foo 1>&2" -e ignore
290 }
291
292 atf_test_case eflag_file
293 eflag_file_head()
294 {
295     atf_set "descr" "Tests for the -e option using the 'file:' argument"
296 }
297 eflag_file_body()
298 {
299     touch empty
300     h_pass "true 1>&2" -e file:empty
301
302     echo foo >text
303     h_pass "echo foo 1>&2" -e file:text
304     h_fail "echo bar 1>&2" -e file:text
305
306     dd if=/dev/urandom of=bin bs=1k count=10
307     h_pass "cat bin 1>&2" -e file:bin
308 }
309
310 atf_test_case eflag_inline
311 eflag_inline_head()
312 {
313     atf_set "descr" "Tests for the -e option using the 'inline:' argument"
314 }
315 eflag_inline_body()
316 {
317     h_pass "true 1>&2" -e inline:
318     h_pass "echo foo bar 1>&2" -e inline:"foo bar\n"
319     h_pass "printf 'foo bar' 1>&2" -e inline:"foo bar"
320     h_pass "printf '\t\n\t\n' 1>&2" -e inline:"\t\n\t\n"
321     h_pass "printf '\a\b\033\f\n\r\t\v' 1>&2" -e inline:"\a\b\e\f\n\r\t\v"
322     h_pass "printf '\011\022\033\012' 1>&2" -e inline:"\011\022\033\012"
323
324     h_fail "echo foo bar 1>&2" -e inline:"foo bar"
325     h_fail "echo -n foo bar 1>&2" -e inline:"foo bar\n"
326 }
327
328 atf_test_case eflag_save
329 eflag_save_head()
330 {
331     atf_set "descr" "Tests for the -e option using the 'save:' argument"
332 }
333 eflag_save_body()
334 {
335     h_pass "echo foo 1>&2" -e save:out
336     echo foo >exp
337     cmp -s out exp || atf_fail "Saved output does not match expected results"
338 }
339
340 atf_test_case eflag_match
341 eflag_match_head()
342 {
343     atf_set "descr" "Tests for the -e option using the 'match:' argument"
344 }
345 eflag_match_body()
346 {
347     h_pass "printf no-newline 1>&2" -e "match:^no-newline"
348     h_pass "echo line1 1>&2; echo foo bar 1>&2" -e "match:^foo"
349     h_pass "echo foo bar 1>&2" -e "match:o b"
350     h_fail "echo foo bar 1>&2" -e "match:baz"
351     h_fail "echo foo bar 1>&2" -e "match:^bar"
352 }
353
354 atf_test_case eflag_multiple
355 eflag_multiple_head()
356 {
357     atf_set "descr" "Tests for multiple occurrences of the -e option"
358 }
359 eflag_multiple_body()
360 {
361     h_pass "echo foo bar 1>&2" -e match:foo -e match:bar
362     h_pass "echo foo 1>&2; echo bar 1>&2" -e match:foo -e match:bar
363     h_fail "echo foo baz 1>&2" -e match:bar -e match:foo
364     h_fail "echo foo 1>&2; echo baz 1>&2" -e match:bar -e match:foo
365 }
366
367 atf_test_case eflag_negated
368 eflag_negated_head()
369 {
370     atf_set "descr" "Tests for negated occurrences of the -e option"
371 }
372 eflag_negated_body()
373 {
374     h_fail "echo foo 1>&2" -e empty
375     h_pass "echo foo 1>&2" -e not-empty
376
377     h_pass "echo foo bar 1>&2" -e match:foo
378     h_fail "echo foo bar 1>&2" -e not-match:foo
379 }
380
381 atf_test_case stdin
382 stdin_head()
383 {
384     atf_set "descr" "Tests that stdin is preserved"
385 }
386 stdin_body()
387 {
388     echo "hello" | ${Atf_Check} -o match:"hello" cat || \
389         atf_fail "atf-check does not seem to respect stdin"
390 }
391
392 atf_test_case invalid_umask
393 invalid_umask_head()
394 {
395     atf_set "descr" "Tests for a correct error condition if the umask is" \
396             "too restrictive"
397 }
398 invalid_umask_body()
399 {
400     umask 0222
401     ${Atf_Check} false 2>stderr && \
402         atf_fail "atf-check returned 0 but it should have failed"
403     cat stderr
404     grep 'temporary.*current umask.*0222' stderr >/dev/null || \
405         atf_fail "atf-check did not report an error related to the" \
406                  "current umask"
407 }
408
409 atf_init_test_cases()
410 {
411     atf_add_test_case sflag_eq_ne
412     atf_add_test_case sflag_exit
413     atf_add_test_case sflag_ignore
414     atf_add_test_case sflag_signal
415
416     atf_add_test_case xflag
417
418     atf_add_test_case oflag_empty
419     atf_add_test_case oflag_ignore
420     atf_add_test_case oflag_file
421     atf_add_test_case oflag_inline
422     atf_add_test_case oflag_match
423     atf_add_test_case oflag_save
424     atf_add_test_case oflag_multiple
425     atf_add_test_case oflag_negated
426
427     atf_add_test_case eflag_empty
428     atf_add_test_case eflag_ignore
429     atf_add_test_case eflag_file
430     atf_add_test_case eflag_inline
431     atf_add_test_case eflag_match
432     atf_add_test_case eflag_save
433     atf_add_test_case eflag_multiple
434     atf_add_test_case eflag_negated
435
436     atf_add_test_case stdin
437
438     atf_add_test_case invalid_umask
439 }
440
441 # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4