t_vfs.sh revision 272345
1234285Sdim#       $NetBSD: t_vfs.sh,v 1.6 2012/08/04 03:56:47 riastradh Exp $
2234285Sdim#
3234285Sdim# Copyright (c) 2011 The NetBSD Foundation, Inc.
4234285Sdim# All rights reserved.
5234285Sdim#
6234285Sdim# Redistribution and use in source and binary forms, with or without
7234285Sdim# modification, are permitted provided that the following conditions
8234285Sdim# are met:
9234285Sdim# 1. Redistributions of source code must retain the above copyright
10234285Sdim#    notice, this list of conditions and the following disclaimer.
11234285Sdim# 2. Redistributions in binary form must reproduce the above copyright
12234285Sdim#    notice, this list of conditions and the following disclaimer in the
13234285Sdim#    documentation and/or other materials provided with the distribution.
14234285Sdim#
15234285Sdim# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16234285Sdim# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17234285Sdim# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18234285Sdim# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19234285Sdim# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20234285Sdim# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21234285Sdim# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22234285Sdim# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23234285Sdim# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24234285Sdim# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25234285Sdim# POSSIBILITY OF SUCH DAMAGE.
26234285Sdim#
27234285Sdim
28234285Sdimimg=ffs.img
29234285Sdimrumpsrv_ffs=\
30234285Sdim"rump_server -lrumpvfs -lrumpfs_ffs -lrumpdev_disk -d key=/img,hostpath=${img},size=host"
31234285Sdimexport RUMP_SERVER=unix://csock
32261991Sdim
33234285Sdimdomount()
34234285Sdim{
35234285Sdim
36234285Sdim	mntdir=$1
37234285Sdim	[ $# -eq 0 ] && mntdir=/rump/mnt
38234285Sdim	atf_check -s exit:0 -e ignore mount_ffs /img ${mntdir}
39234285Sdim}
40234285Sdim
41234285Sdimdounmount()
42234285Sdim{
43234285Sdim
44234285Sdim	atf_check -s exit:0 umount -R ${mntdir}
45234285Sdim}
46249423Sdim
47249423Sdimremount()
48249423Sdim{
49234285Sdim
50234285Sdim	dounmount
51234285Sdim	domount /rump/mnt2
52249423Sdim}
53234285Sdim
54234285Sdimsimpletest()
55234285Sdim{
56234285Sdim	local name="${1}"; shift
57234285Sdim
58234285Sdim	atf_test_case "${name}" cleanup
59276479Sdim	eval "${name}_head() {  }"
60276479Sdim	eval "${name}_body() { \
61234285Sdim		atf_check -s exit:0 rump_server -lrumpvfs ${RUMP_SERVER} ; \
62234285Sdim		export LD_PRELOAD=/usr/lib/librumphijack.so ; \
63234285Sdim		${name} " "${@}" "; \
64234285Sdim	}"
65234285Sdim	eval "${name}_cleanup() { \
66234285Sdim		rump.halt
67234285Sdim	}"
68234285Sdim}
69234285Sdim
70234285Sdimtest_case()
71234285Sdim{
72234285Sdim	local name="${1}"; shift
73251662Sdim
74251662Sdim	atf_test_case "${name}" cleanup
75251662Sdim	eval "${name}_head() {  }"
76251662Sdim	eval "${name}_body() { \
77251662Sdim		atf_check -s exit:0 -o ignore newfs -F -s 20000 ${img} ; \
78288943Sdim		atf_check -s exit:0 ${rumpsrv_ffs} ${RUMP_SERVER} ; \
79251662Sdim		export LD_PRELOAD=/usr/lib/librumphijack.so ; \
80251662Sdim		mkdir /rump/mnt /rump/mnt2 ; \
81251662Sdim		domount ; \
82234285Sdim		${name} " "${@}" "; \
83234285Sdim		dounmount ${mntdir}
84234285Sdim	}"
85234285Sdim	eval "${name}_cleanup() { \
86234285Sdim		rump.halt
87234285Sdim	}"
88234285Sdim}
89234285Sdim
90251662Sdimtest_case paxcopy
91251662Sdimtest_case cpcopy
92251662Sdimtest_case mv_nox
93234285Sdimtest_case ln_nox
94276479Sdim
95234285Sdim#
96276479Sdim# use rumphijack to cp/pax stuff onto an image, unmount it, remount it
97234285Sdim# at a different location, and check that we have an identical copy
98234285Sdim# (we make a local copy to avoid the minor possibility that someone
99234285Sdim# modifies the source dir data while the test is running)
100276479Sdim#
101234285Sdimpaxcopy()
102234285Sdim{
103234285Sdim	parent=$(dirname $(atf_get_srcdir))
104234285Sdim	thedir=$(basename $(atf_get_srcdir))
105234285Sdim	atf_check -s exit:0 pax -rw -s,${parent},, $(atf_get_srcdir) .
106234285Sdim	atf_check -s exit:0 pax -rw ${thedir} /rump/mnt
107234285Sdim	remount
108234285Sdim	atf_check -s exit:0 diff -ru ${thedir} /rump/mnt2/${thedir}
109234285Sdim}
110234285Sdim
111251662Sdimcpcopy()
112251662Sdim{
113251662Sdim	thedir=$(basename $(atf_get_srcdir))
114234285Sdim	atf_check -s exit:0 cp -Rp $(atf_get_srcdir) .
115280031Sdim	atf_check -s exit:0 cp -Rp ${thedir} /rump/mnt
116288943Sdim	remount
117234285Sdim	atf_check -s exit:0 diff -ru ${thedir} /rump/mnt2/${thedir}
118234285Sdim}
119234285Sdim
120243830Sdim#
121234285Sdim# non-crosskernel mv (non-simple test since this uses rename(2)
122234285Sdim# which is not supported by rumpfs)
123234285Sdim#
124234285Sdim
125234285Sdimmv_nox()
126234285Sdim{
127296417Sdim	# stat default format sans changetime and filename
128234285Sdim	statstr='%d %i %Sp %l %Su %Sg %r %z \"%Sa\" \"%Sm\" \"%SB\" %k %b %#Xf'
129243830Sdim
130234285Sdim	atf_check -s exit:0 touch /rump/mnt/filename
131234285Sdim	atf_check -s exit:0 -o save:stat.out \
132234285Sdim	    stat -f "${statstr}" /rump/mnt/filename
133234285Sdim	atf_check -s exit:0 mkdir /rump/mnt/dir
134234285Sdim	atf_check -s exit:0 mv /rump/mnt/filename /rump/mnt/dir/same
135234285Sdim	atf_check -s exit:0 -o file:stat.out \
136234285Sdim	    stat -f "${statstr}" /rump/mnt/dir/same
137280031Sdim}
138234285Sdim
139234285Sdimln_nox()
140234285Sdim{
141234285Sdim	# Omit st_nlink too, since it will increase.
142234285Sdim	statstr='%d %i %Sp %Su %Sg %r %z \"%Sa\" \"%Sm\" \"%SB\" %k %b %#Xf'
143234285Sdim
144234285Sdim	atf_check -s exit:0 touch /rump/mnt/filename
145234285Sdim	atf_check -s exit:0 -o save:stat.out \
146234285Sdim	    stat -f "${statstr}" /rump/mnt/filename
147234285Sdim	atf_check -s exit:0 mkdir /rump/mnt/dir
148234285Sdim	atf_check -s exit:0 ln /rump/mnt/filename /rump/mnt/dir/same
149234285Sdim	atf_check -s exit:0 -o file:stat.out \
150234285Sdim	    stat -f "${statstr}" /rump/mnt/filename
151234285Sdim	atf_check -s exit:0 -o file:stat.out \
152234285Sdim	    stat -f "${statstr}" /rump/mnt/dir/same
153251662Sdim}
154251662Sdim
155251662Sdimsimpletest mv_x
156280031Sdimsimpletest ln_x
157251662Sdimsimpletest runonprefix
158251662Sdimsimpletest blanket
159251662Sdimsimpletest doubleblanket
160251662Sdim
161251662Sdim#
162251662Sdim# do a cross-kernel mv
163251662Sdim#
164251662Sdimmv_x()
165251662Sdim{
166251662Sdim	thedir=$(basename $(atf_get_srcdir))
167251662Sdim	atf_check -s exit:0 cp -Rp $(atf_get_srcdir) .
168243830Sdim	atf_check -s exit:0 cp -Rp ${thedir} ${thedir}.2
169243830Sdim	atf_check -s exit:0 mv ${thedir} /rump
170243830Sdim	atf_check -s exit:0 diff -ru ${thedir}.2 /rump/${thedir}
171243830Sdim}
172243830Sdim
173280031Sdim#
174243830Sdim# Fail to make a cross-kernel hard link.
175243830Sdim#
176243830Sdimln_x()
177243830Sdim{
178243830Sdim	atf_check -s exit:0 touch ./loser
179243830Sdim	atf_check -s not-exit:0 -e ignore ln ./loser /rump/.
180243830Sdim}
181243830Sdim
182243830Sdimrunonprefix()
183296417Sdim{
184243830Sdim	atf_check -s exit:0 -o ignore stat /rump/dev
185243830Sdim	atf_check -s exit:1 -e ignore stat /rumpdev
186234285Sdim}
187234285Sdim
188280031Sdimblanket()
189234285Sdim{
190234285Sdim	export RUMPHIJACK='blanket=/dev,path=/rump'
191234285Sdim	atf_check -s exit:0 -o save:stat.out \
192234285Sdim	    stat -f "${statstr}" /rump/dev/null
193234285Sdim	atf_check -s exit:0 -o file:stat.out \
194234285Sdim	    stat -f "${statstr}" /dev/null
195234285Sdim}
196234285Sdim
197234285Sdimdoubleblanket()
198234285Sdim{
199234285Sdim	atf_check -s exit:0 mkdir /rump/dir
200234285Sdim	atf_check -s exit:0 ln -s dir /rump/dirtoo
201234285Sdim
202234285Sdim	export RUMPHIJACK='blanket=/dirtoo:/dir'
203234285Sdim	atf_check -s exit:0 touch /dir/file
204234285Sdim
205234285Sdim	atf_check -s exit:0 -o save:stat.out \
206234285Sdim	    stat -f "${statstr}" /dir/file
207234285Sdim	atf_check -s exit:0 -o file:stat.out \
208234285Sdim	    stat -f "${statstr}" /dirtoo/file
209234285Sdim}
210234285Sdim
211234285Sdimatf_init_test_cases()
212234285Sdim{
213234285Sdim
214234285Sdim	atf_add_test_case paxcopy
215234285Sdim	atf_add_test_case cpcopy
216234285Sdim	atf_add_test_case mv_x
217234285Sdim	atf_add_test_case ln_x
218234285Sdim	atf_add_test_case mv_nox
219234285Sdim	atf_add_test_case ln_nox
220234285Sdim	atf_add_test_case runonprefix
221234285Sdim	atf_add_test_case blanket
222234285Sdim	atf_add_test_case doubleblanket
223234285Sdim}
224243830Sdim