#!/usr/bin/env bash # group: rw auto quick # # 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=hreitz@redhat.com seq="$(basename $0)" echo "QA output created by $seq" 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 fuse _require_drivers blkdebug blkverify # blkdebug can only inject errors on bs->file, not on the data_file, # so this test does not work with external data files _unsupported_imgopts data_file do_run_qemu() { echo Testing: "$@" | _filter_imgfmt $QEMU -nographic -qmp stdio -serial none "$@" echo } run_qemu() { do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp | _filter_qemu_io } IMG_SIZE=64M echo echo "=== Testing blkverify through filename ===" echo # _make_test_img may set variables that we need to retain. Everything # in a pipe is executed in a subshell, so doing so would throw away # all changes. Therefore, we have to store the output in some temp # file and filter that. scratch_out="$TEST_DIR/img-create.out" TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \ >"$scratch_out" _filter_imgfmt <"$scratch_out" rm -f "$scratch_out" _make_test_img $IMG_SIZE $QEMU_IO -c "open -o driver=raw,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 driver=raw,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" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \ >"$scratch_out" _filter_imgfmt <"$scratch_out" _make_test_img $IMG_SIZE $QEMU_IO -c "open -o driver=raw,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 driver=raw,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 <<EOF { "execute": "qmp_capabilities" } { "execute": "blockdev-add", "arguments": { "node-name": "drive0", "driver": "file", "filename": "$TEST_IMG" } } { "execute": "blockdev-add", "arguments": { "driver": "$IMGFMT", "node-name": "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 <<EOF { "execute": "qmp_capabilities" } { "execute": "blockdev-add", "arguments": { "node-name": "drive0", "driver": "$IMGFMT", "file": { "driver": "file", "filename": "$TEST_IMG" } } } { "execute": "blockdev-add", "arguments": { "driver": "blkverify", "node-name": "drive0-verify", "test": "drive0", "raw": { "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 <<EOF { "execute": "qmp_capabilities" } { "execute": "blockdev-add", "arguments": { "node-name": "drive0", "driver": "file", "filename": "$TEST_IMG.base" } } { "execute": "blockdev-add", "arguments": { "driver": "blkverify", "node-name": "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 <<EOF { "execute": "qmp_capabilities" } { "execute": "blockdev-add", "arguments": { "node-name": "drive0", "driver": "file", "filename": "$TEST_IMG" } } { "execute": "blockdev-add", "arguments": { "driver": "$IMGFMT", "node-name": "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