]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/tail/tests/tail_test.sh
MFC r329606:
[FreeBSD/FreeBSD.git] / usr.bin / tail / tests / tail_test.sh
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
27 atf_test_case empty_r
28 empty_r_head()
29 {
30         atf_set "descr" "Reverse an empty file"
31 }
32 empty_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
41 atf_test_case file_r
42 file_r_head()
43 {
44         atf_set "descr" "Reverse a file"
45 }
46 file_r_body()
47 {
48         cat > infile <<HERE
49 This is the first line
50 This is the second line
51 This is the third line
52 HERE
53         cat > expectfile << HERE
54 This is the third line
55 This is the second line
56 This is the first line
57 HERE
58         tail -r infile > outfile
59         tail -r < infile > outpipe
60         atf_check cmp expectfile outfile
61         atf_check cmp expectfile outpipe
62 }
63
64 atf_test_case file_rn2
65 file_rn2_head()
66 {
67         atf_set "descr" "Reverse the last two lines of a file"
68 }
69 file_rn2_body()
70 {
71         cat > infile <<HERE
72 This is the first line
73 This is the second line
74 This is the third line
75 HERE
76         cat > expectfile << HERE
77 This is the third line
78 This is the second line
79 HERE
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
88 atf_test_case pipe_leading_newline_r
89 pipe_leading_newline_r_head()
90 {
91         atf_set "descr" "Reverse a pipe whose first character is a newline"
92 }
93 pipe_leading_newline_r_body()
94 {
95         cat > expectfile << HERE
96 3
97 2
98 1
99
100 HERE
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
107 atf_test_case file_rc28
108 file_rc28_head()
109 {
110         atf_set "descr" "Reverse a file and display the last 28 characters"
111 }
112 file_rc28_body()
113 {
114         cat > infile <<HERE
115 This is the first line
116 This is the second line
117 This is the third line
118 HERE
119         cat > expectfile << HERE
120 This is the third line
121 line
122 HERE
123         tail -rc28 infile > outfile
124         tail -rc28 < infile > outpipe
125         atf_check cmp expectfile outfile
126         atf_check cmp expectfile outpipe
127 }
128
129 atf_test_case file_rc28
130 file_rc28_head()
131 {
132         atf_set "descr" "Reverse a file and display the last 28 characters"
133 }
134 file_rc28_body()
135 {
136         cat > infile <<HERE
137 This is the first line
138 This is the second line
139 This is the third line
140 HERE
141         cat > expectfile << HERE
142 This is the third line
143 line
144 HERE
145         tail -rc28 infile > outfile
146         tail -rc28 < infile > outpipe
147         atf_check cmp expectfile outfile
148         atf_check cmp expectfile outpipe
149 }
150
151 atf_test_case longfile_r
152 longfile_r_head()
153 {
154         atf_set "descr" "Reverse a long file"
155 }
156 longfile_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
166 atf_test_case longfile_r_enomem
167 longfile_r_enomem_head()
168 {
169         atf_set "descr" "Reverse a file that's too long to store in RAM"
170 }
171 longfile_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
192 atf_test_case longfile_r_longlines
193 longfile_r_longlines_head()
194 {
195         atf_set "descr" "Reverse a long file with extremely long lines"
196 }
197 longfile_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
211 atf_test_case longfile_rc135782
212 longfile_rc135782_head()
213 {
214         atf_set "descr" "Reverse a long file and print the last 135,782 bytes"
215 }
216 longfile_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
227 atf_test_case longfile_rc145782_longlines
228 longfile_rc145782_longlines_head()
229 {
230         atf_set "descr" "Reverse a long file with extremely long lines and print the last 145,782 bytes"
231 }
232 longfile_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
246 atf_test_case longfile_rn2500
247 longfile_rn2500_head()
248 {
249         atf_set "descr" "Reverse a long file and print the last 2,500 lines"
250 }
251 longfile_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
261
262 atf_init_test_cases()
263 {
264         atf_add_test_case empty_r
265         atf_add_test_case file_r
266         atf_add_test_case file_rc28
267         atf_add_test_case file_rn2
268         atf_add_test_case pipe_leading_newline_r
269         # The longfile tests are designed to exercise behavior in r_buf(),
270         # which operates on 128KB blocks
271         atf_add_test_case longfile_r
272         atf_add_test_case longfile_r_enomem
273         atf_add_test_case longfile_r_longlines
274         atf_add_test_case longfile_rc135782
275         atf_add_test_case longfile_rc145782_longlines
276         atf_add_test_case longfile_rn2500
277 }