#!/bin/bash
#
# Test case for the QMP blkdebug and blkverify interfaces
#
# Copyright (C) 2013 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"

here="$PWD"
tmp=/tmp/$$
status=1	# failure is the default!

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

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

_supported_fmt qcow2
_supported_proto file
_supported_os Linux

function do_run_qemu()
{
    echo Testing: "$@" | _filter_imgfmt
    $QEMU -nographic -qmp stdio -serial none "$@"
    echo
}

function run_qemu()
{
    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp | _filter_qemu_io
}

IMG_SIZE=64M

echo
echo "=== Testing blkverify through filename ==="
echo

TEST_IMG="$TEST_IMG.base" IMGOPTS="" IMGFMT="raw" _make_test_img $IMG_SIZE |\
    _filter_imgfmt
_make_test_img $IMG_SIZE
$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
         -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io

$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io

$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
         -c 'read -P 42 0 512' | _filter_qemu_io

echo
echo "=== Testing blkverify through file blockref ==="
echo

TEST_IMG="$TEST_IMG.base" IMGOPTS="" IMGFMT="raw" _make_test_img $IMG_SIZE |\
    _filter_imgfmt
_make_test_img $IMG_SIZE
$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base,file.test.driver=$IMGFMT,file.test.file.filename=$TEST_IMG" \
         -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io

$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io

$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
         -c 'read -P 42 0 512' | _filter_qemu_io

echo
echo "=== Testing blkdebug through filename ==="
echo

$QEMU_IO -c "open -o file.driver=blkdebug,file.inject-error.event=l2_load $TEST_IMG" \
         -c 'read -P 42 0x38000 512'

echo
echo "=== Testing blkdebug through file blockref ==="
echo

$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.inject-error.event=l2_load,file.image.filename=$TEST_IMG" \
         -c 'read -P 42 0x38000 512'

echo
echo "=== Testing blkdebug on existing block device ==="
echo

run_qemu -drive "file=$TEST_IMG,format=raw,if=none,id=drive0" <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add",
    "arguments": {
        "options": {
            "driver": "$IMGFMT",
            "id": "drive0-debug",
            "file": {
                "driver": "blkdebug",
                "image": "drive0",
                "inject-error": [{
                    "event": "l2_load"
                }]
            }
        }
    }
}
{ "execute": "human-monitor-command",
    "arguments": {
        "command-line": 'qemu-io drive0-debug "read 0 512"'
    }
}
{ "execute": "quit" }
EOF

echo
echo "=== Testing blkverify on existing block device ==="
echo

run_qemu -drive "file=$TEST_IMG,format=$IMGFMT,if=none,id=drive0" <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add",
    "arguments": {
        "options": {
            "driver": "blkverify",
            "id": "drive0-verify",
            "test": "drive0",
            "raw": {
                "driver": "raw",
                "file": {
                    "driver": "file",
                    "filename": "$TEST_IMG.base"
                }
            }
        }
    }
}
{ "execute": "human-monitor-command",
    "arguments": {
        "command-line": 'qemu-io drive0-verify "read 0 512"'
    }
}
{ "execute": "quit" }
EOF

echo
echo "=== Testing blkverify on existing raw block device ==="
echo

run_qemu -drive "file=$TEST_IMG.base,if=none,id=drive0" <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add",
    "arguments": {
        "options": {
            "driver": "blkverify",
            "id": "drive0-verify",
            "test": {
                "driver": "$IMGFMT",
                "file": {
                    "driver": "file",
                    "filename": "$TEST_IMG"
                }
            },
            "raw": "drive0"
        }
    }
}
{ "execute": "human-monitor-command",
    "arguments": {
        "command-line": 'qemu-io drive0-verify "read 0 512"'
    }
}
{ "execute": "quit" }
EOF

echo
echo "=== Testing blkdebug's set-state through QMP ==="
echo

run_qemu -drive "file=$TEST_IMG,format=raw,if=none,id=drive0" <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add",
    "arguments": {
        "options": {
            "driver": "$IMGFMT",
            "id": "drive0-debug",
            "file": {
                "driver": "blkdebug",
                "image": "drive0",
                "inject-error": [{
                    "event": "read_aio",
                    "state": 42
                }],
                "set-state": [{
                    "event": "write_aio",
                    "new_state": 42
                }]
            }
        }
    }
}
{ "execute": "human-monitor-command",
    "arguments": {
        "command-line": 'qemu-io drive0-debug "read 0 512"'
    }
}
{ "execute": "human-monitor-command",
    "arguments": {
        "command-line": 'qemu-io drive0-debug "write 0 512"'
    }
}
{ "execute": "human-monitor-command",
    "arguments": {
        "command-line": 'qemu-io drive0-debug "read 0 512"'
    }
}
{ "execute": "quit" }
EOF

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