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