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