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