1272343Sngie
2272343Sngie# Common settings and functions for the various resize_ffs tests.
3272343Sngie# 
4272343Sngie
5272343Sngie# called from atf_init_test_cases
6272343Sngiesetupvars()
7272343Sngie{
8272343Sngie	IMG=fsimage
9272343Sngie	TDBASE64=$(atf_get_srcdir)/testdata.tar.gz.base64
10272343Sngie	GOODMD5=$(atf_get_srcdir)/testdata.md5
11272343Sngie	# set BYTESWAP to opposite-endian.
12272343Sngie	if [ $(sysctl -n hw.byteorder) = "1234" ]; then
13272343Sngie		BYTESWAP=be
14272343Sngie	else
15272343Sngie		BYTESWAP=le
16272343Sngie	fi
17272343Sngie}
18272343Sngie
19272343Sngie# test_case() taken from the tests/ipf/h_common.sh
20272343Sngie# Used to declare the atf goop for a test.
21272343Sngietest_case()
22272343Sngie{
23272343Sngie	local name="${1}"; shift
24272343Sngie	local check_function="${1}"; shift
25272343Sngie
26272343Sngie	atf_test_case "${name}" cleanup
27272343Sngie	eval "${name}_head() { \
28272343Sngie		atf_set "require.user" "root" ; \
29272343Sngie		atf_set "require.progs" "rump_ffs" ; \
30272343Sngie	}"
31272343Sngie	eval "${name}_body() { \
32272343Sngie		${check_function} " "${@}" "; \
33272343Sngie	}"
34272343Sngie	eval "${name}_cleanup() { \
35272343Sngie		umount -f mnt  ; \
36272343Sngie		: reset error ; \
37272343Sngie	}"
38272343Sngie}
39272343Sngie
40272343Sngie# Used to declare the atf goop for a test expected to fail.
41272343Sngietest_case_xfail()
42272343Sngie{
43272343Sngie	local name="${1}"; shift
44272343Sngie	local reason="${1}"; shift
45272343Sngie	local check_function="${1}"; shift
46272343Sngie
47272343Sngie	atf_test_case "${name}" cleanup
48272343Sngie	eval "${name}_head() { \
49272343Sngie		atf_set "require.user" "root" ; \
50272343Sngie	}"
51272343Sngie	eval "${name}_body() { \
52272343Sngie		atf_expect_fail "${reason}" ; \
53272343Sngie		${check_function} " "${@}" "; \
54272343Sngie	}"
55272343Sngie	eval "${name}_cleanup() { \
56272343Sngie		umount -f mnt  ; \
57272343Sngie		: reset error ; \
58272343Sngie	}"
59272343Sngie}
60272343Sngie
61272343Sngie# copy_data requires the mount already done;  makes one copy of the test data
62272343Sngiecopy_data ()
63272343Sngie{
64272343Sngie	uudecode -p ${TDBASE64} | (cd mnt; tar xzf - -s/testdata/TD$1/)
65272343Sngie}
66272343Sngie
67272343Sngiecopy_multiple ()
68272343Sngie{
69272343Sngie	local i
70272343Sngie	for i in $(seq $1); do
71272343Sngie		copy_data $i
72272343Sngie	done
73272343Sngie}
74272343Sngie
75272343Sngie# remove_data removes one directory worth of test data; the purpose
76272343Sngie# is to ensure data exists near the end of the fs under test.
77272343Sngieremove_data ()
78272343Sngie{
79272343Sngie	rm -rf mnt/TD$1
80272343Sngie}
81272343Sngie
82272343Sngieremove_multiple ()
83272343Sngie{
84272343Sngie	local i
85272343Sngie	for i in $(seq $1); do
86272343Sngie		remove_data $i
87272343Sngie	done
88272343Sngie}
89272343Sngie
90272343Sngie# verify that the data in a particular directory is still OK
91272343Sngie# generated md5 file doesn't need explicit cleanup thanks to ATF
92272343Sngiecheck_data ()
93272343Sngie{
94272343Sngie	(cd mnt/TD$1 && md5 *) > TD$1.md5
95272343Sngie	atf_check diff -u ${GOODMD5} TD$1.md5
96272343Sngie}
97272343Sngie
98272343Sngie# supply begin and end arguments
99272343Sngiecheck_data_range ()
100272343Sngie{
101272343Sngie	local i
102272343Sngie	for i in $(seq $1 $2); do
103272343Sngie		check_data $i
104272343Sngie	done
105272343Sngie}
106272343Sngie
107272343Sngie
108272343Sngieresize_ffs()
109272343Sngie{
110272343Sngie	echo "in resize_ffs:" ${@}
111272343Sngie	local bs=$1
112272343Sngie	local fragsz=$2
113272343Sngie	local osize=$3
114272343Sngie	local nsize=$4
115272343Sngie	local fslevel=$5
116272343Sngie	local numdata=$6
117272343Sngie	local swap=$7
118272343Sngie	mkdir -p mnt
119272343Sngie	echo "bs is ${bs} numdata is ${numdata}"
120272343Sngie	echo "****resizing fs with blocksize ${bs}"
121272343Sngie
122272343Sngie	# we want no more than 16K/inode to allow test files to copy.
123272343Sngie	local fpi=$((fragsz * 4))
124272343Sngie	local i
125272343Sngie	if [ $fpi -gt 16384 ]; then
126272343Sngie		i="-i 16384"
127272343Sngie	fi
128272343Sngie	if [ x$swap != x ]; then
129272343Sngie		newfs -B ${BYTESWAP} -O${fslevel} -b ${bs} -f ${fragsz} \
130272343Sngie			-s ${osize} ${i} -F ${IMG}
131272343Sngie	else
132272343Sngie		newfs -O${fslevel} -b ${bs} -f ${fragsz} -s ${osize} ${i} \
133272343Sngie			-F ${IMG}
134272343Sngie	fi
135272343Sngie
136272343Sngie	# we're specifying relative paths, so rump_ffs warns - ignore.
137272343Sngie	atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt
138272343Sngie	copy_multiple ${numdata}
139272343Sngie
140272343Sngie	if [ ${nsize} -lt ${osize} ]; then
141272343Sngie	    # how much data to remove so fs can be shrunk
142272343Sngie	    local remove=$((numdata-numdata*nsize/osize))
143272343Sngie	    local dataleft=$((numdata-remove))
144272343Sngie	    echo remove is $remove dataleft is $dataleft
145272343Sngie	    remove_multiple ${remove}
146272343Sngie	fi
147272343Sngie
148272343Sngie	umount mnt
149272343Sngie	atf_check -s exit:0 -o ignore resize_ffs -y -s ${nsize} ${IMG}
150272343Sngie	atf_check -s exit:0 -o ignore fsck_ffs -f -n -F ${IMG}
151272343Sngie	atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt
152272343Sngie	if [ ${nsize} -lt ${osize} ]; then
153272343Sngie	    check_data_range $((remove + 1)) ${numdata}
154272343Sngie	else
155272343Sngie	    # checking everything because we don't delete on grow
156272343Sngie	    check_data_range 1 ${numdata}
157272343Sngie	fi
158272343Sngie	umount mnt
159272343Sngie}
160