#!/bin/bash

set -ex
. ./functions

V=2
BLOCKSIZE=2048
DELTA=10000
SIZE=1048576000
if [ -f /sys/module/ploop/parameters/large_disk_support ]; then
	SIZENEW=10485760000
else
	SIZENEW=2147482624
fi

while [ "${#}" -gt 0 ]; do
case "${1}" in
	"--online")
		OFFLINE="no"
		shift
		;;
	"--offline")
		OFFLINE="yes"
		shift
		;;
	"-v")
		V=${2}
		shift
		shift
		;;
	*)
		shift
		;;
	esac
done

test_cleanup

ploop init -v $V -b $BLOCKSIZE -s ${SIZE}k -t ext4 $TEST_IMAGE >>$TEST_LOG 2>&1
ploop mount -d /dev/ploop0 -m $TEST_MNT $TEST_DDXML >>$TEST_LOG 2>&1

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

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

if [ "$OFFLINE" = yes ]; then
	echo "Offline resize"
	ploop umount $TEST_DDXML >>$TEST_LOG 2>&1
else
	echo "Online resize"
fi
ploop resize -s ${SIZENEW}k $TEST_DDXML >>$TEST_LOG 2>&1

if [ "$OFFLINE" != yes ]; then
	ploop umount $TEST_DDXML >>$TEST_LOG 2>&1
fi
ploop mount -d /dev/ploop0 -m $TEST_MNT $TEST_DDXML >>$TEST_LOG 2>&1

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

ploop umount $TEST_DDXML >>$TEST_LOG 2>&1
ploop mount -d /dev/ploop0 $TEST_DDXML >>$TEST_LOG 2>&1

fsck -fn /dev/ploop0p1 >>$TEST_LOG 2>&1

ploop umount $TEST_DDXML >>$TEST_LOG 2>&1
ploop mount -d /dev/ploop0 -m $TEST_MNT $TEST_DDXML >>$TEST_LOG 2>&1

rm -f $TEST_MNT/* || true

ploop resize -s ${SIZE}k $TEST_DDXML >>$TEST_LOG 2>&1
fsck -fn /dev/ploop0p1 >>$TEST_LOG 2>&1

test_cleanup

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

echo "FINISHED"
