#!/usr/bin/env bash
#
# Test case for ejecting BDSs with block jobs still running on them
#
# Copyright (C) 2016 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_qemu
    _cleanup_test_img
    for img in "$TEST_DIR"/{b,m,o}.$IMGFMT; do
        _rm_test_img "$img"
    done
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

# Needs backing file and backing format support
_supported_fmt qcow2 qed
_supported_proto file
_supported_os Linux


test_blockjob()
{
    _send_qemu_cmd $QEMU_HANDLE \
        "{'execute': 'blockdev-add',
          'arguments': {
              'node-name': 'drv0',
              'driver': '$IMGFMT',
              'file': {
                  'driver': 'file',
                  'filename': '$TEST_IMG'
              }}}" \
        'return'

    # If "$2" is an event, we may or may not see it before the
    # {"return": {}}.  Therefore, filter the {"return": {}} out both
    # here and in the next command.  (Naturally, if we do not see it
    # here, we will see it before the next command can be executed,
    # so it will appear in the next _send_qemu_cmd's output.)
    _send_qemu_cmd $QEMU_HANDLE \
        "$1" \
        "$2" \
        | _filter_img_create | _filter_qmp_empty_return

    # We want this to return an error because the block job is still running
    _send_qemu_cmd $QEMU_HANDLE \
        "{'execute': 'blockdev-del',
          'arguments': {'node-name': 'drv0'}}" \
        'error' | _filter_generated_node_ids | _filter_qmp_empty_return

    _send_qemu_cmd $QEMU_HANDLE \
        "{'execute': 'block-job-cancel',
          'arguments': {'device': 'job0'}}" \
        "$3"

    _send_qemu_cmd $QEMU_HANDLE \
        "{'execute': 'blockdev-del',
          'arguments': {'node-name': 'drv0'}}" \
        'return'
}


TEST_IMG="$TEST_DIR/b.$IMGFMT" _make_test_img 1M
TEST_IMG="$TEST_DIR/m.$IMGFMT" _make_test_img -b "$TEST_DIR/b.$IMGFMT" 1M
_make_test_img -b "$TEST_DIR/m.$IMGFMT" 1M

_launch_qemu -nodefaults

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

echo
echo '=== Testing drive-backup ==='
echo

# drive-backup will not send BLOCK_JOB_READY by itself, and cancelling the job
# will consequently result in BLOCK_JOB_CANCELLED being emitted.

test_blockjob \
    "{'execute': 'drive-backup',
      'arguments': {'job-id': 'job0',
                    'device': 'drv0',
                    'target': '$TEST_DIR/o.$IMGFMT',
                    'format': '$IMGFMT',
                    'sync': 'none'}}" \
    'return' \
    '"status": "null"'

echo
echo '=== Testing drive-mirror ==='
echo

# drive-mirror will send BLOCK_JOB_READY basically immediately, and cancelling
# the job will consequently result in BLOCK_JOB_COMPLETED being emitted.

test_blockjob \
    "{'execute': 'drive-mirror',
      'arguments': {'job-id': 'job0',
                    'device': 'drv0',
                    'target': '$TEST_DIR/o.$IMGFMT',
                    'format': '$IMGFMT',
                    'sync': 'none'}}" \
    'BLOCK_JOB_READY' \
    '"status": "null"'

echo
echo '=== Testing active block-commit ==='
echo

# An active block-commit will send BLOCK_JOB_READY basically immediately, and
# cancelling the job will consequently result in BLOCK_JOB_COMPLETED being
# emitted.

test_blockjob \
    "{'execute': 'block-commit',
      'arguments': {'job-id': 'job0', 'device': 'drv0'}}" \
    'BLOCK_JOB_READY' \
    '"status": "null"'

echo
echo '=== Testing non-active block-commit ==='
echo

# Give block-commit something to work on, otherwise it would be done
# immediately, send a BLOCK_JOB_COMPLETED and ejecting the BDS would work just
# fine without the block job still running.

$QEMU_IO -c 'write 0 1M' "$TEST_DIR/m.$IMGFMT" | _filter_qemu_io

test_blockjob \
    "{'execute': 'block-commit',
      'arguments': {'job-id': 'job0',
                    'device': 'drv0',
                    'top':    '$TEST_DIR/m.$IMGFMT',
                    'speed':  1}}" \
    'return' \
    '"status": "null"'

echo
echo '=== Testing block-stream ==='
echo

# Give block-stream something to work on, otherwise it would be done
# immediately, send a BLOCK_JOB_COMPLETED and ejecting the BDS would work just
# fine without the block job still running.

$QEMU_IO -c 'write 0 1M' "$TEST_DIR/b.$IMGFMT" | _filter_qemu_io

# With some data to stream (and @speed set to 1), block-stream will not complete
# until we send the block-job-cancel command.

test_blockjob \
    "{'execute': 'block-stream',
      'arguments': {'job-id': 'job0',
                    'device': 'drv0',
                    'speed': 1}}" \
    'return' \
    '"status": "null"'

_cleanup_qemu

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