Statistics
| Branch: | Revision:

root / tests / qemu-iotests / 045 @ 9a05feab

History | View | Annotate | Download (7.1 kB)

1 23e956bf Corey Bryant
#!/usr/bin/env python
2 23e956bf Corey Bryant
#
3 fd9c577b Wenchao Xia
# Tests for fdsets and getfd.
4 23e956bf Corey Bryant
#
5 23e956bf Corey Bryant
# Copyright (C) 2012 IBM Corp.
6 23e956bf Corey Bryant
#
7 23e956bf Corey Bryant
# This program is free software; you can redistribute it and/or modify
8 23e956bf Corey Bryant
# it under the terms of the GNU General Public License as published by
9 23e956bf Corey Bryant
# the Free Software Foundation; either version 2 of the License, or
10 23e956bf Corey Bryant
# (at your option) any later version.
11 23e956bf Corey Bryant
#
12 23e956bf Corey Bryant
# This program is distributed in the hope that it will be useful,
13 23e956bf Corey Bryant
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14 23e956bf Corey Bryant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 23e956bf Corey Bryant
# GNU General Public License for more details.
16 23e956bf Corey Bryant
#
17 23e956bf Corey Bryant
# You should have received a copy of the GNU General Public License
18 23e956bf Corey Bryant
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 23e956bf Corey Bryant
#
20 23e956bf Corey Bryant
21 23e956bf Corey Bryant
import os
22 23e956bf Corey Bryant
import iotests
23 23e956bf Corey Bryant
from iotests import qemu_img
24 23e956bf Corey Bryant
25 23e956bf Corey Bryant
image0 = os.path.join(iotests.test_dir, 'image0')
26 23e956bf Corey Bryant
image1 = os.path.join(iotests.test_dir, 'image1')
27 23e956bf Corey Bryant
image2 = os.path.join(iotests.test_dir, 'image2')
28 23e956bf Corey Bryant
image3 = os.path.join(iotests.test_dir, 'image3')
29 23e956bf Corey Bryant
image4 = os.path.join(iotests.test_dir, 'image4')
30 23e956bf Corey Bryant
31 23e956bf Corey Bryant
class TestFdSets(iotests.QMPTestCase):
32 23e956bf Corey Bryant
33 23e956bf Corey Bryant
    def setUp(self):
34 23e956bf Corey Bryant
        self.vm = iotests.VM()
35 23e956bf Corey Bryant
        qemu_img('create', '-f', iotests.imgfmt, image0, '128K')
36 23e956bf Corey Bryant
        qemu_img('create', '-f', iotests.imgfmt, image1, '128K')
37 23e956bf Corey Bryant
        qemu_img('create', '-f', iotests.imgfmt, image2, '128K')
38 23e956bf Corey Bryant
        qemu_img('create', '-f', iotests.imgfmt, image3, '128K')
39 23e956bf Corey Bryant
        qemu_img('create', '-f', iotests.imgfmt, image4, '128K')
40 23e956bf Corey Bryant
        self.file0 = open(image0, 'r')
41 23e956bf Corey Bryant
        self.file1 = open(image1, 'w+')
42 23e956bf Corey Bryant
        self.file2 = open(image2, 'r')
43 23e956bf Corey Bryant
        self.file3 = open(image3, 'r')
44 23e956bf Corey Bryant
        self.file4 = open(image4, 'r')
45 23e956bf Corey Bryant
        self.vm.add_fd(self.file0.fileno(), 1, 'image0:r')
46 23e956bf Corey Bryant
        self.vm.add_fd(self.file1.fileno(), 1, 'image1:w+')
47 23e956bf Corey Bryant
        self.vm.add_fd(self.file2.fileno(), 0, 'image2:r')
48 23e956bf Corey Bryant
        self.vm.add_fd(self.file3.fileno(), 2, 'image3:r')
49 23e956bf Corey Bryant
        self.vm.add_fd(self.file4.fileno(), 2, 'image4:r')
50 23e956bf Corey Bryant
        self.vm.add_drive("/dev/fdset/1")
51 23e956bf Corey Bryant
        self.vm.launch()
52 23e956bf Corey Bryant
53 23e956bf Corey Bryant
    def tearDown(self):
54 23e956bf Corey Bryant
        self.vm.shutdown()
55 23e956bf Corey Bryant
        self.file0.close()
