1ee44dd6cSjmmv#
2ee44dd6cSjmmv# Automated Testing Framework (atf)
3ee44dd6cSjmmv#
4ee44dd6cSjmmv# Copyright (c) 2007 The NetBSD Foundation, Inc.
5ee44dd6cSjmmv# All rights reserved.
6ee44dd6cSjmmv#
7ee44dd6cSjmmv# Redistribution and use in source and binary forms, with or without
8ee44dd6cSjmmv# modification, are permitted provided that the following conditions
9ee44dd6cSjmmv# are met:
10ee44dd6cSjmmv# 1. Redistributions of source code must retain the above copyright
11ee44dd6cSjmmv#    notice, this list of conditions and the following disclaimer.
12ee44dd6cSjmmv# 2. Redistributions in binary form must reproduce the above copyright
13ee44dd6cSjmmv#    notice, this list of conditions and the following disclaimer in the
14ee44dd6cSjmmv#    documentation and/or other materials provided with the distribution.
15ee44dd6cSjmmv#
16ee44dd6cSjmmv# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17ee44dd6cSjmmv# CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18ee44dd6cSjmmv# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19ee44dd6cSjmmv# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20ee44dd6cSjmmv# IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21ee44dd6cSjmmv# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22ee44dd6cSjmmv# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23ee44dd6cSjmmv# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24ee44dd6cSjmmv# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25ee44dd6cSjmmv# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26ee44dd6cSjmmv# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27ee44dd6cSjmmv# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28ee44dd6cSjmmv#
29ee44dd6cSjmmv
30ee44dd6cSjmmvcreate_atffile()
31ee44dd6cSjmmv{
32ee44dd6cSjmmv    ATF_CONFDIR="$(pwd)"; export ATF_CONFDIR
33ee44dd6cSjmmv
34ee44dd6cSjmmv    cat >Atffile <<EOF
35ee44dd6cSjmmvContent-Type: application/X-atf-atffile; version="1"
36ee44dd6cSjmmv
37ee44dd6cSjmmvprop: test-suite = atf
38ee44dd6cSjmmv
39ee44dd6cSjmmvEOF
40ee44dd6cSjmmv    for f in "${@}"; do
41ee44dd6cSjmmv        echo "tp: ${f}" >>Atffile
42ee44dd6cSjmmv    done
43ee44dd6cSjmmv}
44ee44dd6cSjmmv
45ee44dd6cSjmmvcreate_helper()
46ee44dd6cSjmmv{
47ee44dd6cSjmmv    cp $(atf_get_srcdir)/misc_helpers helper
48ee44dd6cSjmmv    create_atffile helper
49ee44dd6cSjmmv    TESTCASE=${1}; export TESTCASE
50ee44dd6cSjmmv}
51ee44dd6cSjmmv
52ee44dd6cSjmmvcreate_helper_stdin()
53ee44dd6cSjmmv{
54ee44dd6cSjmmv    # TODO: This really, really, really must use real test programs.
55ee44dd6cSjmmv    cat >${1} <<EOF
56ee44dd6cSjmmv#! $(atf-config -t atf_shell)
57ee44dd6cSjmmvwhile [ \${#} -gt 0 ]; do
58ee44dd6cSjmmv    case \${1} in
59ee44dd6cSjmmv        -l)
60ee44dd6cSjmmv            echo 'Content-Type: application/X-atf-tp; version="1"'
61ee44dd6cSjmmv            echo
62ee44dd6cSjmmvEOF
63ee44dd6cSjmmv    cnt=1
64ee44dd6cSjmmv    while [ ${cnt} -le ${2} ]; do
65ee44dd6cSjmmv        echo "echo 'ident: tc${cnt}'" >>${1}
66ee44dd6cSjmmv        [ ${cnt} -lt ${2} ] && echo "echo" >>${1}
67ee44dd6cSjmmv        cnt=$((${cnt} + 1))
68ee44dd6cSjmmv    done
69ee44dd6cSjmmvcat >>${1} <<EOF
70ee44dd6cSjmmv            exit 0
71ee44dd6cSjmmv            ;;
72ee44dd6cSjmmv        -r*)
73ee44dd6cSjmmv            resfile=\$(echo \${1} | cut -d r -f 2-)
74ee44dd6cSjmmv            ;;
75ee44dd6cSjmmv    esac
76ee44dd6cSjmmv    testcase=\$(echo \${1} | cut -d : -f 1)
77ee44dd6cSjmmv    shift
78ee44dd6cSjmmvdone
79ee44dd6cSjmmvEOF
80ee44dd6cSjmmv    cat >>${1}
81ee44dd6cSjmmv}
82ee44dd6cSjmmv
83ee44dd6cSjmmvcreate_mount_helper()
84ee44dd6cSjmmv{
85ee44dd6cSjmmv    cat >${1} <<EOF
86ee44dd6cSjmmv#! /usr/bin/env atf-sh
87ee44dd6cSjmmv
88ee44dd6cSjmmvdo_mount() {
89ee44dd6cSjmmv    platform=\$(uname)
90ee44dd6cSjmmv    case \${platform} in
91ee44dd6cSjmmv    Linux|NetBSD)
92ee44dd6cSjmmv        mount -t tmpfs tmpfs \${1} || atf_fail "Mount failed"
93ee44dd6cSjmmv        ;;
94ee44dd6cSjmmv    FreeBSD)
95ee44dd6cSjmmv        mdmfs -s 16m md \${1} || atf_fail "Mount failed"
96ee44dd6cSjmmv        ;;
97ee44dd6cSjmmv    SunOS)
98ee44dd6cSjmmv        mount -F tmpfs tmpfs \$(pwd)/\${1} || atf_fail "Mount failed"
99ee44dd6cSjmmv        ;;
100ee44dd6cSjmmv    *)
101ee44dd6cSjmmv        atf_fail "create_mount_helper called for an unsupported platform."
102ee44dd6cSjmmv        ;;
103ee44dd6cSjmmv    esac
104ee44dd6cSjmmv}
105ee44dd6cSjmmv
106ee44dd6cSjmmvatf_test_case main
107ee44dd6cSjmmvmain_head() {
108ee44dd6cSjmmv    atf_set "require.user" "root"
109ee44dd6cSjmmv}
110ee44dd6cSjmmvmain_body() {
111ee44dd6cSjmmvEOF
112ee44dd6cSjmmv    cat >>${1}
113ee44dd6cSjmmv    cat >>${1} <<EOF
114ee44dd6cSjmmv}
115ee44dd6cSjmmv
116ee44dd6cSjmmvatf_init_test_cases()
117ee44dd6cSjmmv{
118ee44dd6cSjmmv    atf_add_test_case main
119ee44dd6cSjmmv}
120ee44dd6cSjmmvEOF
121ee44dd6cSjmmv}
122ee44dd6cSjmmv
123ee44dd6cSjmmvatf_test_case no_warnings
124ee44dd6cSjmmvno_warnings_head()
125ee44dd6cSjmmv{
126ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run suppresses warnings about not running" \
127ee44dd6cSjmmv                    "within atf-run"
128ee44dd6cSjmmv}
129ee44dd6cSjmmvno_warnings_body()
130ee44dd6cSjmmv{
131ee44dd6cSjmmv    create_helper pass
132ee44dd6cSjmmv    atf_check -s eq:0 -o ignore -e not-match:'WARNING.*atf-run' atf-run helper
133ee44dd6cSjmmv}
134ee44dd6cSjmmv
135ee44dd6cSjmmvatf_test_case config
136ee44dd6cSjmmvconfig_head()
137ee44dd6cSjmmv{
138ee44dd6cSjmmv    atf_set "descr" "Tests that the config files are read in the correct" \
139ee44dd6cSjmmv                    "order"
140ee44dd6cSjmmv}
141ee44dd6cSjmmvconfig_body()
142ee44dd6cSjmmv{
143ee44dd6cSjmmv    create_helper config
144ee44dd6cSjmmv
145ee44dd6cSjmmv    mkdir etc
146ee44dd6cSjmmv    mkdir .atf
147ee44dd6cSjmmv
148ee44dd6cSjmmv    echo "First: read system-wide common.conf."
149ee44dd6cSjmmv    cat >etc/common.conf <<EOF
150ee44dd6cSjmmvContent-Type: application/X-atf-config; version="1"
151ee44dd6cSjmmv
152ee44dd6cSjmmv1st = "sw common"
153ee44dd6cSjmmv2nd = "sw common"
154ee44dd6cSjmmv3rd = "sw common"
155ee44dd6cSjmmv4th = "sw common"
156ee44dd6cSjmmvEOF
157ee44dd6cSjmmv    atf_check -s eq:0 \
158ee44dd6cSjmmv        -o match:'1st: sw common' \
159ee44dd6cSjmmv        -o match:'2nd: sw common' \
160ee44dd6cSjmmv        -o match:'3rd: sw common' \
161ee44dd6cSjmmv        -o match:'4th: sw common' \
162ee44dd6cSjmmv        -e ignore -x \
163ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc HOME=$(pwd) atf-run helper"
164ee44dd6cSjmmv
165ee44dd6cSjmmv    echo "Second: read system-wide <test-suite>.conf."
166ee44dd6cSjmmv    cat >etc/atf.conf <<EOF
167ee44dd6cSjmmvContent-Type: application/X-atf-config; version="1"
168ee44dd6cSjmmv
169ee44dd6cSjmmv1st = "sw atf"
170ee44dd6cSjmmvEOF
171ee44dd6cSjmmv    atf_check -s eq:0 \
172ee44dd6cSjmmv        -o match:'1st: sw atf' \
173ee44dd6cSjmmv        -o match:'2nd: sw common' \
174ee44dd6cSjmmv        -o match:'3rd: sw common' \
175ee44dd6cSjmmv        -o match:'4th: sw common' \
176ee44dd6cSjmmv        -e ignore -x \
177ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc HOME=$(pwd) atf-run helper"
178ee44dd6cSjmmv
179ee44dd6cSjmmv    echo "Third: read user-specific common.conf."
180ee44dd6cSjmmv    cat >.atf/common.conf <<EOF
181ee44dd6cSjmmvContent-Type: application/X-atf-config; version="1"
182ee44dd6cSjmmv
183ee44dd6cSjmmv2nd = "us common"
184ee44dd6cSjmmvEOF
185ee44dd6cSjmmv    atf_check -s eq:0 \
186ee44dd6cSjmmv        -o match:'1st: sw atf' \
187ee44dd6cSjmmv        -o match:'2nd: us common' \
188ee44dd6cSjmmv        -o match:'3rd: sw common' \
189ee44dd6cSjmmv        -o match:'4th: sw common' \
190ee44dd6cSjmmv        -e ignore -x \
191ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc HOME=$(pwd) atf-run helper"
192ee44dd6cSjmmv
193ee44dd6cSjmmv    echo "Fourth: read user-specific <test-suite>.conf."
194ee44dd6cSjmmv    cat >.atf/atf.conf <<EOF
195ee44dd6cSjmmvContent-Type: application/X-atf-config; version="1"
196ee44dd6cSjmmv
197ee44dd6cSjmmv3rd = "us atf"
198ee44dd6cSjmmvEOF
199ee44dd6cSjmmv    atf_check -s eq:0 \
200ee44dd6cSjmmv        -o match:'1st: sw atf' \
201ee44dd6cSjmmv        -o match:'2nd: us common' \
202ee44dd6cSjmmv        -o match:'3rd: us atf' \
203ee44dd6cSjmmv        -o match:'4th: sw common' \
204ee44dd6cSjmmv        -e ignore -x \
205ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc HOME=$(pwd) atf-run helper"
206ee44dd6cSjmmv}
207ee44dd6cSjmmv
208ee44dd6cSjmmvatf_test_case vflag
209ee44dd6cSjmmvvflag_head()
210ee44dd6cSjmmv{
211ee44dd6cSjmmv    atf_set "descr" "Tests that the -v flag works and that it properly" \
212ee44dd6cSjmmv                    "overrides the values in configuration files"
213ee44dd6cSjmmv}
214ee44dd6cSjmmvvflag_body()
215ee44dd6cSjmmv{
216ee44dd6cSjmmv    create_helper testvar
217ee44dd6cSjmmv
218ee44dd6cSjmmv    echo "Checking that 'testvar' is not defined."
219ee44dd6cSjmmv    atf_check -s eq:1 -o ignore -e ignore -x \
220ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc atf-run helper"
221ee44dd6cSjmmv
222*e62ccdbcSgutteridge    echo "Checking that defining 'testvar' through '-v' works."
223ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: a value' -e ignore -x \
224ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc atf-run -v testvar='a value' helper"
225ee44dd6cSjmmv
226*e62ccdbcSgutteridge    echo "Checking that defining 'testvar' through the configuration" \
227ee44dd6cSjmmv         "file works."
228ee44dd6cSjmmv    mkdir etc
229ee44dd6cSjmmv    cat >etc/common.conf <<EOF
230ee44dd6cSjmmvContent-Type: application/X-atf-config; version="1"
231ee44dd6cSjmmv
232ee44dd6cSjmmvtestvar = "value in conf file"
233ee44dd6cSjmmvEOF
234ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: value in conf file' -e ignore -x \
235ee44dd6cSjmmv              "ATF_CONFDIR=$(pwd)/etc atf-run helper"
236ee44dd6cSjmmv
237*e62ccdbcSgutteridge    echo "Checking that defining 'testvar' through -v overrides the" \
238ee44dd6cSjmmv         "configuration file."
239ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: a value' -e ignore -x \
240ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc atf-run -v testvar='a value' helper"
241ee44dd6cSjmmv}
242ee44dd6cSjmmv
243ee44dd6cSjmmvatf_test_case atffile
244ee44dd6cSjmmvatffile_head()
245ee44dd6cSjmmv{
246ee44dd6cSjmmv    atf_set "descr" "Tests that the variables defined by the Atffile" \
247ee44dd6cSjmmv                    "are recognized and that they take the lowest priority"
248ee44dd6cSjmmv}
249ee44dd6cSjmmvatffile_body()
250ee44dd6cSjmmv{
251ee44dd6cSjmmv    create_helper testvar
252ee44dd6cSjmmv
253ee44dd6cSjmmv    echo "Checking that 'testvar' is not defined."
254ee44dd6cSjmmv    atf_check -s eq:1 -o ignore -e ignore -x \
255ee44dd6cSjmmv              "ATF_CONFDIR=$(pwd)/etc atf-run helper"
256ee44dd6cSjmmv
257*e62ccdbcSgutteridge    echo "Checking that defining 'testvar' through the Atffile works."
258ee44dd6cSjmmv    echo 'conf: testvar = "a value"' >>Atffile
259ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: a value' -e ignore -x \
260ee44dd6cSjmmv              "ATF_CONFDIR=$(pwd)/etc atf-run helper"
261ee44dd6cSjmmv
262*e62ccdbcSgutteridge    echo "Checking that defining 'testvar' through the configuration" \
263ee44dd6cSjmmv         "file overrides the one in the Atffile."
264ee44dd6cSjmmv    mkdir etc
265ee44dd6cSjmmv    cat >etc/common.conf <<EOF
266ee44dd6cSjmmvContent-Type: application/X-atf-config; version="1"
267ee44dd6cSjmmv
268ee44dd6cSjmmvtestvar = "value in conf file"
269ee44dd6cSjmmvEOF
270ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: value in conf file' -e ignore -x \
271ee44dd6cSjmmv              "ATF_CONFDIR=$(pwd)/etc atf-run helper"
272ee44dd6cSjmmv    rm -rf etc
273ee44dd6cSjmmv
274*e62ccdbcSgutteridge    echo "Checking that defining 'testvar' through -v overrides the" \
275ee44dd6cSjmmv         "one in the Atffile."
276ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: new value' -e ignore -x \
277ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/etc atf-run -v testvar='new value' helper"
278ee44dd6cSjmmv}
279ee44dd6cSjmmv
280ee44dd6cSjmmvatf_test_case atffile_recursive
281ee44dd6cSjmmvatffile_recursive_head()
282ee44dd6cSjmmv{
283ee44dd6cSjmmv    atf_set "descr" "Tests that variables defined by an Atffile are not" \
284ee44dd6cSjmmv                    "inherited by other Atffiles."
285ee44dd6cSjmmv}
286ee44dd6cSjmmvatffile_recursive_body()
287ee44dd6cSjmmv{
288ee44dd6cSjmmv    create_helper testvar
289ee44dd6cSjmmv
290ee44dd6cSjmmv    mkdir dir
291ee44dd6cSjmmv    mv Atffile helper dir
292ee44dd6cSjmmv
293ee44dd6cSjmmv    echo "Checking that 'testvar' is not inherited."
294ee44dd6cSjmmv    create_atffile dir
295ee44dd6cSjmmv    echo 'conf: testvar = "a value"' >> Atffile
296ee44dd6cSjmmv    atf_check -s eq:1 -o ignore -e ignore -x "ATF_CONFDIR=$(pwd)/etc atf-run"
297ee44dd6cSjmmv
298ee44dd6cSjmmv    echo "Checking that defining 'testvar' in the correct Atffile works."
299ee44dd6cSjmmv    echo 'conf: testvar = "a value"' >>dir/Atffile
300ee44dd6cSjmmv    atf_check -s eq:0 -o match:'testvar: a value' -e ignore -x \
301ee44dd6cSjmmv              "ATF_CONFDIR=$(pwd)/etc atf-run"
302ee44dd6cSjmmv}
303ee44dd6cSjmmv
304ee44dd6cSjmmvatf_test_case fds
305ee44dd6cSjmmvfds_head()
306ee44dd6cSjmmv{
307ee44dd6cSjmmv    atf_set "descr" "Tests that all streams are properly captured"
308ee44dd6cSjmmv}
309ee44dd6cSjmmvfds_body()
310ee44dd6cSjmmv{
311ee44dd6cSjmmv    create_helper fds
312ee44dd6cSjmmv
313ee44dd6cSjmmv    atf_check -s eq:0 \
314ee44dd6cSjmmv        -o match:'^tc-so:msg1 to stdout$' \
315ee44dd6cSjmmv        -o match:'^tc-so:msg2 to stdout$' \
316ee44dd6cSjmmv        -o match:'^tc-se:msg1 to stderr$' \
317ee44dd6cSjmmv        -o match:'^tc-se:msg2 to stderr$' \
318ee44dd6cSjmmv        -e empty atf-run
319ee44dd6cSjmmv}
320ee44dd6cSjmmv
321ee44dd6cSjmmvatf_test_case mux_streams
322ee44dd6cSjmmvmux_streams_head()
323ee44dd6cSjmmv{
324ee44dd6cSjmmv    atf_set "descr" "Tests for a race condition in stream multiplexing"
325ee44dd6cSjmmv}
326ee44dd6cSjmmvmux_streams_body()
327ee44dd6cSjmmv{
328ee44dd6cSjmmv    create_helper mux_streams
329ee44dd6cSjmmv
330ee44dd6cSjmmv    for i in 1 2 3 4 5; do
331ee44dd6cSjmmv        echo "Attempt ${i}"
332ee44dd6cSjmmv        atf_check -s eq:0 -o match:'stdout 9999' -o match:'stderr 9999' atf-run
333ee44dd6cSjmmv    done
334ee44dd6cSjmmv}
335ee44dd6cSjmmv
336ee44dd6cSjmmvatf_test_case expect
337ee44dd6cSjmmvexpect_head()
338ee44dd6cSjmmv{
339ee44dd6cSjmmv    atf_set "descr" "Tests the processing of test case results and the" \
340ee44dd6cSjmmv        "expect features"
341ee44dd6cSjmmv}
342ee44dd6cSjmmvexpect_body()
343ee44dd6cSjmmv{
344ee44dd6cSjmmv    ln -s "$(atf_get_srcdir)/expect_helpers" .
345ee44dd6cSjmmv    create_atffile expect_helpers
346ee44dd6cSjmmv
347ee44dd6cSjmmv    atf_check -s eq:1 \
348ee44dd6cSjmmv        -o match:'death_and_exit, expected_death' \
349ee44dd6cSjmmv        -o match:'death_and_signal, expected_death' \
350ee44dd6cSjmmv        -o match:'death_but_pass, failed' \
351ee44dd6cSjmmv        -o match:'exit_any_and_exit, expected_exit' \
352ee44dd6cSjmmv        -o match:'exit_but_pass, failed' \
353ee44dd6cSjmmv        -o match:'exit_code_and_exit, expected_exit' \
354ee44dd6cSjmmv        -o match:'fail_and_fail_check, expected_failure' \
355ee44dd6cSjmmv        -o match:'fail_and_fail_requirement, expected_failure' \
356ee44dd6cSjmmv        -o match:'fail_but_pass, failed' \
357ee44dd6cSjmmv        -o match:'pass_and_pass, passed' \
358ee44dd6cSjmmv        -o match:'pass_but_fail_check, failed' \
359ee44dd6cSjmmv        -o match:'pass_but_fail_requirement, failed' \
360ee44dd6cSjmmv        -o match:'signal_any_and_signal, expected_signal' \
361ee44dd6cSjmmv        -o match:'signal_but_pass, failed' \
362ee44dd6cSjmmv        -o match:'signal_no_and_signal, expected_signal' \
363ee44dd6cSjmmv        -o match:'timeout_and_hang, expected_timeout' \
364ee44dd6cSjmmv        -o match:'timeout_but_pass, failed' \
365ee44dd6cSjmmv        -e empty atf-run
366ee44dd6cSjmmv}
367ee44dd6cSjmmv
368ee44dd6cSjmmvatf_test_case missing_results
369ee44dd6cSjmmvmissing_results_head()
370ee44dd6cSjmmv{
371ee44dd6cSjmmv    atf_set "descr" "Ensures that atf-run correctly handles test cases that " \
372ee44dd6cSjmmv                    "do not create the results file"
373ee44dd6cSjmmv}
374ee44dd6cSjmmvmissing_results_body()
375ee44dd6cSjmmv{
376ee44dd6cSjmmv    create_helper_stdin helper 1 <<EOF
377ee44dd6cSjmmvtest -f \${resfile} && echo "resfile found"
378ee44dd6cSjmmvexit 0
379ee44dd6cSjmmvEOF
380ee44dd6cSjmmv    chmod +x helper
381ee44dd6cSjmmv
382ee44dd6cSjmmv    create_atffile helper
383ee44dd6cSjmmv
384ee44dd6cSjmmv    re='^tc-end: [0-9][0-9]*\.[0-9]*, tc1,'
385ee44dd6cSjmmv    atf_check -s eq:1 \
386ee44dd6cSjmmv        -o match:"${re} failed,.*failed to create" \
387ee44dd6cSjmmv        -o not-match:'resfile found' \
388ee44dd6cSjmmv        -e empty atf-run
389ee44dd6cSjmmv}
390ee44dd6cSjmmv
391ee44dd6cSjmmvatf_test_case broken_results
392ee44dd6cSjmmvbroken_results_head()
393ee44dd6cSjmmv{
394ee44dd6cSjmmv    atf_set "descr" "Ensures that atf-run reports test programs that" \
395ee44dd6cSjmmv                    "provide a bogus results output as broken programs"
396ee44dd6cSjmmv}
397ee44dd6cSjmmvbroken_results_body()
398ee44dd6cSjmmv{
399ee44dd6cSjmmv    # We produce two errors from the header to ensure that the parse
400ee44dd6cSjmmv    # errors are printed on a single line on the output file.  Printing
401ee44dd6cSjmmv    # them on separate lines would be incorrect.
402ee44dd6cSjmmv    create_helper_stdin helper 1 <<EOF
403ee44dd6cSjmmvecho 'line 1' >\${resfile}
404ee44dd6cSjmmvecho 'line 2' >>\${resfile}
405ee44dd6cSjmmvexit 0
406ee44dd6cSjmmvEOF
407ee44dd6cSjmmv    chmod +x helper
408ee44dd6cSjmmv
409ee44dd6cSjmmv    create_atffile helper
410ee44dd6cSjmmv
411ee44dd6cSjmmv    re='^tc-end: [0-9][0-9]*\.[0-9]*, tc1,'
412ee44dd6cSjmmv    atf_check -s eq:1 -o match:"${re} .*line 1.*line 2" -e empty atf-run
413ee44dd6cSjmmv}
414ee44dd6cSjmmv
415ee44dd6cSjmmvatf_test_case broken_tp_list
416ee44dd6cSjmmvbroken_tp_list_head()
417ee44dd6cSjmmv{
418ee44dd6cSjmmv    atf_set "descr" "Ensures that atf-run reports test programs that" \
419ee44dd6cSjmmv                    "provide a bogus test case list"
420ee44dd6cSjmmv}
421ee44dd6cSjmmvbroken_tp_list_body()
422ee44dd6cSjmmv{
423ee44dd6cSjmmv    cat >helper <<EOF
424ee44dd6cSjmmv#! $(atf-config -t atf_shell)
425ee44dd6cSjmmvwhile [ \${#} -gt 0 ]; do
426ee44dd6cSjmmv    if [ \${1} = -l ]; then
427ee44dd6cSjmmv        echo 'Content-Type: application/X-atf-tp; version="1"'
428ee44dd6cSjmmv        echo
429ee44dd6cSjmmv        echo 'foo: bar'
430ee44dd6cSjmmv        exit 0
431ee44dd6cSjmmv    else
432ee44dd6cSjmmv        shift
433ee44dd6cSjmmv    fi
434ee44dd6cSjmmvdone
435ee44dd6cSjmmvexit 0
436ee44dd6cSjmmvEOF
437ee44dd6cSjmmv    chmod +x helper
438ee44dd6cSjmmv
439ee44dd6cSjmmv    create_atffile helper
440ee44dd6cSjmmv
441ee44dd6cSjmmv    re='^tp-end: [0-9][0-9]*\.[0-9]*, helper,'
442ee44dd6cSjmmv    re="${re} Invalid format for test case list:.*First property.*ident"
443ee44dd6cSjmmv    atf_check -s eq:1 -o match:"${re}" -e empty atf-run
444ee44dd6cSjmmv}
445ee44dd6cSjmmv
446ee44dd6cSjmmvatf_test_case zero_tcs
447ee44dd6cSjmmvzero_tcs_head()
448ee44dd6cSjmmv{
449ee44dd6cSjmmv    atf_set "descr" "Ensures that atf-run reports test programs without" \
450ee44dd6cSjmmv                    "test cases as errors"
451ee44dd6cSjmmv}
452ee44dd6cSjmmvzero_tcs_body()
453ee44dd6cSjmmv{
454ee44dd6cSjmmv    create_helper_stdin helper 0 <<EOF
455ee44dd6cSjmmvecho 'Content-Type: application/X-atf-tp; version="1"'
456ee44dd6cSjmmvecho
457ee44dd6cSjmmvexit 1
458ee44dd6cSjmmvEOF
459ee44dd6cSjmmv    chmod +x helper
460ee44dd6cSjmmv
461ee44dd6cSjmmv    create_atffile helper
462ee44dd6cSjmmv
463ee44dd6cSjmmv    re='^tp-end: [0-9][0-9]*\.[0-9]*, helper,'
464ee44dd6cSjmmv    atf_check -s eq:1 \
465ee44dd6cSjmmv        -o match:"${re} .*Invalid format for test case list" \
466ee44dd6cSjmmv        -e empty atf-run
467ee44dd6cSjmmv}
468ee44dd6cSjmmv
469ee44dd6cSjmmvatf_test_case exit_codes
470ee44dd6cSjmmvexit_codes_head()
471ee44dd6cSjmmv{
472ee44dd6cSjmmv    atf_set "descr" "Ensures that atf-run reports bogus exit codes for" \
473ee44dd6cSjmmv                    "programs correctly"
474ee44dd6cSjmmv}
475ee44dd6cSjmmvexit_codes_body()
476ee44dd6cSjmmv{
477ee44dd6cSjmmv    create_helper_stdin helper 1 <<EOF
478ee44dd6cSjmmvecho "failed: Yes, it failed" >\${resfile}
479ee44dd6cSjmmvexit 0
480ee44dd6cSjmmvEOF
481ee44dd6cSjmmv    chmod +x helper
482ee44dd6cSjmmv
483ee44dd6cSjmmv    create_atffile helper
484ee44dd6cSjmmv
485ee44dd6cSjmmv    re='^tc-end: [0-9][0-9]*\.[0-9]*, tc1,'
486ee44dd6cSjmmv    atf_check -s eq:1 \
487ee44dd6cSjmmv        -o match:"${re} .*exited successfully.*reported failure" \
488ee44dd6cSjmmv        -e empty atf-run
489ee44dd6cSjmmv}
490ee44dd6cSjmmv
491ee44dd6cSjmmvatf_test_case signaled
492ee44dd6cSjmmvsignaled_head()
493ee44dd6cSjmmv{
494ee44dd6cSjmmv    atf_set "descr" "Ensures that atf-run reports test program's crashes" \
495ee44dd6cSjmmv                    "correctly regardless of their actual results"
496ee44dd6cSjmmv}
497ee44dd6cSjmmvsignaled_body()
498ee44dd6cSjmmv{
499ee44dd6cSjmmv    create_helper_stdin helper 2 <<EOF
500ee44dd6cSjmmvecho "passed" >\${resfile}
501ee44dd6cSjmmvcase \${testcase} in
502ee44dd6cSjmmv    tc1) ;;
503ee44dd6cSjmmv    tc2) echo "Killing myself!" ; kill -9 \$\$ ;;
504ee44dd6cSjmmvesac
505ee44dd6cSjmmvEOF
506ee44dd6cSjmmv    chmod +x helper
507ee44dd6cSjmmv
508ee44dd6cSjmmv    create_atffile helper
509ee44dd6cSjmmv
510ee44dd6cSjmmv    re='^tc-end: [0-9][0-9]*\.[0-9]*, tc2,'
511ee44dd6cSjmmv    atf_check -s eq:1 -o match:"${re} .*received signal 9" \
512ee44dd6cSjmmv        -e empty atf-run
513ee44dd6cSjmmv}
514ee44dd6cSjmmv
515ee44dd6cSjmmvatf_test_case hooks
516ee44dd6cSjmmvhooks_head()
517ee44dd6cSjmmv{
518ee44dd6cSjmmv    atf_set "descr" "Checks that the default hooks work and that they" \
519ee44dd6cSjmmv                    "can be overriden by the user"
520ee44dd6cSjmmv}
521ee44dd6cSjmmvhooks_body()
522ee44dd6cSjmmv{
523ee44dd6cSjmmv    cp $(atf_get_srcdir)/pass_helper helper
524ee44dd6cSjmmv    create_atffile helper
525ee44dd6cSjmmv
526ee44dd6cSjmmv    mkdir atf
527ee44dd6cSjmmv    mkdir .atf
528ee44dd6cSjmmv
529ee44dd6cSjmmv    echo "Checking default hooks"
530ee44dd6cSjmmv    atf_check -s eq:0 -o match:'^info: time.start, ' \
531ee44dd6cSjmmv        -o match:'^info: time.end, ' -e empty -x \
532ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/atf atf-run"
533ee44dd6cSjmmv
534ee44dd6cSjmmv    echo "Checking the system-wide info_start hook"
535ee44dd6cSjmmv    cat >atf/atf-run.hooks <<EOF
536ee44dd6cSjmmvinfo_start_hook()
537ee44dd6cSjmmv{
538ee44dd6cSjmmv    atf_tps_writer_info "test" "sw value"
539ee44dd6cSjmmv}
540ee44dd6cSjmmvEOF
541ee44dd6cSjmmv    atf_check -s eq:0 \
542ee44dd6cSjmmv        -o match:'^info: test, sw value' \
543ee44dd6cSjmmv        -o not-match:'^info: time.start, ' \
544ee44dd6cSjmmv        -o match:'^info: time.end, ' \
545ee44dd6cSjmmv        -e empty -x \
546ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/atf atf-run"
547ee44dd6cSjmmv
548ee44dd6cSjmmv    echo "Checking the user-specific info_start hook"
549ee44dd6cSjmmv    cat >.atf/atf-run.hooks <<EOF
550ee44dd6cSjmmvinfo_start_hook()
551ee44dd6cSjmmv{
552ee44dd6cSjmmv    atf_tps_writer_info "test" "user value"
553ee44dd6cSjmmv}
554ee44dd6cSjmmvEOF
555ee44dd6cSjmmv    atf_check -s eq:0 \
556ee44dd6cSjmmv        -o match:'^info: test, user value' \
557ee44dd6cSjmmv        -o not-match:'^info: time.start, ' \
558ee44dd6cSjmmv        -o match:'^info: time.end, ' \
559ee44dd6cSjmmv        -e empty -x \
560ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/atf atf-run"
561ee44dd6cSjmmv
562ee44dd6cSjmmv    rm atf/atf-run.hooks
563ee44dd6cSjmmv    rm .atf/atf-run.hooks
564ee44dd6cSjmmv
565ee44dd6cSjmmv    echo "Checking the system-wide info_end hook"
566ee44dd6cSjmmv    cat >atf/atf-run.hooks <<EOF
567ee44dd6cSjmmvinfo_end_hook()
568ee44dd6cSjmmv{
569ee44dd6cSjmmv    atf_tps_writer_info "test" "sw value"
570ee44dd6cSjmmv}
571ee44dd6cSjmmvEOF
572ee44dd6cSjmmv    atf_check -s eq:0 \
573ee44dd6cSjmmv        -o match:'^info: time.start, ' \
574ee44dd6cSjmmv        -o not-match:'^info: time.end, ' \
575ee44dd6cSjmmv        -o match:'^info: test, sw value' \
576ee44dd6cSjmmv        -e empty -x \
577ee44dd6cSjmmv        "ATF_CONFDIR=$(pwd)/atf atf-run"
578ee44dd6cSjmmv
579ee44dd6cSjmmv    echo "Checking the user-specific info_end hook"
580ee44dd6cSjmmv    cat >.atf/atf-run.hooks <<EOF
581ee44dd6cSjmmvinfo_end_hook()
582ee44dd6cSjmmv{
583ee44dd6cSjmmv    atf_tps_writer_info "test" "user value"
584ee44dd6cSjmmv}
585ee44dd6cSjmmvEOF
586ee44dd6cSjmmv    atf_check -s eq:0 \
587ee44dd6cSjmmv        -o match:'^info: time.start, ' \
588ee44dd6cSjmmv        -o not-match:'^info: time.end, ' \
589ee44dd6cSjmmv        -o match:'^info: test, user value' \
590ee44dd6cSjmmv        -e empty -x \
591ee44dd6cSjmmv         "ATF_CONFDIR=$(pwd)/atf atf-run"
592ee44dd6cSjmmv}
593ee44dd6cSjmmv
594ee44dd6cSjmmvatf_test_case isolation_env
595ee44dd6cSjmmvisolation_env_head()
596ee44dd6cSjmmv{
597ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run sets a set of environment variables" \
598ee44dd6cSjmmv                    "to known sane values"
599ee44dd6cSjmmv}
600ee44dd6cSjmmvisolation_env_body()
601ee44dd6cSjmmv{
602ee44dd6cSjmmv    undef_vars="LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY \
603ee44dd6cSjmmv                LC_NUMERIC LC_TIME"
604ee44dd6cSjmmv    def_vars="HOME TZ"
605ee44dd6cSjmmv
606ee44dd6cSjmmv    mangleenv="env"
607ee44dd6cSjmmv    for v in ${undef_vars} ${def_vars}; do
608ee44dd6cSjmmv        mangleenv="${mangleenv} ${v}=bogus-value"
609ee44dd6cSjmmv    done
610ee44dd6cSjmmv
611ee44dd6cSjmmv    create_helper env_list
612ee44dd6cSjmmv    create_atffile helper
613ee44dd6cSjmmv
614ee44dd6cSjmmv    # We must ignore stderr in this call (instead of specifying -e empty)
615ee44dd6cSjmmv    # because, when atf-run invokes the shell to run the hooks, we may get
616ee44dd6cSjmmv    # error messages about an invalid locale.  This happens, at least, when
617ee44dd6cSjmmv    # the shell is bash 4.x.
618ee44dd6cSjmmv    atf_check -s eq:0 -o save:stdout -e ignore ${mangleenv} atf-run helper
619ee44dd6cSjmmv
620ee44dd6cSjmmv    for v in ${undef_vars}; do
621ee44dd6cSjmmv        atf_check -s eq:1 -o empty -e empty grep "^tc-so:${v}=" stdout
622ee44dd6cSjmmv    done
623ee44dd6cSjmmv
624ee44dd6cSjmmv    for v in ${def_vars}; do
625ee44dd6cSjmmv        atf_check -s eq:0 -o ignore -e empty grep "^tc-so:${v}=" stdout
626ee44dd6cSjmmv    done
627ee44dd6cSjmmv
628ee44dd6cSjmmv    atf_check -s eq:0 -o ignore -e empty grep "^tc-so:TZ=UTC" stdout
629ee44dd6cSjmmv}
630ee44dd6cSjmmv
631ee44dd6cSjmmvatf_test_case isolation_home
632ee44dd6cSjmmvisolation_home_head()
633ee44dd6cSjmmv{
634ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run sets HOME to a sane and valid value"
635ee44dd6cSjmmv}
636ee44dd6cSjmmvisolation_home_body()
637ee44dd6cSjmmv{
638ee44dd6cSjmmv    create_helper env_home
639ee44dd6cSjmmv    create_atffile helper
640ee44dd6cSjmmv    atf_check -s eq:0 -o ignore -e ignore env HOME=foo atf-run helper
641ee44dd6cSjmmv}
642ee44dd6cSjmmv
643ee44dd6cSjmmvatf_test_case isolation_stdin
644ee44dd6cSjmmvisolation_stdin_head()
645ee44dd6cSjmmv{
646ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run nullifies the stdin of test cases"
647ee44dd6cSjmmv}
648ee44dd6cSjmmvisolation_stdin_body()
649ee44dd6cSjmmv{
650ee44dd6cSjmmv    create_helper read_stdin
651ee44dd6cSjmmv    create_atffile helper
652ee44dd6cSjmmv    atf_check -s eq:0 -o ignore -e ignore -x 'echo hello world | atf-run helper'
653ee44dd6cSjmmv}
654ee44dd6cSjmmv
655ee44dd6cSjmmvatf_test_case isolation_umask
656ee44dd6cSjmmvisolation_umask_head()
657ee44dd6cSjmmv{
658ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run sets the umask to a known value"
659ee44dd6cSjmmv}
660ee44dd6cSjmmvisolation_umask_body()
661ee44dd6cSjmmv{
662ee44dd6cSjmmv    create_helper umask
663ee44dd6cSjmmv    create_atffile helper
664ee44dd6cSjmmv
665ee44dd6cSjmmv    atf_check -s eq:0 -o match:'umask: 0022' -e ignore -x \
666ee44dd6cSjmmv        "umask 0000 && atf-run helper"
667ee44dd6cSjmmv}
668ee44dd6cSjmmv
669ee44dd6cSjmmvatf_test_case cleanup_pass
670ee44dd6cSjmmvcleanup_pass_head()
671ee44dd6cSjmmv{
672ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run calls the cleanup routine of the test" \
673ee44dd6cSjmmv        "case when the test case result is passed"
674ee44dd6cSjmmv}
675ee44dd6cSjmmvcleanup_pass_body()
676ee44dd6cSjmmv{
677ee44dd6cSjmmv    create_helper cleanup_states
678ee44dd6cSjmmv    create_atffile helper
679ee44dd6cSjmmv
680ee44dd6cSjmmv    atf_check -s eq:0 -o match:'cleanup_states, passed' -e ignore atf-run \
681ee44dd6cSjmmv        -v state=pass -v statedir=$(pwd) helper
682ee44dd6cSjmmv    test -f to-stay || atf_fail "Test case body did not run correctly"
683ee44dd6cSjmmv    if [ -f to-delete ]; then
684ee44dd6cSjmmv        atf_fail "Test case cleanup did not run correctly"
685ee44dd6cSjmmv    fi
686ee44dd6cSjmmv}
687ee44dd6cSjmmv
688ee44dd6cSjmmvatf_test_case cleanup_fail
689ee44dd6cSjmmvcleanup_fail_head()
690ee44dd6cSjmmv{
691ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run calls the cleanup routine of the test" \
692ee44dd6cSjmmv        "case when the test case result is failed"
693ee44dd6cSjmmv}
694ee44dd6cSjmmvcleanup_fail_body()
695ee44dd6cSjmmv{
696ee44dd6cSjmmv    create_helper cleanup_states
697ee44dd6cSjmmv    create_atffile helper
698ee44dd6cSjmmv
699ee44dd6cSjmmv    atf_check -s eq:1 -o match:'cleanup_states, failed' -e ignore atf-run \
700ee44dd6cSjmmv        -v state=fail -v statedir=$(pwd) helper
701ee44dd6cSjmmv    test -f to-stay || atf_fail "Test case body did not run correctly"
702ee44dd6cSjmmv    if [ -f to-delete ]; then
703ee44dd6cSjmmv        atf_fail "Test case cleanup did not run correctly"
704ee44dd6cSjmmv    fi
705ee44dd6cSjmmv}
706ee44dd6cSjmmv
707ee44dd6cSjmmvatf_test_case cleanup_skip
708ee44dd6cSjmmvcleanup_skip_head()
709ee44dd6cSjmmv{
710ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run calls the cleanup routine of the test" \
711ee44dd6cSjmmv        "case when the test case result is skipped"
712ee44dd6cSjmmv}
713ee44dd6cSjmmvcleanup_skip_body()
714ee44dd6cSjmmv{
715ee44dd6cSjmmv    create_helper cleanup_states
716ee44dd6cSjmmv    create_atffile helper
717ee44dd6cSjmmv
718ee44dd6cSjmmv    atf_check -s eq:0 -o match:'cleanup_states, skipped' -e ignore atf-run \
719ee44dd6cSjmmv        -v state=skip -v statedir=$(pwd) helper
720ee44dd6cSjmmv    test -f to-stay || atf_fail "Test case body did not run correctly"
721ee44dd6cSjmmv    if [ -f to-delete ]; then
722ee44dd6cSjmmv        atf_fail "Test case cleanup did not run correctly"
723ee44dd6cSjmmv    fi
724ee44dd6cSjmmv}
725ee44dd6cSjmmv
726ee44dd6cSjmmvatf_test_case cleanup_curdir
727ee44dd6cSjmmvcleanup_curdir_head()
728ee44dd6cSjmmv{
729ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run calls the cleanup routine in the same" \
730ee44dd6cSjmmv        "work directory as the body so that they can share data"
731ee44dd6cSjmmv}
732ee44dd6cSjmmvcleanup_curdir_body()
733ee44dd6cSjmmv{
734ee44dd6cSjmmv    create_helper cleanup_curdir
735ee44dd6cSjmmv    create_atffile helper
736ee44dd6cSjmmv
737ee44dd6cSjmmv    atf_check -s eq:0 -o match:'cleanup_curdir, passed' \
738ee44dd6cSjmmv        -o match:'Old value: 1234' -e ignore atf-run helper
739ee44dd6cSjmmv}
740ee44dd6cSjmmv
741ee44dd6cSjmmvatf_test_case cleanup_signal
742ee44dd6cSjmmvcleanup_signal_head()
743ee44dd6cSjmmv{
744ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run calls the cleanup routine if it gets" \
745ee44dd6cSjmmv        "a termination signal while running the body"
746ee44dd6cSjmmv}
747ee44dd6cSjmmvcleanup_signal_body()
748ee44dd6cSjmmv{
749ee44dd6cSjmmv    : # TODO: Write this.
750ee44dd6cSjmmv}
751ee44dd6cSjmmv
752ee44dd6cSjmmvatf_test_case cleanup_mount
753ee44dd6cSjmmvcleanup_mount_head()
754ee44dd6cSjmmv{
755ee44dd6cSjmmv    atf_set "descr" "Tests that the removal algorithm does not cross" \
756ee44dd6cSjmmv                    "mount points"
757ee44dd6cSjmmv    atf_set "require.user" "root"
758ee44dd6cSjmmv}
759ee44dd6cSjmmvcleanup_mount_body()
760ee44dd6cSjmmv{
761ee44dd6cSjmmv    ROOT="$(pwd)/root"; export ROOT
762ee44dd6cSjmmv
763ee44dd6cSjmmv    create_mount_helper helper <<EOF
764ee44dd6cSjmmvecho \$(pwd) >\${ROOT}
765ee44dd6cSjmmvmkdir foo
766ee44dd6cSjmmvmkdir foo/bar
767ee44dd6cSjmmvmkdir foo/bar/mnt
768ee44dd6cSjmmvdo_mount foo/bar/mnt
769ee44dd6cSjmmvmkdir foo/baz
770ee44dd6cSjmmvdo_mount foo/baz
771ee44dd6cSjmmvmkdir foo/baz/foo
772ee44dd6cSjmmvmkdir foo/baz/foo/bar
773ee44dd6cSjmmvdo_mount foo/baz/foo/bar
774ee44dd6cSjmmvEOF
775ee44dd6cSjmmv    create_atffile helper
776ee44dd6cSjmmv    chmod +x helper
777ee44dd6cSjmmv
778ee44dd6cSjmmv    platform=$(uname)
779ee44dd6cSjmmv    case ${platform} in
780ee44dd6cSjmmv    Linux|FreeBSD|NetBSD|SunOS)
781ee44dd6cSjmmv        ;;
782ee44dd6cSjmmv    *)
783ee44dd6cSjmmv        # XXX Possibly specify in meta-data too.
784ee44dd6cSjmmv        atf_skip "Test unimplemented in this platform (${platform})"
785ee44dd6cSjmmv        ;;
786ee44dd6cSjmmv    esac
787ee44dd6cSjmmv
788ee44dd6cSjmmv    atf_check -s eq:0 -o match:"main, passed" -e ignore atf-run helper
789ee44dd6cSjmmv    mount | grep $(cat root) && atf_fail "Some file systems remain mounted"
790ee44dd6cSjmmv    atf_check -s eq:1 -o empty -e empty test -d $(cat root)/foo
791ee44dd6cSjmmv}
792ee44dd6cSjmmv
793ee44dd6cSjmmvatf_test_case cleanup_symlink
794ee44dd6cSjmmvcleanup_symlink_head()
795ee44dd6cSjmmv{
796ee44dd6cSjmmv    atf_set "descr" "Tests that the removal algorithm does not follow" \
797ee44dd6cSjmmv                    "symlinks, which may live in another device and thus" \
798ee44dd6cSjmmv                    "be treated as mount points"
799ee44dd6cSjmmv    atf_set "require.user" "root"
800ee44dd6cSjmmv}
801ee44dd6cSjmmvcleanup_symlink_body()
802ee44dd6cSjmmv{
803ee44dd6cSjmmv    ROOT="$(pwd)/root"; export ROOT
804ee44dd6cSjmmv
805ee44dd6cSjmmv    create_mount_helper helper <<EOF
806ee44dd6cSjmmvecho \$(pwd) >\${ROOT}
807ee44dd6cSjmmvatf_check -s eq:0 -o empty -e empty mkdir foo
808ee44dd6cSjmmvatf_check -s eq:0 -o empty -e empty mkdir foo/bar
809ee44dd6cSjmmvdo_mount foo/bar
810ee44dd6cSjmmvatf_check -s eq:0 -o empty -e empty touch a
811ee44dd6cSjmmvatf_check -s eq:0 -o empty -e empty ln -s "\$(pwd)/a" foo/bar
812ee44dd6cSjmmvEOF
813ee44dd6cSjmmv    create_atffile helper
814ee44dd6cSjmmv    chmod +x helper
815ee44dd6cSjmmv
816ee44dd6cSjmmv    platform=$(uname)
817ee44dd6cSjmmv    case ${platform} in
818ee44dd6cSjmmv    Linux|FreeBSD|NetBSD|SunOS)
819ee44dd6cSjmmv        ;;
820ee44dd6cSjmmv    *)
821ee44dd6cSjmmv        # XXX Possibly specify in meta-data too.
822ee44dd6cSjmmv        atf_skip "Test unimplemented in this platform (${platform})"
823ee44dd6cSjmmv        ;;
824ee44dd6cSjmmv    esac
825ee44dd6cSjmmv
826ee44dd6cSjmmv    atf_check -s eq:0 -o match:"main, passed" -e ignore atf-run helper
827ee44dd6cSjmmv    mount | grep $(cat root) && atf_fail "Some file systems remain mounted"
828ee44dd6cSjmmv    atf_check -s eq:1 -o empty -e empty test -d $(cat root)/foo
829ee44dd6cSjmmv}
830ee44dd6cSjmmv
831ee44dd6cSjmmvatf_test_case require_arch
832ee44dd6cSjmmvrequire_arch_head()
833ee44dd6cSjmmv{
834ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.arch property"
835ee44dd6cSjmmv}
836ee44dd6cSjmmvrequire_arch_body()
837ee44dd6cSjmmv{
838ee44dd6cSjmmv    create_helper require_arch
839ee44dd6cSjmmv    create_atffile helper
840ee44dd6cSjmmv
841ee44dd6cSjmmv    echo "Checking for the real architecture"
842ee44dd6cSjmmv    arch=$(atf-config -t atf_arch)
843ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
844ee44dd6cSjmmv        -v arch="${arch}" helper
845ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
846ee44dd6cSjmmv        -v arch="foo ${arch}" helper
847ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
848ee44dd6cSjmmv        -v arch="${arch} foo" helper
849ee44dd6cSjmmv
850ee44dd6cSjmmv    echo "Checking for a fictitious architecture"
851ee44dd6cSjmmv    arch=fictitious
852ee44dd6cSjmmv    export ATF_ARCH=fictitious
853ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
854ee44dd6cSjmmv        -v arch="${arch}" helper
855ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
856ee44dd6cSjmmv        -v arch="foo ${arch}" helper
857ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
858ee44dd6cSjmmv        -v arch="${arch} foo" helper
859ee44dd6cSjmmv
860ee44dd6cSjmmv    echo "Triggering some failures"
861ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*foo.*architecture" \
862ee44dd6cSjmmv        -e ignore atf-run -v arch="foo" helper
863ee44dd6cSjmmv    atf_check -s eq:0 \
864ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*foo bar.*architectures" -e ignore \
865ee44dd6cSjmmv        atf-run -v arch="foo bar" helper
866ee44dd6cSjmmv    atf_check -s eq:0 \
867ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*fictitiousxxx.*architecture" \
868ee44dd6cSjmmv        -e ignore atf-run -v arch="${arch}xxx" helper
869ee44dd6cSjmmv}
870ee44dd6cSjmmv
871ee44dd6cSjmmvatf_test_case require_config
872ee44dd6cSjmmvrequire_config_head()
873ee44dd6cSjmmv{
874ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.config property"
875ee44dd6cSjmmv}
876ee44dd6cSjmmvrequire_config_body()
877ee44dd6cSjmmv{
878ee44dd6cSjmmv    create_helper require_config
879ee44dd6cSjmmv    create_atffile helper
880ee44dd6cSjmmv
881ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*var1.*not defined" \
882ee44dd6cSjmmv        -e ignore atf-run helper
883ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*var2.*not defined" \
884ee44dd6cSjmmv        -e ignore atf-run -v var1=foo helper
885ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
886ee44dd6cSjmmv        -v var1=a -v var2=' ' helper
887ee44dd6cSjmmv}
888ee44dd6cSjmmv
889ee44dd6cSjmmvatf_test_case require_files
890ee44dd6cSjmmvrequire_files_head()
891ee44dd6cSjmmv{
892ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.files property"
893ee44dd6cSjmmv}
894ee44dd6cSjmmvrequire_files_body()
895ee44dd6cSjmmv{
896ee44dd6cSjmmv    create_helper require_files
897ee44dd6cSjmmv    create_atffile helper
898ee44dd6cSjmmv
899ee44dd6cSjmmv    touch i-exist
900ee44dd6cSjmmv
901ee44dd6cSjmmv    echo "Checking absolute paths"
902ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
903ee44dd6cSjmmv        -v files='/bin/cp' helper
904ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
905ee44dd6cSjmmv        -v files="$(pwd)/i-exist" helper
906ee44dd6cSjmmv    atf_check -s eq:0 \
907ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*/dont-exist" \
908ee44dd6cSjmmv        -e ignore atf-run -v files="$(pwd)/i-exist $(pwd)/dont-exist" helper
909ee44dd6cSjmmv
910ee44dd6cSjmmv    echo "Checking that relative paths are not allowed"
911ee44dd6cSjmmv    atf_check -s eq:1 \
912ee44dd6cSjmmv        -o match:"${TESTCASE}, failed, Relative paths.*not allowed.*hello" \
913ee44dd6cSjmmv        -e ignore atf-run -v files='hello' helper
914ee44dd6cSjmmv    atf_check -s eq:1 \
915ee44dd6cSjmmv        -o match:"${TESTCASE}, failed, Relative paths.*not allowed.*a/b" \
916ee44dd6cSjmmv        -e ignore atf-run -v files='a/b' helper
917ee44dd6cSjmmv}
918ee44dd6cSjmmv
919ee44dd6cSjmmvatf_test_case require_machine
920ee44dd6cSjmmvrequire_machine_head()
921ee44dd6cSjmmv{
922ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.machine property"
923ee44dd6cSjmmv}
924ee44dd6cSjmmvrequire_machine_body()
925ee44dd6cSjmmv{
926ee44dd6cSjmmv    create_helper require_machine
927ee44dd6cSjmmv    create_atffile helper
928ee44dd6cSjmmv
929ee44dd6cSjmmv    echo "Checking for the real machine type"
930ee44dd6cSjmmv    machine=$(atf-config -t atf_machine)
931ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
932ee44dd6cSjmmv        -v machine="${machine}" helper
933ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
934ee44dd6cSjmmv        -v machine="foo ${machine}" helper
935ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
936ee44dd6cSjmmv        -v machine="${machine} foo" helper
937ee44dd6cSjmmv
938ee44dd6cSjmmv    echo "Checking for a fictitious machine type"
939ee44dd6cSjmmv    machine=fictitious
940ee44dd6cSjmmv    export ATF_MACHINE=fictitious
941ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
942ee44dd6cSjmmv        -v machine="${machine}" helper
943ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
944ee44dd6cSjmmv        -v machine="foo ${machine}" helper
945ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
946ee44dd6cSjmmv        -v machine="${machine} foo" helper
947ee44dd6cSjmmv
948ee44dd6cSjmmv    echo "Triggering some failures"
949ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*foo.*machine type" \
950ee44dd6cSjmmv        -e ignore atf-run -v machine="foo" helper
951ee44dd6cSjmmv    atf_check -s eq:0 \
952ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*foo bar.*machine types" -e ignore \
953ee44dd6cSjmmv        atf-run -v machine="foo bar" helper
954ee44dd6cSjmmv    atf_check -s eq:0 \
955ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*fictitiousxxx.*machine type" \
956ee44dd6cSjmmv        -e ignore atf-run -v machine="${machine}xxx" helper
957ee44dd6cSjmmv}
958ee44dd6cSjmmv
959ee44dd6cSjmmvatf_test_case require_progs
960ee44dd6cSjmmvrequire_progs_head()
961ee44dd6cSjmmv{
962ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.progs property"
963ee44dd6cSjmmv}
964ee44dd6cSjmmvrequire_progs_body()
965ee44dd6cSjmmv{
966ee44dd6cSjmmv    create_helper require_progs
967ee44dd6cSjmmv    create_atffile helper
968ee44dd6cSjmmv
969ee44dd6cSjmmv    echo "Checking absolute paths"
970ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
971ee44dd6cSjmmv        -v progs='/bin/cp' helper
972ee44dd6cSjmmv    atf_check -s eq:0 \
973ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*/bin/__non-existent__.*PATH" \
974ee44dd6cSjmmv        -e ignore atf-run -v progs='/bin/__non-existent__' helper
975ee44dd6cSjmmv
976ee44dd6cSjmmv    echo "Checking that relative paths are not allowed"
977ee44dd6cSjmmv    atf_check -s eq:1 \
978ee44dd6cSjmmv        -o match:"${TESTCASE}, failed, Relative paths.*not allowed.*bin/cp" \
979ee44dd6cSjmmv        -e ignore atf-run -v progs='bin/cp' helper
980ee44dd6cSjmmv
981ee44dd6cSjmmv    echo "Check plain file names, searching them in the PATH."
982ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
983ee44dd6cSjmmv        -v progs='cp' helper
984ee44dd6cSjmmv    atf_check -s eq:0 \
985ee44dd6cSjmmv        -o match:"${TESTCASE}, skipped, .*__non-existent__.*PATH" -e ignore \
986ee44dd6cSjmmv        atf-run -v progs='__non-existent__' helper
987ee44dd6cSjmmv}
988ee44dd6cSjmmv
989ee44dd6cSjmmvatf_test_case require_user_root
990ee44dd6cSjmmvrequire_user_root_head()
991ee44dd6cSjmmv{
992ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.user property" \
993ee44dd6cSjmmv        "when it is set to 'root'"
994ee44dd6cSjmmv}
995ee44dd6cSjmmvrequire_user_root_body()
996ee44dd6cSjmmv{
997ee44dd6cSjmmv    create_helper require_user
998ee44dd6cSjmmv    create_atffile helper
999ee44dd6cSjmmv
1000ee44dd6cSjmmv    if [ $(id -u) -eq 0 ]; then
1001ee44dd6cSjmmv        exp=passed
1002ee44dd6cSjmmv    else
1003ee44dd6cSjmmv        exp=skipped
1004ee44dd6cSjmmv    fi
1005ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, ${exp}" -e ignore atf-run \
1006ee44dd6cSjmmv        -v user=root helper
1007ee44dd6cSjmmv}
1008ee44dd6cSjmmv
1009ee44dd6cSjmmvatf_test_case require_user_unprivileged
1010ee44dd6cSjmmvrequire_user_unprivileged_head()
1011ee44dd6cSjmmv{
1012ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.user property" \
1013ee44dd6cSjmmv        "when it is set to 'root'"
1014ee44dd6cSjmmv}
1015ee44dd6cSjmmvrequire_user_unprivileged_body()
1016ee44dd6cSjmmv{
1017ee44dd6cSjmmv    create_helper require_user
1018ee44dd6cSjmmv    create_atffile helper
1019ee44dd6cSjmmv
1020ee44dd6cSjmmv    if [ $(id -u) -eq 0 ]; then
1021ee44dd6cSjmmv        exp=skipped
1022ee44dd6cSjmmv    else
1023ee44dd6cSjmmv        exp=passed
1024ee44dd6cSjmmv    fi
1025ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, ${exp}" -e ignore atf-run \
1026ee44dd6cSjmmv        -v user=unprivileged helper
1027ee44dd6cSjmmv}
1028ee44dd6cSjmmv
1029ee44dd6cSjmmvatf_test_case require_user_bad
1030ee44dd6cSjmmvrequire_user_bad_head()
1031ee44dd6cSjmmv{
1032ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run validates the require.user property" \
1033ee44dd6cSjmmv        "when it is set to 'root'"
1034ee44dd6cSjmmv}
1035ee44dd6cSjmmvrequire_user_bad_body()
1036ee44dd6cSjmmv{
1037ee44dd6cSjmmv    create_helper require_user
1038ee44dd6cSjmmv    create_atffile helper
1039ee44dd6cSjmmv
1040ee44dd6cSjmmv    atf_check -s eq:1 -o match:"${TESTCASE}, failed, Invalid value.*foobar" \
1041ee44dd6cSjmmv        -e ignore atf-run -v user=foobar helper
1042ee44dd6cSjmmv}
1043ee44dd6cSjmmv
1044ee44dd6cSjmmvatf_test_case timeout
1045ee44dd6cSjmmvtimeout_head()
1046ee44dd6cSjmmv{
1047ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run kills a test case that times out"
1048ee44dd6cSjmmv}
1049ee44dd6cSjmmvtimeout_body()
1050ee44dd6cSjmmv{
1051ee44dd6cSjmmv    create_helper timeout
1052ee44dd6cSjmmv    create_atffile helper
1053ee44dd6cSjmmv
1054ee44dd6cSjmmv    atf_check -s eq:1 \
1055ee44dd6cSjmmv        -o match:"${TESTCASE}, failed, .*timed out after 1 second" -e ignore \
1056ee44dd6cSjmmv        atf-run -v statedir=$(pwd) helper
1057ee44dd6cSjmmv    if [ -f finished ]; then
1058ee44dd6cSjmmv        atf_fail "Test case was not killed after time out"
1059ee44dd6cSjmmv    fi
1060ee44dd6cSjmmv}
1061ee44dd6cSjmmv
1062ee44dd6cSjmmvatf_test_case timeout_forkexit
1063ee44dd6cSjmmvtimeout_forkexit_head()
1064ee44dd6cSjmmv{
1065ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run deals gracefully with a test program" \
1066ee44dd6cSjmmv        "that forks, exits, but the child process hangs"
1067ee44dd6cSjmmv}
1068ee44dd6cSjmmvtimeout_forkexit_body()
1069ee44dd6cSjmmv{
1070ee44dd6cSjmmv    create_helper timeout_forkexit
1071ee44dd6cSjmmv    create_atffile helper
1072ee44dd6cSjmmv
1073ee44dd6cSjmmv    atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \
1074ee44dd6cSjmmv        -v statedir=$(pwd) helper
1075ee44dd6cSjmmv    test -f parent-finished || atf_fail "Parent did not exit as expected"
1076ee44dd6cSjmmv    test -f child-finished && atf_fail "Subprocess exited but it should have" \
1077ee44dd6cSjmmv        "been forcibly terminated" || true
1078ee44dd6cSjmmv}
1079ee44dd6cSjmmv
1080ee44dd6cSjmmvatf_test_case ignore_deprecated_use_fs
1081ee44dd6cSjmmvignore_deprecated_use_fs_head()
1082ee44dd6cSjmmv{
1083ee44dd6cSjmmv    atf_set "descr" "Tests that atf-run ignores the deprecated use.fs property"
1084ee44dd6cSjmmv}
1085ee44dd6cSjmmvignore_deprecated_use_fs_body()
1086ee44dd6cSjmmv{
1087ee44dd6cSjmmv    create_helper use_fs
1088ee44dd6cSjmmv    create_atffile helper
1089ee44dd6cSjmmv
1090ee44dd6cSjmmv    atf_check -s eq:0 -o ignore -e ignore atf-run helper
1091ee44dd6cSjmmv}
1092ee44dd6cSjmmv
1093ee44dd6cSjmmvatf_init_test_cases()
1094ee44dd6cSjmmv{
1095ee44dd6cSjmmv    atf_add_test_case no_warnings
1096ee44dd6cSjmmv    atf_add_test_case config
1097ee44dd6cSjmmv    atf_add_test_case vflag
1098ee44dd6cSjmmv    atf_add_test_case atffile
1099ee44dd6cSjmmv    atf_add_test_case atffile_recursive
1100ee44dd6cSjmmv    atf_add_test_case expect
1101ee44dd6cSjmmv    atf_add_test_case fds
1102ee44dd6cSjmmv    atf_add_test_case mux_streams
1103ee44dd6cSjmmv    atf_add_test_case missing_results
1104ee44dd6cSjmmv    atf_add_test_case broken_results
1105ee44dd6cSjmmv    atf_add_test_case broken_tp_list
1106ee44dd6cSjmmv    atf_add_test_case zero_tcs
1107ee44dd6cSjmmv    atf_add_test_case exit_codes
1108ee44dd6cSjmmv    atf_add_test_case signaled
1109ee44dd6cSjmmv    atf_add_test_case hooks
1110ee44dd6cSjmmv    atf_add_test_case isolation_env
1111ee44dd6cSjmmv    atf_add_test_case isolation_home
1112ee44dd6cSjmmv    atf_add_test_case isolation_stdin
1113ee44dd6cSjmmv    atf_add_test_case isolation_umask
1114ee44dd6cSjmmv    atf_add_test_case cleanup_pass
1115ee44dd6cSjmmv    atf_add_test_case cleanup_fail
1116ee44dd6cSjmmv    atf_add_test_case cleanup_skip
1117ee44dd6cSjmmv    atf_add_test_case cleanup_curdir
1118ee44dd6cSjmmv    atf_add_test_case cleanup_signal
1119ee44dd6cSjmmv    atf_add_test_case cleanup_mount
1120ee44dd6cSjmmv    atf_add_test_case cleanup_symlink
1121ee44dd6cSjmmv    atf_add_test_case require_arch
1122ee44dd6cSjmmv    atf_add_test_case require_config
1123ee44dd6cSjmmv    atf_add_test_case require_files
1124ee44dd6cSjmmv    atf_add_test_case require_machine
1125ee44dd6cSjmmv    atf_add_test_case require_progs
1126ee44dd6cSjmmv    atf_add_test_case require_user_root
1127ee44dd6cSjmmv    atf_add_test_case require_user_unprivileged
1128ee44dd6cSjmmv    atf_add_test_case require_user_bad
1129ee44dd6cSjmmv    atf_add_test_case timeout
1130ee44dd6cSjmmv    atf_add_test_case timeout_forkexit
1131ee44dd6cSjmmv    atf_add_test_case ignore_deprecated_use_fs
1132ee44dd6cSjmmv}
1133ee44dd6cSjmmv
1134ee44dd6cSjmmv# vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4
1135