xref: /freebsd-src/contrib/netbsd-tests/fs/tmpfs/t_rename.sh (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper# $NetBSD: t_rename.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
2*57718be8SEnji Cooper#
3*57718be8SEnji Cooper# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
4*57718be8SEnji Cooper# All rights reserved.
5*57718be8SEnji Cooper#
6*57718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without
7*57718be8SEnji Cooper# modification, are permitted provided that the following conditions
8*57718be8SEnji Cooper# are met:
9*57718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright
10*57718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer.
11*57718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
12*57718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
13*57718be8SEnji Cooper#    documentation and/or other materials provided with the distribution.
14*57718be8SEnji Cooper#
15*57718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16*57718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17*57718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18*57718be8SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19*57718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*57718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*57718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*57718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*57718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*57718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*57718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
26*57718be8SEnji Cooper#
27*57718be8SEnji Cooper
28*57718be8SEnji Cooper#
29*57718be8SEnji Cooper# Verifies that the rename operation works (either by renaming entries or
30*57718be8SEnji Cooper# by moving them).
31*57718be8SEnji Cooper#
32*57718be8SEnji Cooper
33*57718be8SEnji Cooperatf_test_case dots
34*57718be8SEnji Cooperdots_head() {
35*57718be8SEnji Cooper	atf_set "descr" "Tests that '.' and '..' cannot be renamed"
36*57718be8SEnji Cooper	atf_set "require.user" "root"
37*57718be8SEnji Cooper}
38*57718be8SEnji Cooperdots_body() {
39*57718be8SEnji Cooper	test_mount
40*57718be8SEnji Cooper
41*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
42*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e ignore mv a/. c
43*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e ignore mv a/.. c
44*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir a
45*57718be8SEnji Cooper
46*57718be8SEnji Cooper	test_unmount
47*57718be8SEnji Cooper}
48*57718be8SEnji Cooper
49*57718be8SEnji Cooperatf_test_case crossdev
50*57718be8SEnji Coopercrossdev_head() {
51*57718be8SEnji Cooper	atf_set "descr" "Tests that cross-device renames do not work"
52*57718be8SEnji Cooper	atf_set "require.user" "root"
53*57718be8SEnji Cooper}
54*57718be8SEnji Coopercrossdev_body() {
55*57718be8SEnji Cooper	test_mount
56*57718be8SEnji Cooper
57*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
58*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e save:stderr \
59*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_tools rename a /var/tmp/a
60*57718be8SEnji Cooper	atf_check -s eq:0 -o ignore -e empty grep "Cross-device link" stderr
61*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d a
62*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir a
63*57718be8SEnji Cooper
64*57718be8SEnji Cooper	test_unmount
65*57718be8SEnji Cooper}
66*57718be8SEnji Cooper
67*57718be8SEnji Cooperatf_test_case basic
68*57718be8SEnji Cooperbasic_head() {
69*57718be8SEnji Cooper	atf_set "descr" "Tests that basic renames work"
70*57718be8SEnji Cooper	atf_set "require.user" "root"
71*57718be8SEnji Cooper}
72*57718be8SEnji Cooperbasic_body() {
73*57718be8SEnji Cooper	test_mount
74*57718be8SEnji Cooper
75*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
76*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv a c
77*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e empty test -d a
78*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d c
79*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir c
80*57718be8SEnji Cooper
81*57718be8SEnji Cooper	test_unmount
82*57718be8SEnji Cooper}
83*57718be8SEnji Cooper
84*57718be8SEnji Cooperatf_test_case dotdot
85*57718be8SEnji Cooperdotdot_head() {
86*57718be8SEnji Cooper	atf_set "descr" "Tests that the '..' entry is properly updated" \
87*57718be8SEnji Cooper	                "during moves"
88*57718be8SEnji Cooper	atf_set "require.user" "root"
89*57718be8SEnji Cooper}
90*57718be8SEnji Cooperdotdot_body() {
91*57718be8SEnji Cooper	test_mount
92*57718be8SEnji Cooper
93*57718be8SEnji Cooper	echo "Checking if the '..' entry is updated after moves"
94*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
95*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir b
96*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv b a
97*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d a/b/../b
98*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d a/b/../../a
99*57718be8SEnji Cooper	eval $(stat -s a/b)
100*57718be8SEnji Cooper	[ ${st_nlink} = 2 ] || atf_fail "Incorrect number of links"
101*57718be8SEnji Cooper	eval $(stat -s a)
102*57718be8SEnji Cooper	[ ${st_nlink} = 3 ] || atf_fail "Incorrect number of links"
103*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir a/b
104*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir a
105*57718be8SEnji Cooper
106*57718be8SEnji Cooper	echo "Checking if the '..' entry is correct after renames"
107*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
108*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir b
109*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv b a
110*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv a c
111*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d c/b/../b
112*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d c/b/../../c
113*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir c/b
114*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir c
115*57718be8SEnji Cooper
116*57718be8SEnji Cooper	echo "Checking if the '..' entry is correct after multiple moves"
117*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
118*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir b
119*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv b a
120*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv a c
121*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mv c/b d
122*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d d/../c
123*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir d
124*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir c
125*57718be8SEnji Cooper
126*57718be8SEnji Cooper	test_unmount
127*57718be8SEnji Cooper}
128*57718be8SEnji Cooper
129*57718be8SEnji Cooperatf_test_case dir_to_emptydir
130*57718be8SEnji Cooperdir_to_emptydir_head() {
131*57718be8SEnji Cooper	atf_set "descr" "Tests that renaming a directory to override an" \
132*57718be8SEnji Cooper	                "empty directory works"
133*57718be8SEnji Cooper	atf_set "require.user" "root"
134*57718be8SEnji Cooper}
135*57718be8SEnji Cooperdir_to_emptydir_body() {
136*57718be8SEnji Cooper	test_mount
137*57718be8SEnji Cooper
138*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
139*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch a/c
140*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir b
141*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty \
142*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_tools rename a b
143*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e empty test -e a
144*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d b
145*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -f b/c
146*57718be8SEnji Cooper	rm b/c
147*57718be8SEnji Cooper	rmdir b
148*57718be8SEnji Cooper
149*57718be8SEnji Cooper	test_unmount
150*57718be8SEnji Cooper}
151*57718be8SEnji Cooper
152*57718be8SEnji Cooperatf_test_case dir_to_fulldir
153*57718be8SEnji Cooperdir_to_fulldir_head() {
154*57718be8SEnji Cooper	atf_set "descr" "Tests that renaming a directory to override a" \
155*57718be8SEnji Cooper	                "non-empty directory fails"
156*57718be8SEnji Cooper	atf_set "require.user" "root"
157*57718be8SEnji Cooper}
158*57718be8SEnji Cooperdir_to_fulldir_body() {
159*57718be8SEnji Cooper	test_mount
160*57718be8SEnji Cooper
161*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
162*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch a/c
163*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir b
164*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch b/d
165*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e save:stderr \
166*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_tools rename a b
167*57718be8SEnji Cooper	atf_check -s eq:0 -o ignore -e empty grep "Directory not empty" stderr
168*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d a
169*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -f a/c
170*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d b
171*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -f b/d
172*57718be8SEnji Cooper	rm a/c
173*57718be8SEnji Cooper	rm b/d
174*57718be8SEnji Cooper	rmdir a
175*57718be8SEnji Cooper	rmdir b
176*57718be8SEnji Cooper
177*57718be8SEnji Cooper	test_unmount
178*57718be8SEnji Cooper}
179*57718be8SEnji Cooper
180*57718be8SEnji Cooperatf_test_case dir_to_file
181*57718be8SEnji Cooperdir_to_file_head() {
182*57718be8SEnji Cooper	atf_set "descr" "Tests that renaming a directory to override a" \
183*57718be8SEnji Cooper	                "file fails"
184*57718be8SEnji Cooper	atf_set "require.user" "root"
185*57718be8SEnji Cooper}
186*57718be8SEnji Cooperdir_to_file_body() {
187*57718be8SEnji Cooper	test_mount
188*57718be8SEnji Cooper
189*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir a
190*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch b
191*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e save:stderr \
192*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_tools rename a b
193*57718be8SEnji Cooper	atf_check -s eq:0 -o ignore -e empty grep "Not a directory" stderr
194*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d a
195*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -f b
196*57718be8SEnji Cooper	rmdir a
197*57718be8SEnji Cooper	rm b
198*57718be8SEnji Cooper
199*57718be8SEnji Cooper	test_unmount
200*57718be8SEnji Cooper}
201*57718be8SEnji Cooper
202*57718be8SEnji Cooperatf_test_case file_to_dir
203*57718be8SEnji Cooperfile_to_dir_head() {
204*57718be8SEnji Cooper	atf_set "descr" "Tests that renaming a file to override a" \
205*57718be8SEnji Cooper	                "directory fails"
206*57718be8SEnji Cooper	atf_set "require.user" "root"
207*57718be8SEnji Cooper}
208*57718be8SEnji Cooperfile_to_dir_body() {
209*57718be8SEnji Cooper	test_mount
210*57718be8SEnji Cooper
211*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch a
212*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir b
213*57718be8SEnji Cooper	atf_check -s eq:1 -o empty -e save:stderr \
214*57718be8SEnji Cooper	    $(atf_get_srcdir)/h_tools rename a b
215*57718be8SEnji Cooper	atf_check -s eq:0 -o ignore -e empty grep "Is a directory" stderr
216*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -f a
217*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty test -d b
218*57718be8SEnji Cooper	rm a
219*57718be8SEnji Cooper	rmdir b
220*57718be8SEnji Cooper
221*57718be8SEnji Cooper	test_unmount
222*57718be8SEnji Cooper}
223*57718be8SEnji Cooper
224*57718be8SEnji Cooperatf_test_case kqueue
225*57718be8SEnji Cooperkqueue_head() {
226*57718be8SEnji Cooper	atf_set "descr" "Tests that moving and renaming files raise the" \
227*57718be8SEnji Cooper	                "correct kqueue events"
228*57718be8SEnji Cooper	atf_set "require.user" "root"
229*57718be8SEnji Cooper}
230*57718be8SEnji Cooperkqueue_body() {
231*57718be8SEnji Cooper	test_mount
232*57718be8SEnji Cooper
233*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir dir
234*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch dir/a
235*57718be8SEnji Cooper	echo 'mv dir/a dir/b' | kqueue_monitor 2 dir dir/a
236*57718be8SEnji Cooper	kqueue_check dir/a NOTE_RENAME
237*57718be8SEnji Cooper	kqueue_check dir NOTE_WRITE
238*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rm dir/b
239*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir dir
240*57718be8SEnji Cooper
241*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir dir
242*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch dir/a
243*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch dir/b
244*57718be8SEnji Cooper	echo 'mv dir/a dir/b' | kqueue_monitor 3 dir dir/a dir/b
245*57718be8SEnji Cooper	kqueue_check dir/a NOTE_RENAME
246*57718be8SEnji Cooper	kqueue_check dir NOTE_WRITE
247*57718be8SEnji Cooper	kqueue_check dir/b NOTE_DELETE
248*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rm dir/b
249*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir dir
250*57718be8SEnji Cooper
251*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir dir1
252*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty mkdir dir2
253*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty touch dir1/a
254*57718be8SEnji Cooper	echo 'mv dir1/a dir2/a' | kqueue_monitor 3 dir1 dir1/a dir2
255*57718be8SEnji Cooper	kqueue_check dir1/a NOTE_RENAME
256*57718be8SEnji Cooper	kqueue_check dir1 NOTE_WRITE
257*57718be8SEnji Cooper	kqueue_check dir2 NOTE_WRITE
258*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rm dir2/a
259*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir dir1
260*57718be8SEnji Cooper	atf_check -s eq:0 -o empty -e empty rmdir dir2
261*57718be8SEnji Cooper
262*57718be8SEnji Cooper	test_unmount
263*57718be8SEnji Cooper}
264*57718be8SEnji Cooper
265*57718be8SEnji Cooperatf_init_test_cases() {
266*57718be8SEnji Cooper	. $(atf_get_srcdir)/../h_funcs.subr
267*57718be8SEnji Cooper	. $(atf_get_srcdir)/h_funcs.subr
268*57718be8SEnji Cooper
269*57718be8SEnji Cooper	atf_add_test_case dots
270*57718be8SEnji Cooper	atf_add_test_case crossdev
271*57718be8SEnji Cooper	atf_add_test_case basic
272*57718be8SEnji Cooper	atf_add_test_case dotdot
273*57718be8SEnji Cooper	atf_add_test_case dir_to_emptydir
274*57718be8SEnji Cooper	atf_add_test_case dir_to_fulldir
275*57718be8SEnji Cooper	atf_add_test_case dir_to_file
276*57718be8SEnji Cooper	atf_add_test_case file_to_dir
277*57718be8SEnji Cooper	atf_add_test_case kqueue
278*57718be8SEnji Cooper}
279