-#!/bin/bash
+#!/usr/bin/env bash
#
# Test case for ejecting BDSs with block jobs still running on them
#
seq="$(basename $0)"
echo "QA output created by $seq"
-here="$PWD"
status=1 # failure is the default!
_cleanup()
{
+ _cleanup_qemu
_cleanup_test_img
- rm -f "$TEST_DIR/{b,m,o}.$IMGFMT"
+ rm -f "$TEST_DIR"/{b,m,o}.$IMGFMT
}
trap "_cleanup; exit \$status" 0 1 2 3 15
_send_qemu_cmd $QEMU_HANDLE \
"{'execute': 'blockdev-add',
'arguments': {
- 'options': {
- 'id': 'drv0',
- 'driver': '$IMGFMT',
- 'file': {
- 'driver': 'file',
- 'filename': '$TEST_IMG'
- }}}}" \
+ 'node-name': 'drv0',
+ 'driver': '$IMGFMT',
+ 'file': {
+ 'driver': 'file',
+ 'filename': '$TEST_IMG'
+ }}}" \
'return'
+ # If "$2" is an event, we may or may not see it before the
+ # {"return": {}}. Therefore, filter the {"return": {}} out both
+ # here and in the next command. (Naturally, if we do not see it
+ # here, we will see it before the next command can be executed,
+ # so it will appear in the next _send_qemu_cmd's output.)
_send_qemu_cmd $QEMU_HANDLE \
"$1" \
"$2" \
- | _filter_img_create
+ | _filter_img_create | _filter_qmp_empty_return
# We want this to return an error because the block job is still running
_send_qemu_cmd $QEMU_HANDLE \
- "{'execute': 'x-blockdev-remove-medium',
- 'arguments': {'device': 'drv0'}}" \
- 'error'
+ "{'execute': 'blockdev-del',
+ 'arguments': {'node-name': 'drv0'}}" \
+ 'error' | _filter_generated_node_ids | _filter_qmp_empty_return
_send_qemu_cmd $QEMU_HANDLE \
"{'execute': 'block-job-cancel',
- 'arguments': {'device': 'drv0'}}" \
+ 'arguments': {'device': 'job0'}}" \
"$3"
_send_qemu_cmd $QEMU_HANDLE \
- "{'execute': 'x-blockdev-del',
- 'arguments': {'id': 'drv0'}}" \
+ "{'execute': 'blockdev-del',
+ 'arguments': {'node-name': 'drv0'}}" \
'return'
}
test_blockjob \
"{'execute': 'drive-backup',
- 'arguments': {'device': 'drv0',
+ 'arguments': {'job-id': 'job0',
+ 'device': 'drv0',
'target': '$TEST_DIR/o.$IMGFMT',
'format': '$IMGFMT',
'sync': 'none'}}" \
'return' \
- 'BLOCK_JOB_CANCELLED'
+ '"status": "null"'
echo
echo '=== Testing drive-mirror ==='
test_blockjob \
"{'execute': 'drive-mirror',
- 'arguments': {'device': 'drv0',
+ 'arguments': {'job-id': 'job0',
+ 'device': 'drv0',
'target': '$TEST_DIR/o.$IMGFMT',
'format': '$IMGFMT',
'sync': 'none'}}" \
'BLOCK_JOB_READY' \
- 'BLOCK_JOB_COMPLETED'
+ '"status": "null"'
echo
echo '=== Testing active block-commit ==='
test_blockjob \
"{'execute': 'block-commit',
- 'arguments': {'device': 'drv0'}}" \
+ 'arguments': {'job-id': 'job0', 'device': 'drv0'}}" \
'BLOCK_JOB_READY' \
- 'BLOCK_JOB_COMPLETED'
+ '"status": "null"'
echo
echo '=== Testing non-active block-commit ==='
test_blockjob \
"{'execute': 'block-commit',
- 'arguments': {'device': 'drv0',
+ 'arguments': {'job-id': 'job0',
+ 'device': 'drv0',
'top': '$TEST_DIR/m.$IMGFMT',
'speed': 1}}" \
'return' \
- 'BLOCK_JOB_CANCELLED'
+ '"status": "null"'
echo
echo '=== Testing block-stream ==='
$QEMU_IO -c 'write 0 1M' "$TEST_DIR/b.$IMGFMT" | _filter_qemu_io
# With some data to stream (and @speed set to 1), block-stream will not complete
-# until we send the block-job-cancel command. Therefore, no event other than
-# BLOCK_JOB_CANCELLED will be emitted.
+# until we send the block-job-cancel command.
test_blockjob \
"{'execute': 'block-stream',
- 'arguments': {'device': 'drv0',
+ 'arguments': {'job-id': 'job0',
+ 'device': 'drv0',
'speed': 1}}" \
'return' \
- 'BLOCK_JOB_CANCELLED'
+ '"status": "null"'
_cleanup_qemu