#!/usr/bin/env bash
#
# Test that a backing image is put back in read-only mode after
# block-commit (both when it fails and when it succeeds).
#
# Copyright (C) 2019 Igalia, S.L.
#
# 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=berto@igalia.com

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

status=1	# failure is the default!

_cleanup()
{
    _cleanup_test_img
    rm -f "$TEST_IMG.base"
    rm -f "$TEST_IMG.int"
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

# Any format implementing BlockDriver.bdrv_change_backing_file
_supported_fmt qcow2 qed
_supported_proto file
_supported_os Linux

IMG_SIZE=1M

# Create the images: base <- int <- active
TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt
TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" | _filter_imgfmt
_make_test_img -b "$TEST_IMG.int" | _filter_imgfmt

# Launch QEMU with these two drives:
# none0: base (read-only)
# none1: base <- int <- active
_launch_qemu -drive if=none,file="${TEST_IMG}.base",node-name=base,read-only=on \
             -drive if=none,file="${TEST_IMG}",backing.node-name=int,backing.backing=base

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'qmp_capabilities' }" \
    'return'

echo
echo '=== Send a write command to a drive opened in read-only mode (1)'
echo
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': {'command-line': 'qemu-io none0 \"aio_write 0 2k\"'}}" \
    'return'

echo
echo '=== Run block-commit on base using an invalid filter node name'
echo
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'block-commit',
       'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int',
                     'filter-node-name': '1234'}}" \
    'error'

echo
echo '=== Send a write command to a drive opened in read-only mode (2)'
echo
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': {'command-line': 'qemu-io none0 \"aio_write 0 2k\"'}}" \
    'return'

echo
echo '=== Run block-commit on base using the default filter node name'
echo
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'block-commit',
       'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int'}}" \
    'return'

# Wait for block-commit to finish
_send_qemu_cmd $QEMU_HANDLE '' \
    '"status": "null"'

echo
echo '=== Send a write command to a drive opened in read-only mode (3)'
echo
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': {'command-line': 'qemu-io none0 \"aio_write 0 2k\"'}}" \
    'return'

_cleanup_qemu

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