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 86atf_test_case file_rc28 87file_rc28_head() 88{ 89 atf_set "descr" "Reverse a file and display the last 28 characters" 90} 91file_rc28_body() 92{ 93 cat > infile <<HERE 94This is the first line 95This is the second line 96This is the third line 97HERE 98 cat > expectfile << HERE 99This is the third line 100line 101HERE 102 tail -rc28 infile > outfile 103 tail -rc28 < infile > outpipe 104 atf_check cmp expectfile outfile 105 atf_check cmp expectfile outpipe 106} 107 108atf_test_case longfile_r 109longfile_r_head() 110{ 111 atf_set "descr" "Reverse a long file" 112} 113longfile_r_body() 114{ 115 jot -w "%0511d" 1030 0 > infile 116 jot -w "%0511d" 1030 1029 0 -1 > expectfile 117 tail -r infile > outfile 118 tail -r < infile > outpipe 119 atf_check cmp expectfile outfile 120 atf_check cmp expectfile outpipe 121} 122 123atf_test_case longfile_r_enomem 124longfile_r_enomem_head() 125{ 126 atf_set "descr" "Reverse a file that's too long to store in RAM" 127} 128longfile_r_enomem_body() 129{ 130 # When we reverse a file that's too long for RAM, tail should drop the 131 # first part and just print what it can. We'll check that the last 132 # part is ok 133 { 134 ulimit -v 32768 || atf_skip "Can't adjust ulimit" 135 jot -w "%01023d" 32768 0 | tail -r > outfile ; 136 } 137 if [ "$?" -ne 1 ]; then 138 atf_skip "Didn't get ENOMEM. Adjust test parameters" 139 fi 140 # We don't know how much of the input we dropped. So just check that 141 # the first ten lines of tail's output are the same as the last ten of 142 # the input 143 jot -w "%01023d" 10 32767 0 -1 > expectfile 144 head -n 10 outfile > outtrunc 145 diff expectfile outtrunc 146 atf_check cmp expectfile outtrunc 147} 148 149atf_test_case longfile_r_longlines 150longfile_r_longlines_head() 151{ 152 atf_set "descr" "Reverse a long file with extremely long lines" 153} 154longfile_r_longlines_body() 155{ 156 jot -s " " -w "%07d" 18000 0 > infile 157 jot -s " " -w "%07d" 18000 18000 >> infile 158 jot -s " " -w "%07d" 18000 36000 >> infile 159 jot -s " " -w "%07d" 18000 36000 > expectfile 160 jot -s " " -w "%07d" 18000 18000 >> expectfile 161 jot -s " " -w "%07d" 18000 0 >> expectfile 162 tail -r infile > outfile 163 tail -r < infile > outpipe 164 atf_check cmp expectfile outfile 165 atf_check cmp expectfile outpipe 166} 167 168atf_test_case longfile_rc135782 169longfile_rc135782_head() 170{ 171 atf_set "descr" "Reverse a long file and print the last 135,782 bytes" 172} 173longfile_rc135782_body() 174{ 175 jot -w "%063d" 9000 0 > infile 176 jot -w "%063d" 2121 8999 0 -1 > expectfile 177 echo "0000000000000000000000000000000006878" >> expectfile 178 tail -rc135782 infile > outfile 179 tail -rc135782 < infile > outpipe 180 atf_check cmp expectfile outfile 181 atf_check cmp expectfile outpipe 182} 183 184atf_test_case longfile_rc145782_longlines 185longfile_rc145782_longlines_head() 186{ 187 atf_set "descr" "Reverse a long file with extremely long lines and print the last 145,782 bytes" 188} 189longfile_rc145782_longlines_body() 190{ 191 jot -s " " -w "%07d" 18000 0 > infile 192 jot -s " " -w "%07d" 18000 18000 >> infile 193 jot -s " " -w "%07d" 18000 36000 >> infile 194 jot -s " " -w "%07d" 18000 36000 > expectfile 195 echo -n "35777 " >> expectfile 196 jot -s " " -w "%07d" 222 35778 >> expectfile 197 tail -rc145782 infile > outfile 198 tail -rc145782 < infile > outpipe 199 atf_check cmp expectfile outfile 200 atf_check cmp expectfile outpipe 201} 202 203atf_test_case longfile_rn2500 204longfile_rn2500_head() 205{ 206 atf_set "descr" "Reverse a long file and print the last 2,500 lines" 207} 208longfile_rn2500_body() 209{ 210 jot -w "%063d" 9000 0 > infile 211 jot -w "%063d" 2500 8999 0 -1 > expectfile 212 tail -rn2500 infile > outfile 213 tail -rn2500 < infile > outpipe 214 atf_check cmp expectfile outfile 215 atf_check cmp expectfile outpipe 216} 217 218atf_test_case broken_pipe 219broken_pipe_head() 220{ 221 atf_set "descr" "Do not print bogus errno based output on short writes" 222} 223broken_pipe_body() 224{ 225 atf_check -o save:ints seq -f '%128g' 1 1000 226 atf_check -s ignore \ 227 -e "inline:tail: stdout\nexit code: 1\n" \ 228 -x '(tail -n 856 ints; echo exit code: $? >&2) | sleep 2' 229} 230 231 232atf_init_test_cases() 233{ 234 atf_add_test_case empty_r 235 atf_add_test_case file_r 236 atf_add_test_case file_rc28 237 atf_add_test_case file_rn2 238 # The longfile tests are designed to exercise behavior in r_buf(), 239 # which operates on 128KB blocks 240 atf_add_test_case longfile_r 241 atf_add_test_case longfile_r_enomem 242 atf_add_test_case longfile_r_longlines 243 atf_add_test_case longfile_rc135782 244 atf_add_test_case longfile_rc145782_longlines 245 atf_add_test_case longfile_rn2500 246 atf_add_test_case broken_pipe 247} 248