1*b30d1939SAndy Fiddaman# 2*b30d1939SAndy Fiddaman# CDDL HEADER START 3*b30d1939SAndy Fiddaman# 4*b30d1939SAndy Fiddaman# The contents of this file are subject to the terms of the 5*b30d1939SAndy Fiddaman# Common Development and Distribution License (the "License"). 6*b30d1939SAndy Fiddaman# You may not use this file except in compliance with the License. 7*b30d1939SAndy Fiddaman# 8*b30d1939SAndy Fiddaman# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*b30d1939SAndy Fiddaman# or http://www.opensolaris.org/os/licensing. 10*b30d1939SAndy Fiddaman# See the License for the specific language governing permissions 11*b30d1939SAndy Fiddaman# and limitations under the License. 12*b30d1939SAndy Fiddaman# 13*b30d1939SAndy Fiddaman# When distributing Covered Code, include this CDDL HEADER in each 14*b30d1939SAndy Fiddaman# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*b30d1939SAndy Fiddaman# If applicable, add the following below this CDDL HEADER, with the 16*b30d1939SAndy Fiddaman# fields enclosed by brackets "[]" replaced with your own identifying 17*b30d1939SAndy Fiddaman# information: Portions Copyright [yyyy] [name of copyright owner] 18*b30d1939SAndy Fiddaman# 19*b30d1939SAndy Fiddaman# CDDL HEADER END 20*b30d1939SAndy Fiddaman# 21*b30d1939SAndy Fiddaman 22*b30d1939SAndy Fiddaman# 23*b30d1939SAndy Fiddaman# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 24*b30d1939SAndy Fiddaman# 25*b30d1939SAndy Fiddaman 26*b30d1939SAndy Fiddaman# 27*b30d1939SAndy Fiddaman# Test whether the ksh93/libcmd tail builtin is compatible to 28*b30d1939SAndy Fiddaman# Solaris/SystemV { /usr/bin/tail, /usr/xpg4/bin/tail } and 29*b30d1939SAndy Fiddaman# POSIX "tail" 30*b30d1939SAndy Fiddaman# 31*b30d1939SAndy Fiddaman 32*b30d1939SAndy Fiddaman# test setup 33*b30d1939SAndy Fiddamanfunction err_exit 34*b30d1939SAndy Fiddaman{ 35*b30d1939SAndy Fiddaman print -u2 -n "\t" 36*b30d1939SAndy Fiddaman print -u2 -r ${Command}[$1]: "${@:2}" 37*b30d1939SAndy Fiddaman (( Errors < 127 && Errors++ )) 38*b30d1939SAndy Fiddaman} 39*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO' 40*b30d1939SAndy Fiddaman 41*b30d1939SAndy Fiddamanset -o nounset 42*b30d1939SAndy FiddamanCommand=${0##*/} 43*b30d1939SAndy Fiddamaninteger Errors=0 44*b30d1939SAndy Fiddaman 45*b30d1939SAndy Fiddaman# common functions 46*b30d1939SAndy Fiddamanfunction isvalidpid 47*b30d1939SAndy Fiddaman{ 48*b30d1939SAndy Fiddaman kill -0 ${1} 2>/dev/null && return 0 49*b30d1939SAndy Fiddaman return 1 50*b30d1939SAndy Fiddaman} 51*b30d1939SAndy Fiddaman 52*b30d1939SAndy Fiddamanfunction waitpidtimeout 53*b30d1939SAndy Fiddaman{ 54*b30d1939SAndy Fiddaman integer pid=$1 55*b30d1939SAndy Fiddaman float timeout=$2 56*b30d1939SAndy Fiddaman float i 57*b30d1939SAndy Fiddaman float -r STEP=0.5 # const 58*b30d1939SAndy Fiddaman 59*b30d1939SAndy Fiddaman (( timeout=timeout/STEP )) 60*b30d1939SAndy Fiddaman 61*b30d1939SAndy Fiddaman for (( i=0 ; i < timeout ; i+=STEP )) ; do 62*b30d1939SAndy Fiddaman isvalidpid ${pid} || break 63*b30d1939SAndy Fiddaman sleep ${STEP} 64*b30d1939SAndy Fiddaman done 65*b30d1939SAndy Fiddaman 66*b30d1939SAndy Fiddaman return 0 67*b30d1939SAndy Fiddaman} 68*b30d1939SAndy Fiddaman 69*b30d1939SAndy Fiddamanfunction myintseq 70*b30d1939SAndy Fiddaman{ 71*b30d1939SAndy Fiddaman integer i 72*b30d1939SAndy Fiddaman 73*b30d1939SAndy Fiddaman case $# in 74*b30d1939SAndy Fiddaman 1) 75*b30d1939SAndy Fiddaman for (( i=1 ; i <= $1 ; i++ )) ; do 76*b30d1939SAndy Fiddaman printf "%d\n" i 77*b30d1939SAndy Fiddaman done 78*b30d1939SAndy Fiddaman ;; 79*b30d1939SAndy Fiddaman 2) 80*b30d1939SAndy Fiddaman for (( i=$1 ; i <= $2 ; i++ )) ; do 81*b30d1939SAndy Fiddaman printf "%d\n" i 82*b30d1939SAndy Fiddaman done 83*b30d1939SAndy Fiddaman ;; 84*b30d1939SAndy Fiddaman 3) 85*b30d1939SAndy Fiddaman for (( i=$1 ; i <= $3 ; i+=$2 )) ; do 86*b30d1939SAndy Fiddaman printf "%d\n" i 87*b30d1939SAndy Fiddaman done 88*b30d1939SAndy Fiddaman ;; 89*b30d1939SAndy Fiddaman *) 90*b30d1939SAndy Fiddaman print -u2 -f "%s: Illegal number of arguments %d\n" "$0" $# 91*b30d1939SAndy Fiddaman return 1 92*b30d1939SAndy Fiddaman ;; 93*b30d1939SAndy Fiddaman esac 94*b30d1939SAndy Fiddaman 95*b30d1939SAndy Fiddaman return 0 96*b30d1939SAndy Fiddaman} 97*b30d1939SAndy Fiddaman 98*b30d1939SAndy Fiddaman# quote input string but use single-backslash that "err_exit" prints 99*b30d1939SAndy Fiddaman# the strings correctly 100*b30d1939SAndy Fiddamanfunction singlebackslashquote 101*b30d1939SAndy Fiddaman{ 102*b30d1939SAndy Fiddaman typeset s 103*b30d1939SAndy Fiddaman s="$(printf "%q\n" "$1")" 104*b30d1939SAndy Fiddaman print -r "$s" 105*b30d1939SAndy Fiddaman return 0 106*b30d1939SAndy Fiddaman} 107*b30d1939SAndy Fiddaman 108*b30d1939SAndy Fiddaman# quote input string but use double-backslash that "err_exit" prints 109*b30d1939SAndy Fiddaman# the strings correctly 110*b30d1939SAndy Fiddamanfunction doublebackslashquote 111*b30d1939SAndy Fiddaman{ 112*b30d1939SAndy Fiddaman typeset s 113*b30d1939SAndy Fiddaman s="$(printf "%q\n" "$1")" 114*b30d1939SAndy Fiddaman s="${s//\\/\\\\}" 115*b30d1939SAndy Fiddaman print -r "$s" 116*b30d1939SAndy Fiddaman return 0 117*b30d1939SAndy Fiddaman} 118*b30d1939SAndy Fiddaman 119*b30d1939SAndy Fiddaman 120*b30d1939SAndy Fiddaman# main 121*b30d1939SAndy Fiddamanbuiltin mktemp || err_exit "mktemp builtin not found" 122*b30d1939SAndy Fiddamanbuiltin rm || err_exit "rm builtin not found" 123*b30d1939SAndy Fiddamanbuiltin tail || err_exit "tail builtin not found" 124*b30d1939SAndy Fiddaman 125*b30d1939SAndy Fiddamantypeset ocwd 126*b30d1939SAndy Fiddamantypeset tmpdir 127*b30d1939SAndy Fiddaman 128*b30d1939SAndy Fiddaman# create temporary test directory 129*b30d1939SAndy Fiddamanocwd="$PWD" 130*b30d1939SAndy Fiddamantmpdir="$(mktemp -t -d "test_sun_solaris_builtin_tail.XXXXXXXX")" || err_exit "Cannot create temporary directory" 131*b30d1939SAndy Fiddaman 132*b30d1939SAndy Fiddamancd "${tmpdir}" || { err_exit "cd ${tmpdir} failed." ; exit $((Errors)) ; } 133*b30d1939SAndy Fiddaman 134*b30d1939SAndy Fiddaman 135*b30d1939SAndy Fiddaman# run tests: 136*b30d1939SAndy Fiddaman 137*b30d1939SAndy Fiddaman# test1: basic tests 138*b30d1939SAndy Fiddamancompound -a testcases=( 139*b30d1939SAndy Fiddaman ( 140*b30d1939SAndy Fiddaman name="reverse_n" 141*b30d1939SAndy Fiddaman input=$'hello\nworld' 142*b30d1939SAndy Fiddaman compound -A tail_args=( 143*b30d1939SAndy Fiddaman [legacy]=( argv=( "-r" ) ) 144*b30d1939SAndy Fiddaman ) 145*b30d1939SAndy Fiddaman expected_output=$'world\nhello' 146*b30d1939SAndy Fiddaman ) 147*b30d1939SAndy Fiddaman ( 148*b30d1939SAndy Fiddaman name="revlist0n" 149*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 150*b30d1939SAndy Fiddaman compound -A tail_args=( 151*b30d1939SAndy Fiddaman [legacy]=( argv=( "-0" ) ) 152*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "0" ) ) 153*b30d1939SAndy Fiddaman ) 154*b30d1939SAndy Fiddaman expected_output=$'' 155*b30d1939SAndy Fiddaman ) 156*b30d1939SAndy Fiddaman ( 157*b30d1939SAndy Fiddaman name="revlist0nr" 158*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 159*b30d1939SAndy Fiddaman compound -A tail_args=( 160*b30d1939SAndy Fiddaman [legacy]=( argv=( "-0r" ) ) 161*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "0" "-r" ) ) 162*b30d1939SAndy Fiddaman [long_options]=( argv=( "--lines" "0" "--reverse" ) ) 163*b30d1939SAndy Fiddaman ) 164*b30d1939SAndy Fiddaman expected_output=$'' ) 165*b30d1939SAndy Fiddaman ( 166*b30d1939SAndy Fiddaman name="revlist1n" 167*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 168*b30d1939SAndy Fiddaman compound -A tail_args=( 169*b30d1939SAndy Fiddaman [legacy]=( argv=( "-1" ) ) 170*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "1" ) ) 171*b30d1939SAndy Fiddaman [long_options]=( argv=( "--lines" "1" ) ) 172*b30d1939SAndy Fiddaman ) 173*b30d1939SAndy Fiddaman expected_output=$'4' ) 174*b30d1939SAndy Fiddaman ( 175*b30d1939SAndy Fiddaman name="revlist1nr" 176*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 177*b30d1939SAndy Fiddaman compound -A tail_args=( 178*b30d1939SAndy Fiddaman [legacy]=( argv=( "-1r" ) ) 179*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "1" "-r" ) ) 180*b30d1939SAndy Fiddaman [long_options]=( argv=( "--lines" "1" "--reverse" ) ) 181*b30d1939SAndy Fiddaman ) 182*b30d1939SAndy Fiddaman expected_output=$'4' 183*b30d1939SAndy Fiddaman ) 184*b30d1939SAndy Fiddaman ( 185*b30d1939SAndy Fiddaman name="revlist2n" 186*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 187*b30d1939SAndy Fiddaman compound -A tail_args=( 188*b30d1939SAndy Fiddaman [legacy]=( argv=( "-2" ) ) 189*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "2" ) ) 190*b30d1939SAndy Fiddaman ) 191*b30d1939SAndy Fiddaman expected_output=$'3\n4' 192*b30d1939SAndy Fiddaman ) 193*b30d1939SAndy Fiddaman ( 194*b30d1939SAndy Fiddaman name="revlist2nr" 195*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 196*b30d1939SAndy Fiddaman compound -A tail_args=( 197*b30d1939SAndy Fiddaman [legacy]=( argv=( "-2r" ) ) 198*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "2" "-r" ) ) 199*b30d1939SAndy Fiddaman ) 200*b30d1939SAndy Fiddaman expected_output=$'4\n3' 201*b30d1939SAndy Fiddaman ) 202*b30d1939SAndy Fiddaman ( 203*b30d1939SAndy Fiddaman name="revlist3nr" 204*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 205*b30d1939SAndy Fiddaman compound -A tail_args=( 206*b30d1939SAndy Fiddaman [legacy]=( argv=( "-3r" ) ) 207*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "3" "-r" ) ) 208*b30d1939SAndy Fiddaman ) 209*b30d1939SAndy Fiddaman expected_output=$'4\n3\n2' 210*b30d1939SAndy Fiddaman ) 211*b30d1939SAndy Fiddaman ( 212*b30d1939SAndy Fiddaman name="revlist2p" 213*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 214*b30d1939SAndy Fiddaman compound -A tail_args=( 215*b30d1939SAndy Fiddaman [legacy]=( argv=( "+2" ) ) 216*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+2" ) ) 217*b30d1939SAndy Fiddaman ) 218*b30d1939SAndy Fiddaman expected_output=$'2\n3\n4' 219*b30d1939SAndy Fiddaman ) 220*b30d1939SAndy Fiddaman ( 221*b30d1939SAndy Fiddaman name="revlist2pr" 222*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 223*b30d1939SAndy Fiddaman compound -A tail_args=( 224*b30d1939SAndy Fiddaman [legacy]=( argv=( "+2r" ) ) 225*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+2" "-r" ) ) 226*b30d1939SAndy Fiddaman ) 227*b30d1939SAndy Fiddaman expected_output=$'4\n3\n2' 228*b30d1939SAndy Fiddaman ) 229*b30d1939SAndy Fiddaman ( 230*b30d1939SAndy Fiddaman name="revlist3p" 231*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 232*b30d1939SAndy Fiddaman compound -A tail_args=( 233*b30d1939SAndy Fiddaman [legacy]=( argv=( "+3" ) ) 234*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+3" ) ) 235*b30d1939SAndy Fiddaman ) 236*b30d1939SAndy Fiddaman expected_output=$'3\n4' 237*b30d1939SAndy Fiddaman ) 238*b30d1939SAndy Fiddaman ( 239*b30d1939SAndy Fiddaman name="revlist3pr" 240*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 241*b30d1939SAndy Fiddaman compound -A tail_args=( 242*b30d1939SAndy Fiddaman [legacy]=( argv=( "+3r" ) ) 243*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+3" "-r" ) ) 244*b30d1939SAndy Fiddaman ) 245*b30d1939SAndy Fiddaman expected_output=$'4\n3' 246*b30d1939SAndy Fiddaman ) 247*b30d1939SAndy Fiddaman ( 248*b30d1939SAndy Fiddaman name="revlist4p" 249*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 250*b30d1939SAndy Fiddaman compound -A tail_args=( 251*b30d1939SAndy Fiddaman [legacy]=( argv=( "+4" ) ) 252*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+4" ) ) 253*b30d1939SAndy Fiddaman ) 254*b30d1939SAndy Fiddaman expected_output=$'4' 255*b30d1939SAndy Fiddaman ) 256*b30d1939SAndy Fiddaman ( 257*b30d1939SAndy Fiddaman name="revlist4pr" 258*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 259*b30d1939SAndy Fiddaman compound -A tail_args=( 260*b30d1939SAndy Fiddaman [legacy]=( argv=( "+4r" ) ) 261*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+4" "-r" ) ) 262*b30d1939SAndy Fiddaman ) 263*b30d1939SAndy Fiddaman expected_output=$'4' 264*b30d1939SAndy Fiddaman ) 265*b30d1939SAndy Fiddaman ( 266*b30d1939SAndy Fiddaman name="revlist5p" 267*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 268*b30d1939SAndy Fiddaman compound -A tail_args=( 269*b30d1939SAndy Fiddaman [legacy]=( argv=( "+5" ) ) 270*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+5" ) ) 271*b30d1939SAndy Fiddaman ) 272*b30d1939SAndy Fiddaman expected_output=$'' 273*b30d1939SAndy Fiddaman ) 274*b30d1939SAndy Fiddaman ( 275*b30d1939SAndy Fiddaman name="revlist5pr" 276*b30d1939SAndy Fiddaman input=$'1\n2\n3\n4' 277*b30d1939SAndy Fiddaman compound -A tail_args=( 278*b30d1939SAndy Fiddaman [legacy]=( argv=( "+5r" ) ) 279*b30d1939SAndy Fiddaman [std_like]=( argv=( "-n" "+5" "-r" ) ) 280*b30d1939SAndy Fiddaman ) 281*b30d1939SAndy Fiddaman expected_output=$'' 282*b30d1939SAndy Fiddaman ) 283*b30d1939SAndy Fiddaman) 284*b30d1939SAndy Fiddaman 285*b30d1939SAndy Fiddamanfor testid in "${!testcases[@]}" ; do 286*b30d1939SAndy Fiddaman nameref tc=testcases[${testid}] 287*b30d1939SAndy Fiddaman 288*b30d1939SAndy Fiddaman for argv_variants in "${!tc.tail_args[@]}" ; do 289*b30d1939SAndy Fiddaman nameref argv=tc.tail_args[${argv_variants}].argv 290*b30d1939SAndy Fiddaman output=$( 291*b30d1939SAndy Fiddaman set -o pipefail 292*b30d1939SAndy Fiddaman (trap "" PIPE ; print -r -- "${tc.input}") | tail "${argv[@]}" 293*b30d1939SAndy Fiddaman ) || err_exit "test ${tc.name}/${argv_variants}: command failed with exit code $?" 294*b30d1939SAndy Fiddaman 295*b30d1939SAndy Fiddaman [[ "${output}" == "${tc.expected_output}" ]] || err_exit "test ${tc.name}/${argv_variants}: Expected $(doublebackslashquote "${tc.expected_output}"), got $(doublebackslashquote "${output}")" 296*b30d1939SAndy Fiddaman done 297*b30d1939SAndy Fiddamandone 298*b30d1939SAndy Fiddaman 299*b30d1939SAndy Fiddaman 300*b30d1939SAndy Fiddaman# test2: test "tail -r </etc/profile | rev -l" vs. "cat </etc/profile" 301*b30d1939SAndy Fiddaman[[ "$(tail -r </etc/profile | rev -l)" == "$( cat /etc/profile )" ]] || err_exit "'tail -r </etc/profile | rev -l' output does not match 'cat /etc/profile'" 302*b30d1939SAndy Fiddaman 303*b30d1939SAndy Fiddaman 304*b30d1939SAndy Fiddaman# test 3: ast-ksh.2009-05-05 "tail" builtin may crash if we pass unsupported long options 305*b30d1939SAndy Fiddaman$SHELL -o errexit -c 'builtin tail ; print "hello" | tail --attack_of_chicken_monsters' >/dev/null 2>&1 306*b30d1939SAndy Fiddaman(( $? == 2 )) || err_exit "expected exit code 2 for unsupported long option, got $?" 307*b30d1939SAndy Fiddaman 308*b30d1939SAndy Fiddaman 309*b30d1939SAndy Fiddaman# test 4: FIFO tests 310*b30d1939SAndy Fiddaman 311*b30d1939SAndy Fiddaman# FIFO test functions 312*b30d1939SAndy Fiddaman# (we use functions here to do propper garbage collection) 313*b30d1939SAndy Fiddamanfunction test_tail_fifo_1 314*b30d1939SAndy Fiddaman{ 315*b30d1939SAndy Fiddaman typeset tail_cmd="$1" 316*b30d1939SAndy Fiddaman integer i 317*b30d1939SAndy Fiddaman integer tail_pid=-1 318*b30d1939SAndy Fiddaman 319*b30d1939SAndy Fiddaman # cleanup trap 320*b30d1939SAndy Fiddaman trap "rm -f tailtestfifo tailout" EXIT 321*b30d1939SAndy Fiddaman 322*b30d1939SAndy Fiddaman # create test FIFO 323*b30d1939SAndy Fiddaman mkfifo tailtestfifo 324*b30d1939SAndy Fiddaman 325*b30d1939SAndy Fiddaman ${tail_cmd} -f <tailtestfifo >tailout & 326*b30d1939SAndy Fiddaman tail_pid=$! 327*b30d1939SAndy Fiddaman 328*b30d1939SAndy Fiddaman myintseq 20 >tailtestfifo 329*b30d1939SAndy Fiddaman 330*b30d1939SAndy Fiddaman waitpidtimeout ${tail_pid} 5 331*b30d1939SAndy Fiddaman 332*b30d1939SAndy Fiddaman if isvalidpid ${tail_pid} ; then 333*b30d1939SAndy Fiddaman err_exit "test_tail_fifo_1: # tail hung (not expected)" 334*b30d1939SAndy Fiddaman kill -KILL ${tail_pid} 335*b30d1939SAndy Fiddaman fi 336*b30d1939SAndy Fiddaman 337*b30d1939SAndy Fiddaman wait || err_exit "tail child returned non-zero exit code=$?" 338*b30d1939SAndy Fiddaman 339*b30d1939SAndy Fiddaman [[ "$(cat tailout)" == $'11\n12\n13\n14\n15\n16\n17\n18\n19\n20' ]] || err_exit "test_tail_fifo_1: Expected $(doublebackslashquote '11\n12\n13\n14\n15\n16\n17\n18\n19\n20'), got $(doublebackslashquote "$(cat tailout)")" 340*b30d1939SAndy Fiddaman 341*b30d1939SAndy Fiddaman return 0 342*b30d1939SAndy Fiddaman} 343*b30d1939SAndy Fiddaman 344*b30d1939SAndy Fiddamanfunction test_tail_fifo_2 345*b30d1939SAndy Fiddaman{ 346*b30d1939SAndy Fiddaman typeset tail_cmd="$1" 347*b30d1939SAndy Fiddaman integer i 348*b30d1939SAndy Fiddaman integer tail_pid=-1 349*b30d1939SAndy Fiddaman 350*b30d1939SAndy Fiddaman # cleanup trap 351*b30d1939SAndy Fiddaman trap "rm -f tailtestfifo tailout" EXIT 352*b30d1939SAndy Fiddaman 353*b30d1939SAndy Fiddaman # create test FIFO 354*b30d1939SAndy Fiddaman mkfifo tailtestfifo 355*b30d1939SAndy Fiddaman 356*b30d1939SAndy Fiddaman ${tail_cmd} -f tailtestfifo >tailout & 357*b30d1939SAndy Fiddaman tail_pid=$! 358*b30d1939SAndy Fiddaman 359*b30d1939SAndy Fiddaman myintseq 14 >tailtestfifo 360*b30d1939SAndy Fiddaman 361*b30d1939SAndy Fiddaman waitpidtimeout ${tail_pid} 5 362*b30d1939SAndy Fiddaman 363*b30d1939SAndy Fiddaman if isvalidpid ${tail_pid} ; then 364*b30d1939SAndy Fiddaman [[ "$(cat tailout)" == $'5\n6\n7\n8\n9\n10\n11\n12\n13\n14' ]] || err_exit "test_tail_fifo_2: Expected $(doublebackslashquote $'5\n6\n7\n8\n9\n10\n11\n12\n13\n14'), got $(doublebackslashquote "$(cat tailout)")" 365*b30d1939SAndy Fiddaman 366*b30d1939SAndy Fiddaman myintseq 15 >>tailtestfifo 367*b30d1939SAndy Fiddaman 368*b30d1939SAndy Fiddaman waitpidtimeout ${tail_pid} 5 369*b30d1939SAndy Fiddaman 370*b30d1939SAndy Fiddaman if isvalidpid ${tail_pid} ; then 371*b30d1939SAndy Fiddaman kill -KILL ${tail_pid} 372*b30d1939SAndy Fiddaman else 373*b30d1939SAndy Fiddaman err_exit "test_tail_fifo_2: # tail exit with return code $? (not expected)" 374*b30d1939SAndy Fiddaman fi 375*b30d1939SAndy Fiddaman fi 376*b30d1939SAndy Fiddaman 377*b30d1939SAndy Fiddaman wait || err_exit "tail child returned non-zero exit code=$?" 378*b30d1939SAndy Fiddaman 379*b30d1939SAndy Fiddaman [[ "$(cat tailout)" == $'5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15' ]] || err_exit "test_tail_fifo_2: Expected $(doublebackslashquote $'5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15'), got $(doublebackslashquote "$(cat tailout)")" 380*b30d1939SAndy Fiddaman 381*b30d1939SAndy Fiddaman return 0 382*b30d1939SAndy Fiddaman} 383*b30d1939SAndy Fiddaman 384*b30d1939SAndy Fiddaman# fixme: This should test /usr/bin/tail and /usr/xpg4/bin/tail in Solaris 385*b30d1939SAndy Fiddamantest_tail_fifo_1 "tail" 386*b30d1939SAndy Fiddamantest_tail_fifo_2 "tail" 387*b30d1939SAndy Fiddaman 388*b30d1939SAndy Fiddaman 389*b30d1939SAndy Fiddaman# test 5: "tail -f" tests 390*b30d1939SAndy Fiddamanfunction followtest1 391*b30d1939SAndy Fiddaman{ 392*b30d1939SAndy Fiddaman typeset -r FOLLOWFILE="followfile.txt" 393*b30d1939SAndy Fiddaman typeset -r OUTFILE="outfile.txt" 394*b30d1939SAndy Fiddaman 395*b30d1939SAndy Fiddaman typeset title="$1" 396*b30d1939SAndy Fiddaman typeset testcmd="$2" 397*b30d1939SAndy Fiddaman typeset usenewline=$3 398*b30d1939SAndy Fiddaman typeset followstr="" 399*b30d1939SAndy Fiddaman typeset newline="" 400*b30d1939SAndy Fiddaman integer i 401*b30d1939SAndy Fiddaman integer tailchild=-1 402*b30d1939SAndy Fiddaman 403*b30d1939SAndy Fiddaman if ${usenewline} ; then 404*b30d1939SAndy Fiddaman newline=$'\n' 405*b30d1939SAndy Fiddaman fi 406*b30d1939SAndy Fiddaman 407*b30d1939SAndy Fiddaman rm -f "${FOLLOWFILE}" "${OUTFILE}" 408*b30d1939SAndy Fiddaman print -n "${newline}" > "${FOLLOWFILE}" 409*b30d1939SAndy Fiddaman 410*b30d1939SAndy Fiddaman ${testcmd} -f "${FOLLOWFILE}" >"${OUTFILE}" & 411*b30d1939SAndy Fiddaman (( tailchild=$! )) 412*b30d1939SAndy Fiddaman 413*b30d1939SAndy Fiddaman for (( i=0 ; i < 10 ; i++)) ; do 414*b30d1939SAndy Fiddaman followstr+="${newline}${i}" 415*b30d1939SAndy Fiddaman print -n "${i}${newline}" >>"${FOLLOWFILE}" 416*b30d1939SAndy Fiddaman sleep 2 417*b30d1939SAndy Fiddaman 418*b30d1939SAndy Fiddaman [[ "$( < "${OUTFILE}")" == "${followstr}" ]] || err_exit "${title}: Expected $(doublebackslashquote "${followstr}"), got "$(doublebackslashquote "$( < "${OUTFILE}")")"" 419*b30d1939SAndy Fiddaman done 420*b30d1939SAndy Fiddaman 421*b30d1939SAndy Fiddaman kill -KILL ${tailchild} 2>/dev/null 422*b30d1939SAndy Fiddaman #kill -TERM ${tailchild} 2>/dev/null 423*b30d1939SAndy Fiddaman waitpidtimeout ${tailchild} 5 424*b30d1939SAndy Fiddaman 425*b30d1939SAndy Fiddaman if isvalidpid ${tailchild} ; then 426*b30d1939SAndy Fiddaman err_exit "${title}: tail pid=${tailchild} hung." 427*b30d1939SAndy Fiddaman kill -KILL ${tailchild} 2>/dev/null 428*b30d1939SAndy Fiddaman fi 429*b30d1939SAndy Fiddaman 430*b30d1939SAndy Fiddaman wait ${tailchild} 2>/dev/null 431*b30d1939SAndy Fiddaman 432*b30d1939SAndy Fiddaman rm -f "${FOLLOWFILE}" "${OUTFILE}" 433*b30d1939SAndy Fiddaman 434*b30d1939SAndy Fiddaman return 0 435*b30d1939SAndy Fiddaman} 436*b30d1939SAndy Fiddaman 437*b30d1939SAndy Fiddamanfollowtest1 "test5a" "tail" true 438*b30d1939SAndy Fiddaman# fixme: later we should test this, too: 439*b30d1939SAndy Fiddaman#followtest1 "test5b" "tail" false 440*b30d1939SAndy Fiddaman#followtest1 "test5c" "/usr/xpg4/bin/tail" true 441*b30d1939SAndy Fiddaman#followtest1 "test5d" "/usr/xpg4/bin/tail" false 442*b30d1939SAndy Fiddaman#followtest1 "test5e" "/usr/bin/tail" true 443*b30d1939SAndy Fiddaman#followtest1 "test5f" "/usr/bin/tail" false 444*b30d1939SAndy Fiddaman 445*b30d1939SAndy Fiddaman 446*b30d1939SAndy Fiddaman# test 6: "tail -f" tests 447*b30d1939SAndy Fiddamanfunction followtest2 448*b30d1939SAndy Fiddaman{ 449*b30d1939SAndy Fiddaman typeset -r FOLLOWFILE="followfile.txt" 450*b30d1939SAndy Fiddaman typeset -r OUTFILE="outfile.txt" 451*b30d1939SAndy Fiddaman 452*b30d1939SAndy Fiddaman typeset title="$1" 453*b30d1939SAndy Fiddaman typeset testcmd="$2" 454*b30d1939SAndy Fiddaman integer tailchild=-1 455*b30d1939SAndy Fiddaman 456*b30d1939SAndy Fiddaman rm -f "${FOLLOWFILE}" "${OUTFILE}" 457*b30d1939SAndy Fiddaman 458*b30d1939SAndy Fiddaman myintseq 50000 >"${FOLLOWFILE}" 459*b30d1939SAndy Fiddaman 460*b30d1939SAndy Fiddaman ${testcmd} -n 60000 -f "${FOLLOWFILE}" >"${OUTFILE}" & 461*b30d1939SAndy Fiddaman (( tailchild=$! )) 462*b30d1939SAndy Fiddaman 463*b30d1939SAndy Fiddaman sleep 10 464*b30d1939SAndy Fiddaman 465*b30d1939SAndy Fiddaman kill -KILL ${tailchild} 2>/dev/null 466*b30d1939SAndy Fiddaman #kill -TERM ${tailchild} 2>/dev/null 467*b30d1939SAndy Fiddaman waitpidtimeout ${tailchild} 5 468*b30d1939SAndy Fiddaman 469*b30d1939SAndy Fiddaman if isvalidpid ${tailchild} ; then 470*b30d1939SAndy Fiddaman err_exit "${title}: tail pid=${tailchild} hung." 471*b30d1939SAndy Fiddaman kill -KILL ${tailchild} 2>/dev/null 472*b30d1939SAndy Fiddaman fi 473*b30d1939SAndy Fiddaman 474*b30d1939SAndy Fiddaman wait ${tailchild} 2>/dev/null 475*b30d1939SAndy Fiddaman 476*b30d1939SAndy Fiddaman # this tail should be an external process 477*b30d1939SAndy Fiddaman outstr=$(/usr/bin/tail "${OUTFILE}") || err_exit "tail returned non-zero exit code $?" 478*b30d1939SAndy Fiddaman [[ "${outstr}" == 49991*50000 ]] || err_exit "${title}: Expected match for 49991*50000, got "$(singlebackslashquote "${outstr}")"" 479*b30d1939SAndy Fiddaman 480*b30d1939SAndy Fiddaman rm -f "${FOLLOWFILE}" "${OUTFILE}" 481*b30d1939SAndy Fiddaman 482*b30d1939SAndy Fiddaman return 0 483*b30d1939SAndy Fiddaman} 484*b30d1939SAndy Fiddaman 485*b30d1939SAndy Fiddamanfollowtest2 "test6a" "tail" 486*b30d1939SAndy Fiddamanfollowtest2 "test6b" "/usr/xpg4/bin/tail" 487*b30d1939SAndy Fiddaman# fixme: later we should test this, too: 488*b30d1939SAndy Fiddaman#followtest2 "test6c" "/usr/bin/tail" 489*b30d1939SAndy Fiddaman 490*b30d1939SAndy Fiddaman 491*b30d1939SAndy Fiddaman# cleanup 492*b30d1939SAndy Fiddamancd "${ocwd}" 493*b30d1939SAndy Fiddamanrmdir "${tmpdir}" || err_exit "Cannot remove temporary directory ${tmpdir}". 494*b30d1939SAndy Fiddaman 495*b30d1939SAndy Fiddaman 496*b30d1939SAndy Fiddaman# tests done 497*b30d1939SAndy Fiddamanexit $((Errors)) 498