btrfs-progs: New btrfsck test infrastructure

Change the old btrfsck test infrastructure (btrfs-image dump or xz raw
dump) to the new test infrastructure.

1) Test case layout
The new infrastructure is dir based, each dir is one test type, and can
contain multiple images/scripts for different corner cases.
So layout will be the following:
btrfs-progs
	|-tests
	    |-fsck-tests
		|-001-SOME-CORRUPT-TYPE
			|-IMAGE-FOR-CASE1
			|-IMAGE-FOR-CASE2

2) Test case image types
Only 2 types for test case images.
a) btrfs-image dump
   This one is the simplest case, one only needs to add the image to
   corresponding dir.

b) custom script
   This one is for all the resting cases which can't fit btrfs-image,
   like csum error or script can generate the image (this reduces the
   size obviously and good for review)
   The old binary dump also belongs to this type, so need to add script
   to extract them.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
Qu Wenruo 2014-12-25 09:32:11 +08:00 committed by David Sterba
parent 3d47cc9ae1
commit 5287625fcf
2 changed files with 97 additions and 47 deletions

49
tests/common Normal file
View File

@ -0,0 +1,49 @@
#!/bin/bash
#
# Common routines for all tests
#
_fail()
{
echo "$*" | tee -a $RESULT
exit 1
}
run_check()
{
echo "############### $@" >> $RESULT 2>&1
"$@" >> $RESULT 2>&1 || _fail "failed: $@"
}
check_prereq()
{
if ! [ -f $top/$1 ]; then
_fail "Failed prerequisities: $1";
fi
}
check_image()
{
image=$1
echo "testing image $(basename $image)" >> $RESULT
$top/btrfs check $image >> $RESULT 2>&1
[ $? -eq 0 ] && _fail "btrfs check should have detected corruption"
run_check $top/btrfs check --repair $image
run_check $top/btrfs check $image
}
check_all_images()
{
dir=$1
for i in $(find $dir -iname '*.img')
do
echo "extracting image $(basename $i)" >> $RESULT
$top/btrfs-image -r $i $i.restored || \
_fail "failed to extract image $i"
check_image $i.restored
rm $i.restored
done
}

95
tests/fsck-tests.sh Normal file → Executable file
View File