56 23e956bf Corey Bryant
        self.file1.close()
57 23e956bf Corey Bryant
        self.file2.close()
58 23e956bf Corey Bryant
        self.file3.close()
59 23e956bf Corey Bryant
        self.file4.close()
60 23e956bf Corey Bryant
        os.remove(image0)
61 23e956bf Corey Bryant
        os.remove(image1)
62 23e956bf Corey Bryant
        os.remove(image2)
63 23e956bf Corey Bryant
        os.remove(image3)
64 23e956bf Corey Bryant
        os.remove(image4)
65 23e956bf Corey Bryant
66 23e956bf Corey Bryant
    def test_query_fdset(self):
67 23e956bf Corey Bryant
        result = self.vm.qmp('query-fdsets')
68 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fdset-id', 2)
69 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fdset-id', 1)
70 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[2]/fdset-id', 0)
71 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image3:r')
72 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fds[1]/opaque', 'image4:r')
73 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image0:r')
74 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fds[1]/opaque', 'image1:w+')
75 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[2]/fds[0]/opaque', 'image2:r')
76 23e956bf Corey Bryant
        self.vm.shutdown()
77 23e956bf Corey Bryant
78 23e956bf Corey Bryant
    def test_remove_fdset(self):
79 23e956bf Corey Bryant
        result = self.vm.qmp('remove-fd', fdset_id=2)
80 23e956bf Corey Bryant
        self.assert_qmp(result, 'return', {})
81 23e956bf Corey Bryant
        result = self.vm.qmp('query-fdsets')
82 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fdset-id', 1)
83 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fdset-id', 0)
84 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image0:r')
85 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fds[1]/opaque', 'image1:w+')
86 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image2:r')
87 23e956bf Corey Bryant
        self.vm.shutdown()
88 23e956bf Corey Bryant
89 23e956bf Corey Bryant
    def test_remove_fd(self):
90 23e956bf Corey Bryant
        result = self.vm.qmp('query-fdsets')
91 23e956bf Corey Bryant
        fd_image3 = result['return'][0]['fds'][0]['fd']
92 23e956bf Corey Bryant
        result = self.vm.qmp('remove-fd', fdset_id=2, fd=fd_image3)
93 23e956bf Corey Bryant
        self.assert_qmp(result, 'return', {})
94 23e956bf Corey Bryant
        result = self.vm.qmp('query-fdsets')
95 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fdset-id', 2)
96 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fdset-id', 1)
97 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[2]/fdset-id', 0)
98 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image4:r')
99 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image0:r')
100 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[1]/fds[1]/opaque', 'image1:w+')
101 23e956bf Corey Bryant
        self.assert_qmp(result, 'return[2]/fds[0]/opaque', 'image2:r')
102 23e956bf Corey Bryant
        self.vm.shutdown()
103 23e956bf Corey Bryant
104 23e956bf Corey Bryant
    def test_remove_fd_invalid_fdset(self):
105 23e956bf Corey Bryant
        result = self.vm.qmp('query-fdsets')
106 23e956bf Corey Bryant
        fd_image3 = result['return'][0]['fds'][0]['fd']
107 23e956bf Corey Bryant
        result = self.vm.qmp('remove-fd', fdset_id=3, fd=fd_image3)
108 23e956bf Corey Bryant
        self.assert_qmp(result, 'error/class', 'GenericError')
109 23e956bf Corey Bryant
        self.assert_qmp(result, 'error/desc',
110 23e956bf Corey Bryant
            'File descriptor named \'fdset-id:3, fd:%d\' not found' % fd_image3)
111 23e956bf Corey Bryant
        self.vm.shutdown()
112 23e956bf Corey Bryant
113 23e956bf Corey Bryant
    def test_remove_fd_invalid_fd(self):
114 23e956bf Corey Bryant
        result = self.vm.qmp('query-fdsets')
115 23e956bf Corey Bryant
        result = self.vm.qmp('remove-fd', fdset_id=2, fd=999)
116 23e956bf Corey Bryant
        self.assert_qmp(result, 'error/class', 'GenericError')
117 23e956bf Corey Bryant
        self.assert_qmp(result, 'error/desc',
118 23e956bf Corey Bryant
            'File descriptor named \'fdset-id:2, fd:999\' not found')
119 23e956bf Corey Bryant
        self.vm.shutdown()
