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