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