1170809Sdelphij#!/bin/sh 2170809Sdelphij# 3171801Sdelphij# $NetBSD: t_rename,v 1.7 2007/07/23 15:05:43 jmmv Exp $ 4170809Sdelphij# 5170809Sdelphij# Copyright (c) 2005, 2006 The NetBSD Foundation, Inc. 6170809Sdelphij# All rights reserved. 7170809Sdelphij# 8170809Sdelphij# This code is derived from software contributed to The NetBSD Foundation 9170809Sdelphij# by Julio M. Merino Vidal, developed as part of Google's Summer of Code 10170809Sdelphij# 2005 program. 11170809Sdelphij# 12170809Sdelphij# Redistribution and use in source and binary forms, with or without 13170809Sdelphij# modification, are permitted provided that the following conditions 14170809Sdelphij# are met: 15170809Sdelphij# 1. Redistributions of source code must retain the above copyright 16170809Sdelphij# notice, this list of conditions and the following disclaimer. 17170809Sdelphij# 2. Redistributions in binary form must reproduce the above copyright 18170809Sdelphij# notice, this list of conditions and the following disclaimer in the 19170809Sdelphij# documentation and/or other materials provided with the distribution. 20170809Sdelphij# 21170809Sdelphij# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 22170809Sdelphij# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23170809Sdelphij# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24170809Sdelphij# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 25170809Sdelphij# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26170809Sdelphij# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27170809Sdelphij# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28170809Sdelphij# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29170809Sdelphij# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30170809Sdelphij# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31170809Sdelphij# POSSIBILITY OF SUCH DAMAGE. 32170809Sdelphij# 33170809Sdelphij# $FreeBSD$ 34170809Sdelphij# 35170809Sdelphij 36170809Sdelphij# 37170809Sdelphij# Verifies that the rename operation works (either by renaming entries or 38170809Sdelphij# by moving them). 39170809Sdelphij# 40170809Sdelphij 41170809Sdelphijtest_run() { 42170809Sdelphij test_mount 43170809Sdelphij 44170809Sdelphij test_name "'.' and '..' entries cannot be renamed" 45170809Sdelphij mkdir a || die 46170809Sdelphij mv a/. c 2>/dev/null && die 47170809Sdelphij mv a/.. c 2>/dev/null && die 48170809Sdelphij rmdir a || die 49170809Sdelphij 50170809Sdelphij test_name "Cross device renames do not work" 51170809Sdelphij mkdir a || die 52171801Sdelphij ${Src_Dir}/h_tools rename a /var/tmp/a >/dev/null 2>&1 && die 53170809Sdelphij rmdir a || die 54170809Sdelphij 55170809Sdelphij test_name "Directories can be renamed" 56170809Sdelphij mkdir a || die 57170809Sdelphij mv a c || die 58170809Sdelphij test -d a && die 59170809Sdelphij test -d c || die 60170809Sdelphij rmdir c || die 61170809Sdelphij 62170809Sdelphij test_name "The '..' entry is updated after moves" 63170809Sdelphij mkdir a || die 64170809Sdelphij mkdir b || die 65170809Sdelphij mv b a || die 66170809Sdelphij test -d a/b/../b || die 67170809Sdelphij test -d a/b/../../a || die 68170809Sdelphij eval $(stat -s a/b) 69170809Sdelphij [ ${st_nlink} = 2 ] || die 70170809Sdelphij eval $(stat -s a) 71170809Sdelphij [ ${st_nlink} = 3 ] || die 72170809Sdelphij rmdir a/b || die 73170809Sdelphij rmdir a || die 74170809Sdelphij 75170809Sdelphij test_name "The '..' entry is correct after renames" 76170809Sdelphij mkdir a || die 77170809Sdelphij mkdir b || die 78170809Sdelphij mv b a || die 79170809Sdelphij mv a c || die 80170809Sdelphij test -d c/b/../b || die 81170809Sdelphij test -d c/b/../../c || die 82170809Sdelphij rmdir c/b || die 83170809Sdelphij rmdir c || die 84170809Sdelphij 85170809Sdelphij test_name "The '..' entry is correct after multiple moves" 86170809Sdelphij mkdir a || die 87170809Sdelphij mkdir b || die 88170809Sdelphij mv b a || die 89170809Sdelphij mv a c || die 90170809Sdelphij mv c/b d || die 91170809Sdelphij test -d d/../c || die 92170809Sdelphij rmdir d || die 93170809Sdelphij rmdir c || die 94170809Sdelphij 95170809Sdelphij test_name "Rename works if the target file exists" 96170809Sdelphij touch a || die 97170809Sdelphij touch b || die 98170809Sdelphij mv a b || die 99170809Sdelphij test -f a && die 100170809Sdelphij test -f b || die 101170809Sdelphij rm b 102170809Sdelphij 103171801Sdelphij test_name "Rename a directory to a override an empty directory works" 104171801Sdelphij mkdir a || die 105171801Sdelphij touch a/c || die 106171801Sdelphij mkdir b || die 107171801Sdelphij ${Src_Dir}/h_tools rename a b >/dev/null 2>&1 || die 108171801Sdelphij test -e a && die 109171801Sdelphij test -d b || die 110171801Sdelphij test -f b/c || die 111171801Sdelphij rm b/c 112171801Sdelphij rmdir b 113171801Sdelphij 114171801Sdelphij test_name "Rename a directory to a override a non-empty directory fails" 115171801Sdelphij mkdir a || die 116171801Sdelphij touch a/c || die 117171801Sdelphij mkdir b || die 118171801Sdelphij touch b/d || die 119171801Sdelphij err=$(${Src_Dir}/h_tools rename a b 2>&1) && die 120171801Sdelphij echo ${err} | grep 'Directory not empty' >/dev/null || die 121171801Sdelphij test -d a || die 122171801Sdelphij test -f a/c || die 123171801Sdelphij test -d b || die 124171801Sdelphij test -f b/d || die 125171801Sdelphij rm a/c 126171801Sdelphij rm b/d 127171801Sdelphij rmdir a 128171801Sdelphij rmdir b 129171801Sdelphij 130171801Sdelphij test_name "Rename a directory to a override a file fails" 131171801Sdelphij mkdir a || die 132171801Sdelphij touch b || die 133171801Sdelphij err=$(${Src_Dir}/h_tools rename a b 2>&1) && die 134171801Sdelphij echo ${err} | grep 'Not a directory' >/dev/null || die 135171801Sdelphij test -d a || die 136171801Sdelphij test -f b || die 137171801Sdelphij rmdir a 138171801Sdelphij rm b 139171801Sdelphij 140171801Sdelphij test_name "Rename a file to a override a directory fails" 141171801Sdelphij touch a || die 142171801Sdelphij mkdir b || die 143171801Sdelphij err=$(${Src_Dir}/h_tools rename a b 2>&1) && die 144171801Sdelphij echo ${err} | grep 'Is a directory' >/dev/null || die 145171801Sdelphij test -f a || die 146171801Sdelphij test -d b || die 147171801Sdelphij rm a 148171801Sdelphij rmdir b 149171801Sdelphij 150170809Sdelphij mkdir dir || die 151170809Sdelphij touch dir/a 152170809Sdelphij echo 'mv dir/a dir/b' | kqueue_monitor 2 dir dir/a || die 153170809Sdelphij test_name "Renaming a file raises NOTE_RENAME on the old file" 154170809Sdelphij kqueue_check dir/a NOTE_RENAME || die 155170809Sdelphij test_name "Renaming a file raises NOTE_WRITE on the parent directory" 156170809Sdelphij kqueue_check dir NOTE_WRITE || die 157170809Sdelphij rm dir/b || die 158170809Sdelphij rmdir dir || die 159170809Sdelphij 160170809Sdelphij mkdir dir || die 161170809Sdelphij touch dir/a 162170809Sdelphij touch dir/b 163170809Sdelphij echo 'mv dir/a dir/b' | kqueue_monitor 3 dir dir/a dir/b || die 164170809Sdelphij test_name "Renaming a file raises NOTE_RENAME on the old file" 165170809Sdelphij kqueue_check dir/a NOTE_RENAME || die 166170809Sdelphij test_name "Renaming a file raises NOTE_WRITE on the parent directory" 167170809Sdelphij kqueue_check dir NOTE_WRITE || die 168170809Sdelphij test_name "Renaming a file raises NOTE_DELETE on the target file" 169170809Sdelphij kqueue_check dir/b NOTE_DELETE || die 170170809Sdelphij rm dir/b || die 171170809Sdelphij rmdir dir || die 172170809Sdelphij 173170809Sdelphij mkdir dir1 || die 174170809Sdelphij mkdir dir2 || die 175170809Sdelphij touch dir1/a 176170809Sdelphij echo 'mv dir1/a dir2/a' | kqueue_monitor 3 dir1 dir1/a dir2 || die 177170809Sdelphij test_name "Moving a file raises NOTE_RENAME on the old file" 178170809Sdelphij kqueue_check dir1/a NOTE_RENAME || die 179170809Sdelphij test_name "Moving a file raises NOTE_WRITE on the source directory" 180170809Sdelphij kqueue_check dir1 NOTE_WRITE || die 181170809Sdelphij test_name "Moving a file raises NOTE_WRITE on the target directory" 182170809Sdelphij kqueue_check dir2 NOTE_WRITE || die 183170809Sdelphij rm dir2/a || die 184170809Sdelphij rmdir dir1 || die 185170809Sdelphij rmdir dir2 || die 186170809Sdelphij 187170809Sdelphij test_unmount 188170809Sdelphij} 189170809Sdelphij 190170809Sdelphij. ${SUBRDIR}/h_funcs.subr 191