#!/usr/bin/env bash
#
# Commit changes into backing chains and empty the top image if the
# backing image is not explicitly specified
#
# Copyright (C) 2014 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"

status=1	# failure is the default!

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

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

# Any format supporting backing files and bdrv_make_empty
_supported_fmt qcow qcow2
_supported_proto file
_supported_os Linux


# Four main passes:
#  0: Two-layer backing chain, commit to upper backing file (implicitly)
#     (in this case, the top image will be emptied)
#  1: Two-layer backing chain, commit to upper backing file (explicitly)
#     (in this case, the top image will implicitly stay unchanged)
#  2: Two-layer backing chain, commit to upper backing file (implicitly with -d)
#     (in this case, the top image will explicitly stay unchanged)
#  3: Two-layer backing chain, commit to lower backing file
#     (in this case, the top image will implicitly stay unchanged)
#
# 020 already tests committing, so this only tests whether image chains are
# working properly and that all images above the base are emptied; therefore,
# no complicated patterns are necessary.  Check near the 2G mark, as qcow2
# has been buggy at that boundary in the past.
for i in 0 1 2 3; do

echo
echo "=== Test pass $i ==="
echo

len=$((2100 * 1024 * 1024 + 512)) # larger than 2G, and not cluster aligned
TEST_IMG="$TEST_IMG.base" _make_test_img $len
TEST_IMG="$TEST_IMG.itmd" _make_test_img -b "$TEST_IMG.base" $len
_make_test_img -b "$TEST_IMG.itmd" $len

$QEMU_IO -c "write -P 1 0x7ffd0000 192k" "$TEST_IMG.base" | _filter_qemu_io
$QEMU_IO -c "write -P 2 0x7ffe0000 128k" "$TEST_IMG.itmd" | _filter_qemu_io
$QEMU_IO -c "write -P 3 0x7fff0000 64k" "$TEST_IMG" | _filter_qemu_io
$QEMU_IO -c "write -P 4 $(($len - 512)) 512" "$TEST_IMG" | _filter_qemu_io

if [ $i -lt 3 ]; then
    if [ $i == 0 ]; then
        # -b "$TEST_IMG.itmd" should be the default (that is, committing to the
        # first backing file in the chain)
        $QEMU_IMG commit "$TEST_IMG"
    elif [ $i == 1 ]; then
        # explicitly specify the commit target (this should imply -d)
        $QEMU_IMG commit -b "$TEST_IMG.itmd" "$TEST_IMG"
    else
        # do not explicitly specify the commit target, but use -d to leave the
        # top image unchanged
        $QEMU_IMG commit -d "$TEST_IMG"
    fi

    # Bottom should be unchanged
    $QEMU_IO -c 'read -P 1 0x7ffd0000 192k' "$TEST_IMG.base" | _filter_qemu_io
    $QEMU_IO -c "read -P 0 $((len - 512)) 512" "$TEST_IMG.base" | _filter_qemu_io

    # Intermediate should contain changes from top
    $QEMU_IO -c 'read -P 1 0x7ffd0000 64k' "$TEST_IMG.itmd" | _filter_qemu_io
    $QEMU_IO -c 'read -P 2 0x7ffe0000 64k' "$TEST_IMG.itmd" | _filter_qemu_io
    $QEMU_IO -c 'read -P 3 0x7fff0000 64k' "$TEST_IMG.itmd" | _filter_qemu_io
    $QEMU_IO -c "read -P 4 $((len - 512)) 512" "$TEST_IMG.itmd" | _filter_qemu_io

    # And in pass 0, the top image should be empty, whereas in both other passes
    # it should be unchanged (which is both checked by qemu-img map)
else
    $QEMU_IMG commit -b "$TEST_IMG.base" "$TEST_IMG"

    # Bottom should contain all changes
    $QEMU_IO -c 'read -P 1 0x7ffd0000 64k' "$TEST_IMG.base" | _filter_qemu_io
    $QEMU_IO -c 'read -P 2 0x7ffe0000 64k' "$TEST_IMG.base" | _filter_qemu_io
    $QEMU_IO -c 'read -P 3 0x7fff0000 64k' "$TEST_IMG.base" | _filter_qemu_io
    $QEMU_IO -c "read -P 4 $((len - 512)) 512" "$TEST_IMG.base" | _filter_qemu_io

    # Both top and intermediate should be unchanged
fi

$QEMU_IMG map "$TEST_IMG.base" | _filter_qemu_img_map
$QEMU_IMG map "$TEST_IMG.itmd" | _filter_qemu_img_map
$QEMU_IMG map "$TEST_IMG" | _filter_qemu_img_map

done


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