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