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