#!/usr/bin/env bash
# group: quick
#
# Test creating raw image preallocation mode
#
# Copyright (C) 2017 Nir Soffer <nirsof@gmail.com>
#
# 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=nirsof@gmail.com

seq=`basename $0`
echo "QA output created by $seq"

status=1	# failure is the default!

_cleanup()
{
    _cleanup_test_img
    rm -f "$TEST_DIR/empty"
}
trap "_cleanup; exit \$status" 0 1 2 3 15

# Some file systems sometimes allocate extra blocks independently of
# the file size.  This function hides the resulting difference in the
# stat -c '%b' output.
# Parameter 1: Number of blocks an empty file occupies
# Parameter 2: Minimal number of blocks in an image
# Parameter 3: Image size in bytes
_filter_blocks()
{
    extra_blocks=$1
    min_blocks=$2
    img_size=$3

    sed -e "s/blocks=$min_blocks\\(\$\\|[^0-9]\\)/min allocation/" \
        -e "s/blocks=$((extra_blocks + img_size / 512))\\(\$\\|[^0-9]\\)/max allocation/"
}

# Resize image using block_resize.
# Parameter 1: image path
# Parameter 2: new size
_block_resize()
{
    local path=$1
    local size=$2

    $QEMU -qmp stdio -nographic -nodefaults \
        -blockdev file,node-name=file,filename=$path,cache.direct=on \
        <<EOF
{'execute': 'qmp_capabilities'}
{'execute': 'block_resize', 'arguments': {'node-name': 'file', 'size': $size}}
{'execute': 'quit'}
EOF
}

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

_supported_fmt raw
_supported_proto file fuse
_supported_os Linux

_default_cache_mode none
_supported_cache_modes none directsync

size=$((1 * 1024 * 1024))

touch "$TEST_DIR/empty"
extra_blocks=$(stat -c '%b' "$TEST_DIR/empty")

# We always write the first byte; check how many blocks this filesystem
# allocates to match empty image alloation.
printf "\0" > "$TEST_DIR/empty"
min_blocks=$(stat -c '%b' "$TEST_DIR/empty")

echo
echo "== creating image with default preallocation =="
_make_test_img -o extent_size_hint=0 $size
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size

for mode in off full falloc; do
    echo
    echo "== creating image with preallocation $mode =="
    _make_test_img -o preallocation=$mode,extent_size_hint=0 $size
    stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size
done

for new_size in 4096 1048576; do
    echo
    echo "== resize empty image with block_resize =="
    _make_test_img -o extent_size_hint=0 0
    _block_resize $TEST_IMG $new_size >/dev/null
    stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $new_size
done

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