Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/tests/sbin/resize_ffs Re-work the resize_ffs(8) tests:
details: https://anonhg.NetBSD.org/src/rev/a5bafe4e3112
branches: trunk
changeset: 759432:a5bafe4e3112
user: riz <riz%NetBSD.org@localhost>
date: Thu Dec 09 05:19:02 2010 +0000
description:
Re-work the resize_ffs(8) tests:
Put real data into file systems before resizing: the test data
was randomly generated and is in pairs of files each a power-of-two and
power-of-two plus one bytes to hopefully catch block and frag issues.
Each test fills (nearly) the file system with test data. If shrinking,
it removes enough data so that the shrunken file system will be large enough
to accomodate the data. (It's done this way to hopefully ensure some or
most of the data will need to be moved when shrinking). The files are
then checked with MD5 against the known list. This particular method
was chosen to reduce the amount of data checked in while still retaining
reproducibility.
There are more tests to come; since resize_ffs(8) currently does not
support ffsv2 or byteswapped file systems, only a couple token expected-fail
test cases for those were added. Also, only 8:1 blocksize:fragsize
combinations are currently tested.
diffstat:
tests/sbin/resize_ffs/Makefile | 11 +-
tests/sbin/resize_ffs/common.sh | 121 +
tests/sbin/resize_ffs/t_grow.sh | 158 +
tests/sbin/resize_ffs/t_resize_ffs.sh | 113 -
tests/sbin/resize_ffs/t_shrink.sh | 153 +
tests/sbin/resize_ffs/testdata.md5 | 18 +
tests/sbin/resize_ffs/testdata.tar.gz.base64 | 10938 +++++++++++++++++++++++++
7 files changed, 11397 insertions(+), 115 deletions(-)
diffs (truncated from 11547 to 300 lines):
diff -r 376f9cbf7441 -r a5bafe4e3112 tests/sbin/resize_ffs/Makefile
--- a/tests/sbin/resize_ffs/Makefile Thu Dec 09 05:14:28 2010 +0000
+++ b/tests/sbin/resize_ffs/Makefile Thu Dec 09 05:19:02 2010 +0000
@@ -1,9 +1,16 @@
-# $NetBSD: Makefile,v 1.1 2010/11/30 23:17:27 riz Exp $
+# $NetBSD: Makefile,v 1.2 2010/12/09 05:19:02 riz Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/sbin/resize_ffs
-TESTS_SH= t_resize_ffs
+.for name in t_grow t_shrink
+TESTS_SH+= ${name}
+TESTS_SH_SRC_${name}= common.sh ${name}.sh
+.endfor
+
+FILESDIR= ${TESTSDIR}
+FILES= testdata.tar.gz.base64
+FILES+= testdata.md5
.include <bsd.test.mk>
diff -r 376f9cbf7441 -r a5bafe4e3112 tests/sbin/resize_ffs/common.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/sbin/resize_ffs/common.sh Thu Dec 09 05:19:02 2010 +0000
@@ -0,0 +1,121 @@
+
+# Common settings and functions for the various resize_ffs tests.
+#
+
+# called from atf_init_test_cases
+setupvars()
+{
+ IMG=fsimage
+ TDBASE64=$(atf_get_srcdir)/testdata.tar.gz.base64
+ GOODMD5=$(atf_get_srcdir)/testdata.md5
+ MNTPT=mnt
+ # set BYTESWAP to opposite-endian.
+ if [ $(sysctl -n hw.byteorder) = "1234" ]; then
+ BYTESWAP=be
+ else
+ BYTESWAP=le
+ fi
+}
+
+# make sure to remove test_redo before committing
+test_redo ()
+{
+ local fpi=$((${2} * 4))
+ local i
+ if [ $fpi -gt 16384 ]; then
+ i="-i 16384"
+ fi
+ sudo umount ${MNTPT}
+ newfs -O1 $i -b $1 -f $2 -s $3 -F ${IMG}
+ sudo rump_ffs ${IMG} ${MNTPT}
+}
+
+# test_case() taken from the tests/ipf/h_common.sh
+# Used to declare the atf goop for a test.
+test_case()
+{
+ local name="${1}"; shift
+ local check_function="${1}"; shift
+
+ atf_test_case "${name}" cleanup
+ eval "${name}_body() { \
+ ${check_function} " "${@}" "; \
+ }"
+ eval "${name}_cleanup() { \
+ umount -f ${MNTPT} ; \
+ }"
+}
+
+# Used to declare the atf goop for a test expected to fail.
+test_case_xfail()
+{
+ local name="${1}"; shift
+ local reason="${1}"; shift
+ local check_function="${1}"; shift
+
+ atf_test_case "${name}" cleanup
+ eval "${name}_body() { \
+ atf_expect_fail "${reason}" ; \
+ ${check_function} " "${@}" "; \
+ }"
+ eval "${name}_cleanup() { \
+ umount -f ${MNTPT} ; \
+ }"
+}
+
+# copy_data requires the mount already done; makes one copy of the test data
+copy_data ()
+{
+ uudecode -p ${TDBASE64} | (cd ${MNTPT}; tar xzf - -s/testdata/TD$1/)
+}
+
+copy_multiple ()
+{
+ local i
+ for i in $(jot $1); do
+ copy_data $i
+ done
+}
+
+# remove_data removes one directory worth of test data; the purpose
+# is to ensure data exists near the end of the fs under test.
+remove_data ()
+{
+ rm -rf ${MNTPT}/TD$1
+}
+
+remove_multiple ()
+{
+ local i
+ for i in $(jot $1); do
+ remove_data $i
+ done
+}
+
+mount_test_fs_image ()
+{
+ rump_ffs ${IMG} ${MNTPT}
+}
+
+unmount_test_fs_image ()
+{
+ umount -f ${MNTPT}
+}
+
+
+# verify that the data in a particular directory is still OK
+# generated md5 file doesn't need explicit cleanup thanks to ATF
+check_data ()
+{
+ (cd ${MNTPT}/TD$1 && md5 *) > TD$1.md5
+ atf_check diff -u ${GOODMD5} TD$1.md5
+}
+
+# supply begin and end arguments
+check_data_range ()
+{
+ local i
+ for i in $(jot $(($2-$1+1)) $1); do
+ check_data $i
+ done
+}
diff -r 376f9cbf7441 -r a5bafe4e3112 tests/sbin/resize_ffs/t_grow.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/sbin/resize_ffs/t_grow.sh Thu Dec 09 05:19:02 2010 +0000
@@ -0,0 +1,158 @@
+# $NetBSD: t_grow.sh,v 1.1 2010/12/09 05:19:02 riz Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Jeffrey C. Rizzo.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+grow_ffs()
+{
+ echo "in grow_ffs:" ${@}
+ local bs=$1
+ local fragsz=$2
+ local osize=$3
+ local nsize=$4
+ local fslevel=$5
+ local numdata=$6
+ local swap=$7
+ mkdir -p ${MNTPT}
+ echo "bs is ${bs} numdata is ${numdata}"
+ echo "****growing fs with blocksize ${bs}"
+
+ # we want no more than 16K/inode to allow test files to copy.
+ local fpi=$((fragsz * 4))
+ local i
+ if [ $fpi -gt 16384 ]; then
+ i="-i 16384"
+ fi
+ if [ x$swap != x ]; then
+ newfs -B ${BYTESWAP} -O${fslevel} -b ${bs} -f ${fragsz} \
+ -s ${osize} ${i} -F ${IMG}
+ else
+ newfs -O${fslevel} -b ${bs} -f ${fragsz} -s ${osize} ${i} \
+ -F ${IMG}
+ fi
+
+ # we're specifying relative paths, so rump_ffs warns - ignore.
+ atf_check -s exit:0 -e ignore rump_ffs ${IMG} ${MNTPT}
+ copy_multiple ${numdata}
+ umount ${MNTPT}
+ atf_check -s exit:0 resize_ffs -y -s ${nsize} ${IMG}
+ atf_check -s exit:0 -o ignore fsck_ffs -f -n -F ${IMG}
+ atf_check -s exit:0 -e ignore rump_ffs ${IMG} ${MNTPT}
+ # checking everything because we don't delete on grow
+ check_data_range 1 ${numdata}
+ umount ${MNTPT}
+ rm -f ${IMG} # probably unnecessary
+}
+
+# grow_ffs params as follows:
+# grow_ffs blocksize fragsize fssize newfssize level numdata swap
+# where 'numdata' is the number of data directories to copy - this is
+# determined manually based on the maximum number that will fit in the
+# created fs. 'level' is the fs-level (-O 0,1,2) passed to newfs.
+# If 'swap' is included, byteswap the fs
+test_case grow_16M_v1_4096 grow_ffs 4096 512 32768 131072 1 28
+test_case grow_16M_v1_8192 grow_ffs 8192 1024 32768 131072 1 28
+test_case grow_16M_v1_16384 grow_ffs 16384 2048 32768 131072 1 29
+test_case grow_16M_v1_32768 grow_ffs 32768 4096 32768 131072 1 28
+test_case grow_16M_v1_65536 grow_ffs 65536 8192 32768 131072 1 26
+# these grow_24M grow a smaller amount; sometimes there's different issues
+test_case grow_24M_v1_4096 grow_ffs 4096 512 49152 65536 1 41
+test_case grow_24M_v1_8192 grow_ffs 8192 1024 49152 65536 1 42
+test_case grow_24M_v1_16384 grow_ffs 16384 2048 49152 65536 1 43
+test_case grow_24M_v1_32768 grow_ffs 32768 4096 49152 65536 1 42
+test_case grow_24M_v1_65536 grow_ffs 65536 8192 49152 65536 1 38
+test_case grow_32M_v1_4096 grow_ffs 4096 512 65536 131072 1 55
+test_case grow_32M_v1_8192 grow_ffs 8192 1024 65536 131072 1 56
+test_case grow_32M_v1_16384 grow_ffs 16384 2048 65536 131072 1 58
+test_case grow_32M_v1_32768 grow_ffs 32768 4096 65536 131072 1 56
+test_case grow_32M_v1_65536 grow_ffs 65536 8192 65536 131072 1 51
+test_case grow_48M_v1_4096 grow_ffs 4096 512 98304 131072 1 82
+test_case grow_48M_v1_8192 grow_ffs 8192 1024 98304 131072 1 84
+test_case grow_48M_v1_16384 grow_ffs 16384 2048 98304 131072 1 87
+test_case_xfail grow_48M_v1_32768 "PR bin/44209" grow_ffs 32768 4096 98304 131072 1 83
+test_case grow_48M_v1_65536 grow_ffs 65536 8192 98304 131072 1 76
+test_case grow_64M_v1_4096 grow_ffs 4096 512 131072 262144 1 109
+test_case grow_64M_v1_8192 grow_ffs 8192 1024 131072 262144 1 111
+test_case grow_64M_v1_16384 grow_ffs 16384 2048 131072 262144 1 115
+test_case_xfail grow_64M_v1_32768 "PR bin/44209" grow_ffs 32768 4096 131072 262144 1 111
+test_case grow_64M_v1_65536 grow_ffs 65536 8192 131072 262144 1 101
+test_case_xfail grow_64M_v1_65536_swapped "PR bin/44203" grow_ffs 65536 8192 131072 262144 1 101 swap
+test_case_xfail grow_64M_v2_65536 "PR bin/44205" grow_ffs 65536 8192 131072 262144 2 101
+test_case_xfail grow_64M_v2_65536_swapped "PR bin/44203; PR bin/44205" grow_ffs 65536 8192 131072 262144 2 101 swap
+
+atf_test_case grow_ffsv1_partial_cg
+grow_ffsv1_partial_cg_head()
+{
+ atf_set "descr" "Checks successful ffsv1 growth by less" \
+ "than a cylinder group"
+}
+grow_ffsv1_partial_cg_body()
+{
+ echo "***resize_ffs grow test"
+
+ # resize_ffs only supports ffsv1 at the moment
+ atf_check -o ignore -e ignore newfs -V1 -s 4000 -F ${IMG}
+
+ # size to grow to is chosen to cause partial cg
+ atf_check -s exit:0 resize_ffs -y -s 5760 ${IMG}
+ atf_check -s exit:0 -o ignore fsck_ffs -f -n -F ${IMG}
+}
+
+atf_init_test_cases()
+{
+ setupvars
+ atf_add_test_case grow_16M_v1_4096
+ atf_add_test_case grow_16M_v1_8192
+ atf_add_test_case grow_16M_v1_16384
+ atf_add_test_case grow_16M_v1_32768
+ atf_add_test_case grow_16M_v1_65536
+ atf_add_test_case grow_24M_v1_4096
+ atf_add_test_case grow_24M_v1_8192
+ atf_add_test_case grow_24M_v1_16384
+ atf_add_test_case grow_24M_v1_32768
+ atf_add_test_case grow_24M_v1_65536
+ atf_add_test_case grow_32M_v1_4096
+ atf_add_test_case grow_32M_v1_8192
+ atf_add_test_case grow_32M_v1_16384
+ atf_add_test_case grow_32M_v1_32768
+ atf_add_test_case grow_32M_v1_65536
+ atf_add_test_case grow_48M_v1_4096
+ atf_add_test_case grow_48M_v1_8192
+ atf_add_test_case grow_48M_v1_16384
+ atf_add_test_case grow_48M_v1_32768
+ atf_add_test_case grow_48M_v1_65536
+ atf_add_test_case grow_64M_v1_4096
Home |
Main Index |
Thread Index |
Old Index