#!/bin/bash
set -x
set -e
. functions

DEV=/dev/mapper/ploop1

BLOCKSIZE=2048
DELTA=100000
SIZE=104857600
SIZENEW=1048576000
V=2
OFFLINE=yes
RESIZE=yes

while [ "${#}" -gt 0 ]; do
case "${1}" in
	"--online")
		OFFLINE="no"
		shift
		;;
	"--noresize")
		RESIZE=no
		SIZE=$SIZENEW
		shift
		;;
	"--size")
		SIZENEW="${2}"
		shift
		shift
		;;
	*)
		shift
		;;
	esac
done

test_cleanup

ploop init -t none -v ${V} -b $BLOCKSIZE -s ${SIZE}k $TEST_IMAGE
ploop mount -d $DEV  $TEST_DDXML

let bs=$BLOCKSIZE/2
dd if=/dev/urandom bs=${bs}k count=1 of=$TEST_STORAGE/data

size=$SIZE
for ((i = 0; i < size; i += bs*DELTA)); do
	progress Writing $i $size
	dd if=$TEST_STORAGE/data of=$DEV bs=1k seek=$i >/dev/null 2>&1
done
echo

if [ "$OFFLINE" = yes ]; then
	echo "Offline resize"
	ploop umount $TEST_DDXML
else
	echo "Online resize"
fi
# snapshot + grow
UUID=`uuidgen`
UUID1=`uuidgen`
ploop snapshot -u $UUID $TEST_DDXML
if [ $RESIZE = yes ]; then
	ploop grow -s ${SIZENEW}k $TEST_DDXML
fi

ploop snapshot -u $UUID1 $TEST_DDXML

if [ "$OFFLINE" != yes ]; then
	ploop umount $TEST_DDXML
fi
ploop mount -d $DEV $TEST_DDXML

size=${SIZENEW}
for ((; i < size; i += bs*DELTA)); do
	progress Writing $i $size
	dd if=$TEST_STORAGE/data of=$DEV bs=1k seek=$i >/dev/null 2>&1
done
echo


if [ "$OFFLINE" = yes ]; then
	echo "Offline snapshot delete"
	ploop umount $TEST_DDXML
else
	echo "Online snapshot delete"
fi

ploop snapshot-delete -u $UUID $TEST_DDXML

if [ "$OFFLINE" = yes ]; then
	ploop mount -d $DEV $TEST_DDXML
fi

echo "Read"
for ((i = 0; i < size; i += bs*DELTA)); do
	progress Reading $i $size
	dd of=$TEST_STORAGE/data_out if=$DEV bs=1k count=$bs skip=$i >/dev/null 2>&1
	cmp $TEST_STORAGE/data $TEST_STORAGE/data_out
	rm -f $TEST_STORAGE/data_out
done
echo

test_cleanup

rm -f $TEST_STORAGE/data_out
rm -f $TEST_STORAGE/data

echo "FINISHED"
