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