#!/bin/bash
#
# Test commit block job where top has two parents
#
# 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=kwolf@redhat.com

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

here=`pwd`
status=1 # failure is the default!

MIG_SOCKET="${TEST_DIR}/migrate"

_cleanup()
{
    rm -f "${TEST_IMG}.mid"
    rm -f "${TEST_IMG}.ovl2"
    rm -f "${TEST_IMG}.ovl3"
    _cleanup_test_img
    _cleanup_qemu
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

_supported_fmt qcow2
_unsupported_imgopts compat=0.10
_supported_proto file
_supported_os Linux

size=64M

echo
echo === Preparing and starting VM ===
echo

TEST_IMG="${TEST_IMG}.base" _make_test_img $size
IMGOPTS=$(_optstr_add "$IMGOPTS" "backing_fmt=$IMGFMT") \
    TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
_make_test_img -b "${TEST_IMG}.mid"
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"

$QEMU_IO -c 'write -P 0x55 1M 64k' "${TEST_IMG}.mid" | _filter_qemu_io

qemu_comm_method="qmp"
qmp_pretty="y"

_launch_qemu \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG}.base,node-name=base" \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG}.mid,node-name=mid,backing=base" \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG},node-name=top,backing=mid" \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG}.ovl2,node-name=top2,backing=mid"
h=$QEMU_HANDLE
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" '^}'

echo
echo === Perform commit job ===
echo

_send_qemu_cmd $h \
    "{ 'execute': 'block-commit',
       'arguments': { 'job-id': 'commit0',
                      'device': 'top',
                      'base':'$TEST_IMG.base',
                      'top': '$TEST_IMG.mid' } }" \
    "BLOCK_JOB_COMPLETED"
_send_qemu_cmd $h "" "^}"

echo
echo === Check that both top and top2 point to base now ===
echo

_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
    _filter_generated_node_ids | _filter_actual_image_size

_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
wait=1 _cleanup_qemu

_img_info
TEST_IMG="$TEST_IMG.ovl2" _img_info


echo
echo === Preparing and starting VM with -drive ===
echo

TEST_IMG="${TEST_IMG}.base" _make_test_img $size
TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
_make_test_img -b "${TEST_IMG}.mid"
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
TEST_IMG="${TEST_IMG}.ovl3" _make_test_img -b "${TEST_IMG}.ovl2"

$QEMU_IO -c 'write -P 0x55 1M 64k' "${TEST_IMG}.mid" | _filter_qemu_io

qemu_comm_method="qmp"
qmp_pretty="y"

_launch_qemu \
    -drive "driver=${IMGFMT},file=${TEST_IMG},node-name=top,backing.node-name=mid" \
    -drive "driver=${IMGFMT},file=${TEST_IMG}.ovl3,node-name=top2,backing.backing=mid"
h=$QEMU_HANDLE
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" '^}'

echo
echo === Perform commit job ===
echo

_send_qemu_cmd $h \
    "{ 'execute': 'block-commit',
       'arguments': { 'job-id': 'commit0',
                      'device': 'top',
                      'base':'$TEST_IMG.base',
                      'top': '$TEST_IMG.mid' } }" \
    "BLOCK_JOB_COMPLETED"
_send_qemu_cmd $h "" "^}"

echo
echo === Check that both top and top2 point to base now ===
echo

_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
    _filter_generated_node_ids | _filter_actual_image_size

_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
wait=1 _cleanup_qemu

_img_info
TEST_IMG="$TEST_IMG.ovl2" _img_info

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