Skip to content

Commit

Permalink
qemu-iotests: Test blockdev-backup in 055
Browse files Browse the repository at this point in the history
This applies cases on drive-backup on blockdev-backup, except cases with
target format and mode.

Also add a case to check source == target.

Signed-off-by: Fam Zheng <[email protected]>
Reviewed-by: Max Reitz <[email protected]>
Reviewed-by: Markus Armbruster <[email protected]>
Message-id: [email protected]
Signed-off-by: Max Reitz <[email protected]>
  • Loading branch information
Fam Zheng authored and stefanhaRH committed Jan 13, 2015
1 parent bd8baec commit 7c6a4ab
Show file tree
Hide file tree
Showing 2 changed files with 176 additions and 39 deletions.
211 changes: 174 additions & 37 deletions tests/qemu-iotests/055
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#!/usr/bin/env python
#
# Tests for drive-backup
# Tests for drive-backup and blockdev-backup
#
# Copyright (C) 2013 Red Hat, Inc.
# Copyright (C) 2013, 2014 Red Hat, Inc.
#
# Based on 041.
#
Expand All @@ -27,6 +27,7 @@ from iotests import qemu_img, qemu_io

test_img = os.path.join(iotests.test_dir, 'test.img')
target_img = os.path.join(iotests.test_dir, 'target.img')
blockdev_target_img = os.path.join(iotests.test_dir, 'blockdev-target.img')

class TestSingleDrive(iotests.QMPTestCase):
image_len = 64 * 1024 * 1024 # MB
Expand All @@ -38,34 +39,41 @@ class TestSingleDrive(iotests.QMPTestCase):
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xd5 1M 32k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 32M 124k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 67043328 64k', test_img)
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len))

self.vm = iotests.VM().add_drive(test_img)
self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
self.vm.launch()

def tearDown(self):
self.vm.shutdown()
os.remove(test_img)
os.remove(blockdev_target_img)
try:
os.remove(target_img)
except OSError:
pass

def test_cancel(self):
def do_test_cancel(self, cmd, target):
self.assert_no_active_block_jobs()

result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0', target=target, sync='full')
self.assert_qmp(result, 'return', {})

event = self.cancel_and_wait()
self.assert_qmp(event, 'data/type', 'backup')

def test_pause(self):
def test_cancel_drive_backup(self):
self.do_test_cancel('drive-backup', target_img)

def test_cancel_blockdev_backup(self):
self.do_test_cancel('blockdev-backup', 'drive1')

def do_test_pause(self, cmd, target, image):
self.assert_no_active_block_jobs()

self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full')
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('block-job-pause', device='drive0')
Expand All @@ -86,14 +94,25 @@ class TestSingleDrive(iotests.QMPTestCase):
self.wait_until_completed()

self.vm.shutdown()
self.assertTrue(iotests.compare_images(test_img, target_img),
self.assertTrue(iotests.compare_images(test_img, image),
'target image does not match source after backup')

def test_pause_drive_backup(self):
self.do_test_pause('drive-backup', target_img, target_img)

def test_pause_blockdev_backup(self):
self.do_test_pause('blockdev-backup', 'drive1', blockdev_target_img)

def test_medium_not_found(self):
result = self.vm.qmp('drive-backup', device='ide1-cd0',
target=target_img, sync='full')
self.assert_qmp(result, 'error/class', 'GenericError')

def test_medium_not_found_blockdev_backup(self):
result = self.vm.qmp('blockdev-backup', device='ide1-cd0',
target='drive1', sync='full')
self.assert_qmp(result, 'error/class', 'GenericError')

def test_image_not_found(self):
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full', mode='existing')
Expand All @@ -105,31 +124,53 @@ class TestSingleDrive(iotests.QMPTestCase):
format='spaghetti-noodles')
self.assert_qmp(result, 'error/class', 'GenericError')

def test_device_not_found(self):
result = self.vm.qmp('drive-backup', device='nonexistent',
target=target_img, sync='full')
def do_test_device_not_found(self, cmd, **args):
result = self.vm.qmp(cmd, **args)
self.assert_qmp(result, 'error/class', 'DeviceNotFound')

def test_device_not_found(self):
self.do_test_device_not_found('drive-backup', device='nonexistent',
target=target_img, sync='full')

self.do_test_device_not_found('blockdev-backup', device='nonexistent',
target='drive0', sync='full')

self.do_test_device_not_found('blockdev-backup', device='drive0',
target='nonexistent', sync='full')

self.do_test_device_not_found('blockdev-backup', device='nonexistent',
target='nonexistent', sync='full')

def test_target_is_source(self):
result = self.vm.qmp('blockdev-backup', device='drive0',
target='drive0', sync='full')
self.assert_qmp(result, 'error/class', 'GenericError')

class TestSetSpeed(iotests.QMPTestCase):
image_len = 80 * 1024 * 1024 # MB

def setUp(self):
qemu_img('create', '-f', iotests.imgfmt, test_img, str(TestSetSpeed.image_len))
qemu_io('-f', iotests.imgfmt, '-c', 'write -P1 0 512', test_img)
self.vm = iotests.VM().add_drive(test_img)
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len))

self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
self.vm.launch()

def tearDown(self):
self.vm.shutdown()
os.remove(test_img)
os.remove(target_img)
os.remove(blockdev_target_img)
try:
os.remove(target_img)
except OSError:
pass

