#!/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 generic
_supported_proto generic
_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
