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