120 23e956bf Corey Bryant
121 23e956bf Corey Bryant
    def test_add_fd_invalid_fd(self):
122 23e956bf Corey Bryant
        result = self.vm.qmp('add-fd', fdset_id=2)
123 23e956bf Corey Bryant
        self.assert_qmp(result, 'error/class', 'GenericError')
124 23e956bf Corey Bryant
        self.assert_qmp(result, 'error/desc',
125 23e956bf Corey Bryant
                'No file descriptor supplied via SCM_RIGHTS')
126 23e956bf Corey Bryant
        self.vm.shutdown()
127 23e956bf Corey Bryant
128 fd9c577b Wenchao Xia
# Add fd at runtime, there are two ways: monitor related or fdset related
129 fd9c577b Wenchao Xia
class TestSCMFd(iotests.QMPTestCase):
130 fd9c577b Wenchao Xia
    def setUp(self):
131 fd9c577b Wenchao Xia
        self.vm = iotests.VM()
132 fd9c577b Wenchao Xia
        qemu_img('create', '-f', iotests.imgfmt, image0, '128K')
133 fd9c577b Wenchao Xia
        # Add an unused monitor, to verify it works fine when two monitor
134 fd9c577b Wenchao Xia
        # instances present
135 fd9c577b Wenchao Xia
        self.vm.add_monitor_telnet("0",4445)
136 fd9c577b Wenchao Xia
        self.vm.launch()
137 fd9c577b Wenchao Xia
138 fd9c577b Wenchao Xia
    def tearDown(self):
139 fd9c577b Wenchao Xia
        self.vm.shutdown()
140 fd9c577b Wenchao Xia
        os.remove(image0)
141 fd9c577b Wenchao Xia
142 fd9c577b Wenchao Xia
    def _send_fd_by_SCM(self):
143 fd9c577b Wenchao Xia
        ret = self.vm.send_fd_scm(image0)
144 fd9c577b Wenchao Xia
        self.assertEqual(ret, 0, 'Failed to send fd with UNIX SCM')
145 fd9c577b Wenchao Xia
146 fd9c577b Wenchao Xia
    def test_add_fd(self):
147 fd9c577b Wenchao Xia
        self._send_fd_by_SCM()
148 fd9c577b Wenchao Xia
        result = self.vm.qmp('add-fd', fdset_id=2, opaque='image0:r')
149 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'return/fdset-id', 2)
150 fd9c577b Wenchao Xia
151 fd9c577b Wenchao Xia
    def test_getfd(self):
152 fd9c577b Wenchao Xia
        self._send_fd_by_SCM()
153 fd9c577b Wenchao Xia
        result = self.vm.qmp('getfd', fdname='image0:r')
154 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'return', {})
155 fd9c577b Wenchao Xia
156 fd9c577b Wenchao Xia
    def test_getfd_invalid_fdname(self):
157 fd9c577b Wenchao Xia
        self._send_fd_by_SCM()
158 fd9c577b Wenchao Xia
        result = self.vm.qmp('getfd', fdname='0image0:r')
159 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'error/class', 'GenericError')
160 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'error/desc',
161 fd9c577b Wenchao Xia
            "Parameter 'fdname' expects a name not starting with a digit")
162 fd9c577b Wenchao Xia
163 fd9c577b Wenchao Xia
    def test_closefd(self):
164 fd9c577b Wenchao Xia
        self._send_fd_by_SCM()
165 fd9c577b Wenchao Xia
        result = self.vm.qmp('getfd', fdname='image0:r')
166 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'return', {})
167 fd9c577b Wenchao Xia
        result = self.vm.qmp('closefd', fdname='image0:r')
168 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'return', {})
169 fd9c577b Wenchao Xia
170 fd9c577b Wenchao Xia
    def test_closefd_fd_not_found(self):
171 fd9c577b Wenchao Xia
        fdname = 'image0:r'
172 fd9c577b Wenchao Xia
        result = self.vm.qmp('closefd', fdname=fdname)
173 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'error/class', 'GenericError')
174 fd9c577b Wenchao Xia
        self.assert_qmp(result, 'error/desc',
175 fd9c577b Wenchao Xia
            "File descriptor named '%s' not found" % fdname)
176 fd9c577b Wenchao Xia
177 23e956bf Corey Bryant
if __name__ == '__main__':
178 23e956bf Corey Bryant
    iotests.main(supported_fmts=['raw'])