130bd6a4dSMax Reitz#!/bin/bash 230bd6a4dSMax Reitz# 330bd6a4dSMax Reitz# Test case for the QMP blkdebug and blkverify interfaces 430bd6a4dSMax Reitz# 530bd6a4dSMax Reitz# Copyright (C) 2013 Red Hat, Inc. 630bd6a4dSMax Reitz# 730bd6a4dSMax Reitz# This program is free software; you can redistribute it and/or modify 830bd6a4dSMax Reitz# it under the terms of the GNU General Public License as published by 930bd6a4dSMax Reitz# the Free Software Foundation; either version 2 of the License, or 1030bd6a4dSMax Reitz# (at your option) any later version. 1130bd6a4dSMax Reitz# 1230bd6a4dSMax Reitz# This program is distributed in the hope that it will be useful, 1330bd6a4dSMax Reitz# but WITHOUT ANY WARRANTY; without even the implied warranty of 1430bd6a4dSMax Reitz# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1530bd6a4dSMax Reitz# GNU General Public License for more details. 1630bd6a4dSMax Reitz# 1730bd6a4dSMax Reitz# You should have received a copy of the GNU General Public License 1830bd6a4dSMax Reitz# along with this program. If not, see <http://www.gnu.org/licenses/>. 1930bd6a4dSMax Reitz# 2030bd6a4dSMax Reitz 2130bd6a4dSMax Reitz# creator 2230bd6a4dSMax Reitzowner=mreitz@redhat.com 2330bd6a4dSMax Reitz 2430bd6a4dSMax Reitzseq="$(basename $0)" 2530bd6a4dSMax Reitzecho "QA output created by $seq" 2630bd6a4dSMax Reitz 2730bd6a4dSMax Reitzhere="$PWD" 2830bd6a4dSMax Reitztmp=/tmp/$$ 2930bd6a4dSMax Reitzstatus=1 # failure is the default! 3030bd6a4dSMax Reitz 3130bd6a4dSMax Reitz_cleanup() 3230bd6a4dSMax Reitz{ 3330bd6a4dSMax Reitz _cleanup_test_img 3430bd6a4dSMax Reitz} 3530bd6a4dSMax Reitztrap "_cleanup; exit \$status" 0 1 2 3 15 3630bd6a4dSMax Reitz 3730bd6a4dSMax Reitz# get standard environment, filters and checks 3830bd6a4dSMax Reitz. ./common.rc 3930bd6a4dSMax Reitz. ./common.filter 4030bd6a4dSMax Reitz 41*1b7650efSStefan Hajnoczi_supported_fmt qcow2 4230bd6a4dSMax Reitz_supported_proto generic 4330bd6a4dSMax Reitz_supported_os Linux 4430bd6a4dSMax Reitz 4530bd6a4dSMax Reitzfunction do_run_qemu() 4630bd6a4dSMax Reitz{ 4730bd6a4dSMax Reitz echo Testing: "$@" | _filter_imgfmt 4830bd6a4dSMax Reitz $QEMU -nographic -qmp stdio -serial none "$@" 4930bd6a4dSMax Reitz echo 5030bd6a4dSMax Reitz} 5130bd6a4dSMax Reitz 5230bd6a4dSMax Reitzfunction run_qemu() 5330bd6a4dSMax Reitz{ 5430bd6a4dSMax Reitz do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp | _filter_qemu_io 5530bd6a4dSMax Reitz} 5630bd6a4dSMax Reitz 5730bd6a4dSMax ReitzIMG_SIZE=64M 5830bd6a4dSMax Reitz 5930bd6a4dSMax Reitzecho 6030bd6a4dSMax Reitzecho "=== Testing blkverify through filename ===" 6130bd6a4dSMax Reitzecho 6230bd6a4dSMax Reitz 6330bd6a4dSMax ReitzTEST_IMG="$TEST_IMG.base" IMGOPTS="" IMGFMT="raw" _make_test_img $IMG_SIZE |\ 6430bd6a4dSMax Reitz _filter_imgfmt 6530bd6a4dSMax Reitz_make_test_img $IMG_SIZE 6630bd6a4dSMax Reitz$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \ 6730bd6a4dSMax Reitz -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io 6830bd6a4dSMax Reitz 6930bd6a4dSMax Reitz$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io 7030bd6a4dSMax Reitz 7130bd6a4dSMax Reitz$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \ 7230bd6a4dSMax Reitz -c 'read -P 42 0 512' | _filter_qemu_io 7330bd6a4dSMax Reitz 7430bd6a4dSMax Reitzecho 7530bd6a4dSMax Reitzecho "=== Testing blkverify through file blockref ===" 7630bd6a4dSMax Reitzecho 7730bd6a4dSMax Reitz 7830bd6a4dSMax ReitzTEST_IMG="$TEST_IMG.base" IMGOPTS="" IMGFMT="raw" _make_test_img $IMG_SIZE |\ 7930bd6a4dSMax Reitz _filter_imgfmt 8030bd6a4dSMax Reitz_make_test_img $IMG_SIZE 8130bd6a4dSMax Reitz$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base,file.test.driver=$IMGFMT,file.test.file.filename=$TEST_IMG" \ 8230bd6a4dSMax Reitz -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io 8330bd6a4dSMax Reitz 8430bd6a4dSMax Reitz$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io 8530bd6a4dSMax Reitz 8630bd6a4dSMax Reitz$QEMU_IO -c "open -o file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \ 8730bd6a4dSMax Reitz -c 'read -P 42 0 512' | _filter_qemu_io 8830bd6a4dSMax Reitz 8930bd6a4dSMax Reitzecho 9030bd6a4dSMax Reitzecho "=== Testing blkdebug through filename ===" 9130bd6a4dSMax Reitzecho 9230bd6a4dSMax Reitz 9330bd6a4dSMax Reitz$QEMU_IO -c "open -o file.driver=blkdebug,file.inject-error.event=l2_load $TEST_IMG" \ 9430bd6a4dSMax Reitz -c 'read -P 42 0x38000 512' 9530bd6a4dSMax Reitz 9630bd6a4dSMax Reitzecho 9730bd6a4dSMax Reitzecho "=== Testing blkdebug through file blockref ===" 9830bd6a4dSMax Reitzecho 9930bd6a4dSMax Reitz 10030bd6a4dSMax Reitz$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.inject-error.event=l2_load,file.image.filename=$TEST_IMG" \ 10130bd6a4dSMax Reitz -c 'read -P 42 0x38000 512' 10230bd6a4dSMax Reitz 10330bd6a4dSMax Reitzecho 10430bd6a4dSMax Reitzecho "=== Testing blkdebug on existing block device ===" 10530bd6a4dSMax Reitzecho 10630bd6a4dSMax Reitz 10730bd6a4dSMax Reitzrun_qemu -drive "file=$TEST_IMG,format=raw,if=none,id=drive0" <<EOF 10830bd6a4dSMax Reitz{ "execute": "qmp_capabilities" } 10930bd6a4dSMax Reitz{ "execute": "blockdev-add", 11030bd6a4dSMax Reitz "arguments": { 11130bd6a4dSMax Reitz "options": { 11230bd6a4dSMax Reitz "driver": "$IMGFMT", 11330bd6a4dSMax Reitz "id": "drive0-debug", 11430bd6a4dSMax Reitz "file": { 11530bd6a4dSMax Reitz "driver": "blkdebug", 11630bd6a4dSMax Reitz "image": "drive0", 11730bd6a4dSMax Reitz "inject-error": [{ 11830bd6a4dSMax Reitz "event": "l2_load" 11930bd6a4dSMax Reitz }] 12030bd6a4dSMax Reitz } 12130bd6a4dSMax Reitz } 12230bd6a4dSMax Reitz } 12330bd6a4dSMax Reitz} 12430bd6a4dSMax Reitz{ "execute": "human-monitor-command", 12530bd6a4dSMax Reitz "arguments": { 12630bd6a4dSMax Reitz "command-line": 'qemu-io drive0-debug "read 0 512"' 12730bd6a4dSMax Reitz } 12830bd6a4dSMax Reitz} 12930bd6a4dSMax Reitz{ "execute": "quit" } 13030bd6a4dSMax ReitzEOF 13130bd6a4dSMax Reitz 13230bd6a4dSMax Reitzecho 13330bd6a4dSMax Reitzecho "=== Testing blkverify on existing block device ===" 13430bd6a4dSMax Reitzecho 13530bd6a4dSMax Reitz 13630bd6a4dSMax Reitzrun_qemu -drive "file=$TEST_IMG,format=$IMGFMT,if=none,id=drive0" <<EOF 13730bd6a4dSMax Reitz{ "execute": "qmp_capabilities" } 13830bd6a4dSMax Reitz{ "execute": "blockdev-add", 13930bd6a4dSMax Reitz "arguments": { 14030bd6a4dSMax Reitz "options": { 14130bd6a4dSMax Reitz "driver": "blkverify", 14230bd6a4dSMax Reitz "id": "drive0-verify", 14330bd6a4dSMax Reitz "test": "drive0", 14430bd6a4dSMax Reitz "raw": { 14530bd6a4dSMax Reitz "driver": "raw", 14630bd6a4dSMax Reitz "file": { 14730bd6a4dSMax Reitz "driver": "file", 14830bd6a4dSMax Reitz "filename": "$TEST_IMG.base" 14930bd6a4dSMax Reitz } 15030bd6a4dSMax Reitz } 15130bd6a4dSMax Reitz } 15230bd6a4dSMax Reitz } 15330bd6a4dSMax Reitz} 15430bd6a4dSMax Reitz{ "execute": "human-monitor-command", 15530bd6a4dSMax Reitz "arguments": { 15630bd6a4dSMax Reitz "command-line": 'qemu-io drive0-verify "read 0 512"' 15730bd6a4dSMax Reitz } 15830bd6a4dSMax Reitz} 15930bd6a4dSMax Reitz{ "execute": "quit" } 16030bd6a4dSMax ReitzEOF 16130bd6a4dSMax Reitz 16230bd6a4dSMax Reitzecho 16330bd6a4dSMax Reitzecho "=== Testing blkverify on existing raw block device ===" 16430bd6a4dSMax Reitzecho 16530bd6a4dSMax Reitz 16630bd6a4dSMax Reitzrun_qemu -drive "file=$TEST_IMG.base,if=none,id=drive0" <<EOF 16730bd6a4dSMax Reitz{ "execute": "qmp_capabilities" } 16830bd6a4dSMax Reitz{ "execute": "blockdev-add", 16930bd6a4dSMax Reitz "arguments": { 17030bd6a4dSMax Reitz "options": { 17130bd6a4dSMax Reitz "driver": "blkverify", 17230bd6a4dSMax Reitz "id": "drive0-verify", 17330bd6a4dSMax Reitz "test": { 17430bd6a4dSMax Reitz "driver": "$IMGFMT", 17530bd6a4dSMax Reitz "file": { 17630bd6a4dSMax Reitz "driver": "file", 17730bd6a4dSMax Reitz "filename": "$TEST_IMG" 17830bd6a4dSMax Reitz } 17930bd6a4dSMax Reitz }, 18030bd6a4dSMax Reitz "raw": "drive0" 18130bd6a4dSMax Reitz } 18230bd6a4dSMax Reitz } 18330bd6a4dSMax Reitz} 18430bd6a4dSMax Reitz{ "execute": "human-monitor-command", 18530bd6a4dSMax Reitz "arguments": { 18630bd6a4dSMax Reitz "command-line": 'qemu-io drive0-verify "read 0 512"' 18730bd6a4dSMax Reitz } 18830bd6a4dSMax Reitz} 18930bd6a4dSMax Reitz{ "execute": "quit" } 19030bd6a4dSMax ReitzEOF 19130bd6a4dSMax Reitz 19230bd6a4dSMax Reitzecho 19330bd6a4dSMax Reitzecho "=== Testing blkdebug's set-state through QMP ===" 19430bd6a4dSMax Reitzecho 19530bd6a4dSMax Reitz 19630bd6a4dSMax Reitzrun_qemu -drive "file=$TEST_IMG,format=raw,if=none,id=drive0" <<EOF 19730bd6a4dSMax Reitz{ "execute": "qmp_capabilities" } 19830bd6a4dSMax Reitz{ "execute": "blockdev-add", 19930bd6a4dSMax Reitz "arguments": { 20030bd6a4dSMax Reitz "options": { 20130bd6a4dSMax Reitz "driver": "$IMGFMT", 20230bd6a4dSMax Reitz "id": "drive0-debug", 20330bd6a4dSMax Reitz "file": { 20430bd6a4dSMax Reitz "driver": "blkdebug", 20530bd6a4dSMax Reitz "image": "drive0", 20630bd6a4dSMax Reitz "inject-error": [{ 20730bd6a4dSMax Reitz "event": "read_aio", 20830bd6a4dSMax Reitz "state": 42 20930bd6a4dSMax Reitz }], 21030bd6a4dSMax Reitz "set-state": [{ 21130bd6a4dSMax Reitz "event": "write_aio", 21230bd6a4dSMax Reitz "new_state": 42 21330bd6a4dSMax Reitz }] 21430bd6a4dSMax Reitz } 21530bd6a4dSMax Reitz } 21630bd6a4dSMax Reitz } 21730bd6a4dSMax Reitz} 21830bd6a4dSMax Reitz{ "execute": "human-monitor-command", 21930bd6a4dSMax Reitz "arguments": { 22030bd6a4dSMax Reitz "command-line": 'qemu-io drive0-debug "read 0 512"' 22130bd6a4dSMax Reitz } 22230bd6a4dSMax Reitz} 22330bd6a4dSMax Reitz{ "execute": "human-monitor-command", 22430bd6a4dSMax Reitz "arguments": { 22530bd6a4dSMax Reitz "command-line": 'qemu-io drive0-debug "write 0 512"' 22630bd6a4dSMax Reitz } 22730bd6a4dSMax Reitz} 22830bd6a4dSMax Reitz{ "execute": "human-monitor-command", 22930bd6a4dSMax Reitz "arguments": { 23030bd6a4dSMax Reitz "command-line": 'qemu-io drive0-debug "read 0 512"' 23130bd6a4dSMax Reitz } 23230bd6a4dSMax Reitz} 23330bd6a4dSMax Reitz{ "execute": "quit" } 23430bd6a4dSMax ReitzEOF 23530bd6a4dSMax Reitz 23630bd6a4dSMax Reitz# success, all done 23730bd6a4dSMax Reitzecho "*** done" 23830bd6a4dSMax Reitzrm -f $seq.full 23930bd6a4dSMax Reitzstatus=0 240