157718be8SEnji Cooper
257718be8SEnji Cooper# Common settings and functions for the various resize_ffs tests.
357718be8SEnji Cooper#
457718be8SEnji Cooper
557718be8SEnji Cooper# called from atf_init_test_cases
657718be8SEnji Coopersetupvars()
757718be8SEnji Cooper{
857718be8SEnji Cooper	IMG=fsimage
957718be8SEnji Cooper	TDBASE64=$(atf_get_srcdir)/testdata.tar.gz.base64
1057718be8SEnji Cooper	GOODMD5=$(atf_get_srcdir)/testdata.md5
1157718be8SEnji Cooper	# set BYTESWAP to opposite-endian.
1257718be8SEnji Cooper	if [ $(sysctl -n hw.byteorder) = "1234" ]; then
1357718be8SEnji Cooper		BYTESWAP=be
1457718be8SEnji Cooper	else
1557718be8SEnji Cooper		BYTESWAP=le
1657718be8SEnji Cooper	fi
1757718be8SEnji Cooper}
1857718be8SEnji Cooper
1957718be8SEnji Cooper# test_case() taken from the tests/ipf/h_common.sh
2057718be8SEnji Cooper# Used to declare the atf goop for a test.
2157718be8SEnji Coopertest_case()
2257718be8SEnji Cooper{
2357718be8SEnji Cooper	local name="${1}"; shift
2457718be8SEnji Cooper	local check_function="${1}"; shift
2557718be8SEnji Cooper
2657718be8SEnji Cooper	atf_test_case "${name}" cleanup
2757718be8SEnji Cooper	eval "${name}_head() { \
2857718be8SEnji Cooper		atf_set "require.user" "root" ; \
2957718be8SEnji Cooper		atf_set "require.progs" "rump_ffs" ; \
3057718be8SEnji Cooper	}"
3157718be8SEnji Cooper	eval "${name}_body() { \
3257718be8SEnji Cooper		${check_function} " "${@}" "; \
3357718be8SEnji Cooper	}"
3457718be8SEnji Cooper	eval "${name}_cleanup() { \
3557718be8SEnji Cooper		umount -f mnt  ; \
3657718be8SEnji Cooper		: reset error ; \
3757718be8SEnji Cooper	}"
3857718be8SEnji Cooper}
3957718be8SEnji Cooper
4057718be8SEnji Cooper# Used to declare the atf goop for a test expected to fail.
4157718be8SEnji Coopertest_case_xfail()
4257718be8SEnji Cooper{
4357718be8SEnji Cooper	local name="${1}"; shift
4457718be8SEnji Cooper	local reason="${1}"; shift
4557718be8SEnji Cooper	local check_function="${1}"; shift
4657718be8SEnji Cooper
4757718be8SEnji Cooper	atf_test_case "${name}" cleanup
4857718be8SEnji Cooper	eval "${name}_head() { \
4957718be8SEnji Cooper		atf_set "require.user" "root" ; \
5057718be8SEnji Cooper	}"
5157718be8SEnji Cooper	eval "${name}_body() { \
5257718be8SEnji Cooper		atf_expect_fail "${reason}" ; \
5357718be8SEnji Cooper		${check_function} " "${@}" "; \
5457718be8SEnji Cooper	}"
5557718be8SEnji Cooper	eval "${name}_cleanup() { \
5657718be8SEnji Cooper		umount -f mnt  ; \
5757718be8SEnji Cooper		: reset error ; \
5857718be8SEnji Cooper	}"
5957718be8SEnji Cooper}
6057718be8SEnji Cooper
6157718be8SEnji Cooper# copy_data requires the mount already done;  makes one copy of the test data
6257718be8SEnji Coopercopy_data ()
6357718be8SEnji Cooper{
6457718be8SEnji Cooper	uudecode -p ${TDBASE64} | (cd mnt; tar xzf - -s/testdata/TD$1/)
6557718be8SEnji Cooper}
6657718be8SEnji Cooper
6757718be8SEnji Coopercopy_multiple ()
6857718be8SEnji Cooper{
6957718be8SEnji Cooper	local i
7057718be8SEnji Cooper	for i in $(seq $1); do
7157718be8SEnji Cooper		copy_data $i
7257718be8SEnji Cooper	done
7357718be8SEnji Cooper}
7457718be8SEnji Cooper
7557718be8SEnji Cooper# remove_data removes one directory worth of test data; the purpose
7657718be8SEnji Cooper# is to ensure data exists near the end of the fs under test.
7757718be8SEnji Cooperremove_data ()
7857718be8SEnji Cooper{
7957718be8SEnji Cooper	rm -rf mnt/TD$1
8057718be8SEnji Cooper}
8157718be8SEnji Cooper
8257718be8SEnji Cooperremove_multiple ()
8357718be8SEnji Cooper{
8457718be8SEnji Cooper	local i
8557718be8SEnji Cooper	for i in $(seq $1); do
8657718be8SEnji Cooper		remove_data $i
8757718be8SEnji Cooper	done
8857718be8SEnji Cooper}
8957718be8SEnji Cooper
9057718be8SEnji Cooper# verify that the data in a particular directory is still OK
9157718be8SEnji Cooper# generated md5 file doesn't need explicit cleanup thanks to ATF
9257718be8SEnji Coopercheck_data ()
9357718be8SEnji Cooper{
9457718be8SEnji Cooper	(cd mnt/TD$1 && md5 *) > TD$1.md5
9557718be8SEnji Cooper	atf_check diff -u ${GOODMD5} TD$1.md5
9657718be8SEnji Cooper}
9757718be8SEnji Cooper
9857718be8SEnji Cooper# supply begin and end arguments
9957718be8SEnji Coopercheck_data_range ()
10057718be8SEnji Cooper{
10157718be8SEnji Cooper	local i
10257718be8SEnji Cooper	for i in $(seq $1 $2); do
10357718be8SEnji Cooper		check_data $i
10457718be8SEnji Cooper	done
10557718be8SEnji Cooper}
10657718be8SEnji Cooper
10757718be8SEnji Cooper
10857718be8SEnji Cooperresize_ffs()
10957718be8SEnji Cooper{
11057718be8SEnji Cooper	echo "in resize_ffs:" ${@}
11157718be8SEnji Cooper	local bs=$1
11257718be8SEnji Cooper	local fragsz=$2
11357718be8SEnji Cooper	local osize=$3
11457718be8SEnji Cooper	local nsize=$4
11557718be8SEnji Cooper	local fslevel=$5
11657718be8SEnji Cooper	local numdata=$6
11757718be8SEnji Cooper	local swap=$7
11857718be8SEnji Cooper	mkdir -p mnt
11957718be8SEnji Cooper	echo "bs is ${bs} numdata is ${numdata}"
12057718be8SEnji Cooper	echo "****resizing fs with blocksize ${bs}"
12157718be8SEnji Cooper
12257718be8SEnji Cooper	# we want no more than 16K/inode to allow test files to copy.
12357718be8SEnji Cooper	local fpi=$((fragsz * 4))
12457718be8SEnji Cooper	local i
12557718be8SEnji Cooper	if [ $fpi -gt 16384 ]; then
12657718be8SEnji Cooper		i="-i 16384"
12757718be8SEnji Cooper	fi
12857718be8SEnji Cooper	if [ x$swap != x ]; then
12957718be8SEnji Cooper		newfs -B ${BYTESWAP} -O${fslevel} -b ${bs} -f ${fragsz} \
13057718be8SEnji Cooper			-s ${osize} ${i} -F ${IMG}
13157718be8SEnji Cooper	else
13257718be8SEnji Cooper		newfs -O${fslevel} -b ${bs} -f ${fragsz} -s ${osize} ${i} \
13357718be8SEnji Cooper			-F ${IMG}
13457718be8SEnji Cooper	fi
13557718be8SEnji Cooper
13657718be8SEnji Cooper	# we're specifying relative paths, so rump_ffs warns - ignore.
13757718be8SEnji Cooper	atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt
13857718be8SEnji Cooper	copy_multiple ${numdata}
13957718be8SEnji Cooper
14057718be8SEnji Cooper	if [ ${nsize} -lt ${osize} ]; then
14157718be8SEnji Cooper	    # how much data to remove so fs can be shrunk
14257718be8SEnji Cooper	    local remove=$((numdata-numdata*nsize/osize))
14357718be8SEnji Cooper	    local dataleft=$((numdata-remove))
14457718be8SEnji Cooper	    echo remove is $remove dataleft is $dataleft
14557718be8SEnji Cooper	    remove_multiple ${remove}
14657718be8SEnji Cooper	fi
14757718be8SEnji Cooper
14857718be8SEnji Cooper	umount mnt
149*640235e2SEnji Cooper	# Check that resize needed
150*640235e2SEnji Cooper	atf_check -s exit:0 -o ignore resize_ffs -c -y -s ${nsize} ${IMG}
15157718be8SEnji Cooper	atf_check -s exit:0 -o ignore resize_ffs -y -s ${nsize} ${IMG}
15257718be8SEnji Cooper	atf_check -s exit:0 -o ignore fsck_ffs -f -n -F ${IMG}
15357718be8SEnji Cooper	atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt
15457718be8SEnji Cooper	if [ ${nsize} -lt ${osize} ]; then
15557718be8SEnji Cooper	    check_data_range $((remove + 1)) ${numdata}
15657718be8SEnji Cooper	else
15757718be8SEnji Cooper	    # checking everything because we don't delete on grow
15857718be8SEnji Cooper	    check_data_range 1 ${numdata}
15957718be8SEnji Cooper	fi
160*640235e2SEnji Cooper	# Check that no resize needed
161*640235e2SEnji Cooper	atf_check -s exit:1 -o ignore resize_ffs -c -y -s ${nsize} ${IMG}
16257718be8SEnji Cooper	umount mnt
16357718be8SEnji Cooper}
164