xref: /freebsd/contrib/netbsd-tests/bin/ps/t_ps.sh (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper# $NetBSD: t_ps.sh,v 1.2 2014/01/16 04:16:32 mlelstv Exp $
2*57718be8SEnji Cooper#
3*57718be8SEnji Cooper# Copyright (c) 2007 The NetBSD Foundation, Inc.
4*57718be8SEnji Cooper# All rights reserved.
5*57718be8SEnji Cooper#
6*57718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without
7*57718be8SEnji Cooper# modification, are permitted provided that the following conditions
8*57718be8SEnji Cooper# are met:
9*57718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright
10*57718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer.
11*57718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
12*57718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
13*57718be8SEnji Cooper#    documentation and/or other materials provided with the distribution.
14*57718be8SEnji Cooper#
15*57718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16*57718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17*57718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18*57718be8SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19*57718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*57718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*57718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*57718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*57718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*57718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*57718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
26*57718be8SEnji Cooper#
27*57718be8SEnji Cooper
28*57718be8SEnji Cooper# the implementation of "ps" to test
29*57718be8SEnji Cooper: ${TEST_PS:="ps"}
30*57718be8SEnji Cooper# tab and newline characters
31*57718be8SEnji Coopertab="$(printf '\t')"
32*57718be8SEnji Cooper# nl="$(printf '\n')" doesn't work
33*57718be8SEnji Coopernl='
34*57718be8SEnji Cooper'
35*57718be8SEnji Cooper
36*57718be8SEnji Cooper#
37*57718be8SEnji Cooper# Parse the "keywords" file into a load of shell variables
38*57718be8SEnji Cooper#
39*57718be8SEnji Coopersetup_keywords()
40*57718be8SEnji Cooper{
41*57718be8SEnji Cooper	# Set variables representing the header text
42*57718be8SEnji Cooper	# for all normal keywords (except aliases), and
43*57718be8SEnji Cooper	# for regular expressions to match the text in left- or
44*57718be8SEnji Cooper	# right-justified columns.
45*57718be8SEnji Cooper	# For example, head_text_p_cpu="%CPU" head_regexp_p_cpu=" *%CPU".
46*57718be8SEnji Cooper	while read keyword heading flag
47*57718be8SEnji Cooper	do
48*57718be8SEnji Cooper		case "$keyword" in
49*57718be8SEnji Cooper		''|\#*)	continue
50*57718be8SEnji Cooper			;;
51*57718be8SEnji Cooper		esac
52*57718be8SEnji Cooper		[ x"$flag" = x"ALIAS" ] && continue
53*57718be8SEnji Cooper		kvar="${keyword}"
54*57718be8SEnji Cooper		case "${keyword}" in
55*57718be8SEnji Cooper		%*)	kvar="p_${keyword#%}"
56*57718be8SEnji Cooper			;;
57*57718be8SEnji Cooper		esac
58*57718be8SEnji Cooper		eval head_text_${kvar}=\'"${heading}"\'
59*57718be8SEnji Cooper		case "${flag}" in
60*57718be8SEnji Cooper		'')	# right justified
61*57718be8SEnji Cooper			eval head_regexp_${kvar}=\'" *${heading}"\'
62*57718be8SEnji Cooper			;;
63*57718be8SEnji Cooper		LJUST)	# left justified
64*57718be8SEnji Cooper			eval head_regexp_${kvar}=\'"${heading} *"\'
65*57718be8SEnji Cooper			;;
66*57718be8SEnji Cooper		*)	atf_fail "unknown flag in keywords"
67*57718be8SEnji Cooper			;;
68*57718be8SEnji Cooper		esac
69*57718be8SEnji Cooper	done <"$(atf_get_srcdir)/keywords"
70*57718be8SEnji Cooper
71*57718be8SEnji Cooper	# Now do the aliases.
72*57718be8SEnji Cooper	while read keyword heading flag
73*57718be8SEnji Cooper	do
74*57718be8SEnji Cooper		case "$keyword" in
75*57718be8SEnji Cooper		''|\#*)	continue
76*57718be8SEnji Cooper			;;
77*57718be8SEnji Cooper		esac
78*57718be8SEnji Cooper		[ x"$flag" != x"ALIAS" ] && continue
79*57718be8SEnji Cooper		kvar="${keyword}"
80*57718be8SEnji Cooper		avar="${heading}"
81*57718be8SEnji Cooper		case "${keyword}" in
82*57718be8SEnji Cooper		%*)	kvar="p_${keyword#%}"
83*57718be8SEnji Cooper			;;
84*57718be8SEnji Cooper		esac
85*57718be8SEnji Cooper		case "${heading}" in
86*57718be8SEnji Cooper		%*)	avar="p_${heading#%}"
87*57718be8SEnji Cooper			;;
88*57718be8SEnji Cooper		esac
89*57718be8SEnji Cooper		eval head_text_${kvar}=\"\$head_text_${avar}\"
90*57718be8SEnji Cooper		eval head_regexp_${kvar}=\"\$head_regexp_${avar}\"
91*57718be8SEnji Cooper	done <"$(atf_get_srcdir)/keywords"
92*57718be8SEnji Cooper
93*57718be8SEnji Cooper	# default sets of keywords
94*57718be8SEnji Cooper	default_keywords='pid tty stat time command'
95*57718be8SEnji Cooper	j_keywords='user pid ppid pgid sess jobc state tt time command'
96*57718be8SEnji Cooper	l_keywords='uid pid ppid cpu pri nice vsz rss wchan state tt time command'
97*57718be8SEnji Cooper	s_keywords='uid pid ppid cpu lid nlwp pri nice vsz rss wchan lstate tt ltime command'
98*57718be8SEnji Cooper	u_keywords='user pid %cpu %mem vsz rss tt state start time command'
99*57718be8SEnji Cooper	v_keywords='pid state time sl re pagein vsz rss lim tsiz %cpu %mem command'
100*57718be8SEnji Cooper}
101*57718be8SEnji Cooper
102*57718be8SEnji Cooper# Convert a list of keywords like "pid comm" to a regexp
103*57718be8SEnji Cooper# like " *PID COMMAND *"
104*57718be8SEnji Cooperheading_keywords_to_regexp()
105*57718be8SEnji Cooper{
106*57718be8SEnji Cooper	local keywords="$1"
107*57718be8SEnji Cooper	local regexp
108*57718be8SEnji Cooper	regexp="$(echo "$keywords" | \
109*57718be8SEnji Cooper		sed -E -e 's/\%/p_/g' -e 's/(^| )/\1\$head_regexp_/g')"
110*57718be8SEnji Cooper	eval regexp=\""${regexp}"\"
111*57718be8SEnji Cooper	regexp="^${regexp}\$"
112*57718be8SEnji Cooper	echo "$regexp"
113*57718be8SEnji Cooper}
114*57718be8SEnji Cooper
115*57718be8SEnji Cooper#
116*57718be8SEnji Cooper# Check that a string matches a regexp; use the specified id
117*57718be8SEnji Cooper# in error or success messages.
118*57718be8SEnji Cooper#
119*57718be8SEnji Coopercheck_regexp() {
120*57718be8SEnji Cooper	local id="$1" string="$2" regexp="$3"
121*57718be8SEnji Cooper	if ! expr "$string" : "$regexp" >/dev/null
122*57718be8SEnji Cooper	then
123*57718be8SEnji Cooper		atf_fail "${id}: expected [${regexp}], got [${string}]"
124*57718be8SEnji Cooper		false
125*57718be8SEnji Cooper	fi
126*57718be8SEnji Cooper}
127*57718be8SEnji Cooper
128*57718be8SEnji Cooper#
129*57718be8SEnji Cooper# Run "ps $args -p $$"; check that only one line is printed,
130*57718be8SEnji Cooper# without a preceding header line.
131*57718be8SEnji Cooper#
132*57718be8SEnji Coopercheck_no_heading_line()
133*57718be8SEnji Cooper{
134*57718be8SEnji Cooper	local args="$1"
135*57718be8SEnji Cooper	local output="$(eval "${TEST_PS} $args -p $$")"
136*57718be8SEnji Cooper	case "$output" in
137*57718be8SEnji Cooper	*"$nl"*)
138*57718be8SEnji Cooper		local firstline="${output%%${nl}*}"
139*57718be8SEnji Cooper		atf_fail "check_no_heading_line [$args] got [$firstline]"
140*57718be8SEnji Cooper		;;
141*57718be8SEnji Cooper	*)
142*57718be8SEnji Cooper		;;
143*57718be8SEnji Cooper	esac
144*57718be8SEnji Cooper}
145*57718be8SEnji Cooper
146*57718be8SEnji Cooper#
147*57718be8SEnji Cooper# Run "ps $args"; check that the heading matches the expected regexp.
148*57718be8SEnji Cooper#
149*57718be8SEnji Coopercheck_heading_regexp()
150*57718be8SEnji Cooper{
151*57718be8SEnji Cooper	args="$1"
152*57718be8SEnji Cooper	regexp="$2"
153*57718be8SEnji Cooper	actual="$( eval "${TEST_PS} $args" | sed -e 1q )"
154*57718be8SEnji Cooper	check_regexp "heading [$args]" "${actual}" "${regexp}"
155*57718be8SEnji Cooper}
156*57718be8SEnji Cooper
157*57718be8SEnji Cooper#
158*57718be8SEnji Cooper# Run "ps $args"; check that the heading matches a regexp constructed
159*57718be8SEnji Cooper# from the specified keywords.
160*57718be8SEnji Cooper#
161*57718be8SEnji Coopercheck_heading_keywords()
162*57718be8SEnji Cooper{
163*57718be8SEnji Cooper	args="$1"
164*57718be8SEnji Cooper	keywords="$2"
165*57718be8SEnji Cooper	check_heading_regexp "$args" "$(heading_keywords_to_regexp "$keywords")"
166*57718be8SEnji Cooper}
167*57718be8SEnji Cooper
168*57718be8SEnji Cooper#
169*57718be8SEnji Cooper# Try several variations on "ps $flag", "ps -$flag", etc.,
170*57718be8SEnji Cooper# and check that the heading always has the correct keywords.
171*57718be8SEnji Cooper#
172*57718be8SEnji Coopercheck_heading_variations()
173*57718be8SEnji Cooper{
174*57718be8SEnji Cooper	flag="$1"
175*57718be8SEnji Cooper	keywords="$2"
176*57718be8SEnji Cooper	for args in "$flag" "-$flag" "-$flag$flag -$flag"; do
177*57718be8SEnji Cooper		check_heading_keywords "$args" "$keywords"
178*57718be8SEnji Cooper	done
179*57718be8SEnji Cooper}
180*57718be8SEnji Cooper
181*57718be8SEnji Cooperatf_test_case default_columns
182*57718be8SEnji Cooperdefault_columns_head()
183*57718be8SEnji Cooper{
184*57718be8SEnji Cooper	atf_set "descr" "Checks that the default set of columns is correct" \
185*57718be8SEnji Cooper	                "and also check that the columns printed by the -j," \
186*57718be8SEnji Cooper	                "-l, -s, -u and -v flags alone are correct"
187*57718be8SEnji Cooper}
188*57718be8SEnji Cooperdefault_columns_body()
189*57718be8SEnji Cooper{
190*57718be8SEnji Cooper	setup_keywords
191*57718be8SEnji Cooper	check_heading_keywords '' "$default_keywords"
192*57718be8SEnji Cooper	check_heading_variations 'j' "$j_keywords"
193*57718be8SEnji Cooper	check_heading_variations 'l' "$l_keywords"
194*57718be8SEnji Cooper	check_heading_variations 's' "$s_keywords"
195*57718be8SEnji Cooper	check_heading_variations 'u' "$u_keywords"
196*57718be8SEnji Cooper	check_heading_variations 'v' "$v_keywords"
197*57718be8SEnji Cooper}
198*57718be8SEnji Cooper
199*57718be8SEnji Cooperatf_test_case minus_O
200*57718be8SEnji Cooperminus_O_head()
201*57718be8SEnji Cooper{
202*57718be8SEnji Cooper	atf_set "descr" "Checks that 'ps -O foo' inserts columns just after" \
203*57718be8SEnji Cooper	                "the pid column"
204*57718be8SEnji Cooper}
205*57718be8SEnji Cooperminus_O_body()
206*57718be8SEnji Cooper{
207*57718be8SEnji Cooper	setup_keywords
208*57718be8SEnji Cooper	check_heading_keywords '-O %cpu,%mem' \
209*57718be8SEnji Cooper		"$(echo "${default_keywords}" | sed -e 's/pid/pid %cpu %mem/')"
210*57718be8SEnji Cooper	check_heading_keywords '-O %cpu -O %mem' \
211*57718be8SEnji Cooper		"$(echo "${default_keywords}" | sed -e 's/pid/pid %cpu %mem/')"
212*57718be8SEnji Cooper	check_heading_keywords '-O%cpu -O%mem' \
213*57718be8SEnji Cooper		"$(echo "${default_keywords}" | sed -e 's/pid/pid %cpu %mem/')"
214*57718be8SEnji Cooper}
215*57718be8SEnji Cooper
216*57718be8SEnji Cooperatf_test_case minus_o
217*57718be8SEnji Cooperminus_o_head()
218*57718be8SEnji Cooper{
219*57718be8SEnji Cooper	atf_set "descr" "Checks simple cases of 'ps -o foo' to control which" \
220*57718be8SEnji Cooper	                "columns are printed; this does not test header" \
221*57718be8SEnji Cooper	                "overriding via 'ps -o foo=BAR'"
222*57718be8SEnji Cooper}
223*57718be8SEnji Cooperminus_o_body()
224*57718be8SEnji Cooper{
225*57718be8SEnji Cooper	setup_keywords
226*57718be8SEnji Cooper	# Keywords for "-o name" override the default display
227*57718be8SEnji Cooper	check_heading_keywords '-o pid,%cpu,%mem' \
228*57718be8SEnji Cooper		"pid %cpu %mem"
229*57718be8SEnji Cooper	check_heading_keywords '-o pid -o %cpu,%mem' \
230*57718be8SEnji Cooper		"pid %cpu %mem"
231*57718be8SEnji Cooper	check_heading_keywords '-opid -o %cpu,%mem' \
232*57718be8SEnji Cooper		"pid %cpu %mem"
233*57718be8SEnji Cooper	# Space works like comma
234*57718be8SEnji Cooper	check_heading_keywords '-opid -o "%cpu %mem"' \
235*57718be8SEnji Cooper		"pid %cpu %mem"
236*57718be8SEnji Cooper	# Check missing pid
237*57718be8SEnji Cooper	check_heading_keywords '-o comm' \
238*57718be8SEnji Cooper		"comm"
239*57718be8SEnji Cooper	# Check pid present but not first
240*57718be8SEnji Cooper	check_heading_keywords '-o comm,pid' \
241*57718be8SEnji Cooper		"comm pid"
242*57718be8SEnji Cooper}
243*57718be8SEnji Cooper
244*57718be8SEnji Cooperatf_test_case override_heading_simple
245*57718be8SEnji Cooperoverride_heading_simple_head()
246*57718be8SEnji Cooper{
247*57718be8SEnji Cooper	atf_set "descr" "Tests simple uses of header overriding via" \
248*57718be8SEnji Cooper	                "'ps -o foo=BAR'.  This does not test columns " \
249*57718be8SEnji Cooper	                "with null headings, or headings with embedded" \
250*57718be8SEnji Cooper	                "space, ',' or '='."
251*57718be8SEnji Cooper}
252*57718be8SEnji Cooperoverride_heading_simple_body()
253*57718be8SEnji Cooper{
254*57718be8SEnji Cooper	setup_keywords
255*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP -o comm' \
256*57718be8SEnji Cooper		'^ *PPP '"${head_text_comm}"'$' # no trailing space
257*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP -o comm=CCC' \
258*57718be8SEnji Cooper		'^ *PPP CCC$'
259*57718be8SEnji Cooper	check_heading_regexp '-o pid,comm=CCC' \
260*57718be8SEnji Cooper		'^'"${head_regexp_pid}"' CCC$'
261*57718be8SEnji Cooper	check_heading_regexp '-o pid -o comm=CCC' \
262*57718be8SEnji Cooper		'^'"${head_regexp_pid}"' CCC$'
263*57718be8SEnji Cooper	# Check missing pid
264*57718be8SEnji Cooper	check_heading_regexp '-o comm=CCC' \
265*57718be8SEnji Cooper		'^CCC$'
266*57718be8SEnji Cooper	# Check pid present but not first
267*57718be8SEnji Cooper	check_heading_regexp '-o comm=CCC -o pid=PPP' \
268*57718be8SEnji Cooper		'^CCC  *PPP$'
269*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid=PPP' \
270*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *PPP$'
271*57718be8SEnji Cooper}
272*57718be8SEnji Cooper
273*57718be8SEnji Cooperatf_test_case override_heading_embedded_specials
274*57718be8SEnji Cooperoverride_heading_embedded_specials_head()
275*57718be8SEnji Cooper{
276*57718be8SEnji Cooper	atf_set "descr" "Tests header overriding with embedded space," \
277*57718be8SEnji Cooper	                "',' or '='.  Everything after the first '='" \
278*57718be8SEnji Cooper	                "is part of the heading."
279*57718be8SEnji Cooper}
280*57718be8SEnji Cooperoverride_heading_embedded_specials_body()
281*57718be8SEnji Cooper{
282*57718be8SEnji Cooper	setup_keywords
283*57718be8SEnji Cooper	# Check embedded "," or "=" in override header.
284*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid==' \
285*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *=$'
286*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid=,' \
287*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *,$'
288*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP,comm' \
289*57718be8SEnji Cooper		'^ *PPP,comm$' # not like '-o pid=PPP -o comm'
290*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP,comm=CCC' \
291*57718be8SEnji Cooper		'^ *PPP,comm=CCC$' # not like '-o pid=PPP -o comm=CCC'
292*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid=PPP,QQQ' \
293*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *PPP,QQQ$'
294*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid=ppid,tty=state' \
295*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *ppid,tty=state$'
296*57718be8SEnji Cooper	# Check embedded space or tab in override header.
297*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid="PPP QQQ"' \
298*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *PPP QQQ$'
299*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid="PPP${tab}QQQ"' \
300*57718be8SEnji Cooper		'^'"${head_regexp_comm}"'  *PPP'"${tab}"'QQQ$'
301*57718be8SEnji Cooper}
302*57718be8SEnji Cooper
303*57718be8SEnji Cooperatf_test_case override_heading_some_null
304*57718be8SEnji Cooperoverride_heading_some_null_head()
305*57718be8SEnji Cooper{
306*57718be8SEnji Cooper	atf_set "descr" "Tests simple uses of null column headings" \
307*57718be8SEnji Cooper	                "overriding via 'ps -o foo=BAR -o baz='.  This" \
308*57718be8SEnji Cooper	                "does not test the case where all columns have" \
309*57718be8SEnji Cooper	                "null headings."
310*57718be8SEnji Cooper}
311*57718be8SEnji Cooperoverride_heading_some_null_body()
312*57718be8SEnji Cooper{
313*57718be8SEnji Cooper	setup_keywords
314*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP -o comm=' \
315*57718be8SEnji Cooper		'^ *PPP *$'
316*57718be8SEnji Cooper	check_heading_regexp '-o pid= -o comm=CCC' \
317*57718be8SEnji Cooper		'^ * CCC$'
318*57718be8SEnji Cooper	check_heading_regexp '-o pid -o comm=' \
319*57718be8SEnji Cooper		'^'"${head_regexp_pid}"' *$'
320*57718be8SEnji Cooper	# Check missing pid
321*57718be8SEnji Cooper	check_heading_regexp '-o ppid= -o comm=CCC' \
322*57718be8SEnji Cooper		'^ * CCC$'
323*57718be8SEnji Cooper	check_heading_regexp '-o ppid=PPP -o comm=' \
324*57718be8SEnji Cooper		'^ *PPP *$'
325*57718be8SEnji Cooper	# Check pid present but not first
326*57718be8SEnji Cooper	check_heading_regexp '-o comm= -o pid=PPP' \
327*57718be8SEnji Cooper		'^ * PPP$'
328*57718be8SEnji Cooper	check_heading_regexp '-o comm,pid=' \
329*57718be8SEnji Cooper		'^'"${head_regexp_comm}"' *$'
330*57718be8SEnji Cooper	# A field with a null custom heading retains a minimum width
331*57718be8SEnji Cooper	# derived from the default heading.  This does not apply
332*57718be8SEnji Cooper	# to a field with a very short (non-null) custom heading.
333*57718be8SEnji Cooper	#
334*57718be8SEnji Cooper	# We choose "holdcnt" as a column whose width is likely to be
335*57718be8SEnji Cooper	# determined entirely by the header width, because the values
336*57718be8SEnji Cooper	# are likely to be very small.
337*57718be8SEnji Cooper	check_heading_regexp '-o holdcnt -o holdcnt -o holdcnt' \
338*57718be8SEnji Cooper		'^HOLDCNT HOLDCNT HOLDCNT$'
339*57718be8SEnji Cooper	check_heading_regexp '-o holdcnt -o holdcnt= -o holdcnt' \
340*57718be8SEnji Cooper		'^HOLDCNT         HOLDCNT$'
341*57718be8SEnji Cooper	check_heading_regexp '-o holdcnt -o holdcnt=HH -o holdcnt' \
342*57718be8SEnji Cooper		'^HOLDCNT HH HOLDCNT$'
343*57718be8SEnji Cooper}
344*57718be8SEnji Cooper
345*57718be8SEnji Cooperatf_test_case override_heading_all_null
346*57718be8SEnji Cooperoverride_heading_all_null_head()
347*57718be8SEnji Cooper{
348*57718be8SEnji Cooper	atf_set "descr" "Tests the use of 'ps -o foo= -o bar=' (with a" \
349*57718be8SEnji Cooper	                "null heading for every column).  The heading" \
350*57718be8SEnji Cooper	                "should not be printed at all in this case."
351*57718be8SEnji Cooper}
352*57718be8SEnji Cooperoverride_heading_all_null_body()
353*57718be8SEnji Cooper{
354*57718be8SEnji Cooper	setup_keywords
355*57718be8SEnji Cooper	# A heading with a space is not a null heading,
356*57718be8SEnji Cooper	# so should not be suppressed
357*57718be8SEnji Cooper	check_heading_regexp '-o comm=" "' \
358*57718be8SEnji Cooper		'^ *$'
359*57718be8SEnji Cooper	# Null headings should be suppressed
360*57718be8SEnji Cooper	check_no_heading_line '-o pid= -o comm='
361*57718be8SEnji Cooper	check_no_heading_line '-o pid= -o comm='
362*57718be8SEnji Cooper	# Check missing pid
363*57718be8SEnji Cooper	check_no_heading_line '-o ppid='
364*57718be8SEnji Cooper	check_no_heading_line '-o comm='
365*57718be8SEnji Cooper	check_no_heading_line '-o command='
366*57718be8SEnji Cooper	check_no_heading_line '-o ppid= -o comm='
367*57718be8SEnji Cooper	check_no_heading_line '-o comm= -o ppid='
368*57718be8SEnji Cooper	# Check pid present but not first
369*57718be8SEnji Cooper	check_no_heading_line '-o comm= -o pid='
370*57718be8SEnji Cooper	check_no_heading_line '-o ppid= -o pid= -o command='
371*57718be8SEnji Cooper}
372*57718be8SEnji Cooper
373*57718be8SEnji Cooperatf_test_case duplicate_column
374*57718be8SEnji Cooperduplicate_column_head()
375*57718be8SEnji Cooper{
376*57718be8SEnji Cooper	atf_set "descr" "Tests the use of -o options to display the" \
377*57718be8SEnji Cooper	                "same column more than once"
378*57718be8SEnji Cooper}
379*57718be8SEnji Cooperduplicate_column_body()
380*57718be8SEnji Cooper{
381*57718be8SEnji Cooper	setup_keywords
382*57718be8SEnji Cooper	# two custom headers
383*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP -o pid=QQQ' \
384*57718be8SEnji Cooper		'^ *PPP  *QQQ$'
385*57718be8SEnji Cooper	# one custom header, before and after default header
386*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP -o pid' \
387*57718be8SEnji Cooper		'^ *PPP '"${head_regexp_pid}"'$'
388*57718be8SEnji Cooper	check_heading_regexp '-o pid -o pid=QQQ' \
389*57718be8SEnji Cooper		'^'"${head_regexp_pid}"'  *QQQ$'
390*57718be8SEnji Cooper	# custom headers both before and after default header
391*57718be8SEnji Cooper	check_heading_regexp '-o pid=PPP -o pid -o pid=QQQ' \
392*57718be8SEnji Cooper		'^ *PPP '"${head_regexp_pid}"'  *QQQ$'
393*57718be8SEnji Cooper}
394*57718be8SEnji Cooper
395*57718be8SEnji Cooperatf_init_test_cases() {
396*57718be8SEnji Cooper	atf_add_test_case default_columns
397*57718be8SEnji Cooper	atf_add_test_case minus_O
398*57718be8SEnji Cooper	atf_add_test_case minus_o
399*57718be8SEnji Cooper	atf_add_test_case override_heading_simple
400*57718be8SEnji Cooper	atf_add_test_case override_heading_embedded_specials
401*57718be8SEnji Cooper	atf_add_test_case override_heading_some_null
402*57718be8SEnji Cooper	atf_add_test_case override_heading_all_null
403*57718be8SEnji Cooper	atf_add_test_case duplicate_column
404*57718be8SEnji Cooper}
405