xref: /freebsd/usr.bin/du/tests/du_test.sh (revision 3e5550d25c6d614f422506373f7068c6c366fa85)
174c9a591SEnji Cooper#
2da5069e1SEnji Cooper# Copyright (c) 2017 Enji Cooper <ngie@FreeBSD.org>
374c9a591SEnji Cooper#
474c9a591SEnji Cooper# Redistribution and use in source and binary forms, with or without
574c9a591SEnji Cooper# modification, are permitted provided that the following conditions
674c9a591SEnji Cooper# are met:
774c9a591SEnji Cooper# 1. Redistributions of source code must retain the above copyright
874c9a591SEnji Cooper#    notice, this list of conditions and the following disclaimer.
974c9a591SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
1074c9a591SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
1174c9a591SEnji Cooper#    documentation and/or other materials provided with the distribution.
1274c9a591SEnji Cooper#
1374c9a591SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1474c9a591SEnji Cooper# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1574c9a591SEnji Cooper# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1674c9a591SEnji Cooper# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1774c9a591SEnji Cooper# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1874c9a591SEnji Cooper# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1974c9a591SEnji Cooper# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2074c9a591SEnji Cooper# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2174c9a591SEnji Cooper# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2274c9a591SEnji Cooper# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2374c9a591SEnji Cooper# SUCH DAMAGE.
2474c9a591SEnji Cooper#
2574c9a591SEnji Cooper
2639a1f858SAlex Richardsonrequire_sparse_file_support()
2739a1f858SAlex Richardson{
2839a1f858SAlex Richardson	if ! getconf MIN_HOLE_SIZE "$(pwd)"; then
2939a1f858SAlex Richardson		echo "getconf MIN_HOLE_SIZE $(pwd) failed; sparse files " \
3039a1f858SAlex Richardson		    "probably not supported by file system"
3139a1f858SAlex Richardson		mount
3239a1f858SAlex Richardson		atf_skip "Test's work directory does not support sparse files;" \
3339a1f858SAlex Richardson		    "try with a different TMPDIR?"
3439a1f858SAlex Richardson	fi
3539a1f858SAlex Richardson}
3639a1f858SAlex Richardson
3774c9a591SEnji Cooperatf_test_case A_flag
3874c9a591SEnji CooperA_flag_head()
3974c9a591SEnji Cooper{
4074c9a591SEnji Cooper	atf_set "descr" "Verify -A behavior"
4174c9a591SEnji Cooper}
4274c9a591SEnji CooperA_flag_body()
4374c9a591SEnji Cooper{
4439a1f858SAlex Richardson	require_sparse_file_support
4574c9a591SEnji Cooper	# XXX: compressed volumes?
4674c9a591SEnji Cooper	atf_check truncate -s 10g sparse.file
4774c9a591SEnji Cooper	atf_check -o inline:'1\tsparse.file\n' du -g sparse.file
4874c9a591SEnji Cooper	atf_check -o inline:'10\tsparse.file\n' du -A -g sparse.file
4974c9a591SEnji Cooper}
5074c9a591SEnji Cooper
5174c9a591SEnji Cooperatf_test_case H_flag
5274c9a591SEnji CooperH_flag_head()
5374c9a591SEnji Cooper{
5474c9a591SEnji Cooper	atf_set "descr" "Verify -H behavior"
5574c9a591SEnji Cooper}
5674c9a591SEnji CooperH_flag_body()
5774c9a591SEnji Cooper{
5874c9a591SEnji Cooper	local paths1='testdir/A/B testdir/A testdir/C testdir'
593c5c39c7SKyle Evans	local paths2='testdir/C/B testdir/C'
60bf59049cSKyle Evans	local lineprefix=$'^[0-9]+\t'
613c5c39c7SKyle Evans	local sep="\$\n${lineprefix}"
6274c9a591SEnji Cooper
6374c9a591SEnji Cooper	atf_check mkdir testdir
6474c9a591SEnji Cooper	atf_check -x "cd testdir && mkdir A && touch A/B && ln -s A C"
6574c9a591SEnji Cooper
6674c9a591SEnji Cooper	atf_check -o save:du.out du -aAH testdir
673c5c39c7SKyle Evans	atf_check egrep -q "${lineprefix}$(echo $paths1 | sed -e "s/ /$sep/g")$" du.out
683c5c39c7SKyle Evans	# Check that the output doesn't contain any lines (i.e. paths) that we
693c5c39c7SKyle Evans	# did not expect it to contain from $paths1.
703c5c39c7SKyle Evans	atf_check -s exit:1 egrep -vq "${lineprefix}$(echo $paths1 | sed -e "s/ /$sep/g")$" du.out
713c5c39c7SKyle Evans
7274c9a591SEnji Cooper	atf_check -o save:du_C.out du -aAH testdir/C
733c5c39c7SKyle Evans	atf_check egrep -q "${lineprefix}$(echo $paths2 | sed -e "s/ /$sep/g")$" du_C.out
743c5c39c7SKyle Evans
753c5c39c7SKyle Evans	# Check that the output doesn't contain any lines (i.e. paths) that we
763c5c39c7SKyle Evans	# did not expect it to contain from $paths2.
773c5c39c7SKyle Evans	atf_check -s exit:1 egrep -vq "${lineprefix}$(echo $paths2 | sed -e "s/ /$sep/g")$" du_C.out
7874c9a591SEnji Cooper}
7974c9a591SEnji Cooper
8074c9a591SEnji Cooperatf_test_case I_flag
8174c9a591SEnji CooperI_flag_head()
8274c9a591SEnji Cooper{
8374c9a591SEnji Cooper	atf_set "descr" "Verify -I behavior"
8474c9a591SEnji Cooper}
8574c9a591SEnji CooperI_flag_body()
8674c9a591SEnji Cooper{
8774c9a591SEnji Cooper	paths_sans_foo_named="a/motley/fool/of/sorts fool/parts/with/their/cache bar baz"
8874c9a591SEnji Cooper	paths_foo_named="foo foobar"
8974c9a591SEnji Cooper	paths="$paths_sans_foo_named $paths_foo_named"
9074c9a591SEnji Cooper
9174c9a591SEnji Cooper	# cd'ing to testdir helps ensure that files from atf/kyua don't
9274c9a591SEnji Cooper	# pollute the results.
9374c9a591SEnji Cooper	atf_check -x "mkdir testdir && cd testdir && mkdir -p $paths"
9474c9a591SEnji Cooper	atf_check -o save:du.out -x "cd testdir && du -s $paths_sans_foo_named"
9574c9a591SEnji Cooper	atf_check -o save:du_I.out -x "cd testdir && du -I '*foo*' -s $paths"
9674c9a591SEnji Cooper
9774c9a591SEnji Cooper	atf_check diff -u du.out du_I.out
9874c9a591SEnji Cooper}
9974c9a591SEnji Cooper
100*3e5550d2SMichal Scigockiatf_test_case L_flag
101*3e5550d2SMichal ScigockiL_flag_head()
102*3e5550d2SMichal Scigocki{
103*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -L behavior"
104*3e5550d2SMichal Scigocki}
105*3e5550d2SMichal ScigockiL_flag_body()
106*3e5550d2SMichal Scigocki{
107*3e5550d2SMichal Scigocki	atf_check mkdir -p testdir1
108*3e5550d2SMichal Scigocki	atf_check truncate -s 8192 testdir1/A
109*3e5550d2SMichal Scigocki	atf_check ln -s A testdir1/B
110*3e5550d2SMichal Scigocki	atf_check -o inline:'9\ttestdir1\n' du -A testdir1
111*3e5550d2SMichal Scigocki	atf_check -o inline:'17\ttestdir1\n' du -AL testdir1
112*3e5550d2SMichal Scigocki}
113*3e5550d2SMichal Scigocki
114*3e5550d2SMichal Scigockiatf_test_case P_flag
115*3e5550d2SMichal ScigockiP_flag_head()
116*3e5550d2SMichal Scigocki{
117*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -P behavior"
118*3e5550d2SMichal Scigocki}
119*3e5550d2SMichal ScigockiP_flag_body()
120*3e5550d2SMichal Scigocki{
121*3e5550d2SMichal Scigocki	atf_check mkdir -p testdir1
122*3e5550d2SMichal Scigocki	atf_check truncate -s 8192 testdir1/A
123*3e5550d2SMichal Scigocki	atf_check ln -s A testdir1/B
124*3e5550d2SMichal Scigocki	atf_check -o inline:'9\ttestdir1\n' du -A testdir1
125*3e5550d2SMichal Scigocki	atf_check -o inline:'9\ttestdir1\n' du -AP testdir1
126*3e5550d2SMichal Scigocki}
127*3e5550d2SMichal Scigocki
128*3e5550d2SMichal Scigockiatf_test_case a_flag
129*3e5550d2SMichal Scigockia_flag_head()
130*3e5550d2SMichal Scigocki{
131*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -a behavior"
132*3e5550d2SMichal Scigocki}
133*3e5550d2SMichal Scigockia_flag_body()
134*3e5550d2SMichal Scigocki{
135*3e5550d2SMichal Scigocki	atf_check mkdir -p testdir1
136*3e5550d2SMichal Scigocki	atf_check truncate -s 0 testdir1/A
137*3e5550d2SMichal Scigocki	atf_check -o inline:'1\ttestdir1\n' du -A testdir1
138*3e5550d2SMichal Scigocki	atf_check -o inline:'0\ttestdir1/A\n1\ttestdir1\n' du -Aa testdir1
139*3e5550d2SMichal Scigocki}
140*3e5550d2SMichal Scigocki
14174c9a591SEnji Cooperatf_test_case c_flag
14274c9a591SEnji Cooperc_flag_head()
14374c9a591SEnji Cooper{
14474c9a591SEnji Cooper	atf_set	"descr" "Verify -c output"
14574c9a591SEnji Cooper}
14674c9a591SEnji Cooperc_flag_body()
14774c9a591SEnji Cooper{
148*3e5550d2SMichal Scigocki	atf_check truncate -s 8192 foo bar
149*3e5550d2SMichal Scigocki	atf_check -o inline:'8\tfoo\n8\tbar\n' du -A foo bar
150*3e5550d2SMichal Scigocki	atf_check -o inline:'8\tfoo\n8\tbar\n16\ttotal\n' du -Ac foo bar
151*3e5550d2SMichal Scigocki}
152*3e5550d2SMichal Scigocki
153*3e5550d2SMichal Scigockiatf_test_case d_flag
154*3e5550d2SMichal Scigockid_flag_head()
155*3e5550d2SMichal Scigocki{
156*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -d behavior"
157*3e5550d2SMichal Scigocki}
158*3e5550d2SMichal Scigockid_flag_body()
159*3e5550d2SMichal Scigocki{
160*3e5550d2SMichal Scigocki	atf_check mkdir -p d0/d1/d2
161*3e5550d2SMichal Scigocki	atf_check -o inline:'2\td0\n' du -A -d 0 d0
162*3e5550d2SMichal Scigocki	atf_check -o inline:'1\td0/d1\n2\td0\n' du -A -d 1 d0
163*3e5550d2SMichal Scigocki	atf_check -o inline:'1\td0/d1/d2\n1\td0/d1\n2\td0\n' du -A -d 2 d0
164*3e5550d2SMichal Scigocki	atf_check -o inline:'1\td0/d1/d2\n1\td0/d1\n2\td0\n' du -A -d 3 d0
16574c9a591SEnji Cooper}
16674c9a591SEnji Cooper
16774c9a591SEnji Cooperatf_test_case g_flag
16874c9a591SEnji Cooperg_flag_head()
16974c9a591SEnji Cooper{
17074c9a591SEnji Cooper	atf_set "descr" "Verify -g output"
17174c9a591SEnji Cooper}
17274c9a591SEnji Cooperg_flag_body()
17374c9a591SEnji Cooper{
17439a1f858SAlex Richardson	require_sparse_file_support
17574c9a591SEnji Cooper	atf_check truncate -s 1k A
17674c9a591SEnji Cooper	atf_check truncate -s 1m B
17774c9a591SEnji Cooper	atf_check truncate -s 1g C
17874c9a591SEnji Cooper	atf_check truncate -s 1t D
17974c9a591SEnji Cooper	atf_check -o inline:'1\tA\n1\tB\n1\tC\n1024\tD\n' du -Ag A B C D
18074c9a591SEnji Cooper}
18174c9a591SEnji Cooper
18274c9a591SEnji Cooperatf_test_case h_flag
18374c9a591SEnji Cooperh_flag_head()
18474c9a591SEnji Cooper{
18574c9a591SEnji Cooper	atf_set	"descr" "Verify -h output"
18674c9a591SEnji Cooper}
18774c9a591SEnji Cooperh_flag_body()
18874c9a591SEnji Cooper{
18939a1f858SAlex Richardson	require_sparse_file_support
19074c9a591SEnji Cooper	atf_check truncate -s 1k A
19174c9a591SEnji Cooper	atf_check truncate -s 1m B
19274c9a591SEnji Cooper	atf_check truncate -s 1g C
19374c9a591SEnji Cooper	atf_check truncate -s 1t D
19474c9a591SEnji Cooper	atf_check -o inline:'1.0K\tA\n1.0M\tB\n1.0G\tC\n1.0T\tD\n' du -Ah A B C D
19574c9a591SEnji Cooper}
19674c9a591SEnji Cooper
19774c9a591SEnji Cooperatf_test_case k_flag
19874c9a591SEnji Cooperk_flag_head()
19974c9a591SEnji Cooper{
20074c9a591SEnji Cooper	atf_set "descr" "Verify -k output"
20174c9a591SEnji Cooper}
20274c9a591SEnji Cooperk_flag_body()
20374c9a591SEnji Cooper{
20474c9a591SEnji Cooper	atf_check truncate -s 1k A
20574c9a591SEnji Cooper	atf_check truncate -s 1m B
20674c9a591SEnji Cooper	atf_check -o inline:'1\tA\n1024\tB\n' du -Ak A B
20774c9a591SEnji Cooper}
20874c9a591SEnji Cooper
209*3e5550d2SMichal Scigockiatf_test_case l_flag
210*3e5550d2SMichal Scigockil_flag_head()
211*3e5550d2SMichal Scigocki{
212*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -l output"
213*3e5550d2SMichal Scigocki}
214*3e5550d2SMichal Scigockil_flag_body()
215*3e5550d2SMichal Scigocki{
216*3e5550d2SMichal Scigocki	atf_check truncate -s 0 A
217*3e5550d2SMichal Scigocki	atf_check ln A B
218*3e5550d2SMichal Scigocki	atf_check -o inline:'0\tA\n' du -A A B
219*3e5550d2SMichal Scigocki	atf_check -o inline:'0\tA\n0\tB\n' du -Al A B
220*3e5550d2SMichal Scigocki}
221*3e5550d2SMichal Scigocki
22274c9a591SEnji Cooperatf_test_case m_flag
22374c9a591SEnji Cooperm_flag_head()
22474c9a591SEnji Cooper{
22574c9a591SEnji Cooper	atf_set "descr" "Verify -m output"
22674c9a591SEnji Cooper}
22774c9a591SEnji Cooperm_flag_body()
22874c9a591SEnji Cooper{
22974c9a591SEnji Cooper	atf_check truncate -s 1k A
23074c9a591SEnji Cooper	atf_check truncate -s 1m B
23174c9a591SEnji Cooper	atf_check truncate -s 1g C
23274c9a591SEnji Cooper	atf_check -o inline:'1\tA\n1\tB\n1024\tC\n' du -Am A B C
23374c9a591SEnji Cooper}
23474c9a591SEnji Cooper
235*3e5550d2SMichal Scigockiatf_test_case n_flag
236*3e5550d2SMichal Scigockin_flag_head()
237*3e5550d2SMichal Scigocki{
238*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -n output"
239*3e5550d2SMichal Scigocki}
240*3e5550d2SMichal Scigockin_flag_body()
241*3e5550d2SMichal Scigocki{
242*3e5550d2SMichal Scigocki	atf_check truncate -s 0 A
243*3e5550d2SMichal Scigocki	atf_check truncate -s 0 B
244*3e5550d2SMichal Scigocki	atf_check -o inline:'0\tA\n0\tB\n' du -An A B
245*3e5550d2SMichal Scigocki	atf_check chflags nodump B
246*3e5550d2SMichal Scigocki	atf_check -o inline:'0\tA\n' du -An A B
247*3e5550d2SMichal Scigocki}
248*3e5550d2SMichal Scigocki
249*3e5550d2SMichal Scigockiatf_test_case s_flag
250*3e5550d2SMichal Scigockis_flag_head()
251*3e5550d2SMichal Scigocki{
252*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -s behavior"
253*3e5550d2SMichal Scigocki}
254*3e5550d2SMichal Scigockis_flag_body()
255*3e5550d2SMichal Scigocki{
256*3e5550d2SMichal Scigocki	atf_check mkdir -p testdir1/testdir2
257*3e5550d2SMichal Scigocki	atf_check truncate -s 0 testdir1/A testdir1/testdir2/B
258*3e5550d2SMichal Scigocki	atf_check -o inline:'1\ttestdir1\n' du -As testdir1
259*3e5550d2SMichal Scigocki	atf_check -o inline:'0\ttestdir1/A\n' du -As testdir1/A
260*3e5550d2SMichal Scigocki	atf_check -o inline:'1\ttestdir1/testdir2\n' du -As testdir1/testdir2
261*3e5550d2SMichal Scigocki	atf_check -o inline:'0\ttestdir1/testdir2/B\n' \
262*3e5550d2SMichal Scigocki	    du -As testdir1/testdir2/B
263*3e5550d2SMichal Scigocki}
264*3e5550d2SMichal Scigocki
265476c601bSKyle Evansatf_test_case si_flag
266476c601bSKyle Evanssi_flag_head()
267476c601bSKyle Evans{
268476c601bSKyle Evans	atf_set "descr" "Verify --si output"
269476c601bSKyle Evans}
270476c601bSKyle Evanssi_flag_body()
271476c601bSKyle Evans{
272476c601bSKyle Evans	atf_check truncate -s 1500000 A
273476c601bSKyle Evans	atf_check truncate -s 1572864 B
274476c601bSKyle Evans
275476c601bSKyle Evans	atf_check -o inline:'1.4M\tA\n1.5M\tB\n' du -Ah A B
276476c601bSKyle Evans	atf_check -o inline:'1.5M\tA\n1.6M\tB\n' du -A --si A B
277476c601bSKyle Evans}
278476c601bSKyle Evans
279*3e5550d2SMichal Scigockiatf_add_test_case t_flag
280*3e5550d2SMichal Scigockit_flag_head()
281*3e5550d2SMichal Scigocki{
282*3e5550d2SMichal Scigocki	atf_set "descr" "Verify -t output"
283*3e5550d2SMichal Scigocki}
284*3e5550d2SMichal Scigockit_flag_body()
285*3e5550d2SMichal Scigocki{
286*3e5550d2SMichal Scigocki	atf_check mkdir -p testdir1/testdir2
287*3e5550d2SMichal Scigocki	atf_check truncate -s 8192 testdir1/A testdir1/testdir2/B
288*3e5550d2SMichal Scigocki
289*3e5550d2SMichal Scigocki	atf_check -o inline:'17\ttestdir1\n' du -At 10240 testdir1
290*3e5550d2SMichal Scigocki	atf_check -o inline:'9\ttestdir1/testdir2\n' du -At -10240 testdir1
291*3e5550d2SMichal Scigocki	atf_check -o inline:'9\ttestdir1/testdir2\n17\ttestdir1\n' \
292*3e5550d2SMichal Scigocki	    du -Aat 9216 testdir1
293*3e5550d2SMichal Scigocki	atf_check -o save:du.out du -Aat -9216 testdir1
294*3e5550d2SMichal Scigocki	atf_check -o inline:'8\ttestdir1/A\n8\ttestdir1/testdir2/B\n' \
295*3e5550d2SMichal Scigocki	    sort du.out
296*3e5550d2SMichal Scigocki}
297*3e5550d2SMichal Scigocki
29874c9a591SEnji Cooperatf_init_test_cases()
29974c9a591SEnji Cooper{
30074c9a591SEnji Cooper	atf_add_test_case A_flag
30174c9a591SEnji Cooper	atf_add_test_case H_flag
30274c9a591SEnji Cooper	atf_add_test_case I_flag
303*3e5550d2SMichal Scigocki	atf_add_test_case L_flag
304*3e5550d2SMichal Scigocki	atf_add_test_case P_flag
305*3e5550d2SMichal Scigocki	atf_add_test_case a_flag
306*3e5550d2SMichal Scigocki	atf_add_test_case c_flag
307*3e5550d2SMichal Scigocki	atf_add_test_case d_flag
30874c9a591SEnji Cooper	atf_add_test_case g_flag
30974c9a591SEnji Cooper	atf_add_test_case h_flag
31074c9a591SEnji Cooper	atf_add_test_case k_flag
311*3e5550d2SMichal Scigocki	atf_add_test_case l_flag
31274c9a591SEnji Cooper	atf_add_test_case m_flag
313*3e5550d2SMichal Scigocki	atf_add_test_case n_flag
314*3e5550d2SMichal Scigocki	atf_add_test_case s_flag
315476c601bSKyle Evans	atf_add_test_case si_flag
316*3e5550d2SMichal Scigocki	atf_add_test_case t_flag
31774c9a591SEnji Cooper}
318