xref: /freebsd/contrib/netbsd-tests/lib/librumphijack/t_vfs.sh (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper#       $NetBSD: t_vfs.sh,v 1.6 2012/08/04 03:56:47 riastradh Exp $
2*57718be8SEnji Cooper#
3*57718be8SEnji Cooper# Copyright (c) 2011 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 Cooperimg=ffs.img
29*57718be8SEnji Cooperrumpsrv_ffs=\
30*57718be8SEnji Cooper"rump_server -lrumpvfs -lrumpfs_ffs -lrumpdev_disk -d key=/img,hostpath=${img},size=host"
31*57718be8SEnji Cooperexport RUMP_SERVER=unix://csock
32*57718be8SEnji Cooper
33*57718be8SEnji Cooperdomount()
34*57718be8SEnji Cooper{
35*57718be8SEnji Cooper
36*57718be8SEnji Cooper	mntdir=$1
37*57718be8SEnji Cooper	[ $# -eq 0 ] && mntdir=/rump/mnt
38*57718be8SEnji Cooper	atf_check -s exit:0 -e ignore mount_ffs /img ${mntdir}
39*57718be8SEnji Cooper}
40*57718be8SEnji Cooper
41*57718be8SEnji Cooperdounmount()
42*57718be8SEnji Cooper{
43*57718be8SEnji Cooper
44*57718be8SEnji Cooper	atf_check -s exit:0 umount -R ${mntdir}
45*57718be8SEnji Cooper}
46*57718be8SEnji Cooper
47*57718be8SEnji Cooperremount()
48*57718be8SEnji Cooper{
49*57718be8SEnji Cooper
50*57718be8SEnji Cooper	dounmount
51*57718be8SEnji Cooper	domount /rump/mnt2
52*57718be8SEnji Cooper}
53*57718be8SEnji Cooper
54*57718be8SEnji Coopersimpletest()
55*57718be8SEnji Cooper{
56*57718be8SEnji Cooper	local name="${1}"; shift
57*57718be8SEnji Cooper
58*57718be8SEnji Cooper	atf_test_case "${name}" cleanup
59*57718be8SEnji Cooper	eval "${name}_head() {  }"
60*57718be8SEnji Cooper	eval "${name}_body() { \
61*57718be8SEnji Cooper		atf_check -s exit:0 rump_server -lrumpvfs ${RUMP_SERVER} ; \
62*57718be8SEnji Cooper		export LD_PRELOAD=/usr/lib/librumphijack.so ; \
63*57718be8SEnji Cooper		${name} " "${@}" "; \
64*57718be8SEnji Cooper	}"
65*57718be8SEnji Cooper	eval "${name}_cleanup() { \
66*57718be8SEnji Cooper		rump.halt
67*57718be8SEnji Cooper	}"
68*57718be8SEnji Cooper}
69*57718be8SEnji Cooper
70*57718be8SEnji Coopertest_case()
71*57718be8SEnji Cooper{
72*57718be8SEnji Cooper	local name="${1}"; shift
73*57718be8SEnji Cooper
74*57718be8SEnji Cooper	atf_test_case "${name}" cleanup
75*57718be8SEnji Cooper	eval "${name}_head() {  }"
76*57718be8SEnji Cooper	eval "${name}_body() { \
77*57718be8SEnji Cooper		atf_check -s exit:0 -o ignore newfs -F -s 20000 ${img} ; \
78*57718be8SEnji Cooper		atf_check -s exit:0 ${rumpsrv_ffs} ${RUMP_SERVER} ; \
79*57718be8SEnji Cooper		export LD_PRELOAD=/usr/lib/librumphijack.so ; \
80*57718be8SEnji Cooper		mkdir /rump/mnt /rump/mnt2 ; \
81*57718be8SEnji Cooper		domount ; \
82*57718be8SEnji Cooper		${name} " "${@}" "; \
83*57718be8SEnji Cooper		dounmount ${mntdir}
84*57718be8SEnji Cooper	}"
85*57718be8SEnji Cooper	eval "${name}_cleanup() { \
86*57718be8SEnji Cooper		rump.halt
87*57718be8SEnji Cooper	}"
88*57718be8SEnji Cooper}
89*57718be8SEnji Cooper
90*57718be8SEnji Coopertest_case paxcopy
91*57718be8SEnji Coopertest_case cpcopy
92*57718be8SEnji Coopertest_case mv_nox
93*57718be8SEnji Coopertest_case ln_nox
94*57718be8SEnji Cooper
95*57718be8SEnji Cooper#
96*57718be8SEnji Cooper# use rumphijack to cp/pax stuff onto an image, unmount it, remount it
97*57718be8SEnji Cooper# at a different location, and check that we have an identical copy
98*57718be8SEnji Cooper# (we make a local copy to avoid the minor possibility that someone
99*57718be8SEnji Cooper# modifies the source dir data while the test is running)
100*57718be8SEnji Cooper#
101*57718be8SEnji Cooperpaxcopy()
102*57718be8SEnji Cooper{
103*57718be8SEnji Cooper	parent=$(dirname $(atf_get_srcdir))
104*57718be8SEnji Cooper	thedir=$(basename $(atf_get_srcdir))
105*57718be8SEnji Cooper	atf_check -s exit:0 pax -rw -s,${parent},, $(atf_get_srcdir) .
106*57718be8SEnji Cooper	atf_check -s exit:0 pax -rw ${thedir} /rump/mnt
107*57718be8SEnji Cooper	remount
108*57718be8SEnji Cooper	atf_check -s exit:0 diff -ru ${thedir} /rump/mnt2/${thedir}
109*57718be8SEnji Cooper}
110*57718be8SEnji Cooper
111*57718be8SEnji Coopercpcopy()
112*57718be8SEnji Cooper{
113*57718be8SEnji Cooper	thedir=$(basename $(atf_get_srcdir))
114*57718be8SEnji Cooper	atf_check -s exit:0 cp -Rp $(atf_get_srcdir) .
115*57718be8SEnji Cooper	atf_check -s exit:0 cp -Rp ${thedir} /rump/mnt
116*57718be8SEnji Cooper	remount
117*57718be8SEnji Cooper	atf_check -s exit:0 diff -ru ${thedir} /rump/mnt2/${thedir}
118*57718be8SEnji Cooper}
119*57718be8SEnji Cooper
120*57718be8SEnji Cooper#
121*57718be8SEnji Cooper# non-crosskernel mv (non-simple test since this uses rename(2)
122*57718be8SEnji Cooper# which is not supported by rumpfs)
123*57718be8SEnji Cooper#
124*57718be8SEnji Cooper
125*57718be8SEnji Coopermv_nox()
126*57718be8SEnji Cooper{
127*57718be8SEnji Cooper	# stat default format sans changetime and filename
128*57718be8SEnji Cooper	statstr='%d %i %Sp %l %Su %Sg %r %z \"%Sa\" \"%Sm\" \"%SB\" %k %b %#Xf'
129*57718be8SEnji Cooper
130*57718be8SEnji Cooper	atf_check -s exit:0 touch /rump/mnt/filename
131*57718be8SEnji Cooper	atf_check -s exit:0 -o save:stat.out \
132*57718be8SEnji Cooper	    stat -f "${statstr}" /rump/mnt/filename
133*57718be8SEnji Cooper	atf_check -s exit:0 mkdir /rump/mnt/dir
134*57718be8SEnji Cooper	atf_check -s exit:0 mv /rump/mnt/filename /rump/mnt/dir/same
135*57718be8SEnji Cooper	atf_check -s exit:0 -o file:stat.out \
136*57718be8SEnji Cooper	    stat -f "${statstr}" /rump/mnt/dir/same
137*57718be8SEnji Cooper}
138*57718be8SEnji Cooper
139*57718be8SEnji Cooperln_nox()
140*57718be8SEnji Cooper{
141*57718be8SEnji Cooper	# Omit st_nlink too, since it will increase.
142*57718be8SEnji Cooper	statstr='%d %i %Sp %Su %Sg %r %z \"%Sa\" \"%Sm\" \"%SB\" %k %b %#Xf'
143*57718be8SEnji Cooper
144*57718be8SEnji Cooper	atf_check -s exit:0 touch /rump/mnt/filename
145*57718be8SEnji Cooper	atf_check -s exit:0 -o save:stat.out \
146*57718be8SEnji Cooper	    stat -f "${statstr}" /rump/mnt/filename
147*57718be8SEnji Cooper	atf_check -s exit:0 mkdir /rump/mnt/dir
148*57718be8SEnji Cooper	atf_check -s exit:0 ln /rump/mnt/filename /rump/mnt/dir/same
149*57718be8SEnji Cooper	atf_check -s exit:0 -o file:stat.out \
150*57718be8SEnji Cooper	    stat -f "${statstr}" /rump/mnt/filename
151*57718be8SEnji Cooper	atf_check -s exit:0 -o file:stat.out \
152*57718be8SEnji Cooper	    stat -f "${statstr}" /rump/mnt/dir/same
153*57718be8SEnji Cooper}
154*57718be8SEnji Cooper
155*57718be8SEnji Coopersimpletest mv_x
156*57718be8SEnji Coopersimpletest ln_x
157*57718be8SEnji Coopersimpletest runonprefix
158*57718be8SEnji Coopersimpletest blanket
159*57718be8SEnji Coopersimpletest doubleblanket
160*57718be8SEnji Cooper
161*57718be8SEnji Cooper#
162*57718be8SEnji Cooper# do a cross-kernel mv
163*57718be8SEnji Cooper#
164*57718be8SEnji Coopermv_x()
165*57718be8SEnji Cooper{
166*57718be8SEnji Cooper	thedir=$(basename $(atf_get_srcdir))
167*57718be8SEnji Cooper	atf_check -s exit:0 cp -Rp $(atf_get_srcdir) .
168*57718be8SEnji Cooper	atf_check -s exit:0 cp -Rp ${thedir} ${thedir}.2
169*57718be8SEnji Cooper	atf_check -s exit:0 mv ${thedir} /rump
170*57718be8SEnji Cooper	atf_check -s exit:0 diff -ru ${thedir}.2 /rump/${thedir}
171*57718be8SEnji Cooper}
172*57718be8SEnji Cooper
173*57718be8SEnji Cooper#
174*57718be8SEnji Cooper# Fail to make a cross-kernel hard link.
175*57718be8SEnji Cooper#
176*57718be8SEnji Cooperln_x()
177*57718be8SEnji Cooper{
178*57718be8SEnji Cooper	atf_check -s exit:0 touch ./loser
179*57718be8SEnji Cooper	atf_check -s not-exit:0 -e ignore ln ./loser /rump/.
180*57718be8SEnji Cooper}
181*57718be8SEnji Cooper
182*57718be8SEnji Cooperrunonprefix()
183*57718be8SEnji Cooper{
184*57718be8SEnji Cooper	atf_check -s exit:0 -o ignore stat /rump/dev
185*57718be8SEnji Cooper	atf_check -s exit:1 -e ignore stat /rumpdev
186*57718be8SEnji Cooper}
187*57718be8SEnji Cooper
188*57718be8SEnji Cooperblanket()
189*57718be8SEnji Cooper{
190*57718be8SEnji Cooper	export RUMPHIJACK='blanket=/dev,path=/rump'
191*57718be8SEnji Cooper	atf_check -s exit:0 -o save:stat.out \
192*57718be8SEnji Cooper	    stat -f "${statstr}" /rump/dev/null
193*57718be8SEnji Cooper	atf_check -s exit:0 -o file:stat.out \
194*57718be8SEnji Cooper	    stat -f "${statstr}" /dev/null
195*57718be8SEnji Cooper}
196*57718be8SEnji Cooper
197*57718be8SEnji Cooperdoubleblanket()
198*57718be8SEnji Cooper{
199*57718be8SEnji Cooper	atf_check -s exit:0 mkdir /rump/dir
200*57718be8SEnji Cooper	atf_check -s exit:0 ln -s dir /rump/dirtoo
201*57718be8SEnji Cooper
202*57718be8SEnji Cooper	export RUMPHIJACK='blanket=/dirtoo:/dir'
203*57718be8SEnji Cooper	atf_check -s exit:0 touch /dir/file
204*57718be8SEnji Cooper
205*57718be8SEnji Cooper	atf_check -s exit:0 -o save:stat.out \
206*57718be8SEnji Cooper	    stat -f "${statstr}" /dir/file
207*57718be8SEnji Cooper	atf_check -s exit:0 -o file:stat.out \
208*57718be8SEnji Cooper	    stat -f "${statstr}" /dirtoo/file
209*57718be8SEnji Cooper}
210*57718be8SEnji Cooper
211*57718be8SEnji Cooperatf_init_test_cases()
212*57718be8SEnji Cooper{
213*57718be8SEnji Cooper
214*57718be8SEnji Cooper	atf_add_test_case paxcopy
215*57718be8SEnji Cooper	atf_add_test_case cpcopy
216*57718be8SEnji Cooper	atf_add_test_case mv_x
217*57718be8SEnji Cooper	atf_add_test_case ln_x
218*57718be8SEnji Cooper	atf_add_test_case mv_nox
219*57718be8SEnji Cooper	atf_add_test_case ln_nox
220*57718be8SEnji Cooper	atf_add_test_case runonprefix
221*57718be8SEnji Cooper	atf_add_test_case blanket
222*57718be8SEnji Cooper	atf_add_test_case doubleblanket
223*57718be8SEnji Cooper}
224