1e3409362SIan Main#!/usr/bin/env python 2e3409362SIan Main# 3e3409362SIan Main# Tests for drive-backup 4e3409362SIan Main# 5e3409362SIan Main# Copyright (C) 2013 Red Hat, Inc. 6e3409362SIan Main# 7e3409362SIan Main# Based on 041. 8e3409362SIan Main# 9e3409362SIan Main# This program is free software; you can redistribute it and/or modify 10e3409362SIan Main# it under the terms of the GNU General Public License as published by 11e3409362SIan Main# the Free Software Foundation; either version 2 of the License, or 12e3409362SIan Main# (at your option) any later version. 13e3409362SIan Main# 14e3409362SIan Main# This program is distributed in the hope that it will be useful, 15e3409362SIan Main# but WITHOUT ANY WARRANTY; without even the implied warranty of 16e3409362SIan Main# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17e3409362SIan Main# GNU General Public License for more details. 18e3409362SIan Main# 19e3409362SIan Main# You should have received a copy of the GNU General Public License 20e3409362SIan Main# along with this program. If not, see <http://www.gnu.org/licenses/>. 21e3409362SIan Main# 22e3409362SIan Main 23e3409362SIan Mainimport time 24e3409362SIan Mainimport os 25e3409362SIan Mainimport iotests 26e3409362SIan Mainfrom iotests import qemu_img, qemu_io, create_image 27e3409362SIan Main 28e3409362SIan Mainbacking_img = os.path.join(iotests.test_dir, 'backing.img') 29e3409362SIan Maintest_img = os.path.join(iotests.test_dir, 'test.img') 30e3409362SIan Maintarget_img = os.path.join(iotests.test_dir, 'target.img') 31e3409362SIan Main 32e3409362SIan Mainclass TestSyncModesNoneAndTop(iotests.QMPTestCase): 33e3409362SIan Main image_len = 64 * 1024 * 1024 # MB 34e3409362SIan Main 35e3409362SIan Main def setUp(self): 36e3409362SIan Main create_image(backing_img, TestSyncModesNoneAndTop.image_len) 37e3409362SIan Main qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img) 38e3409362SIan Main qemu_io('-c', 'write -P0x41 0 512', test_img) 39e3409362SIan Main qemu_io('-c', 'write -P0xd5 1M 32k', test_img) 40e3409362SIan Main qemu_io('-c', 'write -P0xdc 32M 124k', test_img) 41e3409362SIan Main qemu_io('-c', 'write -P0xdc 67043328 64k', test_img) 42e3409362SIan Main self.vm = iotests.VM().add_drive(test_img) 43e3409362SIan Main self.vm.launch() 44e3409362SIan Main 45e3409362SIan Main def tearDown(self): 46e3409362SIan Main self.vm.shutdown() 47e3409362SIan Main os.remove(test_img) 48e3409362SIan Main os.remove(backing_img) 49e3409362SIan Main try: 50e3409362SIan Main os.remove(target_img) 51e3409362SIan Main except OSError: 52e3409362SIan Main pass 53e3409362SIan Main 54e3409362SIan Main def test_complete_top(self): 55e3409362SIan Main self.assert_no_active_block_jobs() 56e3409362SIan Main result = self.vm.qmp('drive-backup', device='drive0', sync='top', 57e3409362SIan Main format=iotests.imgfmt, target=target_img) 58e3409362SIan Main self.assert_qmp(result, 'return', {}) 59e3409362SIan Main 60*9974ad40SFam Zheng self.wait_until_completed(check_offset=False) 61e3409362SIan Main 62e3409362SIan Main self.assert_no_active_block_jobs() 63e3409362SIan Main self.vm.shutdown() 64e3409362SIan Main self.assertTrue(iotests.compare_images(test_img, target_img), 65e3409362SIan Main 'target image does not match source after backup') 66e3409362SIan Main 67e3409362SIan Main def test_cancel_sync_none(self): 68e3409362SIan Main self.assert_no_active_block_jobs() 69e3409362SIan Main 70e3409362SIan Main result = self.vm.qmp('drive-backup', device='drive0', 71e3409362SIan Main sync='none', target=target_img) 72e3409362SIan Main self.assert_qmp(result, 'return', {}) 73e3409362SIan Main time.sleep(1) 74e3409362SIan Main self.vm.hmp_qemu_io('drive0', 'write -P0x5e 0 512') 75e3409362SIan Main self.vm.hmp_qemu_io('drive0', 'aio_flush') 76e3409362SIan Main # Verify that the original contents exist in the target image. 77e3409362SIan Main 78e3409362SIan Main event = self.cancel_and_wait() 79e3409362SIan Main self.assert_qmp(event, 'data/type', 'backup') 80e3409362SIan Main 81e3409362SIan Main self.vm.shutdown() 82e3409362SIan Main time.sleep(1) 83e3409362SIan Main self.assertEqual(-1, qemu_io('-c', 'read -P0x41 0 512', target_img).find("verification failed")) 84e3409362SIan Main 85e3409362SIan Main 86e3409362SIan Mainif __name__ == '__main__': 87e3409362SIan Main iotests.main(supported_fmts=['qcow2', 'qed']) 88