137ce63ebSStefan Hajnoczi#!/usr/bin/env python 237ce63ebSStefan Hajnoczi# 337ce63ebSStefan Hajnoczi# Tests for image streaming. 437ce63ebSStefan Hajnoczi# 537ce63ebSStefan Hajnoczi# Copyright (C) 2012 IBM Corp. 637ce63ebSStefan Hajnoczi# 737ce63ebSStefan Hajnoczi# This program is free software; you can redistribute it and/or modify 837ce63ebSStefan Hajnoczi# it under the terms of the GNU General Public License as published by 937ce63ebSStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or 1037ce63ebSStefan Hajnoczi# (at your option) any later version. 1137ce63ebSStefan Hajnoczi# 1237ce63ebSStefan Hajnoczi# This program is distributed in the hope that it will be useful, 1337ce63ebSStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of 1437ce63ebSStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1537ce63ebSStefan Hajnoczi# GNU General Public License for more details. 1637ce63ebSStefan Hajnoczi# 1737ce63ebSStefan Hajnoczi# You should have received a copy of the GNU General Public License 1837ce63ebSStefan Hajnoczi# along with this program. If not, see <http://www.gnu.org/licenses/>. 1937ce63ebSStefan Hajnoczi# 2037ce63ebSStefan Hajnoczi 2137ce63ebSStefan Hajnocziimport os 2237ce63ebSStefan Hajnocziimport iotests 2337ce63ebSStefan Hajnoczifrom iotests import qemu_img, qemu_io 2437ce63ebSStefan Hajnoczi 2537ce63ebSStefan Hajnoczibacking_img = os.path.join(iotests.test_dir, 'backing.img') 2637ce63ebSStefan Hajnoczitest_img = os.path.join(iotests.test_dir, 'test.img') 2737ce63ebSStefan Hajnoczi 2837ce63ebSStefan Hajnocziclass ImageStreamingTestCase(iotests.QMPTestCase): 2937ce63ebSStefan Hajnoczi '''Abstract base class for image streaming test cases''' 3037ce63ebSStefan Hajnoczi 3137ce63ebSStefan Hajnoczi def assert_no_active_streams(self): 3237ce63ebSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 3337ce63ebSStefan Hajnoczi self.assert_qmp(result, 'return', []) 3437ce63ebSStefan Hajnoczi 3537ce63ebSStefan Hajnocziclass TestSingleDrive(ImageStreamingTestCase): 3637ce63ebSStefan Hajnoczi image_len = 1 * 1024 * 1024 # MB 3737ce63ebSStefan Hajnoczi 3837ce63ebSStefan Hajnoczi def setUp(self): 3937ce63ebSStefan Hajnoczi qemu_img('create', backing_img, str(TestSingleDrive.image_len)) 4037ce63ebSStefan Hajnoczi qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img) 4137ce63ebSStefan Hajnoczi self.vm = iotests.VM().add_drive(test_img) 4237ce63ebSStefan Hajnoczi self.vm.launch() 4337ce63ebSStefan Hajnoczi 4437ce63ebSStefan Hajnoczi def tearDown(self): 4537ce63ebSStefan Hajnoczi self.vm.shutdown() 4637ce63ebSStefan Hajnoczi os.remove(test_img) 4737ce63ebSStefan Hajnoczi os.remove(backing_img) 4837ce63ebSStefan Hajnoczi 4937ce63ebSStefan Hajnoczi def test_stream(self): 5037ce63ebSStefan Hajnoczi self.assert_no_active_streams() 5137ce63ebSStefan Hajnoczi 52*db58f9c0SStefan Hajnoczi result = self.vm.qmp('block-stream', device='drive0') 5337ce63ebSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 5437ce63ebSStefan Hajnoczi 5537ce63ebSStefan Hajnoczi completed = False 5637ce63ebSStefan Hajnoczi while not completed: 5737ce63ebSStefan Hajnoczi for event in self.vm.get_qmp_events(wait=True): 5837ce63ebSStefan Hajnoczi if event['event'] == 'BLOCK_JOB_COMPLETED': 5937ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'stream') 6037ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/device', 'drive0') 6137ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/offset', self.image_len) 6237ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/len', self.image_len) 6337ce63ebSStefan Hajnoczi completed = True 6437ce63ebSStefan Hajnoczi 6537ce63ebSStefan Hajnoczi self.assert_no_active_streams() 6637ce63ebSStefan Hajnoczi 6737ce63ebSStefan Hajnoczi self.assertFalse('sectors not allocated' in qemu_io('-c', 'map', test_img), 6837ce63ebSStefan Hajnoczi 'image file not fully populated after streaming') 6937ce63ebSStefan Hajnoczi 7037ce63ebSStefan Hajnoczi def test_device_not_found(self): 71*db58f9c0SStefan Hajnoczi result = self.vm.qmp('block-stream', device='nonexistent') 7237ce63ebSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'DeviceNotFound') 7337ce63ebSStefan Hajnoczi 7437ce63ebSStefan Hajnocziclass TestStreamStop(ImageStreamingTestCase): 7537ce63ebSStefan Hajnoczi image_len = 8 * 1024 * 1024 * 1024 # GB 7637ce63ebSStefan Hajnoczi 7737ce63ebSStefan Hajnoczi def setUp(self): 7837ce63ebSStefan Hajnoczi qemu_img('create', backing_img, str(TestStreamStop.image_len)) 7937ce63ebSStefan Hajnoczi qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img) 8037ce63ebSStefan Hajnoczi self.vm = iotests.VM().add_drive(test_img) 8137ce63ebSStefan Hajnoczi self.vm.launch() 8237ce63ebSStefan Hajnoczi 8337ce63ebSStefan Hajnoczi def tearDown(self): 8437ce63ebSStefan Hajnoczi self.vm.shutdown() 8537ce63ebSStefan Hajnoczi os.remove(test_img) 8637ce63ebSStefan Hajnoczi os.remove(backing_img) 8737ce63ebSStefan Hajnoczi 8837ce63ebSStefan Hajnoczi def test_stream_stop(self): 8937ce63ebSStefan Hajnoczi import time 9037ce63ebSStefan Hajnoczi 9137ce63ebSStefan Hajnoczi self.assert_no_active_streams() 9237ce63ebSStefan Hajnoczi 93*db58f9c0SStefan Hajnoczi result = self.vm.qmp('block-stream', device='drive0') 9437ce63ebSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 9537ce63ebSStefan Hajnoczi 9637ce63ebSStefan Hajnoczi time.sleep(1) 9737ce63ebSStefan Hajnoczi events = self.vm.get_qmp_events(wait=False) 9837ce63ebSStefan Hajnoczi self.assertEqual(events, [], 'unexpected QMP event: %s' % events) 9937ce63ebSStefan Hajnoczi 100*db58f9c0SStefan Hajnoczi self.vm.qmp('block-job-cancel', device='drive0') 10137ce63ebSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 10237ce63ebSStefan Hajnoczi 10337ce63ebSStefan Hajnoczi cancelled = False 10437ce63ebSStefan Hajnoczi while not cancelled: 10537ce63ebSStefan Hajnoczi for event in self.vm.get_qmp_events(wait=True): 10637ce63ebSStefan Hajnoczi if event['event'] == 'BLOCK_JOB_CANCELLED': 10737ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'stream') 10837ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/device', 'drive0') 10937ce63ebSStefan Hajnoczi cancelled = True 11037ce63ebSStefan Hajnoczi 11137ce63ebSStefan Hajnoczi self.assert_no_active_streams() 11237ce63ebSStefan Hajnoczi 11337ce63ebSStefan Hajnoczi# This is a short performance test which is not run by default. 11437ce63ebSStefan Hajnoczi# Invoke "IMGFMT=qed ./030 TestSetSpeed.perf_test_set_speed" 11537ce63ebSStefan Hajnocziclass TestSetSpeed(ImageStreamingTestCase): 11637ce63ebSStefan Hajnoczi image_len = 80 * 1024 * 1024 # MB 11737ce63ebSStefan Hajnoczi 11837ce63ebSStefan Hajnoczi def setUp(self): 11937ce63ebSStefan Hajnoczi qemu_img('create', backing_img, str(TestSetSpeed.image_len)) 12037ce63ebSStefan Hajnoczi qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img) 12137ce63ebSStefan Hajnoczi self.vm = iotests.VM().add_drive(test_img) 12237ce63ebSStefan Hajnoczi self.vm.launch() 12337ce63ebSStefan Hajnoczi 12437ce63ebSStefan Hajnoczi def tearDown(self): 12537ce63ebSStefan Hajnoczi self.vm.shutdown() 12637ce63ebSStefan Hajnoczi os.remove(test_img) 12737ce63ebSStefan Hajnoczi os.remove(backing_img) 12837ce63ebSStefan Hajnoczi 12937ce63ebSStefan Hajnoczi def perf_test_set_speed(self): 13037ce63ebSStefan Hajnoczi self.assert_no_active_streams() 13137ce63ebSStefan Hajnoczi 132*db58f9c0SStefan Hajnoczi result = self.vm.qmp('block-stream', device='drive0') 13337ce63ebSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 13437ce63ebSStefan Hajnoczi 135*db58f9c0SStefan Hajnoczi result = self.vm.qmp('block-job-set-speed', device='drive0', value=8 * 1024 * 1024) 13637ce63ebSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 13737ce63ebSStefan Hajnoczi 13837ce63ebSStefan Hajnoczi completed = False 13937ce63ebSStefan Hajnoczi while not completed: 14037ce63ebSStefan Hajnoczi for event in self.vm.get_qmp_events(wait=True): 14137ce63ebSStefan Hajnoczi if event['event'] == 'BLOCK_JOB_COMPLETED': 14237ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'stream') 14337ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/device', 'drive0') 14437ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/offset', self.image_len) 14537ce63ebSStefan Hajnoczi self.assert_qmp(event, 'data/len', self.image_len) 14637ce63ebSStefan Hajnoczi completed = True 14737ce63ebSStefan Hajnoczi 14837ce63ebSStefan Hajnoczi self.assert_no_active_streams() 14937ce63ebSStefan Hajnoczi 15037ce63ebSStefan Hajnocziif __name__ == '__main__': 15137ce63ebSStefan Hajnoczi iotests.main(supported_fmts=['qcow2', 'qed']) 152