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