1c36a2f46SEnji Cooper# 2c36a2f46SEnji Cooper# Copyright 2015 EMC Corp. 3c36a2f46SEnji Cooper# All rights reserved. 4c36a2f46SEnji Cooper# 5c36a2f46SEnji Cooper# Redistribution and use in source and binary forms, with or without 6c36a2f46SEnji Cooper# modification, are permitted provided that the following conditions are 7c36a2f46SEnji Cooper# met: 8c36a2f46SEnji Cooper# 9c36a2f46SEnji Cooper# * Redistributions of source code must retain the above copyright 10c36a2f46SEnji Cooper# notice, this list of conditions and the following disclaimer. 11c36a2f46SEnji Cooper# * Redistributions in binary form must reproduce the above copyright 12c36a2f46SEnji Cooper# notice, this list of conditions and the following disclaimer in the 13c36a2f46SEnji Cooper# documentation and/or other materials provided with the distribution. 14c36a2f46SEnji Cooper# 15c36a2f46SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16c36a2f46SEnji Cooper# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17c36a2f46SEnji Cooper# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18c36a2f46SEnji Cooper# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19c36a2f46SEnji Cooper# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20c36a2f46SEnji Cooper# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21c36a2f46SEnji Cooper# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22c36a2f46SEnji Cooper# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23c36a2f46SEnji Cooper# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24c36a2f46SEnji Cooper# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25c36a2f46SEnji Cooper# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26c36a2f46SEnji Cooper# 27c36a2f46SEnji Cooper# $FreeBSD$ 28c36a2f46SEnji Cooper# 29c36a2f46SEnji Cooper 30c36a2f46SEnji Coopercreate_test_dir() 31c36a2f46SEnji Cooper{ 32c36a2f46SEnji Cooper [ -z "$ATF_TMPDIR" ] || return 0 33c36a2f46SEnji Cooper 34c36a2f46SEnji Cooper export ATF_TMPDIR=$(pwd) 35c36a2f46SEnji Cooper 36c36a2f46SEnji Cooper # XXX: need to nest this because of how kyua creates $TMPDIR; otherwise 37c36a2f46SEnji Cooper # it will run into EPERM issues later 38c36a2f46SEnji Cooper TEST_INPUTS_DIR="${ATF_TMPDIR}/test/inputs" 39c36a2f46SEnji Cooper 40c36a2f46SEnji Cooper atf_check -e empty -s exit:0 mkdir -m 0777 -p $TEST_INPUTS_DIR 41c36a2f46SEnji Cooper cd $TEST_INPUTS_DIR 42c36a2f46SEnji Cooper} 43c36a2f46SEnji Cooper 44c36a2f46SEnji Coopercreate_test_inputs() 45c36a2f46SEnji Cooper{ 46c36a2f46SEnji Cooper create_test_dir 47c36a2f46SEnji Cooper 48*a0abe9cdSEnji Cooper atf_check -e empty -s exit:0 mkdir -m 0755 -p a/b/1 49c36a2f46SEnji Cooper atf_check -e empty -s exit:0 ln -s a/b c 50c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch d 51c36a2f46SEnji Cooper atf_check -e empty -s exit:0 ln d e 52c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch .f 53c36a2f46SEnji Cooper atf_check -e empty -s exit:0 mkdir .g 54c36a2f46SEnji Cooper atf_check -e empty -s exit:0 mkfifo h 55c36a2f46SEnji Cooper atf_check -e ignore -s exit:0 dd if=/dev/zero of=i count=1000 bs=1 56c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch klmn 57c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch opqr 58c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch stuv 59*a0abe9cdSEnji Cooper atf_check -e empty -s exit:0 install -m 0755 /dev/null wxyz 60c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000001 61c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000010 62c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000011 63c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000100 64c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000101 65c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000110 66c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00000111 67c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001000 68c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001001 69c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001010 70c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001011 71c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001100 72c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001101 73c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001110 74c36a2f46SEnji Cooper atf_check -e empty -s exit:0 touch 0b00001111 75c36a2f46SEnji Cooper} 76c36a2f46SEnji Cooper 77*a0abe9cdSEnji CooperKB=1024 78*a0abe9cdSEnji CooperMB=$(( 1024 * $KB )) 79*a0abe9cdSEnji CooperGB=$(( 1024 * $MB )) 80*a0abe9cdSEnji CooperTB=$(( 1024 * $GB )) 81*a0abe9cdSEnji CooperPB=$(( 1024 * $TB )) 82c36a2f46SEnji Cooper 83*a0abe9cdSEnji Coopercreate_test_inputs2() 84c36a2f46SEnji Cooper{ 85c36a2f46SEnji Cooper create_test_dir 86c36a2f46SEnji Cooper 87*a0abe9cdSEnji Cooper for filesize in 1 512 $(( 2 * $KB )) $(( 10 * $KB )) $(( 512 * $KB )); \ 88*a0abe9cdSEnji Cooper do 89*a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 \ 90*a0abe9cdSEnji Cooper dd if=/dev/zero of=${filesize}.file bs=1 \ 91*a0abe9cdSEnji Cooper count=1 oseek=${filesize} conv=sparse 92*a0abe9cdSEnji Cooper files="${files} ${filesize}.file" 93*a0abe9cdSEnji Cooper done 94c36a2f46SEnji Cooper 95*a0abe9cdSEnji Cooper for filesize in $MB $GB $TB; do 96*a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 \ 97*a0abe9cdSEnji Cooper dd if=/dev/zero of=${filesize}.file bs=$MB \ 98*a0abe9cdSEnji Cooper count=1 oseek=$(( $filesize / $MB )) conv=sparse 99*a0abe9cdSEnji Cooper files="${files} ${filesize}.file" 100c36a2f46SEnji Cooper done 101c36a2f46SEnji Cooper} 102c36a2f46SEnji Cooper 103c36a2f46SEnji Cooperatf_test_case A_flag 104c36a2f46SEnji CooperA_flag_head() 105c36a2f46SEnji Cooper{ 106c36a2f46SEnji Cooper atf_set "descr" "Verify -A support with unprivileged users" 107c36a2f46SEnji Cooper} 108c36a2f46SEnji Cooper 109c36a2f46SEnji CooperA_flag_body() 110c36a2f46SEnji Cooper{ 111c36a2f46SEnji Cooper create_test_dir 112c36a2f46SEnji Cooper 113c36a2f46SEnji Cooper atf_check -e empty -o empty -s exit:0 ls -A 114c36a2f46SEnji Cooper 115c36a2f46SEnji Cooper create_test_inputs 116c36a2f46SEnji Cooper 117c36a2f46SEnji Cooper WITH_A=$PWD/../with_A.out 118c36a2f46SEnji Cooper WITHOUT_A=$PWD/../without_A.out 119c36a2f46SEnji Cooper 120c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_A -s exit:0 ls -A 121c36a2f46SEnji Cooper atf_check -e empty -o save:$WITHOUT_A -s exit:0 ls 122c36a2f46SEnji Cooper 123c36a2f46SEnji Cooper echo "-A usage" 124c36a2f46SEnji Cooper cat $WITH_A 125c36a2f46SEnji Cooper echo "No -A usage" 126c36a2f46SEnji Cooper cat $WITHOUT_A 127c36a2f46SEnji Cooper 128c36a2f46SEnji Cooper for dot_path in '\.f' '\.g'; do 129c36a2f46SEnji Cooper atf_check -e empty -o not-empty -s exit:0 grep "${dot_path}" \ 130c36a2f46SEnji Cooper $WITH_A 131c36a2f46SEnji Cooper atf_check -e empty -o empty -s not-exit:0 grep "${dot_path}" \ 132c36a2f46SEnji Cooper $WITHOUT_A 133c36a2f46SEnji Cooper done 134c36a2f46SEnji Cooper} 135c36a2f46SEnji Cooper 136c36a2f46SEnji Cooperatf_test_case A_flag_implied_when_root 137c36a2f46SEnji CooperA_flag_implied_when_root_head() 138c36a2f46SEnji Cooper{ 139c36a2f46SEnji Cooper atf_set "descr" "Verify that -A is implied for root" 140c36a2f46SEnji Cooper atf_set "require.user" "root" 141c36a2f46SEnji Cooper} 142c36a2f46SEnji Cooper 143c36a2f46SEnji CooperA_flag_implied_when_root_body() 144c36a2f46SEnji Cooper{ 145c36a2f46SEnji Cooper create_test_dir 146c36a2f46SEnji Cooper 147c36a2f46SEnji Cooper atf_check -e empty -o empty -s exit:0 ls -A 148c36a2f46SEnji Cooper 149c36a2f46SEnji Cooper create_test_inputs 150c36a2f46SEnji Cooper 151c36a2f46SEnji Cooper WITH_EXPLICIT=$PWD/../with_explicit_A.out 152c36a2f46SEnji Cooper WITH_IMPLIED=$PWD/../with_implied_A.out 153c36a2f46SEnji Cooper 154c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_EXPLICIT -s exit:0 ls -A 155c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_IMPLIED -s exit:0 ls 156c36a2f46SEnji Cooper 157c36a2f46SEnji Cooper echo "Explicit -A usage" 158c36a2f46SEnji Cooper cat $WITH_EXPLICIT 159c36a2f46SEnji Cooper echo "Implicit -A usage" 160c36a2f46SEnji Cooper cat $WITH_IMPLIED 161c36a2f46SEnji Cooper 162c36a2f46SEnji Cooper atf_check_equal "$(cat $WITH_EXPLICIT)" "$(cat $WITH_IMPLIED)" 163c36a2f46SEnji Cooper} 164c36a2f46SEnji Cooper 165c36a2f46SEnji Cooperatf_test_case B_flag 166c36a2f46SEnji CooperB_flag_head() 167c36a2f46SEnji Cooper{ 168c36a2f46SEnji Cooper atf_set "descr" "Verify that the output from ls -B prints out non-printable characters" 169c36a2f46SEnji Cooper} 170c36a2f46SEnji Cooper 171c36a2f46SEnji CooperB_flag_body() 172c36a2f46SEnji Cooper{ 17314044e16SEnji Cooper atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" 174c36a2f46SEnji Cooper 175c36a2f46SEnji Cooper atf_check -e empty -o empty -s exit:0 touch "$(printf "y\013z")" 176c36a2f46SEnji Cooper atf_check -e empty -o match:'y\\013z' -s exit:0 ls -B 177c36a2f46SEnji Cooper} 178c36a2f46SEnji Cooper 179c36a2f46SEnji Cooperatf_test_case C_flag 180c36a2f46SEnji CooperC_flag_head() 181c36a2f46SEnji Cooper{ 182c36a2f46SEnji Cooper atf_set "descr" "Verify that the output from ls -C is multi-column, sorted down" 183c36a2f46SEnji Cooper} 184c36a2f46SEnji Cooper 185*a0abe9cdSEnji Cooperprint_index() 186*a0abe9cdSEnji Cooper{ 187*a0abe9cdSEnji Cooper local i=1 188*a0abe9cdSEnji Cooper local wanted_index=$1; shift 189*a0abe9cdSEnji Cooper 190*a0abe9cdSEnji Cooper while [ $i -le $wanted_index ]; do 191*a0abe9cdSEnji Cooper if [ $i -eq $wanted_index ]; then 192*a0abe9cdSEnji Cooper echo $1 193*a0abe9cdSEnji Cooper return 194*a0abe9cdSEnji Cooper fi 195*a0abe9cdSEnji Cooper shift 196*a0abe9cdSEnji Cooper : $(( i += 1 )) 197*a0abe9cdSEnji Cooper done 198*a0abe9cdSEnji Cooper} 199*a0abe9cdSEnji Cooper 200c36a2f46SEnji CooperC_flag_body() 201c36a2f46SEnji Cooper{ 202c36a2f46SEnji Cooper create_test_inputs 203c36a2f46SEnji Cooper 204c36a2f46SEnji Cooper WITH_C=$PWD/../with_C.out 205c36a2f46SEnji Cooper 206*a0abe9cdSEnji Cooper export COLUMNS=40 207c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_C -s exit:0 ls -C 208c36a2f46SEnji Cooper 209c36a2f46SEnji Cooper echo "With -C usage" 210c36a2f46SEnji Cooper cat $WITH_C 211c36a2f46SEnji Cooper 212*a0abe9cdSEnji Cooper paths=$(find -s . -mindepth 1 -maxdepth 1 \! -name '.*' -exec basename {} \; ) 213*a0abe9cdSEnji Cooper set -- $paths 214*a0abe9cdSEnji Cooper num_paths=$# 215*a0abe9cdSEnji Cooper num_columns=2 216*a0abe9cdSEnji Cooper 217*a0abe9cdSEnji Cooper max_num_paths_per_column=$(( $(( $num_paths + 1 )) / $num_columns )) 218*a0abe9cdSEnji Cooper 219*a0abe9cdSEnji Cooper local i=1 220*a0abe9cdSEnji Cooper while [ $i -le $max_num_paths_per_column ]; do 221*a0abe9cdSEnji Cooper column_1=$(print_index $i $paths) 222*a0abe9cdSEnji Cooper column_2=$(print_index $(( $i + $max_num_paths_per_column )) $paths) 223*a0abe9cdSEnji Cooper #echo "paths[$(( $i + $max_num_paths_per_column ))] = $column_2" 224*a0abe9cdSEnji Cooper expected_expr="$column_1" 225*a0abe9cdSEnji Cooper if [ -n "$column_2" ]; then 226*a0abe9cdSEnji Cooper expected_expr="$expected_expr[[:space:]]+$column_2" 227*a0abe9cdSEnji Cooper fi 228c36a2f46SEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 229*a0abe9cdSEnji Cooper egrep "$expected_expr" $WITH_C 230*a0abe9cdSEnji Cooper : $(( i += 1 )) 231*a0abe9cdSEnji Cooper done 232*a0abe9cdSEnji Cooper} 233*a0abe9cdSEnji Cooper 234*a0abe9cdSEnji Cooperatf_test_case D_flag 235*a0abe9cdSEnji CooperD_flag_head() 236*a0abe9cdSEnji Cooper{ 237*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -D modifies the time format used with ls -l" 238*a0abe9cdSEnji Cooper} 239*a0abe9cdSEnji Cooper 240*a0abe9cdSEnji CooperD_flag_body() 241*a0abe9cdSEnji Cooper{ 242*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 243*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$(stat -f '%c[[:space:]]+%N' a.file)" \ 244*a0abe9cdSEnji Cooper -s exit:0 ls -lD '%s' 245*a0abe9cdSEnji Cooper} 246*a0abe9cdSEnji Cooper 247*a0abe9cdSEnji Cooperatf_test_case F_flag 248*a0abe9cdSEnji CooperF_flag_head() 249*a0abe9cdSEnji Cooper{ 250*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -F prints out appropriate symbols after files" 251*a0abe9cdSEnji Cooper} 252*a0abe9cdSEnji Cooper 253*a0abe9cdSEnji CooperF_flag_body() 254*a0abe9cdSEnji Cooper{ 255*a0abe9cdSEnji Cooper create_test_inputs 256*a0abe9cdSEnji Cooper 257*a0abe9cdSEnji Cooper atf_check -e empty -s exit:0 \ 258*a0abe9cdSEnji Cooper sh -c "pid=${ATF_TMPDIR}/nc.pid; daemon -p \$pid nc -lU j; sleep 2; pkill -F \$pid" 259*a0abe9cdSEnji Cooper 260*a0abe9cdSEnji Cooper atf_check -e empty -o match:'a/' -s exit:0 ls -F 261*a0abe9cdSEnji Cooper atf_check -e empty -o match:'c@' -s exit:0 ls -F 262*a0abe9cdSEnji Cooper atf_check -e empty -o match:'h\|' -s exit:0 ls -F 263*a0abe9cdSEnji Cooper atf_check -e empty -o match:'j=' -s exit:0 ls -F 264*a0abe9cdSEnji Cooper #atf_check -e empty -o match:'<whiteout-file>%' -s exit:0 ls -F 265*a0abe9cdSEnji Cooper atf_check -e empty -o match:'stuv' -s exit:0 ls -F 266*a0abe9cdSEnji Cooper atf_check -e empty -o match:'wxyz\*' -s exit:0 ls -F 267*a0abe9cdSEnji Cooper} 268*a0abe9cdSEnji Cooper 269*a0abe9cdSEnji Cooperatf_test_case H_flag 270*a0abe9cdSEnji CooperH_flag_head() 271*a0abe9cdSEnji Cooper{ 272*a0abe9cdSEnji Cooper atf_set "descr" "Verify that ls -H follows symlinks" 273*a0abe9cdSEnji Cooper} 274*a0abe9cdSEnji Cooper 275*a0abe9cdSEnji CooperH_flag_body() 276*a0abe9cdSEnji Cooper{ 277*a0abe9cdSEnji Cooper create_test_inputs 278*a0abe9cdSEnji Cooper 279*a0abe9cdSEnji Cooper atf_check -e empty -o match:'1' -s exit:0 ls -H c 280c36a2f46SEnji Cooper} 281c36a2f46SEnji Cooper 282c36a2f46SEnji Cooperatf_test_case I_flag 283c36a2f46SEnji CooperI_flag_head() 284c36a2f46SEnji Cooper{ 285c36a2f46SEnji Cooper atf_set "descr" "Verify that the output from ls -I is the same as ls for an unprivileged user" 286c36a2f46SEnji Cooper} 287c36a2f46SEnji Cooper 288c36a2f46SEnji CooperI_flag_body() 289c36a2f46SEnji Cooper{ 290c36a2f46SEnji Cooper create_test_inputs 291c36a2f46SEnji Cooper 292c36a2f46SEnji Cooper WITH_I=$PWD/../with_I.out 293c36a2f46SEnji Cooper WITHOUT_I=$PWD/../without_I.out 294c36a2f46SEnji Cooper 295c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_I -s exit:0 ls -I 296c36a2f46SEnji Cooper atf_check -e empty -o save:$WITHOUT_I -s exit:0 ls 297c36a2f46SEnji Cooper 298c36a2f46SEnji Cooper echo "Explicit -I usage" 299c36a2f46SEnji Cooper cat $WITH_I 300c36a2f46SEnji Cooper echo "No -I usage" 301c36a2f46SEnji Cooper cat $WITHOUT_I 302c36a2f46SEnji Cooper 303c36a2f46SEnji Cooper atf_check_equal "$(cat $WITH_I)" "$(cat $WITHOUT_I)" 304c36a2f46SEnji Cooper} 305c36a2f46SEnji Cooper 306c36a2f46SEnji Cooperatf_test_case I_flag_voids_implied_A_flag_when_root 307c36a2f46SEnji CooperI_flag_voids_implied_A_flag_when_root_head() 308c36a2f46SEnji Cooper{ 309c36a2f46SEnji Cooper atf_set "descr" "Verify that -I voids out implied -A for root" 310c36a2f46SEnji Cooper atf_set "require.user" "root" 311c36a2f46SEnji Cooper} 312c36a2f46SEnji Cooper 313c36a2f46SEnji CooperI_flag_voids_implied_A_flag_when_root_body() 314c36a2f46SEnji Cooper{ 315c36a2f46SEnji Cooper create_test_inputs 316c36a2f46SEnji Cooper 317c36a2f46SEnji Cooper atf_check -o not-match:'\.f' -s exit:0 ls -I 318c36a2f46SEnji Cooper atf_check -o not-match:'\.g' -s exit:0 ls -I 319c36a2f46SEnji Cooper 320c36a2f46SEnji Cooper atf_check -o match:'\.f' -s exit:0 ls -A -I 321c36a2f46SEnji Cooper atf_check -o match:'\.g' -s exit:0 ls -A -I 322c36a2f46SEnji Cooper} 323c36a2f46SEnji Cooper 324*a0abe9cdSEnji Cooperatf_test_case L_flag 325*a0abe9cdSEnji CooperL_flag_head() 326*a0abe9cdSEnji Cooper{ 327*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -L prints out the symbolic link and conversely -P prints out the target for the symbolic link" 328*a0abe9cdSEnji Cooper} 329*a0abe9cdSEnji Cooper 330*a0abe9cdSEnji CooperL_flag_body() 331*a0abe9cdSEnji Cooper{ 332*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 ln -s target1/target2 link1 333*a0abe9cdSEnji Cooper atf_check -e empty -o match:link1 -s exit:0 ls -L 334*a0abe9cdSEnji Cooper atf_check -e empty -o not-match:target1/target2 -s exit:0 ls -L 335*a0abe9cdSEnji Cooper} 336*a0abe9cdSEnji Cooper 337*a0abe9cdSEnji Cooperatf_test_case R_flag 338*a0abe9cdSEnji CooperR_flag_head() 339*a0abe9cdSEnji Cooper{ 340*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -R prints out the directory contents recursively" 341*a0abe9cdSEnji Cooper} 342*a0abe9cdSEnji Cooper 343*a0abe9cdSEnji CooperR_flag_body() 344*a0abe9cdSEnji Cooper{ 345*a0abe9cdSEnji Cooper create_test_inputs 346*a0abe9cdSEnji Cooper 347*a0abe9cdSEnji Cooper WITH_R=$PWD/../with_R.out 348*a0abe9cdSEnji Cooper WITH_R_expected_output=$PWD/../with_R_expected.out 349*a0abe9cdSEnji Cooper 350*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_R -s exit:0 ls -R 351*a0abe9cdSEnji Cooper 352*a0abe9cdSEnji Cooper set -- . $(find -s . \! -name '.*' -type d) 353*a0abe9cdSEnji Cooper while [ $# -gt 0 ]; do 354*a0abe9cdSEnji Cooper dir=$1; shift 355*a0abe9cdSEnji Cooper [ "$dir" != "." ] && echo "$dir:" 356*a0abe9cdSEnji Cooper (cd $dir && ls -1A | sed -e '/^\./d') 357*a0abe9cdSEnji Cooper [ $# -ne 0 ] && echo 358*a0abe9cdSEnji Cooper done > $WITH_R_expected_output 359*a0abe9cdSEnji Cooper 360*a0abe9cdSEnji Cooper echo "-R usage" 361*a0abe9cdSEnji Cooper cat $WITH_R 362*a0abe9cdSEnji Cooper echo "-R expected output" 363*a0abe9cdSEnji Cooper cat $WITH_R_expected_output 364*a0abe9cdSEnji Cooper 365*a0abe9cdSEnji Cooper atf_check_equal "$(cat $WITH_R)" "$(cat $WITH_R_expected_output)" 366*a0abe9cdSEnji Cooper} 367*a0abe9cdSEnji Cooper 368*a0abe9cdSEnji Cooperatf_test_case S_flag 369*a0abe9cdSEnji CooperS_flag_head() 370*a0abe9cdSEnji Cooper{ 371*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -S sorts by file size, then by filename lexicographically" 372*a0abe9cdSEnji Cooper} 373*a0abe9cdSEnji Cooper 374*a0abe9cdSEnji CooperS_flag_body() 375*a0abe9cdSEnji Cooper{ 376*a0abe9cdSEnji Cooper create_test_dir 377*a0abe9cdSEnji Cooper 378*a0abe9cdSEnji Cooper file_list_dir=$PWD/../files 379*a0abe9cdSEnji Cooper 380*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 mkdir -p $file_list_dir 381*a0abe9cdSEnji Cooper 382*a0abe9cdSEnji Cooper create_test_inputs 383*a0abe9cdSEnji Cooper create_test_inputs2 384*a0abe9cdSEnji Cooper 385*a0abe9cdSEnji Cooper WITH_S=$PWD/../with_S.out 386*a0abe9cdSEnji Cooper WITHOUT_S=$PWD/../without_S.out 387*a0abe9cdSEnji Cooper 388*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_S ls -D '%s' -lS 389*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITHOUT_S ls -D '%s' -l 390*a0abe9cdSEnji Cooper 391*a0abe9cdSEnji Cooper WITH_S_parsed=$(awk '! /^total/ { print $7 }' $WITH_S) 392*a0abe9cdSEnji Cooper set -- $(awk '! /^total/ { print $5, $7 }' $WITHOUT_S) 393*a0abe9cdSEnji Cooper while [ $# -gt 0 ]; do 394*a0abe9cdSEnji Cooper size=$1; shift 395*a0abe9cdSEnji Cooper filename=$1; shift 396*a0abe9cdSEnji Cooper echo $filename >> $file_list_dir/${size} 397*a0abe9cdSEnji Cooper done 398*a0abe9cdSEnji Cooper file_lists=$(find $file_list_dir -type f -exec basename {} \; | sort -nr) 399*a0abe9cdSEnji Cooper WITHOUT_S_parsed=$(for file_list in $file_lists; do sort < $file_list_dir/$file_list; done) 400*a0abe9cdSEnji Cooper 401*a0abe9cdSEnji Cooper echo "-lS usage (parsed)" 402*a0abe9cdSEnji Cooper echo "$WITH_S_parsed" 403*a0abe9cdSEnji Cooper echo "-l usage (parsed)" 404*a0abe9cdSEnji Cooper echo "$WITHOUT_S_parsed" 405*a0abe9cdSEnji Cooper 406*a0abe9cdSEnji Cooper atf_check_equal "$WITHOUT_S_parsed" "$WITH_S_parsed" 407*a0abe9cdSEnji Cooper} 408*a0abe9cdSEnji Cooper 409*a0abe9cdSEnji Cooperatf_test_case T_flag 410*a0abe9cdSEnji CooperT_flag_head() 411*a0abe9cdSEnji Cooper{ 412*a0abe9cdSEnji Cooper atf_set "descr" "Verify -T support" 413*a0abe9cdSEnji Cooper} 414*a0abe9cdSEnji Cooper 415*a0abe9cdSEnji CooperT_flag_body() 416*a0abe9cdSEnji Cooper{ 417*a0abe9cdSEnji Cooper create_test_dir 418*a0abe9cdSEnji Cooper 419*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 420*a0abe9cdSEnji Cooper 421*a0abe9cdSEnji Cooper birthtime_in_secs=$(stat -f %B -t %s a.file) 422*a0abe9cdSEnji Cooper birthtime=$(date -j -f %s $birthtime_in_secs +"[[:space:]]+%b[[:space:]]+%e[[:space:]]+%H:%M:%S[[:space:]]+%Y") 423*a0abe9cdSEnji Cooper 424*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$birthtime"'[[:space:]]+a\.file' \ 425*a0abe9cdSEnji Cooper -s exit:0 ls -lT a.file 426*a0abe9cdSEnji Cooper} 427*a0abe9cdSEnji Cooper 428*a0abe9cdSEnji Cooperatf_test_case a_flag 429*a0abe9cdSEnji Coopera_flag_head() 430*a0abe9cdSEnji Cooper{ 431*a0abe9cdSEnji Cooper atf_set "descr" "Verify -a support" 432*a0abe9cdSEnji Cooper} 433*a0abe9cdSEnji Cooper 434*a0abe9cdSEnji Coopera_flag_body() 435*a0abe9cdSEnji Cooper{ 436*a0abe9cdSEnji Cooper create_test_dir 437*a0abe9cdSEnji Cooper 438*a0abe9cdSEnji Cooper # Make sure "." and ".." show up with -a 439*a0abe9cdSEnji Cooper atf_check -e empty -o match:'\.[[:space:]]+\.\.' -s exit:0 ls -ax 440*a0abe9cdSEnji Cooper 441*a0abe9cdSEnji Cooper create_test_inputs 442*a0abe9cdSEnji Cooper 443*a0abe9cdSEnji Cooper WITH_a=$PWD/../with_a.out 444*a0abe9cdSEnji Cooper WITHOUT_a=$PWD/../without_a.out 445*a0abe9cdSEnji Cooper 446*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_a -s exit:0 ls -a 447*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITHOUT_a -s exit:0 ls 448*a0abe9cdSEnji Cooper 449*a0abe9cdSEnji Cooper echo "-a usage" 450*a0abe9cdSEnji Cooper cat $WITH_a 451*a0abe9cdSEnji Cooper echo "No -a usage" 452*a0abe9cdSEnji Cooper cat $WITHOUT_a 453*a0abe9cdSEnji Cooper 454*a0abe9cdSEnji Cooper for dot_path in '\.f' '\.g'; do 455*a0abe9cdSEnji Cooper atf_check -e empty -o not-empty -s exit:0 grep "${dot_path}" \ 456*a0abe9cdSEnji Cooper $WITH_a 457*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s not-exit:0 grep "${dot_path}" \ 458*a0abe9cdSEnji Cooper $WITHOUT_a 459*a0abe9cdSEnji Cooper done 460*a0abe9cdSEnji Cooper} 461*a0abe9cdSEnji Cooper 462*a0abe9cdSEnji Cooperatf_test_case b_flag 463*a0abe9cdSEnji Cooperb_flag_head() 464*a0abe9cdSEnji Cooper{ 465*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -b prints out non-printable characters" 466*a0abe9cdSEnji Cooper} 467*a0abe9cdSEnji Cooper 468*a0abe9cdSEnji Cooperb_flag_body() 469*a0abe9cdSEnji Cooper{ 470*a0abe9cdSEnji Cooper atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" 471*a0abe9cdSEnji Cooper 472*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch "$(printf "y\013z")" 473*a0abe9cdSEnji Cooper atf_check -e empty -o match:'y\\vz' -s exit:0 ls -b 474*a0abe9cdSEnji Cooper} 475*a0abe9cdSEnji Cooper 476*a0abe9cdSEnji Cooperatf_test_case d_flag 477*a0abe9cdSEnji Cooperd_flag_head() 478*a0abe9cdSEnji Cooper{ 479*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -d doesn't descend down directories" 480*a0abe9cdSEnji Cooper} 481*a0abe9cdSEnji Cooper 482*a0abe9cdSEnji Cooperd_flag_body() 483*a0abe9cdSEnji Cooper{ 484*a0abe9cdSEnji Cooper create_test_dir 485*a0abe9cdSEnji Cooper 486*a0abe9cdSEnji Cooper output=$PWD/../output 487*a0abe9cdSEnji Cooper 488*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 mkdir -p a/b 489*a0abe9cdSEnji Cooper 490*a0abe9cdSEnji Cooper for path in . $PWD a; do 491*a0abe9cdSEnji Cooper atf_check -e empty -o save:$output -s exit:0 ls -d $path 492*a0abe9cdSEnji Cooper atf_check_equal "$(cat $output)" "$path" 493*a0abe9cdSEnji Cooper done 494*a0abe9cdSEnji Cooper} 495*a0abe9cdSEnji Cooper 496*a0abe9cdSEnji Cooperatf_test_case f_flag 497*a0abe9cdSEnji Cooperf_flag_head() 498*a0abe9cdSEnji Cooper{ 499*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -f prints out the contents of a directory unsorted" 500*a0abe9cdSEnji Cooper} 501*a0abe9cdSEnji Cooper 502*a0abe9cdSEnji Cooperf_flag_body() 503*a0abe9cdSEnji Cooper{ 504*a0abe9cdSEnji Cooper create_test_inputs 505*a0abe9cdSEnji Cooper 506*a0abe9cdSEnji Cooper output=$PWD/../output 507*a0abe9cdSEnji Cooper 508*a0abe9cdSEnji Cooper # XXX: I don't have enough understanding of how the algorithm works yet 509*a0abe9cdSEnji Cooper # to determine more than the fact that all the entries printed out 510*a0abe9cdSEnji Cooper # exist 511*a0abe9cdSEnji Cooper paths=$(find -s . -mindepth 1 -maxdepth 1 \! -name '.*' -exec basename {} \; ) 512*a0abe9cdSEnji Cooper 513*a0abe9cdSEnji Cooper atf_check -e empty -o save:$output -s exit:0 ls -f 514*a0abe9cdSEnji Cooper 515*a0abe9cdSEnji Cooper for path in $paths; do 516*a0abe9cdSEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 517*a0abe9cdSEnji Cooper egrep "^$path$" $output 518*a0abe9cdSEnji Cooper done 519*a0abe9cdSEnji Cooper} 520*a0abe9cdSEnji Cooper 521*a0abe9cdSEnji Cooperatf_test_case g_flag 522*a0abe9cdSEnji Cooperg_flag_head() 523*a0abe9cdSEnji Cooper{ 524*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -g does nothing (compatibility flag)" 525*a0abe9cdSEnji Cooper} 526*a0abe9cdSEnji Cooper 527*a0abe9cdSEnji Cooperg_flag_body() 528*a0abe9cdSEnji Cooper{ 529*a0abe9cdSEnji Cooper create_test_inputs2 530*a0abe9cdSEnji Cooper for file in $files; do 531*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$(ls -a $file)" -s exit:0 \ 532*a0abe9cdSEnji Cooper ls -ag $file 533*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$(ls -la $file)" -s exit:0 \ 534*a0abe9cdSEnji Cooper ls -alg $file 535*a0abe9cdSEnji Cooper done 536*a0abe9cdSEnji Cooper} 537*a0abe9cdSEnji Cooper 538*a0abe9cdSEnji Cooperatf_test_case h_flag 539*a0abe9cdSEnji Cooperh_flag_head() 540*a0abe9cdSEnji Cooper{ 541*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -h prints out the humanized units for file sizes with ls -l" 542*a0abe9cdSEnji Cooper atf_set "require.files" "/usr/bin/bc" 543*a0abe9cdSEnji Cooper} 544*a0abe9cdSEnji Cooper 545*a0abe9cdSEnji Cooperh_flag_body() 546*a0abe9cdSEnji Cooper{ 547*a0abe9cdSEnji Cooper # XXX: this test doesn't currently show how 999 bytes will be 999B, 548*a0abe9cdSEnji Cooper # but 1000 bytes will be 1.0K, due to how humanize_number(3) works. 549*a0abe9cdSEnji Cooper create_test_inputs2 550*a0abe9cdSEnji Cooper for file in $files; do 551*a0abe9cdSEnji Cooper file_size=$(stat -f '%z' "$file") || \ 552*a0abe9cdSEnji Cooper atf_fail "stat'ing $file failed" 553*a0abe9cdSEnji Cooper scale=2 554*a0abe9cdSEnji Cooper if [ $file_size -lt $KB ]; then 555*a0abe9cdSEnji Cooper divisor=1 556*a0abe9cdSEnji Cooper scale=0 557*a0abe9cdSEnji Cooper suffix=B 558*a0abe9cdSEnji Cooper elif [ $file_size -lt $MB ]; then 559*a0abe9cdSEnji Cooper divisor=$KB 560*a0abe9cdSEnji Cooper suffix=K 561*a0abe9cdSEnji Cooper elif [ $file_size -lt $GB ]; then 562*a0abe9cdSEnji Cooper divisor=$MB 563*a0abe9cdSEnji Cooper suffix=M 564*a0abe9cdSEnji Cooper elif [ $file_size -lt $TB ]; then 565*a0abe9cdSEnji Cooper divisor=$GB 566*a0abe9cdSEnji Cooper suffix=G 567*a0abe9cdSEnji Cooper elif [ $file_size -lt $PB ]; then 568*a0abe9cdSEnji Cooper divisor=$TB 569*a0abe9cdSEnji Cooper suffix=T 570*a0abe9cdSEnji Cooper else 571*a0abe9cdSEnji Cooper divisor=$PB 572*a0abe9cdSEnji Cooper suffix=P 573*a0abe9cdSEnji Cooper fi 574*a0abe9cdSEnji Cooper 575*a0abe9cdSEnji Cooper bc_expr="$(printf "scale=%s\n%s/%s\nquit" $scale $file_size $divisor)" 576*a0abe9cdSEnji Cooper size_humanized=$(bc -e "$bc_expr" | tr '.' '\.' | sed -e 's,\.00,,') 577*a0abe9cdSEnji Cooper 578*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$size_humanized.+$file" \ 579*a0abe9cdSEnji Cooper -s exit:0 ls -hl $file 580*a0abe9cdSEnji Cooper done 581*a0abe9cdSEnji Cooper} 582*a0abe9cdSEnji Cooper 583*a0abe9cdSEnji Cooperatf_test_case i_flag 584*a0abe9cdSEnji Cooperi_flag_head() 585*a0abe9cdSEnji Cooper{ 586*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -i prints out the inode for files" 587*a0abe9cdSEnji Cooper} 588*a0abe9cdSEnji Cooper 589*a0abe9cdSEnji Cooperi_flag_body() 590*a0abe9cdSEnji Cooper{ 591*a0abe9cdSEnji Cooper create_test_inputs 592*a0abe9cdSEnji Cooper 593*a0abe9cdSEnji Cooper paths=$(find -L . -mindepth 1) 594*a0abe9cdSEnji Cooper [ -n "$paths" ] || atf_skip 'Could not find any paths to iterate over (!)' 595*a0abe9cdSEnji Cooper 596*a0abe9cdSEnji Cooper for path in $paths; do 597*a0abe9cdSEnji Cooper atf_check -e empty \ 598*a0abe9cdSEnji Cooper -o match:"$(stat -f '[[:space:]]*%i[[:space:]]+%N' $path)" \ 599*a0abe9cdSEnji Cooper -s exit:0 ls -d1i $path 600*a0abe9cdSEnji Cooper done 601*a0abe9cdSEnji Cooper} 602*a0abe9cdSEnji Cooper 603*a0abe9cdSEnji Cooperatf_test_case k_flag 604*a0abe9cdSEnji Cooperk_flag_head() 605*a0abe9cdSEnji Cooper{ 606*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -k prints out the size with a block size of 1kB" 607*a0abe9cdSEnji Cooper} 608*a0abe9cdSEnji Cooper 609*a0abe9cdSEnji Cooperk_flag_body() 610*a0abe9cdSEnji Cooper{ 611*a0abe9cdSEnji Cooper create_test_inputs2 612*a0abe9cdSEnji Cooper for file in $files; do 613*a0abe9cdSEnji Cooper atf_check -e empty \ 614*a0abe9cdSEnji Cooper -o match:"[[:space:]]+$(stat -f "%z" $file)[[:space:]]+.+[[:space:]]+$file" ls -lk $file 615*a0abe9cdSEnji Cooper done 616*a0abe9cdSEnji Cooper} 617*a0abe9cdSEnji Cooper 618*a0abe9cdSEnji Cooperatf_test_case l_flag 619*a0abe9cdSEnji Cooperl_flag_head() 620*a0abe9cdSEnji Cooper{ 621*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -l prints out the output in long format" 622*a0abe9cdSEnji Cooper} 623*a0abe9cdSEnji Cooper 624*a0abe9cdSEnji Cooperl_flag_body() 625*a0abe9cdSEnji Cooper{ 626*a0abe9cdSEnji Cooper 627*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 628*a0abe9cdSEnji Cooper 629*a0abe9cdSEnji Cooper birthtime_in_secs=$(stat -f "%B" -t "%s" a.file) 630*a0abe9cdSEnji Cooper birthtime=$(date -j -f "%s" $birthtime_in_secs +"%b[[:space:]]+%e[[:space:]]+%H:%M") 631*a0abe9cdSEnji Cooper 632*a0abe9cdSEnji Cooper expected_output=$(stat -f "%Sp[[:space:]]+%l[[:space:]]+%Su[[:space:]]+%Sg[[:space:]]+%z[[:space:]]+$birthtime[[:space:]]+a\\.file" a.file) 633*a0abe9cdSEnji Cooper 634*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$expected_output" -s exit:0 ls -l a.file 635*a0abe9cdSEnji Cooper} 636*a0abe9cdSEnji Cooper 637*a0abe9cdSEnji Cooperatf_test_case lcomma_flag 638c36a2f46SEnji Cooperlcomma_flag_head() 639c36a2f46SEnji Cooper{ 640*a0abe9cdSEnji Cooper atf_set "descr" "Verify that -l, prints out the size with ',' delimiters" 641c36a2f46SEnji Cooper} 642c36a2f46SEnji Cooper 643c36a2f46SEnji Cooperlcomma_flag_body() 644c36a2f46SEnji Cooper{ 645c36a2f46SEnji Cooper create_test_inputs 646c36a2f46SEnji Cooper 647c36a2f46SEnji Cooper atf_check \ 648c36a2f46SEnji Cooper -o match:'\-rw\-r\-\-r\-\-[[:space:]]+.+[[:space:]]+1,000[[:space:]]+.+i' \ 649c36a2f46SEnji Cooper env LC_ALL=en_US.ISO8859-1 ls -l, i 650c36a2f46SEnji Cooper} 651c36a2f46SEnji Cooper 652*a0abe9cdSEnji Cooperatf_test_case m_flag 653*a0abe9cdSEnji Cooperm_flag_head() 654*a0abe9cdSEnji Cooper{ 655*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -m is comma-separated" 656*a0abe9cdSEnji Cooper} 657*a0abe9cdSEnji Cooper 658*a0abe9cdSEnji Cooperm_flag_body() 659*a0abe9cdSEnji Cooper{ 660*a0abe9cdSEnji Cooper create_test_dir 661*a0abe9cdSEnji Cooper 662*a0abe9cdSEnji Cooper output=$PWD/../output 663*a0abe9cdSEnji Cooper 664*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch ,, "a,b " c d e 665*a0abe9cdSEnji Cooper 666*a0abe9cdSEnji Cooper atf_check -e empty -o save:$output -s exit:0 ls -m 667*a0abe9cdSEnji Cooper 668*a0abe9cdSEnji Cooper atf_check_equal "$(cat $output)" ",,, a,b , c, d, e" 669*a0abe9cdSEnji Cooper} 670*a0abe9cdSEnji Cooper 671*a0abe9cdSEnji Cooperatf_test_case n_flag 672*a0abe9cdSEnji Coopern_flag_head() 673*a0abe9cdSEnji Cooper{ 674*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -n prints out numeric GIDs/UIDs instead of symbolic GIDs/UIDs" 675*a0abe9cdSEnji Cooper atf_set "require.user" "root" 676*a0abe9cdSEnji Cooper} 677*a0abe9cdSEnji Cooper 678*a0abe9cdSEnji Coopern_flag_body() 679*a0abe9cdSEnji Cooper{ 680*a0abe9cdSEnji Cooper daemon_gid=$(id -g daemon) || atf_skip "could not resolve gid for daemon (!)" 681*a0abe9cdSEnji Cooper nobody_uid=$(id -u nobody) || atf_skip "could not resolve uid for nobody (!)" 682*a0abe9cdSEnji Cooper 683*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 684*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 chown $nobody_uid:$daemon_gid a.file 685*a0abe9cdSEnji Cooper 686*a0abe9cdSEnji Cooper atf_check -e empty \ 687*a0abe9cdSEnji Cooper -o match:'\-rw\-r\-\-r\-\-[[:space:]]+1[[:space:]]+'"$nobody_uid[[:space:]]+$daemon_gid"'[[:space:]]+.+a\.file' \ 688*a0abe9cdSEnji Cooper ls -ln a.file 689*a0abe9cdSEnji Cooper 690*a0abe9cdSEnji Cooper} 691*a0abe9cdSEnji Cooper 692*a0abe9cdSEnji Cooperatf_test_case o_flag 693*a0abe9cdSEnji Coopero_flag_head() 694*a0abe9cdSEnji Cooper{ 695*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -o prints out the chflag values or '-' if none are set" 696*a0abe9cdSEnji Cooper atf_set "require.user" "root" 697*a0abe9cdSEnji Cooper} 698*a0abe9cdSEnji Cooper 699*a0abe9cdSEnji Coopero_flag_body() 700*a0abe9cdSEnji Cooper{ 701*a0abe9cdSEnji Cooper local size=12345 702*a0abe9cdSEnji Cooper 703*a0abe9cdSEnji Cooper create_test_dir 704*a0abe9cdSEnji Cooper 705*a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 dd if=/dev/zero of=a.file \ 706*a0abe9cdSEnji Cooper bs=$size count=1 707*a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 dd if=/dev/zero of=b.file \ 708*a0abe9cdSEnji Cooper bs=$size count=1 709*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 chflags uarch a.file 710*a0abe9cdSEnji Cooper 711*a0abe9cdSEnji Cooper atf_check -e empty -o match:"[[:space:]]+uarch[[:space:]]$size+.+a\\.file" \ 712*a0abe9cdSEnji Cooper -s exit:0 ls -lo a.file 713*a0abe9cdSEnji Cooper atf_check -e empty -o match:"[[:space:]]+\\-[[:space:]]$size+.+b\\.file" \ 714*a0abe9cdSEnji Cooper -s exit:0 ls -lo b.file 715*a0abe9cdSEnji Cooper} 716*a0abe9cdSEnji Cooper 717*a0abe9cdSEnji Cooperatf_test_case p_flag 718*a0abe9cdSEnji Cooperp_flag_head() 719*a0abe9cdSEnji Cooper{ 720*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -p prints out '/' after directories" 721*a0abe9cdSEnji Cooper} 722*a0abe9cdSEnji Cooper 723*a0abe9cdSEnji Cooperp_flag_body() 724*a0abe9cdSEnji Cooper{ 725*a0abe9cdSEnji Cooper create_test_inputs 726*a0abe9cdSEnji Cooper 727*a0abe9cdSEnji Cooper paths=$(find -L .) 728*a0abe9cdSEnji Cooper [ -n "$paths" ] || atf_skip 'Could not find any paths to iterate over (!)' 729*a0abe9cdSEnji Cooper 730*a0abe9cdSEnji Cooper for path in $paths; do 731*a0abe9cdSEnji Cooper suffix= 732*a0abe9cdSEnji Cooper # If path is not a symlink and is a directory, then the suffix 733*a0abe9cdSEnji Cooper # must be "/". 734*a0abe9cdSEnji Cooper if [ ! -L "${path}" -a -d "$path" ]; then 735*a0abe9cdSEnji Cooper suffix=/ 736*a0abe9cdSEnji Cooper fi 737*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$path${suffix}" -s exit:0 \ 738*a0abe9cdSEnji Cooper ls -dp $path 739*a0abe9cdSEnji Cooper done 740*a0abe9cdSEnji Cooper} 741*a0abe9cdSEnji Cooper 742*a0abe9cdSEnji Cooperatf_test_case q_flag_and_w_flag 743*a0abe9cdSEnji Cooperq_flag_and_w_flag_head() 744*a0abe9cdSEnji Cooper{ 745*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -q prints out '?' for ESC and ls -w prints out the escape character" 746*a0abe9cdSEnji Cooper} 747*a0abe9cdSEnji Cooper 748*a0abe9cdSEnji Cooperq_flag_and_w_flag_body() 749*a0abe9cdSEnji Cooper{ 750*a0abe9cdSEnji Cooper atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" 751*a0abe9cdSEnji Cooper 752*a0abe9cdSEnji Cooper create_test_dir 753*a0abe9cdSEnji Cooper 754*a0abe9cdSEnji Cooper test_file="$(printf "y\01z")" 755*a0abe9cdSEnji Cooper 756*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch "$test_file" 757*a0abe9cdSEnji Cooper 758*a0abe9cdSEnji Cooper atf_check -e empty -o match:'y\?z' -s exit:0 ls -q "$test_file" 759*a0abe9cdSEnji Cooper atf_check -e empty -o match:"$test_file" -s exit:0 ls -w "$test_file" 760*a0abe9cdSEnji Cooper} 761*a0abe9cdSEnji Cooper 762*a0abe9cdSEnji Cooperatf_test_case r_flag 763*a0abe9cdSEnji Cooperr_flag_head() 764*a0abe9cdSEnji Cooper{ 765*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -r sorts the same way as reverse sorting with sort(1)" 766*a0abe9cdSEnji Cooper} 767*a0abe9cdSEnji Cooper 768*a0abe9cdSEnji Cooperr_flag_body() 769*a0abe9cdSEnji Cooper{ 770*a0abe9cdSEnji Cooper create_test_inputs 771*a0abe9cdSEnji Cooper 772*a0abe9cdSEnji Cooper WITH_r=$PWD/../with_r.out 773*a0abe9cdSEnji Cooper WITH_sort=$PWD/../with_sort.out 774*a0abe9cdSEnji Cooper 775*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_r -s exit:0 ls -1r 776*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_sort -s exit:0 sh -c 'ls -1 | sort -r' 777*a0abe9cdSEnji Cooper 778*a0abe9cdSEnji Cooper echo "Sorted with -r" 779*a0abe9cdSEnji Cooper cat $WITH_r 780*a0abe9cdSEnji Cooper echo "Reverse sorted with sort(1)" 781*a0abe9cdSEnji Cooper cat $WITH_sort 782*a0abe9cdSEnji Cooper 783*a0abe9cdSEnji Cooper atf_check_equal "$(cat $WITH_r)" "$(cat $WITH_sort)" 784*a0abe9cdSEnji Cooper} 785*a0abe9cdSEnji Cooper 786*a0abe9cdSEnji Cooperatf_test_case s_flag 787*a0abe9cdSEnji Coopers_flag_head() 788*a0abe9cdSEnji Cooper{ 789*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -s matches the output from stat(1)" 790*a0abe9cdSEnji Cooper} 791*a0abe9cdSEnji Cooper 792*a0abe9cdSEnji Coopers_flag_body() 793*a0abe9cdSEnji Cooper{ 794*a0abe9cdSEnji Cooper create_test_inputs2 795*a0abe9cdSEnji Cooper for file in $files; do 796*a0abe9cdSEnji Cooper atf_check -e empty \ 797*a0abe9cdSEnji Cooper -o match:"$(stat -f "%b" $file)[[:space:]]+$file" ls -s $file 798*a0abe9cdSEnji Cooper done 799*a0abe9cdSEnji Cooper} 800*a0abe9cdSEnji Cooper 801*a0abe9cdSEnji Cooperatf_test_case t_flag 802*a0abe9cdSEnji Coopert_flag_head() 803*a0abe9cdSEnji Cooper{ 804*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -t sorts by modification time" 805*a0abe9cdSEnji Cooper} 806*a0abe9cdSEnji Cooper 807*a0abe9cdSEnji Coopert_flag_body() 808*a0abe9cdSEnji Cooper{ 809*a0abe9cdSEnji Cooper create_test_dir 810*a0abe9cdSEnji Cooper 811*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 812*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch b.file 813*a0abe9cdSEnji Cooper sync 814*a0abe9cdSEnji Cooper 815*a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file' -s exit:0 sh -c 'ls -lt | tail -n 1' 816*a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file.*a\.file' -s exit:0 ls -Ct 817*a0abe9cdSEnji Cooper 818*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 rm a.file 819*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 sh -c 'echo "i am a" > a.file' 820*a0abe9cdSEnji Cooper sync 821*a0abe9cdSEnji Cooper 822*a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lt | tail -n 1' 823*a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Ct 824*a0abe9cdSEnji Cooper} 825*a0abe9cdSEnji Cooper 826*a0abe9cdSEnji Cooperatf_test_case u_flag 827*a0abe9cdSEnji Cooperu_flag_head() 828*a0abe9cdSEnji Cooper{ 829*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -u sorts by last access" 830*a0abe9cdSEnji Cooper} 831*a0abe9cdSEnji Cooper 832*a0abe9cdSEnji Cooperu_flag_body() 833*a0abe9cdSEnji Cooper{ 834*a0abe9cdSEnji Cooper create_test_dir 835*a0abe9cdSEnji Cooper 836*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 837*a0abe9cdSEnji Cooper sync 838*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch b.file 839*a0abe9cdSEnji Cooper sync 840*a0abe9cdSEnji Cooper 841*a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lu | tail -n 1' 842*a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Cu 843*a0abe9cdSEnji Cooper 844*a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 sh -c 'echo "i am a" > a.file' 845*a0abe9cdSEnji Cooper sync 846*a0abe9cdSEnji Cooper atf_check -e empty -o match:'i am a' -s exit:0 cat a.file 847*a0abe9cdSEnji Cooper sync 848*a0abe9cdSEnji Cooper 849*a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lu | tail -n 1' 850*a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Cu 851*a0abe9cdSEnji Cooper} 852*a0abe9cdSEnji Cooper 853*a0abe9cdSEnji Cooperatf_test_case x_flag 854c36a2f46SEnji Cooperx_flag_head() 855c36a2f46SEnji Cooper{ 856*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -x is multi-column, sorted across" 857c36a2f46SEnji Cooper} 858c36a2f46SEnji Cooper 859c36a2f46SEnji Cooperx_flag_body() 860c36a2f46SEnji Cooper{ 861c36a2f46SEnji Cooper create_test_inputs 862c36a2f46SEnji Cooper 863c36a2f46SEnji Cooper WITH_x=$PWD/../with_x.out 864c36a2f46SEnji Cooper 865c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_x -s exit:0 ls -x 866c36a2f46SEnji Cooper 867c36a2f46SEnji Cooper echo "With -x usage" 868c36a2f46SEnji Cooper cat $WITH_x 869c36a2f46SEnji Cooper 870c36a2f46SEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 871c36a2f46SEnji Cooper egrep "a[[:space:]]+c[[:space:]]+d[[:space:]]+e[[:space:]]+h" $WITH_x 872c36a2f46SEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 873*a0abe9cdSEnji Cooper egrep "i[[:space:]]+klmn[[:space:]]+opqr[[:space:]]+stuv[[:space:]]+wxyz" $WITH_x 874c36a2f46SEnji Cooper} 875c36a2f46SEnji Cooper 876*a0abe9cdSEnji Cooperatf_test_case y_flag 877*a0abe9cdSEnji Coopery_flag_head() 878*a0abe9cdSEnji Cooper{ 879*a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -y sorts the same way as sort(1)" 880*a0abe9cdSEnji Cooper} 881*a0abe9cdSEnji Cooper 882*a0abe9cdSEnji Coopery_flag_body() 883*a0abe9cdSEnji Cooper{ 884*a0abe9cdSEnji Cooper create_test_inputs 885*a0abe9cdSEnji Cooper 886*a0abe9cdSEnji Cooper WITH_sort=$PWD/../with_sort.out 887*a0abe9cdSEnji Cooper WITH_y=$PWD/../with_y.out 888*a0abe9cdSEnji Cooper 889*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_sort -s exit:0 sh -c 'ls -1 | sort' 890*a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_y -s exit:0 ls -1y 891*a0abe9cdSEnji Cooper 892*a0abe9cdSEnji Cooper echo "Sorted with sort(1)" 893*a0abe9cdSEnji Cooper cat $WITH_sort 894*a0abe9cdSEnji Cooper echo "Sorted with -y" 895*a0abe9cdSEnji Cooper cat $WITH_y 896*a0abe9cdSEnji Cooper 897*a0abe9cdSEnji Cooper atf_check_equal "$(cat $WITH_sort)" "$(cat $WITH_y)" 898*a0abe9cdSEnji Cooper} 899*a0abe9cdSEnji Cooper 900*a0abe9cdSEnji Cooperatf_test_case 1_flag 901c36a2f46SEnji Cooper1_flag_head() 902c36a2f46SEnji Cooper{ 903c36a2f46SEnji Cooper atf_set "descr" "Verify that -1 prints out one item per line" 904c36a2f46SEnji Cooper} 905c36a2f46SEnji Cooper 906c36a2f46SEnji Cooper1_flag_body() 907c36a2f46SEnji Cooper{ 908c36a2f46SEnji Cooper create_test_inputs 909c36a2f46SEnji Cooper 910c36a2f46SEnji Cooper WITH_1=$PWD/../with_1.out 911c36a2f46SEnji Cooper WITHOUT_1=$PWD/../without_1.out 912c36a2f46SEnji Cooper 913c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_1 -s exit:0 ls -1 914c36a2f46SEnji Cooper atf_check -e empty -o save:$WITHOUT_1 -s exit:0 \ 915c36a2f46SEnji Cooper sh -c 'for i in $(ls); do echo $i; done' 916c36a2f46SEnji Cooper 917c36a2f46SEnji Cooper echo "Explicit -1 usage" 918c36a2f46SEnji Cooper cat $WITH_1 919c36a2f46SEnji Cooper echo "No -1 usage" 920c36a2f46SEnji Cooper cat $WITHOUT_1 921c36a2f46SEnji Cooper 922c36a2f46SEnji Cooper atf_check_equal "$(cat $WITH_1)" "$(cat $WITHOUT_1)" 923c36a2f46SEnji Cooper} 924c36a2f46SEnji Cooper 925c36a2f46SEnji Cooperatf_init_test_cases() 926c36a2f46SEnji Cooper{ 927c36a2f46SEnji Cooper 928c36a2f46SEnji Cooper atf_add_test_case A_flag 929c36a2f46SEnji Cooper atf_add_test_case A_flag_implied_when_root 930c36a2f46SEnji Cooper atf_add_test_case B_flag 931c36a2f46SEnji Cooper atf_add_test_case C_flag 932*a0abe9cdSEnji Cooper atf_add_test_case D_flag 933*a0abe9cdSEnji Cooper atf_add_test_case F_flag 934c36a2f46SEnji Cooper #atf_add_test_case G_flag 935*a0abe9cdSEnji Cooper atf_add_test_case H_flag 936c36a2f46SEnji Cooper atf_add_test_case I_flag 937c36a2f46SEnji Cooper atf_add_test_case I_flag_voids_implied_A_flag_when_root 938*a0abe9cdSEnji Cooper atf_add_test_case L_flag 939c36a2f46SEnji Cooper #atf_add_test_case P_flag 940*a0abe9cdSEnji Cooper atf_add_test_case R_flag 941*a0abe9cdSEnji Cooper atf_add_test_case S_flag 942*a0abe9cdSEnji Cooper atf_add_test_case T_flag 943c36a2f46SEnji Cooper #atf_add_test_case U_flag 944c36a2f46SEnji Cooper #atf_add_test_case W_flag 945c36a2f46SEnji Cooper #atf_add_test_case Z_flag 946c36a2f46SEnji Cooper atf_add_test_case a_flag 947*a0abe9cdSEnji Cooper atf_add_test_case b_flag 948c36a2f46SEnji Cooper #atf_add_test_case c_flag 949*a0abe9cdSEnji Cooper atf_add_test_case d_flag 950*a0abe9cdSEnji Cooper atf_add_test_case f_flag 951*a0abe9cdSEnji Cooper atf_add_test_case g_flag 952*a0abe9cdSEnji Cooper atf_add_test_case h_flag 953*a0abe9cdSEnji Cooper atf_add_test_case i_flag 954*a0abe9cdSEnji Cooper atf_add_test_case k_flag 955*a0abe9cdSEnji Cooper atf_add_test_case l_flag 956c36a2f46SEnji Cooper atf_add_test_case lcomma_flag 957*a0abe9cdSEnji Cooper atf_add_test_case m_flag 958*a0abe9cdSEnji Cooper atf_add_test_case n_flag 959*a0abe9cdSEnji Cooper atf_add_test_case o_flag 960*a0abe9cdSEnji Cooper atf_add_test_case p_flag 961*a0abe9cdSEnji Cooper atf_add_test_case q_flag_and_w_flag 962*a0abe9cdSEnji Cooper atf_add_test_case r_flag 963*a0abe9cdSEnji Cooper atf_add_test_case s_flag 964*a0abe9cdSEnji Cooper atf_add_test_case t_flag 965*a0abe9cdSEnji Cooper atf_add_test_case u_flag 966c36a2f46SEnji Cooper atf_add_test_case x_flag 967*a0abe9cdSEnji Cooper atf_add_test_case y_flag 968c36a2f46SEnji Cooper atf_add_test_case 1_flag 969c36a2f46SEnji Cooper} 970