xref: /freebsd/usr.bin/tail/tests/tail_test.sh (revision 4f52dfbb8d6c4d446500c5b097e3806ec219fbd4)
1# Copyright (c) 2016 Alan Somers
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions
6# are met:
7# 1. Redistributions of source code must retain the above copyright
8#    notice, this list of conditions and the following disclaimer.
9# 2. Redistributions in binary form must reproduce the above copyright
10#    notice, this list of conditions and the following disclaimer in the
11#    documentation and/or other materials provided with the distribution.
12#
13# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23# SUCH DAMAGE.
24#
25# $FreeBSD$
26
27atf_test_case empty_r
28empty_r_head()
29{
30	atf_set "descr" "Reverse an empty file"
31}
32empty_r_body()
33{
34	touch infile expectfile
35	tail -r infile > outfile
36	tail -r < infile > outpipe
37	atf_check cmp expectfile outfile
38	atf_check cmp expectfile outpipe
39}
40
41atf_test_case file_r
42file_r_head()
43{
44	atf_set "descr" "Reverse a file"
45}
46file_r_body()
47{
48	cat > infile <<HERE
49This is the first line
50This is the second line
51This is the third line
52HERE
53	cat > expectfile << HERE
54This is the third line
55This is the second line
56This is the first line
57HERE
58	tail -r infile > outfile
59	tail -r < infile > outpipe
60	atf_check cmp expectfile outfile
61	atf_check cmp expectfile outpipe
62}
63
64atf_test_case file_rn2
65file_rn2_head()
66{
67	atf_set "descr" "Reverse the last two lines of a file"
68}
69file_rn2_body()
70{
71	cat > infile <<HERE
72This is the first line
73This is the second line
74This is the third line
75HERE
76	cat > expectfile << HERE
77This is the third line
78This is the second line
79HERE
80	tail -rn2 infile > outfile
81	tail -rn2 < infile > outpipe
82	atf_check cmp expectfile outfile
83	atf_check cmp expectfile outpipe
84}
85
86# Regression test for PR 222671
87# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222671
88atf_test_case pipe_leading_newline_r
89pipe_leading_newline_r_head()
90{
91	atf_set "descr" "Reverse a pipe whose first character is a newline"
92}
93pipe_leading_newline_r_body()
94{
95	cat > expectfile << HERE
963
972
981
99
100HERE
101	printf '\n1\n2\n3\n' | tail -r > outfile
102	printf '\n1\n2\n3\n' | tail -r > outpipe
103	atf_check cmp expectfile outfile
104	atf_check cmp expectfile outpipe
105}
106
107atf_test_case file_rc28
108file_rc28_head()
109{
110	atf_set "descr" "Reverse a file and display the last 28 characters"
111}
112file_rc28_body()
113{
114	cat > infile <<HERE
115This is the first line
116This is the second line
117This is the third line
118HERE
119	cat > expectfile << HERE
120This is the third line
121line
122HERE
123	tail -rc28 infile > outfile
124	tail -rc28 < infile > outpipe
125	atf_check cmp expectfile outfile
126	atf_check cmp expectfile outpipe
127}
128
129atf_test_case file_rc28
130file_rc28_head()
131{
132	atf_set "descr" "Reverse a file and display the last 28 characters"
133}
134file_rc28_body()
135{
136	cat > infile <<HERE
137This is the first line
138This is the second line
139This is the third line
140HERE
141	cat > expectfile << HERE
142This is the third line
143line
144HERE
145	tail -rc28 infile > outfile
146	tail -rc28 < infile > outpipe
147	atf_check cmp expectfile outfile
148	atf_check cmp expectfile outpipe
149}
150
151atf_test_case longfile_r
152longfile_r_head()
153{
154	atf_set "descr" "Reverse a long file"
155}
156longfile_r_body()
157{
158	jot -w "%0511d" 1030 0 > infile
159	jot -w "%0511d" 1030 1029 0 -1 > expectfile
160	tail -r infile > outfile
161	tail -r < infile > outpipe
162	atf_check cmp expectfile outfile
163	atf_check cmp expectfile outpipe
164}
165
166atf_test_case longfile_r_enomem
167longfile_r_enomem_head()
168{
169	atf_set "descr" "Reverse a file that's too long to store in RAM"
170}
171longfile_r_enomem_body()
172{
173	# When we reverse a file that's too long for RAM, tail should drop the
174	# first part and just print what it can.  We'll check that the last
175	# part is ok
176	{
177		ulimit -v 32768 || atf_skip "Can't adjust ulimit"
178		jot -w "%01023d" 32768 0 | tail -r > outfile ;
179	}
180	if [ "$?" -ne 1 ]; then
181		atf_skip "Didn't get ENOMEM.  Adjust test parameters"
182	fi
183	# We don't know how much of the input we dropped.  So just check that
184	# the first ten lines of tail's output are the same as the last ten of
185	# the input
186	jot -w "%01023d" 10 32767 0 -1 > expectfile
187	head -n 10 outfile > outtrunc
188	diff expectfile outtrunc
189	atf_check cmp expectfile outtrunc
190}
191
192atf_test_case longfile_r_longlines
193longfile_r_longlines_head()
194{
195	atf_set "descr" "Reverse a long file with extremely long lines"
196}
197longfile_r_longlines_body()
198{
199	jot -s " " -w "%07d" 18000 0 > infile
200	jot -s " " -w "%07d" 18000 18000 >> infile
201	jot -s " " -w "%07d" 18000 36000 >> infile
202	jot -s " " -w "%07d" 18000 36000 > expectfile
203	jot -s " " -w "%07d" 18000 18000 >> expectfile
204	jot -s " " -w "%07d" 18000 0 >> expectfile
205	tail -r infile > outfile
206	tail -r < infile > outpipe
207	atf_check cmp expectfile outfile
208	atf_check cmp expectfile outpipe
209}
210
211atf_test_case longfile_rc135782
212longfile_rc135782_head()
213{
214	atf_set "descr" "Reverse a long file and print the last 135,782 bytes"
215}
216longfile_rc135782_body()
217{
218	jot -w "%063d" 9000 0 > infile
219	jot -w "%063d" 2121 8999 0 -1 > expectfile
220	echo "0000000000000000000000000000000006878" >> expectfile
221	tail -rc135782 infile > outfile
222	tail -rc135782 < infile > outpipe
223	atf_check cmp expectfile outfile
224	atf_check cmp expectfile outpipe
225}
226
227atf_test_case longfile_rc145782_longlines
228longfile_rc145782_longlines_head()
229{
230	atf_set "descr" "Reverse a long file with extremely long lines and print the last 145,782 bytes"
231}
232longfile_rc145782_longlines_body()
233{
234	jot -s " " -w "%07d" 18000 0 > infile
235	jot -s " " -w "%07d" 18000 18000 >> infile
236	jot -s " " -w "%07d" 18000 36000 >> infile
237	jot -s " " -w "%07d" 18000 36000 > expectfile
238	echo -n "35777 " >> expectfile
239	jot -s " " -w "%07d" 222 35778 >> expectfile
240	tail -rc145782 infile > outfile
241	tail -rc145782 < infile > outpipe
242	atf_check cmp expectfile outfile
243	atf_check cmp expectfile outpipe
244}
245
246atf_test_case longfile_rn2500
247longfile_rn2500_head()
248{
249	atf_set "descr" "Reverse a long file and print the last 2,500 lines"
250}
251longfile_rn2500_body()
252{
253	jot -w "%063d" 9000 0 > infile
254	jot -w "%063d" 2500 8999 0 -1 > expectfile
255	tail -rn2500 infile > outfile
256	tail -rn2500 < infile > outpipe
257	atf_check cmp expectfile outfile
258	atf_check cmp expectfile outpipe
259}
260
261atf_test_case broken_pipe
262broken_pipe_head()
263{
264	atf_set "descr" "Do not print bogus errno based output on short writes"
265}
266broken_pipe_body()
267{
268	atf_check -o save:ints seq -f '%128g' 1 1000
269	atf_check -s ignore \
270	    -e "inline:tail: stdout\nexit code: 1\n" \
271	    -x '(tail -n 856 ints; echo exit code: $? >&2) | sleep 2'
272}
273
274
275atf_init_test_cases()
276{
277	atf_add_test_case empty_r
278	atf_add_test_case file_r
279	atf_add_test_case file_rc28
280	atf_add_test_case file_rn2
281	atf_add_test_case pipe_leading_newline_r
282	# The longfile tests are designed to exercise behavior in r_buf(),
283	# which operates on 128KB blocks
284	atf_add_test_case longfile_r
285	atf_add_test_case longfile_r_enomem
286	atf_add_test_case longfile_r_longlines
287	atf_add_test_case longfile_rc135782
288	atf_add_test_case longfile_rc145782_longlines
289	atf_add_test_case longfile_rn2500
290	atf_add_test_case broken_pipe
291}
292