1c7d813a9SEnji Cooper# 2da5069e1SEnji 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# 26c7d813a9SEnji Cooper 27c7d813a9SEnji CooperPROG_PID= 28c7d813a9SEnji CooperPROG_PATH=$(atf_get_srcdir)/while1 29c7d813a9SEnji Cooper 30c7d813a9SEnji CooperSP='[[:space:]]' 31c7d813a9SEnji Cooper 32c7d813a9SEnji Cooperstart_program() 33c7d813a9SEnji Cooper{ 34c7d813a9SEnji Cooper echo "Starting program in background" 35c7d813a9SEnji Cooper PROG_COMM=while1 36c7d813a9SEnji Cooper PROG_PATH=$(atf_get_srcdir)/$PROG_COMM 37c7d813a9SEnji Cooper 38*ddc0daeaSJilles Tjoelker mkfifo wait_for_start || atf_fail "mkfifo" 39*ddc0daeaSJilles Tjoelker $PROG_PATH $* >wait_for_start & 40c7d813a9SEnji Cooper PROG_PID=$! 41*ddc0daeaSJilles Tjoelker if ! read dummy <wait_for_start; then 42*ddc0daeaSJilles Tjoelker atf_fail "Program did not start properly" 43c7d813a9SEnji Cooper fi 44*ddc0daeaSJilles Tjoelker rm wait_for_start 45c7d813a9SEnji Cooper} 46c7d813a9SEnji Cooper 47c7d813a9SEnji Cooperatf_test_case binary_info 48c7d813a9SEnji Cooperbinary_info_head() 49c7d813a9SEnji Cooper{ 50c7d813a9SEnji Cooper atf_set "descr" "Checks -b support" 51c7d813a9SEnji Cooper} 52c7d813a9SEnji Cooperbinary_info_body() 53c7d813a9SEnji Cooper{ 54c7d813a9SEnji Cooper start_program bogus-arg 55c7d813a9SEnji Cooper 56c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP+%s$SP*" 57c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "OSREL" "PATH") 58c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID $PROG_COMM "[[:digit:]]+" "$PROG_PATH") 59c7d813a9SEnji Cooper 602a243b95SBrooks Davis atf_check -o save:procstat.out procstat binary $PROG_PID 612a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 622a243b95SBrooks Davis atf_check -o match:"$line_re" tail -n 1 procstat.out 63c7d813a9SEnji Cooper 642a243b95SBrooks Davis atf_check -o save:procstat.out procstat -b $PROG_PID 65c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 66c7d813a9SEnji Cooper atf_check -o match:"$line_re" tail -n 1 procstat.out 67c7d813a9SEnji Cooper} 68c7d813a9SEnji Cooper 69c7d813a9SEnji Cooperatf_test_case command_line_arguments 70c7d813a9SEnji Coopercommand_line_arguments_head() 71c7d813a9SEnji Cooper{ 72c7d813a9SEnji Cooper atf_set "descr" "Checks -c support" 73c7d813a9SEnji Cooper} 74c7d813a9SEnji Coopercommand_line_arguments_body() 75c7d813a9SEnji Cooper{ 76c7d813a9SEnji Cooper arguments="my arguments" 77c7d813a9SEnji Cooper 78c7d813a9SEnji Cooper start_program $arguments 79c7d813a9SEnji Cooper 80c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP*" 81c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "ARGS") 82c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID "$PROG_COMM" "$PROG_PATH $arguments") 83c7d813a9SEnji Cooper 842a243b95SBrooks Davis atf_check -o save:procstat.out procstat arguments $PROG_PID 852a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 862a243b95SBrooks Davis atf_check -o match:"$line_re" tail -n 1 procstat.out 872a243b95SBrooks Davis 88c7d813a9SEnji Cooper atf_check -o save:procstat.out procstat -c $PROG_PID 89c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 90c7d813a9SEnji Cooper atf_check -o match:"$line_re" tail -n 1 procstat.out 91c7d813a9SEnji Cooper} 92c7d813a9SEnji Cooper 93c7d813a9SEnji Cooperatf_test_case environment 94c7d813a9SEnji Cooperenvironment_head() 95c7d813a9SEnji Cooper{ 96c7d813a9SEnji Cooper atf_set "descr" "Checks -e support" 97c7d813a9SEnji Cooper} 98c7d813a9SEnji Cooperenvironment_body() 99c7d813a9SEnji Cooper{ 100c7d813a9SEnji Cooper var="MY_VARIABLE=foo" 101c7d813a9SEnji Cooper eval "export $var" 102c7d813a9SEnji Cooper 103c7d813a9SEnji Cooper start_program my arguments 104c7d813a9SEnji Cooper 105c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP*" 106c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "ENVIRONMENT") 107c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID $PROG_COMM ".*$var.*") 108c7d813a9SEnji Cooper 1092a243b95SBrooks Davis atf_check -o save:procstat.out procstat environment $PROG_PID 1102a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 1112a243b95SBrooks Davis atf_check -o match:"$line_re" tail -n 1 procstat.out 112c7d813a9SEnji Cooper 1132a243b95SBrooks Davis atf_check -o save:procstat.out procstat -e $PROG_PID 114c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 115c7d813a9SEnji Cooper atf_check -o match:"$line_re" tail -n 1 procstat.out 116c7d813a9SEnji Cooper} 117c7d813a9SEnji Cooper 118c7d813a9SEnji Cooperatf_test_case file_descriptor 119c7d813a9SEnji Cooperfile_descriptor_head() 120c7d813a9SEnji Cooper{ 121c7d813a9SEnji Cooper atf_set "descr" "Checks -f support" 122c7d813a9SEnji Cooper} 123c7d813a9SEnji Cooperfile_descriptor_body() 124c7d813a9SEnji Cooper{ 125c7d813a9SEnji Cooper start_program my arguments 126c7d813a9SEnji Cooper 127c7d813a9SEnji Cooper line_format="$SP*%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP+%s$SP%s$SP*" 128c7d813a9SEnji Cooper header_re=$(printf "$line_format" "PID" "COMM" "FD" "T" "V" "FLAGS" "REF" "OFFSET" "PRO" "NAME") 129c7d813a9SEnji Cooper # XXX: write a more sensible feature test 130c7d813a9SEnji Cooper line_re=$(printf "$line_format" $PROG_PID $PROG_COMM ".+" ".+" ".+" ".+" ".+" ".+" ".+" ".+") 131c7d813a9SEnji Cooper 1322a243b95SBrooks Davis atf_check -o save:procstat.out procstat files $PROG_PID 1332a243b95SBrooks Davis atf_check -o match:"$header_re" head -n 1 procstat.out 1342a243b95SBrooks Davis atf_check -o match:"$line_re" awk 'NR > 1' procstat.out 135c7d813a9SEnji Cooper 1362a243b95SBrooks Davis atf_check -o save:procstat.out procstat -f $PROG_PID 137c7d813a9SEnji Cooper atf_check -o match:"$header_re" head -n 1 procstat.out 138c7d813a9SEnji Cooper atf_check -o match:"$line_re" awk 'NR > 1' procstat.out 139c7d813a9SEnji Cooper} 140c7d813a9SEnji Cooper 1410dbdecfdSMark Johnstonatf_test_case kernel_stacks 1420dbdecfdSMark Johnstonkernel_stacks_head() 1430dbdecfdSMark Johnston{ 1440dbdecfdSMark Johnston atf_set "descr" "Captures kernel stacks for all visible threads" 1450dbdecfdSMark Johnston} 1460dbdecfdSMark Johnstonkernel_stacks_body() 1470dbdecfdSMark Johnston{ 1480dbdecfdSMark Johnston atf_check -o save:procstat.out procstat -a kstack 1490dbdecfdSMark Johnston atf_check -o not-empty awk '{if ($3 == "procstat") print}' procstat.out 1500dbdecfdSMark Johnston 1510dbdecfdSMark Johnston atf_check -o save:procstat.out procstat -kka 1520dbdecfdSMark Johnston atf_check -o not-empty awk '{if ($3 == "procstat") print}' procstat.out 1530dbdecfdSMark Johnston} 1540dbdecfdSMark Johnston 155c7d813a9SEnji Cooperatf_init_test_cases() 156c7d813a9SEnji Cooper{ 157c7d813a9SEnji Cooper atf_add_test_case binary_info 158c7d813a9SEnji Cooper atf_add_test_case command_line_arguments 159c7d813a9SEnji Cooper atf_add_test_case environment 160c7d813a9SEnji Cooper atf_add_test_case file_descriptor 1610dbdecfdSMark Johnston atf_add_test_case kernel_stacks 162c7d813a9SEnji Cooper} 163