@ -5,60 +5,60 @@
# It's GPL, same as everything else in this tree. # It's GPL, same as everything else in this tree.
# #
here=`pwd` unset top
TEST_DEV= unset LANG
TEST_MNT= LANG=C
RESULT="fsck-tests-results.txt" script_dir=$(dirname $(realpath $0))
top=$(realpath $script_dir/../)
TEST_DEV=${TEST_DEV:-}
TEST_MNT=${TEST_MNT:-$top/tests/mnt}
RESULT="$top/tests/fsck-tests-results.txt"
_fail() source $top/tests/common
{
echo "$*" | tee -a $RESULT
exit 1
}
run_check() # Allow child test to use $top and $RESULT
{ export top
echo "############### $@" >> $RESULT 2>&1 export RESULT
"$@" >> $RESULT 2>&1 || _fail "failed: $@" # For custom script needs to verfiy recovery
} export TEST_MNT
export LANG
check_prereq()
{
if ! [ -f $here/$1 ]; then
_fail "Failed prerequisities: $1";
fi
}
rm -f $RESULT rm -f $RESULT
mkdir -p $TEST_MNT || _fail "unable to create mount point on $TEST_MNT"
# test rely on corrupting blocks tool # test rely on corrupting blocks tool
check_prereq btrfs-corrupt-block check_prereq btrfs-corrupt-block
check_prereq btrfs-image check_prereq btrfs-image
check_prereq btrfs check_prereq btrfs
# Some broken filesystem images are kept as .img files, created by the tool # Each dir contains one type of error for btrfsck test.
# btrfs-image, and others are kept as .tar.xz files that contain raw filesystem # Each dir must be one of the following 2 types:
# image (the backing file of a loop device, as a sparse file). The reason for # 1) Only btrfs-image dump
# keeping some as tarballs of raw images is that for these cases btrfs-image # Only contains one or several btrfs-image dumps (.img)
# isn't able to preserve all the (bad) filesystem structure for some reason. # Each image will be tested by generic test routine
for i in $(find $here/tests/fsck-tests -name '*.img' -o -name '*.tar.xz' | sort) # (btrfsck --repair and btrfsck).
# This is for case that btree-healthy images.
# 2) Custom test script
# This dir contains test.sh which will do custom image
# generation/check/verification.
# This is for case btrfs-image can't dump or case needs extra
# check/verify
for i in $(find $top/tests/fsck-tests -maxdepth 1 -mindepth 1 -type d | sort)
do do
echo " [TEST] $(basename $i)" echo " [TEST] $(basename $i)"
echo "testing image $i" >> $RESULT cd $i
if [ -x test.sh ]; then
extension=${i#*.} # Type 2
./test.sh
if [ $extension == "img" ]; then if [ $? -ne 0 ]; then
run_check $here/btrfs-image -r $i test.img _fail "test failed for case $(basename $i)"
fi
else else
run_check tar xJf $i # Type 1
check_all_images `pwd`
fi fi
cd $top
$here/btrfs check test.img >> $RESULT 2>&1
[ $? -eq 0 ] && _fail "btrfs check should have detected corruption"
run_check $here/btrfs check --repair test.img
run_check $here/btrfs check test.img
done done
if [ -z $TEST_DEV ] || [ -z $TEST_MNT ];then if [ -z $TEST_DEV ] || [ -z $TEST_MNT ];then
@ -70,31 +70,32 @@ fi
test_extent_tree_rebuild() test_extent_tree_rebuild()
{ {
echo " [TEST] extent tree rebuild" echo " [TEST] extent tree rebuild"
$here/mkfs.btrfs -f $TEST_DEV >> /dev/null 2>&1 || _fail "fail to mkfs" $top/mkfs.btrfs -f $TEST_DEV >> /dev/null 2>&1 || _fail "fail to mkfs"
run_check mount $TEST_DEV $TEST_MNT run_check mount $TEST_DEV $TEST_MNT
cp -aR /lib/modules/`uname -r`/ $TEST_MNT 2>&1 cp -aR /lib/modules/`uname -r`/ $TEST_MNT 2>&1
for i in `seq 1 100`;do for i in `seq 1 100`;do
$here/btrfs sub snapshot $TEST_MNT \ $top/btrfs sub snapshot $TEST_MNT \
$TEST_MNT/snapaaaaaaa_$i >& /dev/null $TEST_MNT/snapaaaaaaa_$i >& /dev/null
done done
run_check umount $TEST_DEV run_check umount $TEST_DEV
# get extent root bytenr # get extent root bytenr
extent_root_bytenr=`$here/btrfs-debug-tree -r $TEST_DEV | grep extent | awk '{print $7}'` extent_root_bytenr=`$top/btrfs-debug-tree -r $TEST_DEV | \
grep extent | awk '{print $7}'`
if [ -z $extent_root_bytenr ];then if [ -z $extent_root_bytenr ];then
_fail "fail to get extent root bytenr" _fail "fail to get extent root bytenr"
fi fi
# corrupt extent root node block # corrupt extent root node block
run_check $here/btrfs-corrupt-block -l $extent_root_bytenr \ run_check $top/btrfs-corrupt-block -l $extent_root_bytenr \
-b 4096 $TEST_DEV -b 4096 $TEST_DEV
$here/btrfs check $TEST_DEV >& /dev/null && \ $top/btrfs check $TEST_DEV >& /dev/null && \
_fail "btrfs check should detect failure" _fail "btrfs check should detect failure"
run_check $here/btrfs check --init-extent-tree $TEST_DEV run_check $top/btrfs check --init-extent-tree $TEST_DEV
run_check $here/btrfs check $TEST_DEV run_check $top/btrfs check $TEST_DEV
} }
test_extent_tree_rebuild test_extent_tree_rebuild