--- /dev/null
+#!/bin/bash
+
+#
+# 5-second regression test for dump/verify/restore. It's not intended to be
+# an exhaustive regression test, just a quick way to verify that you haven't
+# introduced any errors when changing code.
+#
+# N.B., this only verifies that THIS build of dump(8) and THIS build of
+# restore(8) will play well together. It does not guarantee that these systems
+# are compatible with released versions of the software! For that we need
+# to keep images of known-good partitions and dump files.
+#
+# Author: Bear Giles (bgiles@coyotesong.com)
+# License granted to dump project under non-advertising BSD license.
+#
+
+#
+# Create 10 MB virtual partition.
+#
+# mkvirtpart(filename, loop device)
+#
+mkvirtpart()
+{
+ FILENAME=$1
+ LOOPDEV=$2
+
+ if [ "$#" -ne "2" ]; then
+ /bin/echo "usage: mkvrtpart FILENAME LOOPDEV"
+ return 1
+ fi
+
+ # create 10M sparse file
+ /usr/bin/truncate -s 10M $FILENAME
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "unable to create partition image."
+ return 1
+ fi
+
+ # mount and format it
+ /sbin/losetup $LOOPDEV $FILENAME
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "setting up loop device failed."
+ return 1
+ fi
+
+ /sbin/mkfs -text4 $LOOPDEV
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "formating test partition failed."
+ /sbin/losetup -d $LOOPDEV
+ return 1
+ fi
+
+ /sbin/losetup -d $LOOPDEV
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "tearing down loop device failed."
+ return 1
+ fi
+}
+
+#
+# Populate test filesystem
+#
+# mktestfs(root)
+mktestfs()
+{
+ ROOT=$1
+
+ if [ "$#" -ne "1" ]; then
+ /bin/echo "usage: mktestfs ROOT"
+ return 1
+ fi
+
+ if [ "$ROOT" == "" -o "$ROOT" == "/" ]; then
+ /bin/echo "cowardly refusing to stomp on root."
+ return 1
+ fi
+
+ /usr/bin/install -d $ROOT
+
+ # create typical file
+ /usr/bin/touch $ROOT/perm644
+ /bin/chmod 0644 $ROOT/perm644
+
+ # create typical executable
+ /usr/bin/touch $ROOT/perm755
+ /bin/chmod 0755 $ROOT/perm755
+
+ # create multiple symlinks
+ /usr/bin/touch $ROOT/symlink
+ /bin/ln $ROOT/symlink $ROOT/symlink1
+ /bin/ln $ROOT/symlink $ROOT/symlink2
+
+ # create hard links
+ /usr/bin/touch $ROOT/hardlink
+ /bin/ln $ROOT/hardlink $ROOT/hardlink1
+ /bin/ln $ROOT/hardlink $ROOT/hardlink2
+
+ # create block device
+ /bin/mknod $ROOT/block b 10 20
+
+ # create character device
+ /bin/mknod $ROOT/char c 11 21
+
+ # create FIFO
+ /bin/mknod $ROOT/pipe p
+
+ # make sparse device
+ #/usr/bin/truncate -s 500k $ROOT/sparse
+
+ # populate some files
+ /bin/mkdir $ROOT/man1
+ /bin/cp -rp /usr/share/man/man1/* $ROOT/man1
+}
+
+#
+# Single test cycle
+#
+dump_verify_restore() {
+
+ if [ "$#" -lt "5" ]; then
+ /bin/echo "usage: dump_verify_restore SRC_LOOPDEV SRC_MOUNTPOINT DEST_LOOPDEV DEST_MOUNTPOINT DUMPFILE ..."
+ return 1
+ fi
+
+ SRC_LOOPDEV=$1
+ SRC_MOUNTPOINT=$2
+ DEST_LOOPDEV=$3
+ DEST_MOUNTPOINT=$4
+ DUMPFILE=$5
+
+ shift; shift; shift; shift; shift
+
+ /sbin/losetup $SRC_LOOPDEV $SRC_FILENAME
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "setting up loop device failed."
+ return 1
+ fi
+
+ # we have to mount partition for verify to work even if we dump the
+ # underlying partition.
+ /bin/mount $SRC_LOOPDEV $SRC_MOUNTPOINT
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "mounting source partition failed."
+ /sbin/losetup -d $SRC_LOOPDEV
+ return 1;
+ fi
+
+ # dump the test partition
+ ../dump/dump -0 $@ -f $DUMPFILE $SRC_LOOPDEV
+ if [ "$?" -ne "0" ]; then
+ echo "dump failed, error code $?"
+ /bin/rm $DUMPFILE
+ /bin/umount $SRC_MOUNTPOINT
+ /sbin/losetup -d $SRC_LOOPDEV
+ return 1
+ fi
+
+ # verify
+ ../restore/restore -C -f $DUMPFILE
+ if [ "$?" -ne "0" ]; then
+ echo "verification failed, error code $?"
+ /bin/rm $DUMPFILE
+ /bin/umount $SRC_MOUNTPOINT
+ /sbin/losetup -d $SRC_LOOPDEV
+ return 1
+ fi
+
+ # restore fs, compare to orginal one
+ # I can't do that yet since restore will only restore to the current directory.
+ # this makes sense for a number of reasons it difficult to test our newly
+ # compiled code.
+ # ../../restore/restore -r ...
+
+ # tear everything down
+ /bin/umount $SRC_MOUNTPOINT
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "unmounting test partition failed."
+ return 1
+ fi
+
+ /sbin/losetup -d $SRC_LOOPDEV
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "tearing down loop device failed."
+ return 1
+ fi
+}
+
+#
+# set up source partition.
+#
+setup_src_partition() {
+ SRC_FILENAME=$1
+ SRC_LOOPDEV=$2
+ SRC_MOUNTPOINT=$3
+
+ if [ "$#" -ne "3" ]; then
+ /bin/echo "usage: setup_src_partition SRC_FILENAME SRC_LOOPDEV SRC_MOUNTPOINT"
+ return 1
+ fi
+
+ mkvirtpart $SRC_FILENAME $SRC_LOOPDEV
+ if [ $? -ne 0 ]; then
+ /bin/echo "creating source test partition failed."
+ return 1
+ fi
+
+ # mount it
+ /sbin/losetup $SRC_LOOPDEV $SRC_FILENAME
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "setting up loop device failed."
+ return 1
+ fi
+
+ /bin/mount $SRC_LOOPDEV $SRC_MOUNTPOINT
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "mounting test partition failed."
+ return 1
+ fi
+
+ mktestfs $SRC_MOUNTPOINT
+ if [ "$?" -ne "0" ]; then
+ return 1
+ fi
+
+ /bin/umount $SRC_LOOPDEV
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "unmounting test partition failed."
+ return 1
+ fi
+
+ /sbin/losetup -d $SRC_LOOPDEV
+ if [ "$?" -ne "0" ]; then
+ /bin/echo "tearing down loop device failed."
+ return 1
+ fi
+
+ return 0
+}
+
+
+#
+# clean up temporary files. We want to be extremely careful here that
+# we don't accidently do a 'rm -rf' on /
+#
+cleanup() {
+
+ if [ "$#" -ne "6" ]; then
+ /bin/echo "usage: cleanup SRC_FILENAME SRC_MOUNTPOINT DEST_FILENAME DEST_MOUNTPOINT BASEDIR DUMPFILE"
+ return 1
+ fi
+
+ SRC_FILENAME=$1
+ SRC_MOUNTPOINT=$2
+ DEST_FILENAME=$3
+ DEST_MOUNTPOINT=$4
+ BASEDIR=$5
+ DUMPFILE=$6
+
+ if [ "$BASEDIR" == "" -o "$BASEDIR" == "/" ]; then
+ /bin/echo "cowardly refusing to delete root."
+ return 1
+ fi
+
+ # we don't do rm -r since we don't want to delete
+ # anything we didn't create.
+ /bin/rm -f $SRC_FILENAME
+ /bin/rmdir $SRC_MOUNTPOINT
+ /bin/rm -f $DEST_FILENAME
+ /bin/rmdir $DEST_MOUNTPOINT
+ /bin/rm -f $DUMPFILE
+ /bin/rmdir $BASEDIR
+
+ return 0
+}
+
+###############################################
+#
+# the actual script
+#
+BASEDIR=`/bin/mktemp -d`
+
+SRC_FILENAME=$BASEDIR/dump-test-src.img
+SRC_LOOPDEV=/dev/loop6
+SRC_MOUNTPOINT=$BASEDIR/src
+DEST_FILENAME=$BASEDIR/dump-test-dst.img
+DEST_LOOPDEV=/dev/loop7
+DEST_MOUNTPOINT=$BASEDIR/dest
+DUMPFILE=$BASEDIR/dump-test.dump
+
+/bin/echo BASEDIR = $BASEDIR
+
+/usr/bin/install -d $BASEDIR
+/usr/bin/install -d $SRC_MOUNTPOINT
+/usr/bin/install -d $DEST_MOUNTPOINT
+
+# Setup source partition
+setup_src_partition $SRC_FILENAME $SRC_LOOPDEV $SRC_MOUNTPOINT
+if [ $? -ne 0 ]; then
+ /bin/echo "creating source test partition failed."
+ cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+ exit 1
+fi
+
+# create dest partition (for restores)
+mkvirtpart $DEST_FILENAME $DEST_LOOPDEV
+if [ $? -ne 0 ]; then
+ /bin/echo "creating destination test partition failed."
+ cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+ exit 1
+fi
+
+echo
+echo "testing basic dump/restore"
+dump_verify_restore $SRC_LOOPDEV $SRC_MOUNTPOINT $DEST_LOOPDEV $DEST_MOUNTPOINT $DUMPFILE
+if [ $? -ne 0 ]; then
+ /bin/echo "dump cycle failed."
+ cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+ exit 1
+fi
+
+echo
+echo "testing compressed dump/restore (lzo)..."
+dump_verify_restore $SRC_LOOPDEV $SRC_MOUNTPOINT $DEST_LOOPDEV $DEST_MOUNTPOINT $DUMPFILE -y
+if [ $? -ne 0 ]; then
+ /bin/echo "dump cycle failed."
+ cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+ exit 1
+fi
+
+echo
+echo "testing compressed dump/restore (zlib)..."
+dump_verify_restore $SRC_LOOPDEV $SRC_MOUNTPOINT $DEST_LOOPDEV $DEST_MOUNTPOINT $DUMPFILE -z2
+if [ $? -ne 0 ]; then
+ /bin/echo "dump cycle failed."
+ cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+ exit 1
+fi
+
+echo
+echo "testing compressed dump/restore (bzlib)..."
+dump_verify_restore $SRC_LOOPDEV $SRC_MOUNTPOINT $DEST_LOOPDEV $DEST_MOUNTPOINT $DUMPFILE -j2
+if [ $? -ne 0 ]; then
+ /bin/echo "dump cycle failed."
+ cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+ exit 1
+fi
+
+cleanup $SRC_FILENAME $SRC_MOUNTPOINT $DEST_FILENAME $DEST_MOUNTPOINT $BASEDIR $DUMPFILE
+
+/bin/echo "#"
+/bin/echo "# success!"
+/bin/echo "#"
+
+exit 0