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