xref: /qemu/tests/qemu-iotests/071 (revision 8b7b9c5c)
1#!/usr/bin/env bash
2# group: rw auto quick
3#
4# Test case for the QMP blkdebug and blkverify interfaces
5#
6# Copyright (C) 2013 Red Hat, Inc.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20#
21
22# creator
23owner=hreitz@redhat.com
24
25seq="$(basename $0)"
26echo "QA output created by $seq"
27
28status=1	# failure is the default!
29
30_cleanup()
31{
32	_cleanup_test_img
33}
34trap "_cleanup; exit \$status" 0 1 2 3 15
35
36# get standard environment, filters and checks
37. ./common.rc
38. ./common.filter
39
40_supported_fmt qcow2
41_supported_proto file fuse
42_require_drivers blkdebug blkverify
43# blkdebug can only inject errors on bs->file, not on the data_file,
44# so this test does not work with external data files
45_unsupported_imgopts data_file
46
47do_run_qemu()
48{
49    echo Testing: "$@" | _filter_imgfmt
50    $QEMU -nographic -qmp stdio -serial none "$@"
51    echo
52}
53
54run_qemu()
55{
56    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp | _filter_qemu_io
57}
58
59IMG_SIZE=64M
60
61echo
62echo "=== Testing blkverify through filename ==="
63echo
64
65# _make_test_img may set variables that we need to retain.  Everything
66# in a pipe is executed in a subshell, so doing so would throw away
67# all changes.  Therefore, we have to store the output in some temp
68# file and filter that.
69scratch_out="$TEST_DIR/img-create.out"
70
71TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \
72    >"$scratch_out"
73_filter_imgfmt <"$scratch_out"
74rm -f "$scratch_out"
75
76_make_test_img $IMG_SIZE
77$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
78         -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io
79
80$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io
81
82$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
83         -c 'read -P 42 0 512' | _filter_qemu_io
84
85echo
86echo "=== Testing blkverify through file blockref ==="
87echo
88
89TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \
90    >"$scratch_out"
91_filter_imgfmt <"$scratch_out"
92
93_make_test_img $IMG_SIZE
94$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" \
95         -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io
96
97$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io
98
99$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
100         -c 'read -P 42 0 512' | _filter_qemu_io
101
102echo
103echo "=== Testing blkdebug through filename ==="
104echo
105
106$QEMU_IO -c "open -o file.driver=blkdebug,file.inject-error.event=l2_load $TEST_IMG" \
107         -c 'read -P 42 0x38000 512'
108
109echo
110echo "=== Testing blkdebug through file blockref ==="
111echo
112
113$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.inject-error.event=l2_load,file.image.filename=$TEST_IMG" \
114         -c 'read -P 42 0x38000 512'
115
116echo
117echo "=== Testing blkdebug on existing block device ==="
118echo
119
120run_qemu <<EOF
121{ "execute": "qmp_capabilities" }
122{ "execute": "blockdev-add",
123    "arguments": {
124        "node-name": "drive0",
125        "driver": "file",
126        "filename": "$TEST_IMG"
127    }
128}
129{ "execute": "blockdev-add",
130    "arguments": {
131        "driver": "$IMGFMT",
132        "node-name": "drive0-debug",
133        "file": {
134            "driver": "blkdebug",
135            "image": "drive0",
136            "inject-error": [{
137                "event": "l2_load"
138            }]
139        }
140    }
141}
142{ "execute": "human-monitor-command",
143    "arguments": {
144        "command-line": 'qemu-io drive0-debug "read 0 512"'
145    }
146}
147{ "execute": "quit" }
148EOF
149
150echo
151echo "=== Testing blkverify on existing block device ==="
152echo
153
154run_qemu <<EOF
155{ "execute": "qmp_capabilities" }
156{ "execute": "blockdev-add",
157    "arguments": {
158        "node-name": "drive0",
159        "driver": "$IMGFMT",
160        "file": {
161            "driver": "file",
162            "filename": "$TEST_IMG"
163        }
164    }
165}
166{ "execute": "blockdev-add",
167    "arguments": {
168        "driver": "blkverify",
169        "node-name": "drive0-verify",
170        "test": "drive0",
171        "raw": {
172            "driver": "file",
173            "filename": "$TEST_IMG.base"
174        }
175    }
176}
177{ "execute": "human-monitor-command",
178    "arguments": {
179        "command-line": 'qemu-io drive0-verify "read 0 512"'
180    }
181}
182{ "execute": "quit" }
183EOF
184
185echo
186echo "=== Testing blkverify on existing raw block device ==="
187echo
188
189run_qemu <<EOF
190{ "execute": "qmp_capabilities" }
191{ "execute": "blockdev-add",
192    "arguments": {
193        "node-name": "drive0",
194        "driver": "file",
195        "filename": "$TEST_IMG.base"
196    }
197}
198{ "execute": "blockdev-add",
199    "arguments": {
200        "driver": "blkverify",
201        "node-name": "drive0-verify",
202        "test": {
203            "driver": "$IMGFMT",
204            "file": {
205                "driver": "file",
206                "filename": "$TEST_IMG"
207            }
208        },
209        "raw": "drive0"
210    }
211}
212{ "execute": "human-monitor-command",
213    "arguments": {
214        "command-line": 'qemu-io drive0-verify "read 0 512"'
215    }
216}
217{ "execute": "quit" }
218EOF
219
220echo
221echo "=== Testing blkdebug's set-state through QMP ==="
222echo
223
224run_qemu <<EOF
225{ "execute": "qmp_capabilities" }
226{ "execute": "blockdev-add",
227    "arguments": {
228        "node-name": "drive0",
229        "driver": "file",
230        "filename": "$TEST_IMG"
231    }
232}
233{ "execute": "blockdev-add",
234    "arguments": {
235        "driver": "$IMGFMT",
236        "node-name": "drive0-debug",
237        "file": {
238            "driver": "blkdebug",
239            "image": "drive0",
240            "inject-error": [{
241                "event": "read_aio",
242                "state": 42
243            }],
244            "set-state": [{
245                "event": "write_aio",
246                "new_state": 42
247            }]
248        }
249    }
250}
251{ "execute": "human-monitor-command",
252    "arguments": {
253        "command-line": 'qemu-io drive0-debug "read 0 512"'
254    }
255}
256{ "execute": "human-monitor-command",
257    "arguments": {
258        "command-line": 'qemu-io drive0-debug "write 0 512"'
259    }
260}
261{ "execute": "human-monitor-command",
262    "arguments": {
263        "command-line": 'qemu-io drive0-debug "read 0 512"'
264    }
265}
266{ "execute": "quit" }
267EOF
268
269# success, all done
270echo "*** done"
271rm -f $seq.full
272status=0
273