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 48a0abe9cdSEnji 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 59a0abe9cdSEnji 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 75f46d1be6SEnji Cooper 76f46d1be6SEnji Cooper atf_check -e empty -s exit:0 sync 77c36a2f46SEnji Cooper} 78c36a2f46SEnji Cooper 79a0abe9cdSEnji CooperKB=1024 80a0abe9cdSEnji CooperMB=$(( 1024 * $KB )) 81a0abe9cdSEnji CooperGB=$(( 1024 * $MB )) 82a0abe9cdSEnji CooperTB=$(( 1024 * $GB )) 83a0abe9cdSEnji CooperPB=$(( 1024 * $TB )) 84c36a2f46SEnji Cooper 85a0abe9cdSEnji Coopercreate_test_inputs2() 86c36a2f46SEnji Cooper{ 87c36a2f46SEnji Cooper create_test_dir 88c36a2f46SEnji Cooper 89a0abe9cdSEnji Cooper for filesize in 1 512 $(( 2 * $KB )) $(( 10 * $KB )) $(( 512 * $KB )); \ 90a0abe9cdSEnji Cooper do 91a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 \ 92a0abe9cdSEnji Cooper dd if=/dev/zero of=${filesize}.file bs=1 \ 93a0abe9cdSEnji Cooper count=1 oseek=${filesize} conv=sparse 94a0abe9cdSEnji Cooper files="${files} ${filesize}.file" 95a0abe9cdSEnji Cooper done 96c36a2f46SEnji Cooper 97a0abe9cdSEnji Cooper for filesize in $MB $GB $TB; do 98a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 \ 99a0abe9cdSEnji Cooper dd if=/dev/zero of=${filesize}.file bs=$MB \ 100a0abe9cdSEnji Cooper count=1 oseek=$(( $filesize / $MB )) conv=sparse 101a0abe9cdSEnji Cooper files="${files} ${filesize}.file" 102c36a2f46SEnji Cooper done 103f46d1be6SEnji Cooper 104f46d1be6SEnji Cooper atf_check -e empty -s exit:0 sync 105c36a2f46SEnji Cooper} 106c36a2f46SEnji Cooper 107c36a2f46SEnji Cooperatf_test_case A_flag 108c36a2f46SEnji CooperA_flag_head() 109c36a2f46SEnji Cooper{ 110c36a2f46SEnji Cooper atf_set "descr" "Verify -A support with unprivileged users" 111c36a2f46SEnji Cooper} 112c36a2f46SEnji Cooper 113c36a2f46SEnji CooperA_flag_body() 114c36a2f46SEnji Cooper{ 115c36a2f46SEnji Cooper create_test_dir 116c36a2f46SEnji Cooper 117c36a2f46SEnji Cooper atf_check -e empty -o empty -s exit:0 ls -A 118c36a2f46SEnji Cooper 119c36a2f46SEnji Cooper create_test_inputs 120c36a2f46SEnji Cooper 121c36a2f46SEnji Cooper WITH_A=$PWD/../with_A.out 122c36a2f46SEnji Cooper WITHOUT_A=$PWD/../without_A.out 123c36a2f46SEnji Cooper 124c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_A -s exit:0 ls -A 125c36a2f46SEnji Cooper atf_check -e empty -o save:$WITHOUT_A -s exit:0 ls 126c36a2f46SEnji Cooper 127c36a2f46SEnji Cooper echo "-A usage" 128c36a2f46SEnji Cooper cat $WITH_A 129c36a2f46SEnji Cooper echo "No -A usage" 130c36a2f46SEnji Cooper cat $WITHOUT_A 131c36a2f46SEnji Cooper 132c36a2f46SEnji Cooper for dot_path in '\.f' '\.g'; do 133c36a2f46SEnji Cooper atf_check -e empty -o not-empty -s exit:0 grep "${dot_path}" \ 134c36a2f46SEnji Cooper $WITH_A 135c36a2f46SEnji Cooper atf_check -e empty -o empty -s not-exit:0 grep "${dot_path}" \ 136c36a2f46SEnji Cooper $WITHOUT_A 137c36a2f46SEnji Cooper done 138c36a2f46SEnji Cooper} 139c36a2f46SEnji Cooper 140c36a2f46SEnji Cooperatf_test_case A_flag_implied_when_root 141c36a2f46SEnji CooperA_flag_implied_when_root_head() 142c36a2f46SEnji Cooper{ 143c36a2f46SEnji Cooper atf_set "descr" "Verify that -A is implied for root" 144c36a2f46SEnji Cooper atf_set "require.user" "root" 145c36a2f46SEnji Cooper} 146c36a2f46SEnji Cooper 147c36a2f46SEnji CooperA_flag_implied_when_root_body() 148c36a2f46SEnji Cooper{ 149c36a2f46SEnji Cooper create_test_dir 150c36a2f46SEnji Cooper 151c36a2f46SEnji Cooper atf_check -e empty -o empty -s exit:0 ls -A 152c36a2f46SEnji Cooper 153c36a2f46SEnji Cooper create_test_inputs 154c36a2f46SEnji Cooper 155c36a2f46SEnji Cooper WITH_EXPLICIT=$PWD/../with_explicit_A.out 156c36a2f46SEnji Cooper WITH_IMPLIED=$PWD/../with_implied_A.out 157c36a2f46SEnji Cooper 158c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_EXPLICIT -s exit:0 ls -A 159c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_IMPLIED -s exit:0 ls 160c36a2f46SEnji Cooper 161c36a2f46SEnji Cooper echo "Explicit -A usage" 162c36a2f46SEnji Cooper cat $WITH_EXPLICIT 163c36a2f46SEnji Cooper echo "Implicit -A usage" 164c36a2f46SEnji Cooper cat $WITH_IMPLIED 165c36a2f46SEnji Cooper 166c36a2f46SEnji Cooper atf_check_equal "$(cat $WITH_EXPLICIT)" "$(cat $WITH_IMPLIED)" 167c36a2f46SEnji Cooper} 168c36a2f46SEnji Cooper 169c36a2f46SEnji Cooperatf_test_case B_flag 170c36a2f46SEnji CooperB_flag_head() 171c36a2f46SEnji Cooper{ 172c36a2f46SEnji Cooper atf_set "descr" "Verify that the output from ls -B prints out non-printable characters" 173c36a2f46SEnji Cooper} 174c36a2f46SEnji Cooper 175c36a2f46SEnji CooperB_flag_body() 176c36a2f46SEnji Cooper{ 17714044e16SEnji Cooper atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" 178c36a2f46SEnji Cooper 179c36a2f46SEnji Cooper atf_check -e empty -o empty -s exit:0 touch "$(printf "y\013z")" 180c36a2f46SEnji Cooper atf_check -e empty -o match:'y\\013z' -s exit:0 ls -B 181c36a2f46SEnji Cooper} 182c36a2f46SEnji Cooper 183c36a2f46SEnji Cooperatf_test_case C_flag 184c36a2f46SEnji CooperC_flag_head() 185c36a2f46SEnji Cooper{ 186c36a2f46SEnji Cooper atf_set "descr" "Verify that the output from ls -C is multi-column, sorted down" 187c36a2f46SEnji Cooper} 188c36a2f46SEnji Cooper 189a0abe9cdSEnji Cooperprint_index() 190a0abe9cdSEnji Cooper{ 191a0abe9cdSEnji Cooper local i=1 192a0abe9cdSEnji Cooper local wanted_index=$1; shift 193a0abe9cdSEnji Cooper 194a0abe9cdSEnji Cooper while [ $i -le $wanted_index ]; do 195a0abe9cdSEnji Cooper if [ $i -eq $wanted_index ]; then 196a0abe9cdSEnji Cooper echo $1 197a0abe9cdSEnji Cooper return 198a0abe9cdSEnji Cooper fi 199a0abe9cdSEnji Cooper shift 200a0abe9cdSEnji Cooper : $(( i += 1 )) 201a0abe9cdSEnji Cooper done 202a0abe9cdSEnji Cooper} 203a0abe9cdSEnji Cooper 204c36a2f46SEnji CooperC_flag_body() 205c36a2f46SEnji Cooper{ 206c36a2f46SEnji Cooper create_test_inputs 207c36a2f46SEnji Cooper 208c36a2f46SEnji Cooper WITH_C=$PWD/../with_C.out 209c36a2f46SEnji Cooper 210a0abe9cdSEnji Cooper export COLUMNS=40 211c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_C -s exit:0 ls -C 212c36a2f46SEnji Cooper 213c36a2f46SEnji Cooper echo "With -C usage" 214c36a2f46SEnji Cooper cat $WITH_C 215c36a2f46SEnji Cooper 216a0abe9cdSEnji Cooper paths=$(find -s . -mindepth 1 -maxdepth 1 \! -name '.*' -exec basename {} \; ) 217a0abe9cdSEnji Cooper set -- $paths 218a0abe9cdSEnji Cooper num_paths=$# 219a0abe9cdSEnji Cooper num_columns=2 220a0abe9cdSEnji Cooper 221a0abe9cdSEnji Cooper max_num_paths_per_column=$(( $(( $num_paths + 1 )) / $num_columns )) 222a0abe9cdSEnji Cooper 223a0abe9cdSEnji Cooper local i=1 224a0abe9cdSEnji Cooper while [ $i -le $max_num_paths_per_column ]; do 225a0abe9cdSEnji Cooper column_1=$(print_index $i $paths) 226a0abe9cdSEnji Cooper column_2=$(print_index $(( $i + $max_num_paths_per_column )) $paths) 227a0abe9cdSEnji Cooper #echo "paths[$(( $i + $max_num_paths_per_column ))] = $column_2" 228a0abe9cdSEnji Cooper expected_expr="$column_1" 229a0abe9cdSEnji Cooper if [ -n "$column_2" ]; then 230a0abe9cdSEnji Cooper expected_expr="$expected_expr[[:space:]]+$column_2" 231a0abe9cdSEnji Cooper fi 232c36a2f46SEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 233a0abe9cdSEnji Cooper egrep "$expected_expr" $WITH_C 234a0abe9cdSEnji Cooper : $(( i += 1 )) 235a0abe9cdSEnji Cooper done 236a0abe9cdSEnji Cooper} 237a0abe9cdSEnji Cooper 238a0abe9cdSEnji Cooperatf_test_case D_flag 239a0abe9cdSEnji CooperD_flag_head() 240a0abe9cdSEnji Cooper{ 241a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -D modifies the time format used with ls -l" 242a0abe9cdSEnji Cooper} 243a0abe9cdSEnji Cooper 244a0abe9cdSEnji CooperD_flag_body() 245a0abe9cdSEnji Cooper{ 246a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 247a0abe9cdSEnji Cooper atf_check -e empty -o match:"$(stat -f '%c[[:space:]]+%N' a.file)" \ 248a0abe9cdSEnji Cooper -s exit:0 ls -lD '%s' 249a0abe9cdSEnji Cooper} 250a0abe9cdSEnji Cooper 251a0abe9cdSEnji Cooperatf_test_case F_flag 252a0abe9cdSEnji CooperF_flag_head() 253a0abe9cdSEnji Cooper{ 254a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -F prints out appropriate symbols after files" 255a0abe9cdSEnji Cooper} 256a0abe9cdSEnji Cooper 257a0abe9cdSEnji CooperF_flag_body() 258a0abe9cdSEnji Cooper{ 259a0abe9cdSEnji Cooper create_test_inputs 260a0abe9cdSEnji Cooper 261a0abe9cdSEnji Cooper atf_check -e empty -s exit:0 \ 262a0abe9cdSEnji Cooper sh -c "pid=${ATF_TMPDIR}/nc.pid; daemon -p \$pid nc -lU j; sleep 2; pkill -F \$pid" 263a0abe9cdSEnji Cooper 264a0abe9cdSEnji Cooper atf_check -e empty -o match:'a/' -s exit:0 ls -F 265a0abe9cdSEnji Cooper atf_check -e empty -o match:'c@' -s exit:0 ls -F 266a0abe9cdSEnji Cooper atf_check -e empty -o match:'h\|' -s exit:0 ls -F 267a0abe9cdSEnji Cooper atf_check -e empty -o match:'j=' -s exit:0 ls -F 268a0abe9cdSEnji Cooper #atf_check -e empty -o match:'<whiteout-file>%' -s exit:0 ls -F 269a0abe9cdSEnji Cooper atf_check -e empty -o match:'stuv' -s exit:0 ls -F 270a0abe9cdSEnji Cooper atf_check -e empty -o match:'wxyz\*' -s exit:0 ls -F 271a0abe9cdSEnji Cooper} 272a0abe9cdSEnji Cooper 273a0abe9cdSEnji Cooperatf_test_case H_flag 274a0abe9cdSEnji CooperH_flag_head() 275a0abe9cdSEnji Cooper{ 276a0abe9cdSEnji Cooper atf_set "descr" "Verify that ls -H follows symlinks" 277a0abe9cdSEnji Cooper} 278a0abe9cdSEnji Cooper 279a0abe9cdSEnji CooperH_flag_body() 280a0abe9cdSEnji Cooper{ 281a0abe9cdSEnji Cooper create_test_inputs 282a0abe9cdSEnji Cooper 283a0abe9cdSEnji Cooper atf_check -e empty -o match:'1' -s exit:0 ls -H c 284c36a2f46SEnji Cooper} 285c36a2f46SEnji Cooper 286c36a2f46SEnji Cooperatf_test_case I_flag 287c36a2f46SEnji CooperI_flag_head() 288c36a2f46SEnji Cooper{ 289c36a2f46SEnji Cooper atf_set "descr" "Verify that the output from ls -I is the same as ls for an unprivileged user" 290c36a2f46SEnji Cooper} 291c36a2f46SEnji Cooper 292c36a2f46SEnji CooperI_flag_body() 293c36a2f46SEnji Cooper{ 294c36a2f46SEnji Cooper create_test_inputs 295c36a2f46SEnji Cooper 296c36a2f46SEnji Cooper WITH_I=$PWD/../with_I.out 297c36a2f46SEnji Cooper WITHOUT_I=$PWD/../without_I.out 298c36a2f46SEnji Cooper 299c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_I -s exit:0 ls -I 300c36a2f46SEnji Cooper atf_check -e empty -o save:$WITHOUT_I -s exit:0 ls 301c36a2f46SEnji Cooper 302c36a2f46SEnji Cooper echo "Explicit -I usage" 303c36a2f46SEnji Cooper cat $WITH_I 304c36a2f46SEnji Cooper echo "No -I usage" 305c36a2f46SEnji Cooper cat $WITHOUT_I 306c36a2f46SEnji Cooper 307c36a2f46SEnji Cooper atf_check_equal "$(cat $WITH_I)" "$(cat $WITHOUT_I)" 308c36a2f46SEnji Cooper} 309c36a2f46SEnji Cooper 310c36a2f46SEnji Cooperatf_test_case I_flag_voids_implied_A_flag_when_root 311c36a2f46SEnji CooperI_flag_voids_implied_A_flag_when_root_head() 312c36a2f46SEnji Cooper{ 313c36a2f46SEnji Cooper atf_set "descr" "Verify that -I voids out implied -A for root" 314c36a2f46SEnji Cooper atf_set "require.user" "root" 315c36a2f46SEnji Cooper} 316c36a2f46SEnji Cooper 317c36a2f46SEnji CooperI_flag_voids_implied_A_flag_when_root_body() 318c36a2f46SEnji Cooper{ 319c36a2f46SEnji Cooper create_test_inputs 320c36a2f46SEnji Cooper 321c36a2f46SEnji Cooper atf_check -o not-match:'\.f' -s exit:0 ls -I 322c36a2f46SEnji Cooper atf_check -o not-match:'\.g' -s exit:0 ls -I 323c36a2f46SEnji Cooper 324c36a2f46SEnji Cooper atf_check -o match:'\.f' -s exit:0 ls -A -I 325c36a2f46SEnji Cooper atf_check -o match:'\.g' -s exit:0 ls -A -I 326c36a2f46SEnji Cooper} 327c36a2f46SEnji Cooper 328a0abe9cdSEnji Cooperatf_test_case L_flag 329a0abe9cdSEnji CooperL_flag_head() 330a0abe9cdSEnji Cooper{ 331a0abe9cdSEnji Cooper atf_set "descr" "Verify that -L prints out the symbolic link and conversely -P prints out the target for the symbolic link" 332a0abe9cdSEnji Cooper} 333a0abe9cdSEnji Cooper 334a0abe9cdSEnji CooperL_flag_body() 335a0abe9cdSEnji Cooper{ 336a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 ln -s target1/target2 link1 337a0abe9cdSEnji Cooper atf_check -e empty -o match:link1 -s exit:0 ls -L 338a0abe9cdSEnji Cooper atf_check -e empty -o not-match:target1/target2 -s exit:0 ls -L 339a0abe9cdSEnji Cooper} 340a0abe9cdSEnji Cooper 341a0abe9cdSEnji Cooperatf_test_case R_flag 342a0abe9cdSEnji CooperR_flag_head() 343a0abe9cdSEnji Cooper{ 344a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -R prints out the directory contents recursively" 345a0abe9cdSEnji Cooper} 346a0abe9cdSEnji Cooper 347a0abe9cdSEnji CooperR_flag_body() 348a0abe9cdSEnji Cooper{ 349a0abe9cdSEnji Cooper create_test_inputs 350a0abe9cdSEnji Cooper 351a0abe9cdSEnji Cooper WITH_R=$PWD/../with_R.out 352a0abe9cdSEnji Cooper WITH_R_expected_output=$PWD/../with_R_expected.out 353a0abe9cdSEnji Cooper 354a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_R -s exit:0 ls -R 355a0abe9cdSEnji Cooper 356a0abe9cdSEnji Cooper set -- . $(find -s . \! -name '.*' -type d) 357a0abe9cdSEnji Cooper while [ $# -gt 0 ]; do 358a0abe9cdSEnji Cooper dir=$1; shift 359a0abe9cdSEnji Cooper [ "$dir" != "." ] && echo "$dir:" 360a0abe9cdSEnji Cooper (cd $dir && ls -1A | sed -e '/^\./d') 361a0abe9cdSEnji Cooper [ $# -ne 0 ] && echo 362a0abe9cdSEnji Cooper done > $WITH_R_expected_output 363a0abe9cdSEnji Cooper 364a0abe9cdSEnji Cooper echo "-R usage" 365a0abe9cdSEnji Cooper cat $WITH_R 366a0abe9cdSEnji Cooper echo "-R expected output" 367a0abe9cdSEnji Cooper cat $WITH_R_expected_output 368a0abe9cdSEnji Cooper 369a0abe9cdSEnji Cooper atf_check_equal "$(cat $WITH_R)" "$(cat $WITH_R_expected_output)" 370a0abe9cdSEnji Cooper} 371a0abe9cdSEnji Cooper 372a0abe9cdSEnji Cooperatf_test_case S_flag 373a0abe9cdSEnji CooperS_flag_head() 374a0abe9cdSEnji Cooper{ 375a0abe9cdSEnji Cooper atf_set "descr" "Verify that -S sorts by file size, then by filename lexicographically" 376a0abe9cdSEnji Cooper} 377a0abe9cdSEnji Cooper 378a0abe9cdSEnji CooperS_flag_body() 379a0abe9cdSEnji Cooper{ 380a0abe9cdSEnji Cooper create_test_dir 381a0abe9cdSEnji Cooper 382a0abe9cdSEnji Cooper file_list_dir=$PWD/../files 383a0abe9cdSEnji Cooper 384a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 mkdir -p $file_list_dir 385a0abe9cdSEnji Cooper 386a0abe9cdSEnji Cooper create_test_inputs 387a0abe9cdSEnji Cooper create_test_inputs2 388a0abe9cdSEnji Cooper 389a0abe9cdSEnji Cooper WITH_S=$PWD/../with_S.out 390a0abe9cdSEnji Cooper WITHOUT_S=$PWD/../without_S.out 391a0abe9cdSEnji Cooper 392a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_S ls -D '%s' -lS 393a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITHOUT_S ls -D '%s' -l 394a0abe9cdSEnji Cooper 395a0abe9cdSEnji Cooper WITH_S_parsed=$(awk '! /^total/ { print $7 }' $WITH_S) 396a0abe9cdSEnji Cooper set -- $(awk '! /^total/ { print $5, $7 }' $WITHOUT_S) 397a0abe9cdSEnji Cooper while [ $# -gt 0 ]; do 398a0abe9cdSEnji Cooper size=$1; shift 399a0abe9cdSEnji Cooper filename=$1; shift 400a0abe9cdSEnji Cooper echo $filename >> $file_list_dir/${size} 401a0abe9cdSEnji Cooper done 402a0abe9cdSEnji Cooper file_lists=$(find $file_list_dir -type f -exec basename {} \; | sort -nr) 403a0abe9cdSEnji Cooper WITHOUT_S_parsed=$(for file_list in $file_lists; do sort < $file_list_dir/$file_list; done) 404a0abe9cdSEnji Cooper 405a0abe9cdSEnji Cooper echo "-lS usage (parsed)" 406a0abe9cdSEnji Cooper echo "$WITH_S_parsed" 407a0abe9cdSEnji Cooper echo "-l usage (parsed)" 408a0abe9cdSEnji Cooper echo "$WITHOUT_S_parsed" 409a0abe9cdSEnji Cooper 410a0abe9cdSEnji Cooper atf_check_equal "$WITHOUT_S_parsed" "$WITH_S_parsed" 411a0abe9cdSEnji Cooper} 412a0abe9cdSEnji Cooper 413a0abe9cdSEnji Cooperatf_test_case T_flag 414a0abe9cdSEnji CooperT_flag_head() 415a0abe9cdSEnji Cooper{ 416a0abe9cdSEnji Cooper atf_set "descr" "Verify -T support" 417a0abe9cdSEnji Cooper} 418a0abe9cdSEnji Cooper 419a0abe9cdSEnji CooperT_flag_body() 420a0abe9cdSEnji Cooper{ 421a0abe9cdSEnji Cooper create_test_dir 422a0abe9cdSEnji Cooper 423a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 424a0abe9cdSEnji Cooper 425a0abe9cdSEnji Cooper birthtime_in_secs=$(stat -f %B -t %s a.file) 426a0abe9cdSEnji Cooper birthtime=$(date -j -f %s $birthtime_in_secs +"[[:space:]]+%b[[:space:]]+%e[[:space:]]+%H:%M:%S[[:space:]]+%Y") 427a0abe9cdSEnji Cooper 428a0abe9cdSEnji Cooper atf_check -e empty -o match:"$birthtime"'[[:space:]]+a\.file' \ 429a0abe9cdSEnji Cooper -s exit:0 ls -lT a.file 430a0abe9cdSEnji Cooper} 431a0abe9cdSEnji Cooper 432a0abe9cdSEnji Cooperatf_test_case a_flag 433a0abe9cdSEnji Coopera_flag_head() 434a0abe9cdSEnji Cooper{ 435a0abe9cdSEnji Cooper atf_set "descr" "Verify -a support" 436a0abe9cdSEnji Cooper} 437a0abe9cdSEnji Cooper 438a0abe9cdSEnji Coopera_flag_body() 439a0abe9cdSEnji Cooper{ 440a0abe9cdSEnji Cooper create_test_dir 441a0abe9cdSEnji Cooper 442a0abe9cdSEnji Cooper # Make sure "." and ".." show up with -a 443a0abe9cdSEnji Cooper atf_check -e empty -o match:'\.[[:space:]]+\.\.' -s exit:0 ls -ax 444a0abe9cdSEnji Cooper 445a0abe9cdSEnji Cooper create_test_inputs 446a0abe9cdSEnji Cooper 447a0abe9cdSEnji Cooper WITH_a=$PWD/../with_a.out 448a0abe9cdSEnji Cooper WITHOUT_a=$PWD/../without_a.out 449a0abe9cdSEnji Cooper 450a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_a -s exit:0 ls -a 451a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITHOUT_a -s exit:0 ls 452a0abe9cdSEnji Cooper 453a0abe9cdSEnji Cooper echo "-a usage" 454a0abe9cdSEnji Cooper cat $WITH_a 455a0abe9cdSEnji Cooper echo "No -a usage" 456a0abe9cdSEnji Cooper cat $WITHOUT_a 457a0abe9cdSEnji Cooper 458a0abe9cdSEnji Cooper for dot_path in '\.f' '\.g'; do 459a0abe9cdSEnji Cooper atf_check -e empty -o not-empty -s exit:0 grep "${dot_path}" \ 460a0abe9cdSEnji Cooper $WITH_a 461a0abe9cdSEnji Cooper atf_check -e empty -o empty -s not-exit:0 grep "${dot_path}" \ 462a0abe9cdSEnji Cooper $WITHOUT_a 463a0abe9cdSEnji Cooper done 464a0abe9cdSEnji Cooper} 465a0abe9cdSEnji Cooper 466a0abe9cdSEnji Cooperatf_test_case b_flag 467a0abe9cdSEnji Cooperb_flag_head() 468a0abe9cdSEnji Cooper{ 469a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -b prints out non-printable characters" 470a0abe9cdSEnji Cooper} 471a0abe9cdSEnji Cooper 472a0abe9cdSEnji Cooperb_flag_body() 473a0abe9cdSEnji Cooper{ 474a0abe9cdSEnji Cooper atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" 475a0abe9cdSEnji Cooper 476a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch "$(printf "y\013z")" 477a0abe9cdSEnji Cooper atf_check -e empty -o match:'y\\vz' -s exit:0 ls -b 478a0abe9cdSEnji Cooper} 479a0abe9cdSEnji Cooper 480a0abe9cdSEnji Cooperatf_test_case d_flag 481a0abe9cdSEnji Cooperd_flag_head() 482a0abe9cdSEnji Cooper{ 483a0abe9cdSEnji Cooper atf_set "descr" "Verify that -d doesn't descend down directories" 484a0abe9cdSEnji Cooper} 485a0abe9cdSEnji Cooper 486a0abe9cdSEnji Cooperd_flag_body() 487a0abe9cdSEnji Cooper{ 488a0abe9cdSEnji Cooper create_test_dir 489a0abe9cdSEnji Cooper 490a0abe9cdSEnji Cooper output=$PWD/../output 491a0abe9cdSEnji Cooper 492a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 mkdir -p a/b 493a0abe9cdSEnji Cooper 494a0abe9cdSEnji Cooper for path in . $PWD a; do 495a0abe9cdSEnji Cooper atf_check -e empty -o save:$output -s exit:0 ls -d $path 496a0abe9cdSEnji Cooper atf_check_equal "$(cat $output)" "$path" 497a0abe9cdSEnji Cooper done 498a0abe9cdSEnji Cooper} 499a0abe9cdSEnji Cooper 500a0abe9cdSEnji Cooperatf_test_case f_flag 501a0abe9cdSEnji Cooperf_flag_head() 502a0abe9cdSEnji Cooper{ 503a0abe9cdSEnji Cooper atf_set "descr" "Verify that -f prints out the contents of a directory unsorted" 504a0abe9cdSEnji Cooper} 505a0abe9cdSEnji Cooper 506a0abe9cdSEnji Cooperf_flag_body() 507a0abe9cdSEnji Cooper{ 508a0abe9cdSEnji Cooper create_test_inputs 509a0abe9cdSEnji Cooper 510a0abe9cdSEnji Cooper output=$PWD/../output 511a0abe9cdSEnji Cooper 512a0abe9cdSEnji Cooper # XXX: I don't have enough understanding of how the algorithm works yet 513a0abe9cdSEnji Cooper # to determine more than the fact that all the entries printed out 514a0abe9cdSEnji Cooper # exist 515a0abe9cdSEnji Cooper paths=$(find -s . -mindepth 1 -maxdepth 1 \! -name '.*' -exec basename {} \; ) 516a0abe9cdSEnji Cooper 517a0abe9cdSEnji Cooper atf_check -e empty -o save:$output -s exit:0 ls -f 518a0abe9cdSEnji Cooper 519a0abe9cdSEnji Cooper for path in $paths; do 520a0abe9cdSEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 521a0abe9cdSEnji Cooper egrep "^$path$" $output 522a0abe9cdSEnji Cooper done 523a0abe9cdSEnji Cooper} 524a0abe9cdSEnji Cooper 525a0abe9cdSEnji Cooperatf_test_case g_flag 526a0abe9cdSEnji Cooperg_flag_head() 527a0abe9cdSEnji Cooper{ 528a0abe9cdSEnji Cooper atf_set "descr" "Verify that -g does nothing (compatibility flag)" 529a0abe9cdSEnji Cooper} 530a0abe9cdSEnji Cooper 531a0abe9cdSEnji Cooperg_flag_body() 532a0abe9cdSEnji Cooper{ 533a0abe9cdSEnji Cooper create_test_inputs2 534a0abe9cdSEnji Cooper for file in $files; do 535a0abe9cdSEnji Cooper atf_check -e empty -o match:"$(ls -a $file)" -s exit:0 \ 536a0abe9cdSEnji Cooper ls -ag $file 537a0abe9cdSEnji Cooper atf_check -e empty -o match:"$(ls -la $file)" -s exit:0 \ 538a0abe9cdSEnji Cooper ls -alg $file 539a0abe9cdSEnji Cooper done 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" 546a0abe9cdSEnji Cooper atf_set "require.files" "/usr/bin/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 633a0abe9cdSEnji Cooper birthtime_in_secs=$(stat -f "%B" -t "%s" a.file) 634a0abe9cdSEnji Cooper birthtime=$(date -j -f "%s" $birthtime_in_secs +"%b[[:space:]]+%e[[:space:]]+%H:%M") 635a0abe9cdSEnji Cooper 636a0abe9cdSEnji Cooper expected_output=$(stat -f "%Sp[[:space:]]+%l[[:space:]]+%Su[[:space:]]+%Sg[[:space:]]+%z[[:space:]]+$birthtime[[: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' \ 692a0abe9cdSEnji Cooper ls -ln 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 atf_set "require.user" "root" 701a0abe9cdSEnji Cooper} 702a0abe9cdSEnji Cooper 703a0abe9cdSEnji Coopero_flag_body() 704a0abe9cdSEnji Cooper{ 705a0abe9cdSEnji Cooper local size=12345 706a0abe9cdSEnji Cooper 707a0abe9cdSEnji Cooper create_test_dir 708a0abe9cdSEnji Cooper 709a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 dd if=/dev/zero of=a.file \ 710a0abe9cdSEnji Cooper bs=$size count=1 711a0abe9cdSEnji Cooper atf_check -e ignore -o empty -s exit:0 dd if=/dev/zero of=b.file \ 712a0abe9cdSEnji Cooper bs=$size count=1 713a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 chflags uarch a.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 atf_skip "kyua report-jenkins doesn't properly escape non-printable chars: https://github.com/jmmv/kyua/issues/136" 755a0abe9cdSEnji Cooper 756a0abe9cdSEnji Cooper create_test_dir 757a0abe9cdSEnji Cooper 758a0abe9cdSEnji Cooper test_file="$(printf "y\01z")" 759a0abe9cdSEnji Cooper 760a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch "$test_file" 761a0abe9cdSEnji Cooper 762a0abe9cdSEnji Cooper atf_check -e empty -o match:'y\?z' -s exit:0 ls -q "$test_file" 763a0abe9cdSEnji Cooper atf_check -e empty -o match:"$test_file" -s exit:0 ls -w "$test_file" 764a0abe9cdSEnji Cooper} 765a0abe9cdSEnji Cooper 766a0abe9cdSEnji Cooperatf_test_case r_flag 767a0abe9cdSEnji Cooperr_flag_head() 768a0abe9cdSEnji Cooper{ 769a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -r sorts the same way as reverse sorting with sort(1)" 770a0abe9cdSEnji Cooper} 771a0abe9cdSEnji Cooper 772a0abe9cdSEnji Cooperr_flag_body() 773a0abe9cdSEnji Cooper{ 774a0abe9cdSEnji Cooper create_test_inputs 775a0abe9cdSEnji Cooper 776a0abe9cdSEnji Cooper WITH_r=$PWD/../with_r.out 777a0abe9cdSEnji Cooper WITH_sort=$PWD/../with_sort.out 778a0abe9cdSEnji Cooper 779a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_r -s exit:0 ls -1r 780a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_sort -s exit:0 sh -c 'ls -1 | sort -r' 781a0abe9cdSEnji Cooper 782a0abe9cdSEnji Cooper echo "Sorted with -r" 783a0abe9cdSEnji Cooper cat $WITH_r 784a0abe9cdSEnji Cooper echo "Reverse sorted with sort(1)" 785a0abe9cdSEnji Cooper cat $WITH_sort 786a0abe9cdSEnji Cooper 787a0abe9cdSEnji Cooper atf_check_equal "$(cat $WITH_r)" "$(cat $WITH_sort)" 788a0abe9cdSEnji Cooper} 789a0abe9cdSEnji Cooper 790a0abe9cdSEnji Cooperatf_test_case s_flag 791a0abe9cdSEnji Coopers_flag_head() 792a0abe9cdSEnji Cooper{ 793a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -s matches the output from stat(1)" 794a0abe9cdSEnji Cooper} 795a0abe9cdSEnji Cooper 796a0abe9cdSEnji Coopers_flag_body() 797a0abe9cdSEnji Cooper{ 798a0abe9cdSEnji Cooper create_test_inputs2 799a0abe9cdSEnji Cooper for file in $files; do 800a0abe9cdSEnji Cooper atf_check -e empty \ 801a0abe9cdSEnji Cooper -o match:"$(stat -f "%b" $file)[[:space:]]+$file" ls -s $file 802a0abe9cdSEnji Cooper done 803a0abe9cdSEnji Cooper} 804a0abe9cdSEnji Cooper 805a0abe9cdSEnji Cooperatf_test_case t_flag 806a0abe9cdSEnji Coopert_flag_head() 807a0abe9cdSEnji Cooper{ 808a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -t sorts by modification time" 809a0abe9cdSEnji Cooper} 810a0abe9cdSEnji Cooper 811a0abe9cdSEnji Coopert_flag_body() 812a0abe9cdSEnji Cooper{ 813a0abe9cdSEnji Cooper create_test_dir 814a0abe9cdSEnji Cooper 815a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 816a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch b.file 817*20dbf8efSEnji Cooper 818*20dbf8efSEnji Cooper atf_check -e empty -s exit:0 sync 819a0abe9cdSEnji Cooper 820a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file' -s exit:0 sh -c 'ls -lt | tail -n 1' 821a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file.*a\.file' -s exit:0 ls -Ct 822a0abe9cdSEnji Cooper 823a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 rm a.file 824a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 sh -c 'echo "i am a" > a.file' 825*20dbf8efSEnji Cooper 826*20dbf8efSEnji Cooper atf_check -e empty -s exit:0 sync 827a0abe9cdSEnji Cooper 828a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lt | tail -n 1' 829a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Ct 830a0abe9cdSEnji Cooper} 831a0abe9cdSEnji Cooper 832a0abe9cdSEnji Cooperatf_test_case u_flag 833a0abe9cdSEnji Cooperu_flag_head() 834a0abe9cdSEnji Cooper{ 835a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -u sorts by last access" 836a0abe9cdSEnji Cooper} 837a0abe9cdSEnji Cooper 838a0abe9cdSEnji Cooperu_flag_body() 839a0abe9cdSEnji Cooper{ 840a0abe9cdSEnji Cooper create_test_dir 841a0abe9cdSEnji Cooper 842a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch a.file 843a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 touch b.file 844*20dbf8efSEnji Cooper atf_check -e empty -s exit:0 sync 845a0abe9cdSEnji Cooper 846a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lu | tail -n 1' 847a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Cu 848a0abe9cdSEnji Cooper 849a0abe9cdSEnji Cooper atf_check -e empty -o empty -s exit:0 sh -c 'echo "i am a" > a.file' 850a0abe9cdSEnji Cooper atf_check -e empty -o match:'i am a' -s exit:0 cat a.file 851*20dbf8efSEnji Cooper atf_check -e empty -s exit:0 sync 852a0abe9cdSEnji Cooper 853a0abe9cdSEnji Cooper atf_check -e empty -o match:'b\.file' -s exit:0 sh -c 'ls -lu | tail -n 1' 854a0abe9cdSEnji Cooper atf_check -e empty -o match:'a\.file.*b\.file' -s exit:0 ls -Cu 855a0abe9cdSEnji Cooper} 856a0abe9cdSEnji Cooper 857a0abe9cdSEnji Cooperatf_test_case x_flag 858c36a2f46SEnji Cooperx_flag_head() 859c36a2f46SEnji Cooper{ 860a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -x is multi-column, sorted across" 861c36a2f46SEnji Cooper} 862c36a2f46SEnji Cooper 863c36a2f46SEnji Cooperx_flag_body() 864c36a2f46SEnji Cooper{ 865c36a2f46SEnji Cooper create_test_inputs 866c36a2f46SEnji Cooper 867c36a2f46SEnji Cooper WITH_x=$PWD/../with_x.out 868c36a2f46SEnji Cooper 869c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_x -s exit:0 ls -x 870c36a2f46SEnji Cooper 871c36a2f46SEnji Cooper echo "With -x usage" 872c36a2f46SEnji Cooper cat $WITH_x 873c36a2f46SEnji Cooper 874c36a2f46SEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 875c36a2f46SEnji Cooper egrep "a[[:space:]]+c[[:space:]]+d[[:space:]]+e[[:space:]]+h" $WITH_x 876c36a2f46SEnji Cooper atf_check -e ignore -o not-empty -s exit:0 \ 877a0abe9cdSEnji Cooper egrep "i[[:space:]]+klmn[[:space:]]+opqr[[:space:]]+stuv[[:space:]]+wxyz" $WITH_x 878c36a2f46SEnji Cooper} 879c36a2f46SEnji Cooper 880a0abe9cdSEnji Cooperatf_test_case y_flag 881a0abe9cdSEnji Coopery_flag_head() 882a0abe9cdSEnji Cooper{ 883a0abe9cdSEnji Cooper atf_set "descr" "Verify that the output from ls -y sorts the same way as sort(1)" 884a0abe9cdSEnji Cooper} 885a0abe9cdSEnji Cooper 886a0abe9cdSEnji Coopery_flag_body() 887a0abe9cdSEnji Cooper{ 888a0abe9cdSEnji Cooper create_test_inputs 889a0abe9cdSEnji Cooper 890a0abe9cdSEnji Cooper WITH_sort=$PWD/../with_sort.out 891a0abe9cdSEnji Cooper WITH_y=$PWD/../with_y.out 892a0abe9cdSEnji Cooper 893a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_sort -s exit:0 sh -c 'ls -1 | sort' 894a0abe9cdSEnji Cooper atf_check -e empty -o save:$WITH_y -s exit:0 ls -1y 895a0abe9cdSEnji Cooper 896a0abe9cdSEnji Cooper echo "Sorted with sort(1)" 897a0abe9cdSEnji Cooper cat $WITH_sort 898a0abe9cdSEnji Cooper echo "Sorted with -y" 899a0abe9cdSEnji Cooper cat $WITH_y 900a0abe9cdSEnji Cooper 901a0abe9cdSEnji Cooper atf_check_equal "$(cat $WITH_sort)" "$(cat $WITH_y)" 902a0abe9cdSEnji Cooper} 903a0abe9cdSEnji Cooper 904a0abe9cdSEnji Cooperatf_test_case 1_flag 905c36a2f46SEnji Cooper1_flag_head() 906c36a2f46SEnji Cooper{ 907c36a2f46SEnji Cooper atf_set "descr" "Verify that -1 prints out one item per line" 908c36a2f46SEnji Cooper} 909c36a2f46SEnji Cooper 910c36a2f46SEnji Cooper1_flag_body() 911c36a2f46SEnji Cooper{ 912c36a2f46SEnji Cooper create_test_inputs 913c36a2f46SEnji Cooper 914c36a2f46SEnji Cooper WITH_1=$PWD/../with_1.out 915c36a2f46SEnji Cooper WITHOUT_1=$PWD/../without_1.out 916c36a2f46SEnji Cooper 917c36a2f46SEnji Cooper atf_check -e empty -o save:$WITH_1 -s exit:0 ls -1 918c36a2f46SEnji Cooper atf_check -e empty -o save:$WITHOUT_1 -s exit:0 \ 919c36a2f46SEnji Cooper sh -c 'for i in $(ls); do echo $i; done' 920c36a2f46SEnji Cooper 921c36a2f46SEnji Cooper echo "Explicit -1 usage" 922c36a2f46SEnji Cooper cat $WITH_1 923c36a2f46SEnji Cooper echo "No -1 usage" 924c36a2f46SEnji Cooper cat $WITHOUT_1 925c36a2f46SEnji Cooper 926c36a2f46SEnji Cooper atf_check_equal "$(cat $WITH_1)" "$(cat $WITHOUT_1)" 927c36a2f46SEnji Cooper} 928c36a2f46SEnji Cooper 929c36a2f46SEnji Cooperatf_init_test_cases() 930c36a2f46SEnji Cooper{ 931910be139SEnji Cooper export BLOCKSIZE=512 932c36a2f46SEnji Cooper 933c36a2f46SEnji Cooper atf_add_test_case A_flag 934c36a2f46SEnji Cooper atf_add_test_case A_flag_implied_when_root 935c36a2f46SEnji Cooper atf_add_test_case B_flag 936c36a2f46SEnji Cooper atf_add_test_case C_flag 937a0abe9cdSEnji Cooper atf_add_test_case D_flag 938a0abe9cdSEnji Cooper atf_add_test_case F_flag 939c36a2f46SEnji Cooper #atf_add_test_case G_flag 940a0abe9cdSEnji Cooper atf_add_test_case H_flag 941c36a2f46SEnji Cooper atf_add_test_case I_flag 942c36a2f46SEnji Cooper atf_add_test_case I_flag_voids_implied_A_flag_when_root 943a0abe9cdSEnji Cooper atf_add_test_case L_flag 944c36a2f46SEnji Cooper #atf_add_test_case P_flag 945a0abe9cdSEnji Cooper atf_add_test_case R_flag 946a0abe9cdSEnji Cooper atf_add_test_case S_flag 947a0abe9cdSEnji Cooper atf_add_test_case T_flag 948c36a2f46SEnji Cooper #atf_add_test_case U_flag 949c36a2f46SEnji Cooper #atf_add_test_case W_flag 950c36a2f46SEnji Cooper #atf_add_test_case Z_flag 951c36a2f46SEnji Cooper atf_add_test_case a_flag 952a0abe9cdSEnji Cooper atf_add_test_case b_flag 953c36a2f46SEnji Cooper #atf_add_test_case c_flag 954a0abe9cdSEnji Cooper atf_add_test_case d_flag 955a0abe9cdSEnji Cooper atf_add_test_case f_flag 956a0abe9cdSEnji Cooper atf_add_test_case g_flag 957a0abe9cdSEnji Cooper atf_add_test_case h_flag 958a0abe9cdSEnji Cooper atf_add_test_case i_flag 959a0abe9cdSEnji Cooper atf_add_test_case k_flag 960a0abe9cdSEnji Cooper atf_add_test_case l_flag 961c36a2f46SEnji Cooper atf_add_test_case lcomma_flag 962a0abe9cdSEnji Cooper atf_add_test_case m_flag 963a0abe9cdSEnji Cooper atf_add_test_case n_flag 964a0abe9cdSEnji Cooper atf_add_test_case o_flag 965a0abe9cdSEnji Cooper atf_add_test_case p_flag 966a0abe9cdSEnji Cooper atf_add_test_case q_flag_and_w_flag 967a0abe9cdSEnji Cooper atf_add_test_case r_flag 968a0abe9cdSEnji Cooper atf_add_test_case s_flag 969a0abe9cdSEnji Cooper atf_add_test_case t_flag 970a0abe9cdSEnji Cooper atf_add_test_case u_flag 971c36a2f46SEnji Cooper atf_add_test_case x_flag 972a0abe9cdSEnji Cooper atf_add_test_case y_flag 973c36a2f46SEnji Cooper atf_add_test_case 1_flag 974c36a2f46SEnji Cooper} 975