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