#!/bin/bash
#
# Test preallocated resize of raw images
#
# Copyright (C) 2017 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# creator
owner=mreitz@redhat.com

seq=$(basename $0)
echo "QA output created by $seq"

here=$PWD
status=1	# failure is the default!

_cleanup()
{
	_cleanup_test_img
}
trap "_cleanup; exit \$status" 0 1 2 3 15

# get standard environment and filters
. ./common.rc
. ./common.filter

_supported_fmt raw
_supported_proto file
_supported_os Linux

# in kB
CREATION_SIZE=128
GROWTH_SIZE=256

echo '=== Testing image growth ==='

for create_mode in off falloc full; do
    for growth_mode in off falloc full; do
        echo
        echo "--- create_mode=$create_mode growth_mode=$growth_mode ---"

        IMGOPTS="preallocation=$create_mode" _make_test_img ${CREATION_SIZE}K
        $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K

        expected_size=0
        if [ $create_mode != off ]; then
            expected_size=$CREATION_SIZE
        fi
        if [ $growth_mode != off ]; then
            expected_size=$((expected_size + $GROWTH_SIZE))
        fi

        actual_size=$($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | grep 'disk size')
        actual_size=$(echo "$actual_size" | sed -e 's/^[^0-9]*\([0-9]\+\).*$/\1/')

        # The actual size may exceed the expected size, depending on the file
        # system. Therefore we just test that the actual size is at least what
        # we expect.
        if [ $actual_size -lt $expected_size ]; then
            echo "ERROR: Image should have at least ${expected_size}K, but has ${actual_size}K"
        fi
    done
done

echo
echo '=== Testing image shrinking ==='

# None of this should work except for "off", because other modes cannot be used
# for shrinking
for growth_mode in falloc full off; do
    echo
    echo "--- growth_mode=$growth_mode ---"
    $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" -${GROWTH_SIZE}K
done

# success, all done
echo '*** done'
rm -f $seq.full
status=0
