xref: /freebsd/usr.sbin/chown/tests/chown_test.sh (revision c19afa1c20b9f08386b6e0a29fc06e5e1853f0d7)
1*c19afa1cSEnji Cooper#
2*c19afa1cSEnji Cooper# Copyright (c) 2017 Dell EMC
3*c19afa1cSEnji Cooper# All rights reserved.
4*c19afa1cSEnji Cooper#
5*c19afa1cSEnji Cooper# Redistribution and use in source and binary forms, with or without
6*c19afa1cSEnji Cooper# modification, are permitted provided that the following conditions
7*c19afa1cSEnji Cooper# are met:
8*c19afa1cSEnji Cooper# 1. Redistributions of source code must retain the above copyright
9*c19afa1cSEnji Cooper#    notice, this list of conditions and the following disclaimer.
10*c19afa1cSEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
11*c19afa1cSEnji Cooper#    notice, this list of conditions and the following disclaimer in the
12*c19afa1cSEnji Cooper#    documentation and/or other materials provided with the distribution.
13*c19afa1cSEnji Cooper#
14*c19afa1cSEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*c19afa1cSEnji Cooper# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*c19afa1cSEnji Cooper# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*c19afa1cSEnji Cooper# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*c19afa1cSEnji Cooper# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*c19afa1cSEnji Cooper# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*c19afa1cSEnji Cooper# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*c19afa1cSEnji Cooper# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*c19afa1cSEnji Cooper# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*c19afa1cSEnji Cooper# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*c19afa1cSEnji Cooper# SUCH DAMAGE.
25*c19afa1cSEnji Cooper#
26*c19afa1cSEnji Cooper# $FreeBSD$
27*c19afa1cSEnji Cooper
28*c19afa1cSEnji Cooperatf_test_case RH_flag
29*c19afa1cSEnji CooperRH_flag_head()
30*c19afa1cSEnji Cooper{
31*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting ownership recursively via -R doesn't " \
32*c19afa1cSEnji Cooper			"affect symlinks specified via the arguments when -H " \
33*c19afa1cSEnji Cooper			"is specified"
34*c19afa1cSEnji Cooper	atf_set "require.user" "root"
35*c19afa1cSEnji Cooper}
36*c19afa1cSEnji CooperRH_flag_body()
37*c19afa1cSEnji Cooper{
38*c19afa1cSEnji Cooper	atf_check mkdir -p A/B
39*c19afa1cSEnji Cooper	atf_check ln -s B A/C
40*c19afa1cSEnji Cooper	atf_check chown -h 42:42 A/C
41*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n42:42\n' stat -f '%u:%g' A A/B A/C
42*c19afa1cSEnji Cooper	atf_check chown -RH 84:84 A
43*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n84:84\n84:84\n' stat -f '%u:%g' A A/B A/C
44*c19afa1cSEnji Cooper	atf_check chown -RH 126:126 A/C
45*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n126:126\n84:84\n' stat -f '%u:%g' A A/B A/C
46*c19afa1cSEnji Cooper}
47*c19afa1cSEnji Cooper
48*c19afa1cSEnji Cooperatf_test_case RL_flag
49*c19afa1cSEnji CooperRL_flag_head()
50*c19afa1cSEnji Cooper{
51*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting ownership recursively via -R doesn't " \
52*c19afa1cSEnji Cooper			"affect symlinks specified via the arguments when -L " \
53*c19afa1cSEnji Cooper			"is specified"
54*c19afa1cSEnji Cooper	atf_set "require.user" "root"
55*c19afa1cSEnji Cooper}
56*c19afa1cSEnji CooperRL_flag_body()
57*c19afa1cSEnji Cooper{
58*c19afa1cSEnji Cooper	atf_check mkdir -p A/B
59*c19afa1cSEnji Cooper	atf_check ln -s B A/C
60*c19afa1cSEnji Cooper	atf_check chown -h 42:42 A/C
61*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n42:42\n' stat -f '%u:%g' A A/B A/C
62*c19afa1cSEnji Cooper	atf_check chown -RL 84:84 A
63*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n84:84\n42:42\n' stat -f '%u:%g' A A/B A/C
64*c19afa1cSEnji Cooper	atf_check chown -RL 126:126 A/C
65*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n126:126\n42:42\n' stat -f '%u:%g' A A/B A/C
66*c19afa1cSEnji Cooper}
67*c19afa1cSEnji Cooper
68*c19afa1cSEnji Cooperatf_test_case RP_flag
69*c19afa1cSEnji CooperRP_flag_head()
70*c19afa1cSEnji Cooper{
71*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting ownership recursively via -R " \
72*c19afa1cSEnji Cooper			"doesn't affect symlinks specified via the arguments " \
73*c19afa1cSEnji Cooper			"when -P is specified"
74*c19afa1cSEnji Cooper	atf_set "require.user" "root"
75*c19afa1cSEnji Cooper}
76*c19afa1cSEnji CooperRP_flag_body()
77*c19afa1cSEnji Cooper{
78*c19afa1cSEnji Cooper	atf_check mkdir -p A/B
79*c19afa1cSEnji Cooper	atf_check ln -s B A/C
80*c19afa1cSEnji Cooper	atf_check chown -h 42:42 A/C
81*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n42:42\n' stat -f '%u:%g' A A/B A/C
82*c19afa1cSEnji Cooper	atf_check chown -RP 84:84 A
83*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n84:84\n84:84\n' stat -f '%u:%g' A A/B A/C
84*c19afa1cSEnji Cooper	atf_check chown -RP 126:126 A/C
85*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n84:84\n126:126\n' stat -f '%u:%g' A A/B A/C
86*c19afa1cSEnji Cooper}
87*c19afa1cSEnji Cooper
88*c19afa1cSEnji Cooperatf_test_case f_flag cleanup
89*c19afa1cSEnji Cooperf_flag_head()
90*c19afa1cSEnji Cooper{
91*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting a mode for a file with -f " \
92*c19afa1cSEnji Cooper			"doesn't emit an error message/exit with a non-zero " \
93*c19afa1cSEnji Cooper			"code"
94*c19afa1cSEnji Cooper	atf_set "require.user" "root"
95*c19afa1cSEnji Cooper}
96*c19afa1cSEnji Cooper
97*c19afa1cSEnji Cooperf_flag_body()
98*c19afa1cSEnji Cooper{
99*c19afa1cSEnji Cooper	atf_check truncate -s 0 foo bar
100*c19afa1cSEnji Cooper	atf_check chown 0:0 foo bar
101*c19afa1cSEnji Cooper	atf_check chflags uchg foo
102*c19afa1cSEnji Cooper	atf_check -e not-empty -s not-exit:0 chown 42:42 foo bar
103*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n42:42\n' stat -f '%u:%g' foo bar
104*c19afa1cSEnji Cooper	atf_check -s exit:0 chown -f 84:84 foo bar
105*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n84:84\n' stat -f '%u:%g' foo bar
106*c19afa1cSEnji Cooper}
107*c19afa1cSEnji Cooper
108*c19afa1cSEnji Cooperf_flag_cleanup()
109*c19afa1cSEnji Cooper{
110*c19afa1cSEnji Cooper	atf_check chflags 0 foo
111*c19afa1cSEnji Cooper}
112*c19afa1cSEnji Cooper
113*c19afa1cSEnji Cooperatf_test_case h_flag
114*c19afa1cSEnji Cooperh_flag_head()
115*c19afa1cSEnji Cooper{
116*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting a mode for a file with -f " \
117*c19afa1cSEnji Cooper			"doesn't emit an error message/exit with a non-zero " \
118*c19afa1cSEnji Cooper			"code"
119*c19afa1cSEnji Cooper	atf_set "require.user" "root"
120*c19afa1cSEnji Cooper}
121*c19afa1cSEnji Cooper
122*c19afa1cSEnji Cooperh_flag_body()
123*c19afa1cSEnji Cooper{
124*c19afa1cSEnji Cooper	atf_check truncate -s 0 foo
125*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n' stat -f '%u:%g' foo
126*c19afa1cSEnji Cooper	atf_check ln -s foo bar
127*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n' stat -f '%u:%g' foo bar
128*c19afa1cSEnji Cooper	atf_check chown -h 42:42 bar
129*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n42:42\n' stat -f '%u:%g' foo bar
130*c19afa1cSEnji Cooper	atf_check chown 84:84 bar
131*c19afa1cSEnji Cooper	atf_check -o inline:'84:84\n42:42\n' stat -f '%u:%g' foo bar
132*c19afa1cSEnji Cooper}
133*c19afa1cSEnji Cooper
134*c19afa1cSEnji Cooperatf_test_case v_flag
135*c19afa1cSEnji Cooperv_flag_head()
136*c19afa1cSEnji Cooper{
137*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting ownership with -v emits the " \
138*c19afa1cSEnji Cooper			"file doesn't emit an error message/exit with a " \
139*c19afa1cSEnji Cooper			"non-zero code"
140*c19afa1cSEnji Cooper	atf_set "require.user" "root"
141*c19afa1cSEnji Cooper}
142*c19afa1cSEnji Cooperv_flag_body()
143*c19afa1cSEnji Cooper{
144*c19afa1cSEnji Cooper	atf_check truncate -s 0 foo bar
145*c19afa1cSEnji Cooper	atf_check chown 0:0 foo
146*c19afa1cSEnji Cooper	atf_check chown 42:42 bar
147*c19afa1cSEnji Cooper	atf_check -o 'inline:bar\n' chown -v 0:0 foo bar
148*c19afa1cSEnji Cooper	atf_check chown -v 0:0 foo bar
149*c19afa1cSEnji Cooper	for f in foo bar; do
150*c19afa1cSEnji Cooper		echo "$f: 0:0 -> 84:84";
151*c19afa1cSEnji Cooper	done > output.txt
152*c19afa1cSEnji Cooper	atf_check -o file:output.txt chown -vv 84:84 foo bar
153*c19afa1cSEnji Cooper	atf_check chown -vv 84:84 foo bar
154*c19afa1cSEnji Cooper}
155*c19afa1cSEnji Cooper
156*c19afa1cSEnji Coopermd_file="md.out"
157*c19afa1cSEnji Cooperatf_test_case x_flag cleanup
158*c19afa1cSEnji Cooperx_flag_head()
159*c19afa1cSEnji Cooper{
160*c19afa1cSEnji Cooper	atf_set	"descr" "Verify that setting a mode with -x doesn't set " \
161*c19afa1cSEnji Cooper			"ownership across mountpoints"
162*c19afa1cSEnji Cooper	atf_set "require.user" "root"
163*c19afa1cSEnji Cooper}
164*c19afa1cSEnji Cooperx_flag_body()
165*c19afa1cSEnji Cooper{
166*c19afa1cSEnji Cooper	atf_check -o save:$md_file mdconfig -a -t malloc -s 20m
167*c19afa1cSEnji Cooper	if ! md_device=$(cat $md_file); then
168*c19afa1cSEnji Cooper		atf_fail "cat $md_file failed"
169*c19afa1cSEnji Cooper	fi
170*c19afa1cSEnji Cooper	atf_check -o not-empty newfs /dev/$md_device
171*c19afa1cSEnji Cooper	atf_check mkdir mnt
172*c19afa1cSEnji Cooper	atf_check mount /dev/$md_device mnt
173*c19afa1cSEnji Cooper	atf_check truncate -s 0 foo bar mnt/bazbaz
174*c19afa1cSEnji Cooper	atf_check ln -s bar mnt/barbaz
175*c19afa1cSEnji Cooper	atf_check ln -s ../foo mnt/foobaz
176*c19afa1cSEnji Cooper	cd mnt
177*c19afa1cSEnji Cooper	test_files="../foo ../bar barbaz bazbaz foobaz"
178*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n0:0\n0:0\n0:0\n' \
179*c19afa1cSEnji Cooper	    stat -f '%u:%g' $test_files
180*c19afa1cSEnji Cooper	atf_check chown -Rx 42:42 .
181*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n42:42\n42:42\n42:42\n' \
182*c19afa1cSEnji Cooper	    stat -f '%u:%g' $test_files
183*c19afa1cSEnji Cooper	atf_check chown -R 84:84 .
184*c19afa1cSEnji Cooper	atf_check -o inline:'0:0\n0:0\n84:84\n84:84\n84:84\n' \
185*c19afa1cSEnji Cooper	    stat -f '%u:%g' $test_files
186*c19afa1cSEnji Cooper}
187*c19afa1cSEnji Cooperx_flag_cleanup()
188*c19afa1cSEnji Cooper{
189*c19afa1cSEnji Cooper	if ! md_device=$(cat $md_file) || [ -z "$md_device" ]; then
190*c19afa1cSEnji Cooper		echo "Couldn't get device from $md_file"
191*c19afa1cSEnji Cooper		exit 0
192*c19afa1cSEnji Cooper	fi
193*c19afa1cSEnji Cooper	umount mnt
194*c19afa1cSEnji Cooper	mdconfig -d -u $md_device
195*c19afa1cSEnji Cooper}
196*c19afa1cSEnji Cooper
197*c19afa1cSEnji Cooperatf_init_test_cases()
198*c19afa1cSEnji Cooper{
199*c19afa1cSEnji Cooper	atf_add_test_case RH_flag
200*c19afa1cSEnji Cooper	atf_add_test_case RL_flag
201*c19afa1cSEnji Cooper	atf_add_test_case RP_flag
202*c19afa1cSEnji Cooper	atf_add_test_case f_flag
203*c19afa1cSEnji Cooper	atf_add_test_case h_flag
204*c19afa1cSEnji Cooper	atf_add_test_case v_flag
205*c19afa1cSEnji Cooper	atf_add_test_case x_flag
206*c19afa1cSEnji Cooper}
207