1272343Sngie# $NetBSD: t_rename.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
2272343Sngie#
3272343Sngie# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
4272343Sngie# All rights reserved.
5272343Sngie#
6272343Sngie# Redistribution and use in source and binary forms, with or without
7272343Sngie# modification, are permitted provided that the following conditions
8272343Sngie# are met:
9272343Sngie# 1. Redistributions of source code must retain the above copyright
10272343Sngie#    notice, this list of conditions and the following disclaimer.
11272343Sngie# 2. Redistributions in binary form must reproduce the above copyright
12272343Sngie#    notice, this list of conditions and the following disclaimer in the
13272343Sngie#    documentation and/or other materials provided with the distribution.
14272343Sngie#
15272343Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16272343Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17272343Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18272343Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19272343Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20272343Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21272343Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22272343Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23272343Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24272343Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25272343Sngie# POSSIBILITY OF SUCH DAMAGE.
26272343Sngie#
27272343Sngie
28272343Sngie#
29272343Sngie# Verifies that the rename operation works (either by renaming entries or
30272343Sngie# by moving them).
31272343Sngie#
32272343Sngie
33272343Sngieatf_test_case dots
34272343Sngiedots_head() {
35272343Sngie	atf_set "descr" "Tests that '.' and '..' cannot be renamed"
36272343Sngie	atf_set "require.user" "root"
37272343Sngie}
38272343Sngiedots_body() {
39272343Sngie	test_mount
40272343Sngie
41272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
42272343Sngie	atf_check -s eq:1 -o empty -e ignore mv a/. c
43272343Sngie	atf_check -s eq:1 -o empty -e ignore mv a/.. c
44272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir a
45272343Sngie
46272343Sngie	test_unmount
47272343Sngie}
48272343Sngie
49272343Sngieatf_test_case crossdev
50272343Sngiecrossdev_head() {
51272343Sngie	atf_set "descr" "Tests that cross-device renames do not work"
52272343Sngie	atf_set "require.user" "root"
53272343Sngie}
54272343Sngiecrossdev_body() {
55272343Sngie	test_mount
56272343Sngie
57272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
58272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
59272343Sngie	    $(atf_get_srcdir)/h_tools rename a /var/tmp/a
60272343Sngie	atf_check -s eq:0 -o ignore -e empty grep "Cross-device link" stderr
61272343Sngie	atf_check -s eq:0 -o empty -e empty test -d a
62272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir a
63272343Sngie
64272343Sngie	test_unmount
65272343Sngie}
66272343Sngie
67272343Sngieatf_test_case basic
68272343Sngiebasic_head() {
69272343Sngie	atf_set "descr" "Tests that basic renames work"
70272343Sngie	atf_set "require.user" "root"
71272343Sngie}
72272343Sngiebasic_body() {
73272343Sngie	test_mount
74272343Sngie
75272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
76272343Sngie	atf_check -s eq:0 -o empty -e empty mv a c
77272343Sngie	atf_check -s eq:1 -o empty -e empty test -d a
78272343Sngie	atf_check -s eq:0 -o empty -e empty test -d c
79272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir c
80272343Sngie
81272343Sngie	test_unmount
82272343Sngie}
83272343Sngie
84272343Sngieatf_test_case dotdot
85272343Sngiedotdot_head() {
86272343Sngie	atf_set "descr" "Tests that the '..' entry is properly updated" \
87272343Sngie	                "during moves"
88272343Sngie	atf_set "require.user" "root"
89272343Sngie}
90272343Sngiedotdot_body() {
91272343Sngie	test_mount
92272343Sngie
93272343Sngie	echo "Checking if the '..' entry is updated after moves"
94272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
95272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir b
96272343Sngie	atf_check -s eq:0 -o empty -e empty mv b a
97272343Sngie	atf_check -s eq:0 -o empty -e empty test -d a/b/../b
98272343Sngie	atf_check -s eq:0 -o empty -e empty test -d a/b/../../a
99272343Sngie	eval $(stat -s a/b)
100272343Sngie	[ ${st_nlink} = 2 ] || atf_fail "Incorrect number of links"
101272343Sngie	eval $(stat -s a)
102272343Sngie	[ ${st_nlink} = 3 ] || atf_fail "Incorrect number of links"
103272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir a/b
104272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir a
105272343Sngie
106272343Sngie	echo "Checking if the '..' entry is correct after renames"
107272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
108272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir b
109272343Sngie	atf_check -s eq:0 -o empty -e empty mv b a
110272343Sngie	atf_check -s eq:0 -o empty -e empty mv a c
111272343Sngie	atf_check -s eq:0 -o empty -e empty test -d c/b/../b
112272343Sngie	atf_check -s eq:0 -o empty -e empty test -d c/b/../../c
113272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir c/b
114272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir c
115272343Sngie
116272343Sngie	echo "Checking if the '..' entry is correct after multiple moves"
117272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
118272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir b
119272343Sngie	atf_check -s eq:0 -o empty -e empty mv b a
120272343Sngie	atf_check -s eq:0 -o empty -e empty mv a c
121272343Sngie	atf_check -s eq:0 -o empty -e empty mv c/b d
122272343Sngie	atf_check -s eq:0 -o empty -e empty test -d d/../c
123272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir d
124272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir c
125272343Sngie
126272343Sngie	test_unmount
127272343Sngie}
128272343Sngie
129272343Sngieatf_test_case dir_to_emptydir
130272343Sngiedir_to_emptydir_head() {
131272343Sngie	atf_set "descr" "Tests that renaming a directory to override an" \
132272343Sngie	                "empty directory works"
133272343Sngie	atf_set "require.user" "root"
134272343Sngie}
135272343Sngiedir_to_emptydir_body() {
136272343Sngie	test_mount
137272343Sngie
138272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
139272343Sngie	atf_check -s eq:0 -o empty -e empty touch a/c
140272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir b
141272343Sngie	atf_check -s eq:0 -o empty -e empty \
142272343Sngie	    $(atf_get_srcdir)/h_tools rename a b
143272343Sngie	atf_check -s eq:1 -o empty -e empty test -e a
144272343Sngie	atf_check -s eq:0 -o empty -e empty test -d b
145272343Sngie	atf_check -s eq:0 -o empty -e empty test -f b/c
146272343Sngie	rm b/c
147272343Sngie	rmdir b
148272343Sngie
149272343Sngie	test_unmount
150272343Sngie}
151272343Sngie
152272343Sngieatf_test_case dir_to_fulldir
153272343Sngiedir_to_fulldir_head() {
154272343Sngie	atf_set "descr" "Tests that renaming a directory to override a" \
155272343Sngie	                "non-empty directory fails"
156272343Sngie	atf_set "require.user" "root"
157272343Sngie}
158272343Sngiedir_to_fulldir_body() {
159272343Sngie	test_mount
160272343Sngie
161272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
162272343Sngie	atf_check -s eq:0 -o empty -e empty touch a/c
163272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir b
164272343Sngie	atf_check -s eq:0 -o empty -e empty touch b/d
165272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
166272343Sngie	    $(atf_get_srcdir)/h_tools rename a b
167272343Sngie	atf_check -s eq:0 -o ignore -e empty grep "Directory not empty" stderr
168272343Sngie	atf_check -s eq:0 -o empty -e empty test -d a
169272343Sngie	atf_check -s eq:0 -o empty -e empty test -f a/c
170272343Sngie	atf_check -s eq:0 -o empty -e empty test -d b
171272343Sngie	atf_check -s eq:0 -o empty -e empty test -f b/d
172272343Sngie	rm a/c
173272343Sngie	rm b/d
174272343Sngie	rmdir a
175272343Sngie	rmdir b
176272343Sngie
177272343Sngie	test_unmount
178272343Sngie}
179272343Sngie
180272343Sngieatf_test_case dir_to_file
181272343Sngiedir_to_file_head() {
182272343Sngie	atf_set "descr" "Tests that renaming a directory to override a" \
183272343Sngie	                "file fails"
184272343Sngie	atf_set "require.user" "root"
185272343Sngie}
186272343Sngiedir_to_file_body() {
187272343Sngie	test_mount
188272343Sngie
189272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir a
190272343Sngie	atf_check -s eq:0 -o empty -e empty touch b
191272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
192272343Sngie	    $(atf_get_srcdir)/h_tools rename a b
193272343Sngie	atf_check -s eq:0 -o ignore -e empty grep "Not a directory" stderr
194272343Sngie	atf_check -s eq:0 -o empty -e empty test -d a
195272343Sngie	atf_check -s eq:0 -o empty -e empty test -f b
196272343Sngie	rmdir a
197272343Sngie	rm b
198272343Sngie
199272343Sngie	test_unmount
200272343Sngie}
201272343Sngie
202272343Sngieatf_test_case file_to_dir
203272343Sngiefile_to_dir_head() {
204272343Sngie	atf_set "descr" "Tests that renaming a file to override a" \
205272343Sngie	                "directory fails"
206272343Sngie	atf_set "require.user" "root"
207272343Sngie}
208272343Sngiefile_to_dir_body() {
209272343Sngie	test_mount
210272343Sngie
211272343Sngie	atf_check -s eq:0 -o empty -e empty touch a
212272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir b
213272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
214272343Sngie	    $(atf_get_srcdir)/h_tools rename a b
215272343Sngie	atf_check -s eq:0 -o ignore -e empty grep "Is a directory" stderr
216272343Sngie	atf_check -s eq:0 -o empty -e empty test -f a
217272343Sngie	atf_check -s eq:0 -o empty -e empty test -d b
218272343Sngie	rm a
219272343Sngie	rmdir b
220272343Sngie
221272343Sngie	test_unmount
222272343Sngie}
223272343Sngie
224272343Sngieatf_test_case kqueue
225272343Sngiekqueue_head() {
226272343Sngie	atf_set "descr" "Tests that moving and renaming files raise the" \
227272343Sngie	                "correct kqueue events"
228272343Sngie	atf_set "require.user" "root"
229272343Sngie}
230272343Sngiekqueue_body() {
231272343Sngie	test_mount
232272343Sngie
233272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir dir
234272343Sngie	atf_check -s eq:0 -o empty -e empty touch dir/a
235272343Sngie	echo 'mv dir/a dir/b' | kqueue_monitor 2 dir dir/a
236272343Sngie	kqueue_check dir/a NOTE_RENAME
237272343Sngie	kqueue_check dir NOTE_WRITE
238272343Sngie	atf_check -s eq:0 -o empty -e empty rm dir/b
239272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir dir
240272343Sngie
241272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir dir
242272343Sngie	atf_check -s eq:0 -o empty -e empty touch dir/a
243272343Sngie	atf_check -s eq:0 -o empty -e empty touch dir/b
244272343Sngie	echo 'mv dir/a dir/b' | kqueue_monitor 3 dir dir/a dir/b
245272343Sngie	kqueue_check dir/a NOTE_RENAME
246272343Sngie	kqueue_check dir NOTE_WRITE
247272343Sngie	kqueue_check dir/b NOTE_DELETE
248272343Sngie	atf_check -s eq:0 -o empty -e empty rm dir/b
249272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir dir
250272343Sngie
251272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir dir1
252272343Sngie	atf_check -s eq:0 -o empty -e empty mkdir dir2
253272343Sngie	atf_check -s eq:0 -o empty -e empty touch dir1/a
254272343Sngie	echo 'mv dir1/a dir2/a' | kqueue_monitor 3 dir1 dir1/a dir2
255272343Sngie	kqueue_check dir1/a NOTE_RENAME
256272343Sngie	kqueue_check dir1 NOTE_WRITE
257272343Sngie	kqueue_check dir2 NOTE_WRITE
258272343Sngie	atf_check -s eq:0 -o empty -e empty rm dir2/a
259272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir dir1
260272343Sngie	atf_check -s eq:0 -o empty -e empty rmdir dir2
261272343Sngie
262272343Sngie	test_unmount
263272343Sngie}
264272343Sngie
265272343Sngieatf_init_test_cases() {
266272343Sngie	. $(atf_get_srcdir)/../h_funcs.subr
267272343Sngie	. $(atf_get_srcdir)/h_funcs.subr
268272343Sngie
269272343Sngie	atf_add_test_case dots
270272343Sngie	atf_add_test_case crossdev
271272343Sngie	atf_add_test_case basic
272272343Sngie	atf_add_test_case dotdot
273272343Sngie	atf_add_test_case dir_to_emptydir
274272343Sngie	atf_add_test_case dir_to_fulldir
275272343Sngie	atf_add_test_case dir_to_file
276272343Sngie	atf_add_test_case file_to_dir
277272343Sngie	atf_add_test_case kqueue
278272343Sngie}
279