def test_set_speed(self):
def do_test_set_speed(self, cmd, target):
self.assert_no_active_block_jobs()

self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0', target=target, sync='full')
self.assert_qmp(result, 'return', {})

# Default speed is 0
Expand All @@ -148,10 +189,10 @@ class TestSetSpeed(iotests.QMPTestCase):
event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')

# Check setting speed in drive-backup works
# Check setting speed option works
self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full', speed=4*1024*1024)
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full', speed=4*1024*1024)
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('query-block-jobs')
Expand All @@ -161,18 +202,24 @@ class TestSetSpeed(iotests.QMPTestCase):
event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')

def test_set_speed_invalid(self):
def test_set_speed_drive_backup(self):
self.do_test_set_speed('drive-backup', target_img)

def test_set_speed_blockdev_backup(self):
self.do_test_set_speed('blockdev-backup', 'drive1')

def do_test_set_speed_invalid(self, cmd, target):
self.assert_no_active_block_jobs()

result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full', speed=-1)
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full', speed=-1)
self.assert_qmp(result, 'error/class', 'GenericError')

self.assert_no_active_block_jobs()

self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full')
self.assert_qmp(result, 'return', {})

result = self.vm.qmp('block-job-set-speed', device='drive0', speed=-1)
Expand All @@ -181,6 +228,12 @@ class TestSetSpeed(iotests.QMPTestCase):
event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')

def test_set_speed_invalid_drive_backup(self):
self.do_test_set_speed_invalid('drive-backup', target_img)

def test_set_speed_invalid_blockdev_backup(self):
self.do_test_set_speed_invalid('blockdev-backup', 'drive1')

class TestSingleTransaction(iotests.QMPTestCase):
image_len = 64 * 1024 * 1024 # MB

Expand All @@ -190,41 +243,50 @@ class TestSingleTransaction(iotests.QMPTestCase):
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xd5 1M 32k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 32M 124k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 67043328 64k', test_img)
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len))

self.vm = iotests.VM().add_drive(test_img)
self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
self.vm.launch()

def tearDown(self):
self.vm.shutdown()
os.remove(test_img)
os.remove(blockdev_target_img)
try:
os.remove(target_img)
except OSError:
pass

def test_cancel(self):
def do_test_cancel(self, cmd, target):
self.assert_no_active_block_jobs()

result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
'type': cmd,
'data': { 'device': 'drive0',
'target': target_img,
'target': target,
'sync': 'full' },
}
])

self.assert_qmp(result, 'return', {})

event = self.cancel_and_wait()
self.assert_qmp(event, 'data/type', 'backup')

def test_pause(self):
def test_cancel_drive_backup(self):
self.do_test_cancel('drive-backup', target_img)

def test_cancel_blockdev_backup(self):
self.do_test_cancel('blockdev-backup', 'drive1')

def do_test_pause(self, cmd, target, image):
self.assert_no_active_block_jobs()

self.vm.pause_drive('drive0')
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
'type': cmd,
'data': { 'device': 'drive0',
'target': target_img,
'target': target,
'sync': 'full' },
}
])
Expand All @@ -248,19 +310,31 @@ class TestSingleTransaction(iotests.QMPTestCase):
self.wait_until_completed()

self.vm.shutdown()
self.assertTrue(iotests.compare_images(test_img, target_img),
self.assertTrue(iotests.compare_images(test_img, image),
'target image does not match source after backup')

def test_medium_not_found(self):
def test_pause_drive_backup(self):
self.do_test_pause('drive-backup', target_img, target_img)

def test_pause_blockdev_backup(self):
self.do_test_pause('blockdev-backup', 'drive1', blockdev_target_img)

def do_test_medium_not_found(self, cmd, target):
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
'type': cmd,
'data': { 'device': 'ide1-cd0',
'target': target_img,
'target': target,
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'GenericError')

def test_medium_not_found_drive_backup(self):
self.do_test_medium_not_found('drive-backup', target_img)

def test_medium_not_found_blockdev_backup(self):
self.do_test_medium_not_found('blockdev-backup', 'drive1')

def test_image_not_found(self):
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
Expand All @@ -283,6 +357,43 @@ class TestSingleTransaction(iotests.QMPTestCase):
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')

result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'nonexistent',
'target': 'drive1',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')

result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'drive0',
'target': 'nonexistent',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')

result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'nonexistent',
'target': 'nonexistent',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')

def test_target_is_source(self):
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'drive0',
'target': 'drive0',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'GenericError')

def test_abort(self):
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
Expand All @@ -298,5 +409,31 @@ class TestSingleTransaction(iotests.QMPTestCase):
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()

result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'nonexistent',
'target': 'drive1',
'sync': 'full' },
}, {
'type': 'Abort',
'data': {},
}
])
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()

result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'drive0',
'target': 'nonexistent',
'sync': 'full' },
}, {
'type': 'Abort',
'data': {},
}
])
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()

if __name__ == '__main__':
iotests.main(supported_fmts=['raw', 'qcow2'])
4 changes: 2 additions & 2 deletions tests/qemu-iotests/055.out
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
..............
........................
----------------------------------------------------------------------
Ran 14 tests
Ran 24 tests

OK

0 comments on commit 7c6a4ab

Please sign in to comment.