1311895Sasomers# Copyright (c) 2016 Alan Somers
2311895Sasomers# All rights reserved.
3311895Sasomers#
4311895Sasomers# Redistribution and use in source and binary forms, with or without
5311895Sasomers# modification, are permitted provided that the following conditions
6311895Sasomers# are met:
7311895Sasomers# 1. Redistributions of source code must retain the above copyright
8311895Sasomers#    notice, this list of conditions and the following disclaimer.
9311895Sasomers# 2. Redistributions in binary form must reproduce the above copyright
10311895Sasomers#    notice, this list of conditions and the following disclaimer in the
11311895Sasomers#    documentation and/or other materials provided with the distribution.
12311895Sasomers#
13311895Sasomers# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14311895Sasomers# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15311895Sasomers# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16311895Sasomers# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17311895Sasomers# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18311895Sasomers# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19311895Sasomers# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20311895Sasomers# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21311895Sasomers# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22311895Sasomers# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23311895Sasomers# SUCH DAMAGE.
24311895Sasomers#
25311895Sasomers# $FreeBSD: stable/10/usr.bin/tail/tests/tail_test.sh 332610 2018-04-16 16:42:16Z asomers $
26311895Sasomers
27311895Sasomersatf_test_case empty_r
28311895Sasomersempty_r_head()
29311895Sasomers{
30311895Sasomers	atf_set "descr" "Reverse an empty file"
31311895Sasomers}
32311895Sasomersempty_r_body()
33311895Sasomers{
34311895Sasomers	touch infile expectfile
35311895Sasomers	tail -r infile > outfile
36311895Sasomers	tail -r < infile > outpipe
37311895Sasomers	atf_check cmp expectfile outfile
38311895Sasomers	atf_check cmp expectfile outpipe
39311895Sasomers}
40311895Sasomers
41311895Sasomersatf_test_case file_r
42311895Sasomersfile_r_head()
43311895Sasomers{
44311895Sasomers	atf_set "descr" "Reverse a file"
45311895Sasomers}
46311895Sasomersfile_r_body()
47311895Sasomers{
48311895Sasomers	cat > infile <<HERE
49311895SasomersThis is the first line
50311895SasomersThis is the second line
51311895SasomersThis is the third line
52311895SasomersHERE
53311895Sasomers	cat > expectfile << HERE
54311895SasomersThis is the third line
55311895SasomersThis is the second line
56311895SasomersThis is the first line
57311895SasomersHERE
58311895Sasomers	tail -r infile > outfile
59311895Sasomers	tail -r < infile > outpipe
60311895Sasomers	atf_check cmp expectfile outfile
61311895Sasomers	atf_check cmp expectfile outpipe
62311895Sasomers}
63311895Sasomers
64311895Sasomersatf_test_case file_rn2
65311895Sasomersfile_rn2_head()
66311895Sasomers{
67311895Sasomers	atf_set "descr" "Reverse the last two lines of a file"
68311895Sasomers}
69311895Sasomersfile_rn2_body()
70311895Sasomers{
71311895Sasomers	cat > infile <<HERE
72311895SasomersThis is the first line
73311895SasomersThis is the second line
74311895SasomersThis is the third line
75311895SasomersHERE
76311895Sasomers	cat > expectfile << HERE
77311895SasomersThis is the third line
78311895SasomersThis is the second line
79311895SasomersHERE
80311895Sasomers	tail -rn2 infile > outfile
81311895Sasomers	tail -rn2 < infile > outpipe
82311895Sasomers	atf_check cmp expectfile outfile
83311895Sasomers	atf_check cmp expectfile outpipe
84311895Sasomers}
85311895Sasomers
86332610Sasomers# Regression test for PR 222671
87332610Sasomers# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222671
88332610Sasomersatf_test_case pipe_leading_newline_r
89332610Sasomerspipe_leading_newline_r_head()
90332610Sasomers{
91332610Sasomers	atf_set "descr" "Reverse a pipe whose first character is a newline"
92332610Sasomers}
93332610Sasomerspipe_leading_newline_r_body()
94332610Sasomers{
95332610Sasomers	cat > expectfile << HERE
96332610Sasomers3
97332610Sasomers2
98332610Sasomers1
99332610Sasomers
100332610SasomersHERE
101332610Sasomers	printf '\n1\n2\n3\n' | tail -r > outfile
102332610Sasomers	printf '\n1\n2\n3\n' | tail -r > outpipe
103332610Sasomers	atf_check cmp expectfile outfile
104332610Sasomers	atf_check cmp expectfile outpipe
105332610Sasomers}
106332610Sasomers
107311895Sasomersatf_test_case file_rc28
108311895Sasomersfile_rc28_head()
109311895Sasomers{
110311895Sasomers	atf_set "descr" "Reverse a file and display the last 28 characters"
111311895Sasomers}
112311895Sasomersfile_rc28_body()
113311895Sasomers{
114311895Sasomers	cat > infile <<HERE
115311895SasomersThis is the first line
116311895SasomersThis is the second line
117311895SasomersThis is the third line
118311895SasomersHERE
119311895Sasomers	cat > expectfile << HERE
120311895SasomersThis is the third line
121311895Sasomersline
122311895SasomersHERE
123311895Sasomers	tail -rc28 infile > outfile
124311895Sasomers	tail -rc28 < infile > outpipe
125311895Sasomers	atf_check cmp expectfile outfile
126311895Sasomers	atf_check cmp expectfile outpipe
127311895Sasomers}
128311895Sasomers
129332610Sasomersatf_test_case file_rc28
130332610Sasomersfile_rc28_head()
131332610Sasomers{
132332610Sasomers	atf_set "descr" "Reverse a file and display the last 28 characters"
133332610Sasomers}
134332610Sasomersfile_rc28_body()
135332610Sasomers{
136332610Sasomers	cat > infile <<HERE
137332610SasomersThis is the first line
138332610SasomersThis is the second line
139332610SasomersThis is the third line
140332610SasomersHERE
141332610Sasomers	cat > expectfile << HERE
142332610SasomersThis is the third line
143332610Sasomersline
144332610SasomersHERE
145332610Sasomers	tail -rc28 infile > outfile
146332610Sasomers	tail -rc28 < infile > outpipe
147332610Sasomers	atf_check cmp expectfile outfile
148332610Sasomers	atf_check cmp expectfile outpipe
149332610Sasomers}
150332610Sasomers
151311895Sasomersatf_test_case longfile_r
152311895Sasomerslongfile_r_head()
153311895Sasomers{
154311895Sasomers	atf_set "descr" "Reverse a long file"
155311895Sasomers}
156311895Sasomerslongfile_r_body()
157311895Sasomers{
158311895Sasomers	jot -w "%0511d" 1030 0 > infile
159311895Sasomers	jot -w "%0511d" 1030 1029 0 -1 > expectfile
160311895Sasomers	tail -r infile > outfile
161311895Sasomers	tail -r < infile > outpipe
162311895Sasomers	atf_check cmp expectfile outfile
163311895Sasomers	atf_check cmp expectfile outpipe
164311895Sasomers}
165311895Sasomers
166311895Sasomersatf_test_case longfile_r_enomem
167311895Sasomerslongfile_r_enomem_head()
168311895Sasomers{
169311895Sasomers	atf_set "descr" "Reverse a file that's too long to store in RAM"
170311895Sasomers}
171311895Sasomerslongfile_r_enomem_body()
172311895Sasomers{
173311895Sasomers	# When we reverse a file that's too long for RAM, tail should drop the
174311895Sasomers	# first part and just print what it can.  We'll check that the last
175311895Sasomers	# part is ok
176311895Sasomers	{
177311895Sasomers		ulimit -v 32768 || atf_skip "Can't adjust ulimit"
178311895Sasomers		jot -w "%01023d" 32768 0 | tail -r > outfile ;
179311895Sasomers	}
180311895Sasomers	if [ "$?" -ne 1 ]; then
181311895Sasomers		atf_skip "Didn't get ENOMEM.  Adjust test parameters"
182311895Sasomers	fi
183311895Sasomers	# We don't know how much of the input we dropped.  So just check that
184311895Sasomers	# the first ten lines of tail's output are the same as the last ten of
185311895Sasomers	# the input
186311895Sasomers	jot -w "%01023d" 10 32767 0 -1 > expectfile
187311895Sasomers	head -n 10 outfile > outtrunc
188311895Sasomers	diff expectfile outtrunc
189311895Sasomers	atf_check cmp expectfile outtrunc
190311895Sasomers}
191311895Sasomers
192311895Sasomersatf_test_case longfile_r_longlines
193311895Sasomerslongfile_r_longlines_head()
194311895Sasomers{
195311895Sasomers	atf_set "descr" "Reverse a long file with extremely long lines"
196311895Sasomers}
197311895Sasomerslongfile_r_longlines_body()
198311895Sasomers{
199311895Sasomers	jot -s " " -w "%07d" 18000 0 > infile
200311895Sasomers	jot -s " " -w "%07d" 18000 18000 >> infile
201311895Sasomers	jot -s " " -w "%07d" 18000 36000 >> infile
202311895Sasomers	jot -s " " -w "%07d" 18000 36000 > expectfile
203311895Sasomers	jot -s " " -w "%07d" 18000 18000 >> expectfile
204311895Sasomers	jot -s " " -w "%07d" 18000 0 >> expectfile
205311895Sasomers	tail -r infile > outfile
206311895Sasomers	tail -r < infile > outpipe
207311895Sasomers	atf_check cmp expectfile outfile
208311895Sasomers	atf_check cmp expectfile outpipe
209311895Sasomers}
210311895Sasomers
211311895Sasomersatf_test_case longfile_rc135782
212311895Sasomerslongfile_rc135782_head()
213311895Sasomers{
214311895Sasomers	atf_set "descr" "Reverse a long file and print the last 135,782 bytes"
215311895Sasomers}
216311895Sasomerslongfile_rc135782_body()
217311895Sasomers{
218311895Sasomers	jot -w "%063d" 9000 0 > infile
219311895Sasomers	jot -w "%063d" 2121 8999 0 -1 > expectfile
220311895Sasomers	echo "0000000000000000000000000000000006878" >> expectfile
221311895Sasomers	tail -rc135782 infile > outfile
222311895Sasomers	tail -rc135782 < infile > outpipe
223311895Sasomers	atf_check cmp expectfile outfile
224311895Sasomers	atf_check cmp expectfile outpipe
225311895Sasomers}
226311895Sasomers
227311895Sasomersatf_test_case longfile_rc145782_longlines
228311895Sasomerslongfile_rc145782_longlines_head()
229311895Sasomers{
230311895Sasomers	atf_set "descr" "Reverse a long file with extremely long lines and print the last 145,782 bytes"
231311895Sasomers}
232311895Sasomerslongfile_rc145782_longlines_body()
233311895Sasomers{
234311895Sasomers	jot -s " " -w "%07d" 18000 0 > infile
235311895Sasomers	jot -s " " -w "%07d" 18000 18000 >> infile
236311895Sasomers	jot -s " " -w "%07d" 18000 36000 >> infile
237311895Sasomers	jot -s " " -w "%07d" 18000 36000 > expectfile
238311895Sasomers	echo -n "35777 " >> expectfile
239311895Sasomers	jot -s " " -w "%07d" 222 35778 >> expectfile
240311895Sasomers	tail -rc145782 infile > outfile
241311895Sasomers	tail -rc145782 < infile > outpipe
242311895Sasomers	atf_check cmp expectfile outfile
243311895Sasomers	atf_check cmp expectfile outpipe
244311895Sasomers}
245311895Sasomers
246311895Sasomersatf_test_case longfile_rn2500
247311895Sasomerslongfile_rn2500_head()
248311895Sasomers{
249311895Sasomers	atf_set "descr" "Reverse a long file and print the last 2,500 lines"
250311895Sasomers}
251311895Sasomerslongfile_rn2500_body()
252311895Sasomers{
253311895Sasomers	jot -w "%063d" 9000 0 > infile
254311895Sasomers	jot -w "%063d" 2500 8999 0 -1 > expectfile
255311895Sasomers	tail -rn2500 infile > outfile
256311895Sasomers	tail -rn2500 < infile > outpipe
257311895Sasomers	atf_check cmp expectfile outfile
258311895Sasomers	atf_check cmp expectfile outpipe
259311895Sasomers}
260311895Sasomers
261311895Sasomers
262311895Sasomersatf_init_test_cases()
263311895Sasomers{
264311895Sasomers	atf_add_test_case empty_r
265311895Sasomers	atf_add_test_case file_r
266311895Sasomers	atf_add_test_case file_rc28
267311895Sasomers	atf_add_test_case file_rn2
268332610Sasomers	atf_add_test_case pipe_leading_newline_r
269311895Sasomers	# The longfile tests are designed to exercise behavior in r_buf(),
270311895Sasomers	# which operates on 128KB blocks
271311895Sasomers	atf_add_test_case longfile_r
272311895Sasomers	atf_add_test_case longfile_r_enomem
273311895Sasomers	atf_add_test_case longfile_r_longlines
274311895Sasomers	atf_add_test_case longfile_rc135782
275311895Sasomers	atf_add_test_case longfile_rc145782_longlines
276311895Sasomers	atf_add_test_case longfile_rn2500
277311895Sasomers}
278