xref: /freebsd/usr.bin/procstat/tests/procstat_test.sh (revision da5069e1f7daaef1e7157876d6044de6f3a08ce2)
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