1c7d813a9SEnji Cooper# 2*da5069e1SEnji Cooper# Copyright (c) 2017 Enji Cooper <ngie@FreeBSD.org> 3c7d813a9SEnji Cooper# 4c7d813a9SEnji Cooper# Redistribution and use in source and binary forms, with or without 5c7d813a9SEnji Cooper# modification, are permitted provided that the following conditions 6c7d813a9SEnji Cooper# are met: 7c7d813a9SEnji Cooper# 1. Redistributions of source code must retain the above copyright 8c7d813a9SEnji Cooper# notice, this list of conditions and the following disclaimer. 9c7d813a9SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 10c7d813a9SEnji Cooper# notice, this list of conditions and the following disclaimer in the 11c7d813a9SEnji Cooper# documentation and/or other materials provided with the distribution. 12c7d813a9SEnji Cooper# 13c7d813a9SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 14c7d813a9SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 15c7d813a9SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16c7d813a9SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 17c7d813a9SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18c7d813a9SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19c7d813a9SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20c7d813a9SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21c7d813a9SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22c7d813a9SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 23c7d813a9SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 24c7d813a9SEnji Cooper# 25c7d813a9SEnji Cooper# $FreeBSD$ 26c7d813a9SEnji Cooper# 27c7d813a9SEnji Cooper 28c7d813a9SEnji CooperMAX_TRIES=20 29c7d813a9SEnji CooperPROG_PID= 30c7d813a9SEnji CooperPROG_PATH=$(atf_get_srcdir)/while1 31c7d813a9SEnji Cooper 32c7d813a9SEnji CooperSP='[[:space:]]' 33c7d813a9SEnji Cooper 34c7d813a9SEnji Cooperstart_program() 35c7d813a9SEnji Cooper{ 36c7d813a9SEnji Cooper echo "Starting program in background" 37c7d813a9SEnji Cooper PROG_COMM=while1 38c7d813a9SEnji Cooper PROG_PATH=$(atf_get_srcdir)/$PROG_COMM 39c7d813a9SEnji Cooper 40c7d813a9SEnji Cooper $PROG_PATH $* & 41c7d813a9SEnji Cooper PROG_PID=$! 42c7d813a9SEnji Cooper try=0 43c7d813a9SEnji Cooper while [ $try -lt $MAX_TRIES ] && ! kill -0 $PROG_PID; do 44c7d813a9SEnji Cooper sleep 0.5 45c7d813a9SEnji Cooper : $(( try += 1 )) 46c7d813a9SEnji Cooper done 47c7d813a9SEnji Cooper if [ $try -ge $MAX_TRIES ]; then 48c7d813a9SEnji Cooper atf_fail "Polled for program start $MAX_TRIES tries and failed" 49c7d813a9SEnji Cooper fi 50c7d813a9SEnji Cooper} 51c7d813a9SEnji Cooper 52c7d813a9SEnji Cooperatf_test_case binary_info 53c7d813a9SEnji Cooperbinary_info_head() 54c7d813a9SEnji Cooper{ 55c7d813a9SEnji Cooper atf_set "descr" "Checks -b support" 56c7d813a9SEnji Cooper} 57c7d813a9SEnji Cooperbinary_info_body() 58c7d813a9SEnji Cooper{ 59c7d813a9SEnji Cooper start_program bogus-arg 60c7d813a9SEnji Cooper 61c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP+%s$SP*" 62c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "OSREL" "PATH") 63c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID $PROG_COMM "[[:digit:]]+" "$PROG_PATH") 64c7d813a9SEnji Cooper 652a243b95SBrooks Davis atf_check -o save:procstat.out procstat binary $PROG_PID 662a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 672a243b95SBrooks Davis atf_check -o match:"$line_re" tail -n 1 procstat.out 68c7d813a9SEnji Cooper 692a243b95SBrooks Davis atf_check -o save:procstat.out procstat -b $PROG_PID 70c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 71c7d813a9SEnji Cooper atf_check -o match:"$line_re" tail -n 1 procstat.out 72c7d813a9SEnji Cooper} 73c7d813a9SEnji Cooper 74c7d813a9SEnji Cooperatf_test_case command_line_arguments 75c7d813a9SEnji Coopercommand_line_arguments_head() 76c7d813a9SEnji Cooper{ 77c7d813a9SEnji Cooper atf_set "descr" "Checks -c support" 78c7d813a9SEnji Cooper} 79c7d813a9SEnji Coopercommand_line_arguments_body() 80c7d813a9SEnji Cooper{ 81037479ffSLi-Wen Hsu atf_skip "https://bugs.freebsd.org/233587" 82037479ffSLi-Wen Hsu 83c7d813a9SEnji Cooper arguments="my arguments" 84c7d813a9SEnji Cooper 85c7d813a9SEnji Cooper start_program $arguments 86c7d813a9SEnji Cooper 87c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP*" 88c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "ARGS") 89c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID "$PROG_COMM" "$PROG_PATH $arguments") 90c7d813a9SEnji Cooper 912a243b95SBrooks Davis atf_check -o save:procstat.out procstat arguments $PROG_PID 922a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 932a243b95SBrooks Davis atf_check -o match:"$line_re" tail -n 1 procstat.out 942a243b95SBrooks Davis 95c7d813a9SEnji Cooper atf_check -o save:procstat.out procstat -c $PROG_PID 96c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 97c7d813a9SEnji Cooper atf_check -o match:"$line_re" tail -n 1 procstat.out 98c7d813a9SEnji Cooper} 99c7d813a9SEnji Cooper 100c7d813a9SEnji Cooperatf_test_case environment 101c7d813a9SEnji Cooperenvironment_head() 102c7d813a9SEnji Cooper{ 103c7d813a9SEnji Cooper atf_set "descr" "Checks -e support" 104c7d813a9SEnji Cooper} 105c7d813a9SEnji Cooperenvironment_body() 106c7d813a9SEnji Cooper{ 107037479ffSLi-Wen Hsu atf_skip "https://bugs.freebsd.org/233588" 108037479ffSLi-Wen Hsu 109c7d813a9SEnji Cooper var="MY_VARIABLE=foo" 110c7d813a9SEnji Cooper eval "export $var" 111c7d813a9SEnji Cooper 112c7d813a9SEnji Cooper start_program my arguments 113c7d813a9SEnji Cooper 114c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP*" 115c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "ENVIRONMENT") 116c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID $PROG_COMM ".*$var.*") 117c7d813a9SEnji Cooper 1182a243b95SBrooks Davis atf_check -o save:procstat.out procstat environment $PROG_PID 1192a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 1202a243b95SBrooks Davis atf_check -o match:"$line_re" tail -n 1 procstat.out 121c7d813a9SEnji Cooper 1222a243b95SBrooks Davis atf_check -o save:procstat.out procstat -e $PROG_PID 123c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 124c7d813a9SEnji Cooper atf_check -o match:"$line_re" tail -n 1 procstat.out 125c7d813a9SEnji Cooper} 126c7d813a9SEnji Cooper 127c7d813a9SEnji Cooperatf_test_case file_descriptor 128c7d813a9SEnji Cooperfile_descriptor_head() 129c7d813a9SEnji Cooper{ 130c7d813a9SEnji Cooper atf_set "descr" "Checks -f support" 131c7d813a9SEnji Cooper} 132c7d813a9SEnji Cooperfile_descriptor_body() 133c7d813a9SEnji Cooper{ 134c7d813a9SEnji Cooper start_program my arguments 135c7d813a9SEnji Cooper 136c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP%s$SP*" 137c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "FD" "T" "V" "FLAGS" "REF" "OFFSET" "PRO" "NAME") 138c7d813a9SEnji Cooper # XXX: write a more sensible feature test 139c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID $PROG_COMM ".+" ".+" ".+" ".+" ".+" ".+" ".+" ".+") 140c7d813a9SEnji Cooper 1412a243b95SBrooks Davis atf_check -o save:procstat.out procstat files $PROG_PID 1422a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 1432a243b95SBrooks Davis atf_check -o match:"$line_re" awk 'NR > 1' procstat.out 144c7d813a9SEnji Cooper 1452a243b95SBrooks Davis atf_check -o save:procstat.out procstat -f $PROG_PID 146c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 147c7d813a9SEnji Cooper atf_check -o match:"$line_re" awk 'NR > 1' procstat.out 148c7d813a9SEnji Cooper} 149c7d813a9SEnji Cooper 1500dbdecfdSMark Johnstonatf_test_case kernel_stacks 1510dbdecfdSMark Johnstonkernel_stacks_head() 1520dbdecfdSMark Johnston{ 1530dbdecfdSMark Johnston atf_set "descr" "Captures kernel stacks for all visible threads" 1540dbdecfdSMark Johnston} 1550dbdecfdSMark Johnstonkernel_stacks_body() 1560dbdecfdSMark Johnston{ 1570dbdecfdSMark Johnston atf_check -o save:procstat.out procstat -a kstack 1580dbdecfdSMark Johnston atf_check -o not-empty awk '{if ($3 == "procstat") print}' procstat.out 1590dbdecfdSMark Johnston 1600dbdecfdSMark Johnston atf_check -o save:procstat.out procstat -kka 1610dbdecfdSMark Johnston atf_check -o not-empty awk '{if ($3 == "procstat") print}' procstat.out 1620dbdecfdSMark Johnston} 1630dbdecfdSMark Johnston 164c7d813a9SEnji Cooperatf_init_test_cases() 165c7d813a9SEnji Cooper{ 166c7d813a9SEnji Cooper atf_add_test_case binary_info 167c7d813a9SEnji Cooper atf_add_test_case command_line_arguments 168c7d813a9SEnji Cooper atf_add_test_case environment 169c7d813a9SEnji Cooper atf_add_test_case file_descriptor 1700dbdecfdSMark Johnston atf_add_test_case kernel_stacks 171c7d813a9SEnji Cooper} 172