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