diff --git a/Makefile b/Makefile index 997abad8..4e336482 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o \ libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \ crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h \ extent_io.h ioctl.h ctree.h btrfsck.h +TESTS = fsck-tests.sh INSTALL = install prefix ?= /usr/local @@ -123,6 +124,12 @@ $(BUILDDIRS): @echo "Making all in $(patsubst build-%,%,$@)" $(Q)$(MAKE) $(MAKEOPTS) -C $(patsubst build-%,%,$@) +test: + $(Q)for t in $(TESTS); do \ + echo " [TEST] $$t"; \ + bash tests/$$t || exit 1; \ + done + # # NOTE: For static compiles, you need to have all the required libs # static equivalent available diff --git a/tests/fsck-tests.sh b/tests/fsck-tests.sh new file mode 100644 index 00000000..c1490bf3 --- /dev/null +++ b/tests/fsck-tests.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# loop through all of our bad images and make sure fsck repairs them properly +# +# It's GPL, same as everything else in this tree. +# + +here=`pwd` + +_fail() +{ + echo "$*" | tee -a fsck-tests-results.txt + exit 1 +} + +rm -f fsck-tests-results.txt + +for i in $(find $here/tests/fsck-tests -name '*.img') +do + echo "testing image $i" >> fsck-tests-results.txt + $here/btrfs-image -r $i test.img >> fsck-tests-results.txt 2>&1 \ + || _fail "restore failed" + $here/btrfsck test.img >> fsck-test-results.txt 2>&1 + [ $? -eq 0 ] && _fail "btrfsck should have detected corruption" + + $here/btrfsck --repair test.img >> fsck-test-results.txt 2>&1 || \ + _fail "btrfsck should have repaired the image" + + $here/btrfsck test.img >> fsck-test-results.txt 2>&1 || \ + _fail "btrfsck did not correct corruption" +done diff --git a/tests/fsck-tests/001-bad-file-extent-bytenr.img b/tests/fsck-tests/001-bad-file-extent-bytenr.img new file mode 100644 index 00000000..d2a05bb8 Binary files /dev/null and b/tests/fsck-tests/001-bad-file-extent-bytenr.img differ