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