123e956bfSCorey Bryant#!/usr/bin/env python 223e956bfSCorey Bryant# 3*fd9c577bSWenchao Xia# Tests for fdsets and getfd. 423e956bfSCorey Bryant# 523e956bfSCorey Bryant# Copyright (C) 2012 IBM Corp. 623e956bfSCorey Bryant# 723e956bfSCorey Bryant# This program is free software; you can redistribute it and/or modify 823e956bfSCorey Bryant# it under the terms of the GNU General Public License as published by 923e956bfSCorey Bryant# the Free Software Foundation; either version 2 of the License, or 1023e956bfSCorey Bryant# (at your option) any later version. 1123e956bfSCorey Bryant# 1223e956bfSCorey Bryant# This program is distributed in the hope that it will be useful, 1323e956bfSCorey Bryant# but WITHOUT ANY WARRANTY; without even the implied warranty of 1423e956bfSCorey Bryant# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1523e956bfSCorey Bryant# GNU General Public License for more details. 1623e956bfSCorey Bryant# 1723e956bfSCorey Bryant# You should have received a copy of the GNU General Public License 1823e956bfSCorey Bryant# along with this program. If not, see <http://www.gnu.org/licenses/>. 1923e956bfSCorey Bryant# 2023e956bfSCorey Bryant 2123e956bfSCorey Bryantimport os 2223e956bfSCorey Bryantimport iotests 2323e956bfSCorey Bryantfrom iotests import qemu_img 2423e956bfSCorey Bryant 2523e956bfSCorey Bryantimage0 = os.path.join(iotests.test_dir, 'image0') 2623e956bfSCorey Bryantimage1 = os.path.join(iotests.test_dir, 'image1') 2723e956bfSCorey Bryantimage2 = os.path.join(iotests.test_dir, 'image2') 2823e956bfSCorey Bryantimage3 = os.path.join(iotests.test_dir, 'image3') 2923e956bfSCorey Bryantimage4 = os.path.join(iotests.test_dir, 'image4') 3023e956bfSCorey Bryant 3123e956bfSCorey Bryantclass TestFdSets(iotests.QMPTestCase): 3223e956bfSCorey Bryant 3323e956bfSCorey Bryant def setUp(self): 3423e956bfSCorey Bryant self.vm = iotests.VM() 3523e956bfSCorey Bryant qemu_img('create', '-f', iotests.imgfmt, image0, '128K') 3623e956bfSCorey Bryant qemu_img('create', '-f', iotests.imgfmt, image1, '128K') 3723e956bfSCorey Bryant qemu_img('create', '-f', iotests.imgfmt, image2, '128K') 3823e956bfSCorey Bryant qemu_img('create', '-f', iotests.imgfmt, image3, '128K') 3923e956bfSCorey Bryant qemu_img('create', '-f', iotests.imgfmt, image4, '128K') 4023e956bfSCorey Bryant self.file0 = open(image0, 'r') 4123e956bfSCorey Bryant self.file1 = open(image1, 'w+') 4223e956bfSCorey Bryant self.file2 = open(image2, 'r') 4323e956bfSCorey Bryant self.file3 = open(image3, 'r') 4423e956bfSCorey Bryant self.file4 = open(image4, 'r') 4523e956bfSCorey Bryant self.vm.add_fd(self.file0.fileno(), 1, 'image0:r') 4623e956bfSCorey Bryant self.vm.add_fd(self.file1.fileno(), 1, 'image1:w+') 4723e956bfSCorey Bryant self.vm.add_fd(self.file2.fileno(), 0, 'image2:r') 4823e956bfSCorey Bryant self.vm.add_fd(self.file3.fileno(), 2, 'image3:r') 4923e956bfSCorey Bryant self.vm.add_fd(self.file4.fileno(), 2, 'image4:r') 5023e956bfSCorey Bryant self.vm.add_drive("/dev/fdset/1") 5123e956bfSCorey Bryant self.vm.launch() 5223e956bfSCorey Bryant 5323e956bfSCorey Bryant def tearDown(self): 5423e956bfSCorey Bryant self.vm.shutdown() 5523e956bfSCorey Bryant self.file0.close() 5623e956bfSCorey Bryant self.file1.close() 5723e956bfSCorey Bryant self.file2.close() 5823e956bfSCorey Bryant self.file3.close() 5923e956bfSCorey Bryant self.file4.close() 6023e956bfSCorey Bryant os.remove(image0) 6123e956bfSCorey Bryant os.remove(image1) 6223e956bfSCorey Bryant os.remove(image2) 6323e956bfSCorey Bryant os.remove(image3) 6423e956bfSCorey Bryant os.remove(image4) 6523e956bfSCorey Bryant 6623e956bfSCorey Bryant def test_query_fdset(self): 6723e956bfSCorey Bryant result = self.vm.qmp('query-fdsets') 6823e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fdset-id', 2) 6923e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fdset-id', 1) 7023e956bfSCorey Bryant self.assert_qmp(result, 'return[2]/fdset-id', 0) 7123e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image3:r') 7223e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fds[1]/opaque', 'image4:r') 7323e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image0:r') 7423e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fds[1]/opaque', 'image1:w+') 7523e956bfSCorey Bryant self.assert_qmp(result, 'return[2]/fds[0]/opaque', 'image2:r') 7623e956bfSCorey Bryant self.vm.shutdown() 7723e956bfSCorey Bryant 7823e956bfSCorey Bryant def test_remove_fdset(self): 7923e956bfSCorey Bryant result = self.vm.qmp('remove-fd', fdset_id=2) 8023e956bfSCorey Bryant self.assert_qmp(result, 'return', {}) 8123e956bfSCorey Bryant result = self.vm.qmp('query-fdsets') 8223e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fdset-id', 1) 8323e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fdset-id', 0) 8423e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image0:r') 8523e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fds[1]/opaque', 'image1:w+') 8623e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image2:r') 8723e956bfSCorey Bryant self.vm.shutdown() 8823e956bfSCorey Bryant 8923e956bfSCorey Bryant def test_remove_fd(self): 9023e956bfSCorey Bryant result = self.vm.qmp('query-fdsets') 9123e956bfSCorey Bryant fd_image3 = result['return'][0]['fds'][0]['fd'] 9223e956bfSCorey Bryant result = self.vm.qmp('remove-fd', fdset_id=2, fd=fd_image3) 9323e956bfSCorey Bryant self.assert_qmp(result, 'return', {}) 9423e956bfSCorey Bryant result = self.vm.qmp('query-fdsets') 9523e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fdset-id', 2) 9623e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fdset-id', 1) 9723e956bfSCorey Bryant self.assert_qmp(result, 'return[2]/fdset-id', 0) 9823e956bfSCorey Bryant self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image4:r') 9923e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image0:r') 10023e956bfSCorey Bryant self.assert_qmp(result, 'return[1]/fds[1]/opaque', 'image1:w+') 10123e956bfSCorey Bryant self.assert_qmp(result, 'return[2]/fds[0]/opaque', 'image2:r') 10223e956bfSCorey Bryant self.vm.shutdown() 10323e956bfSCorey Bryant 10423e956bfSCorey Bryant def test_remove_fd_invalid_fdset(self): 10523e956bfSCorey Bryant result = self.vm.qmp('query-fdsets') 10623e956bfSCorey Bryant fd_image3 = result['return'][0]['fds'][0]['fd'] 10723e956bfSCorey Bryant result = self.vm.qmp('remove-fd', fdset_id=3, fd=fd_image3) 10823e956bfSCorey Bryant self.assert_qmp(result, 'error/class', 'GenericError') 10923e956bfSCorey Bryant self.assert_qmp(result, 'error/desc', 11023e956bfSCorey Bryant 'File descriptor named \'fdset-id:3, fd:%d\' not found' % fd_image3) 11123e956bfSCorey Bryant self.vm.shutdown() 11223e956bfSCorey Bryant 11323e956bfSCorey Bryant def test_remove_fd_invalid_fd(self): 11423e956bfSCorey Bryant result = self.vm.qmp('query-fdsets') 11523e956bfSCorey Bryant result = self.vm.qmp('remove-fd', fdset_id=2, fd=999) 11623e956bfSCorey Bryant self.assert_qmp(result, 'error/class', 'GenericError') 11723e956bfSCorey Bryant self.assert_qmp(result, 'error/desc', 11823e956bfSCorey Bryant 'File descriptor named \'fdset-id:2, fd:999\' not found') 11923e956bfSCorey Bryant self.vm.shutdown() 12023e956bfSCorey Bryant 12123e956bfSCorey Bryant def test_add_fd_invalid_fd(self): 12223e956bfSCorey Bryant result = self.vm.qmp('add-fd', fdset_id=2) 12323e956bfSCorey Bryant self.assert_qmp(result, 'error/class', 'GenericError') 12423e956bfSCorey Bryant self.assert_qmp(result, 'error/desc', 12523e956bfSCorey Bryant 'No file descriptor supplied via SCM_RIGHTS') 12623e956bfSCorey Bryant self.vm.shutdown() 12723e956bfSCorey Bryant 128*fd9c577bSWenchao Xia# Add fd at runtime, there are two ways: monitor related or fdset related 129*fd9c577bSWenchao Xiaclass TestSCMFd(iotests.QMPTestCase): 130*fd9c577bSWenchao Xia def setUp(self): 131*fd9c577bSWenchao Xia self.vm = iotests.VM() 132*fd9c577bSWenchao Xia qemu_img('create', '-f', iotests.imgfmt, image0, '128K') 133*fd9c577bSWenchao Xia # Add an unused monitor, to verify it works fine when two monitor 134*fd9c577bSWenchao Xia # instances present 135*fd9c577bSWenchao Xia self.vm.add_monitor_telnet("0",4445) 136*fd9c577bSWenchao Xia self.vm.launch() 137*fd9c577bSWenchao Xia 138*fd9c577bSWenchao Xia def tearDown(self): 139*fd9c577bSWenchao Xia self.vm.shutdown() 140*fd9c577bSWenchao Xia os.remove(image0) 141*fd9c577bSWenchao Xia 142*fd9c577bSWenchao Xia def _send_fd_by_SCM(self): 143*fd9c577bSWenchao Xia ret = self.vm.send_fd_scm(image0) 144*fd9c577bSWenchao Xia self.assertEqual(ret, 0, 'Failed to send fd with UNIX SCM') 145*fd9c577bSWenchao Xia 146*fd9c577bSWenchao Xia def test_add_fd(self): 147*fd9c577bSWenchao Xia self._send_fd_by_SCM() 148*fd9c577bSWenchao Xia result = self.vm.qmp('add-fd', fdset_id=2, opaque='image0:r') 149*fd9c577bSWenchao Xia self.assert_qmp(result, 'return/fdset-id', 2) 150*fd9c577bSWenchao Xia 151*fd9c577bSWenchao Xia def test_getfd(self): 152*fd9c577bSWenchao Xia self._send_fd_by_SCM() 153*fd9c577bSWenchao Xia result = self.vm.qmp('getfd', fdname='image0:r') 154*fd9c577bSWenchao Xia self.assert_qmp(result, 'return', {}) 155*fd9c577bSWenchao Xia 156*fd9c577bSWenchao Xia def test_getfd_invalid_fdname(self): 157*fd9c577bSWenchao Xia self._send_fd_by_SCM() 158*fd9c577bSWenchao Xia result = self.vm.qmp('getfd', fdname='0image0:r') 159*fd9c577bSWenchao Xia self.assert_qmp(result, 'error/class', 'GenericError') 160*fd9c577bSWenchao Xia self.assert_qmp(result, 'error/desc', 161*fd9c577bSWenchao Xia "Parameter 'fdname' expects a name not starting with a digit") 162*fd9c577bSWenchao Xia 163*fd9c577bSWenchao Xia def test_closefd(self): 164*fd9c577bSWenchao Xia self._send_fd_by_SCM() 165*fd9c577bSWenchao Xia result = self.vm.qmp('getfd', fdname='image0:r') 166*fd9c577bSWenchao Xia self.assert_qmp(result, 'return', {}) 167*fd9c577bSWenchao Xia result = self.vm.qmp('closefd', fdname='image0:r') 168*fd9c577bSWenchao Xia self.assert_qmp(result, 'return', {}) 169*fd9c577bSWenchao Xia 170*fd9c577bSWenchao Xia def test_closefd_fd_not_found(self): 171*fd9c577bSWenchao Xia fdname = 'image0:r' 172*fd9c577bSWenchao Xia result = self.vm.qmp('closefd', fdname=fdname) 173*fd9c577bSWenchao Xia self.assert_qmp(result, 'error/class', 'GenericError') 174*fd9c577bSWenchao Xia self.assert_qmp(result, 'error/desc', 175*fd9c577bSWenchao Xia "File descriptor named '%s' not found" % fdname) 176*fd9c577bSWenchao Xia 17723e956bfSCorey Bryantif __name__ == '__main__': 17823e956bfSCorey Bryant iotests.main(supported_fmts=['raw']) 179