Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: tools/usb_gadget/gadget_test.py

Issue 407353002: [usb_gadget p02] Basic USB device implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed copyright text and added specification references. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/usb_gadget/gadget.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/python
2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 import unittest
7
8 import mock
9
10 import gadget
11 import usb_constants
12 import usb_descriptors
13
14
15 device_desc = usb_descriptors.DeviceDescriptor(
16 idVendor=0x18D1, # Google Inc.
17 idProduct=0xFF00,
18 bcdUSB=0x0200,
19 iManufacturer=1,
20 iProduct=2,
21 iSerialNumber=3,
22 bNumConfigurations=1,
23 bcdDevice=0x0100)
24
25 fs_config_desc = usb_descriptors.ConfigurationDescriptor(
26 bmAttributes=0xC0,
27 MaxPower=50)
28
29 fs_interface_desc = usb_descriptors.InterfaceDescriptor(
30 bInterfaceNumber=0
31 )
32 fs_config_desc.AddInterface(fs_interface_desc)
33
34 fs_bulk_in_endpoint_desc = usb_descriptors.EndpointDescriptor(
35 bEndpointAddress=0x01,
36 bmAttributes=usb_constants.TransferType.BULK,
37 wMaxPacketSize=64,
38 bInterval=0
39 )
40 fs_interface_desc.AddEndpoint(fs_bulk_in_endpoint_desc)
41
42 fs_bulk_out_endpoint_desc = usb_descriptors.EndpointDescriptor(
43 bEndpointAddress=0x81,
44 bmAttributes=usb_constants.TransferType.BULK,
45 wMaxPacketSize=64,
46 bInterval=0
47 )
48 fs_interface_desc.AddEndpoint(fs_bulk_out_endpoint_desc)
49
50 fs_alt_interface_desc = usb_descriptors.InterfaceDescriptor(
51 bInterfaceNumber=0,
52 bAlternateSetting=1
53 )
54 fs_config_desc.AddInterface(fs_alt_interface_desc)
55
56 fs_interrupt_in_endpoint_desc = usb_descriptors.EndpointDescriptor(
57 bEndpointAddress=0x01,
58 bmAttributes=usb_constants.TransferType.INTERRUPT,
59 wMaxPacketSize=64,
60 bInterval=1
61 )
62 fs_alt_interface_desc.AddEndpoint(fs_interrupt_in_endpoint_desc)
63
64 fs_interrupt_out_endpoint_desc = usb_descriptors.EndpointDescriptor(
65 bEndpointAddress=0x81,
66 bmAttributes=usb_constants.TransferType.INTERRUPT,
67 wMaxPacketSize=64,
68 bInterval=1
69 )
70 fs_alt_interface_desc.AddEndpoint(fs_interrupt_out_endpoint_desc)
71
72 hs_config_desc = usb_descriptors.ConfigurationDescriptor(
73 bmAttributes=0xC0,
74 MaxPower=50)
75
76 hs_interface_desc = usb_descriptors.InterfaceDescriptor(
77 bInterfaceNumber=0
78 )
79 hs_config_desc.AddInterface(hs_interface_desc)
80
81 hs_bulk_in_endpoint_desc = usb_descriptors.EndpointDescriptor(
82 bEndpointAddress=0x01,
83 bmAttributes=usb_constants.TransferType.BULK,
84 wMaxPacketSize=512,
85 bInterval=0
86 )
87 hs_interface_desc.AddEndpoint(hs_bulk_in_endpoint_desc)
88
89 hs_bulk_out_endpoint_desc = usb_descriptors.EndpointDescriptor(
90 bEndpointAddress=0x81,
91 bmAttributes=usb_constants.TransferType.BULK,
92 wMaxPacketSize=512,
93 bInterval=0
94 )
95 hs_interface_desc.AddEndpoint(hs_bulk_out_endpoint_desc)
96
97 hs_alt_interface_desc = usb_descriptors.InterfaceDescriptor(
98 bInterfaceNumber=0,
99 bAlternateSetting=1
100 )
101 hs_config_desc.AddInterface(hs_alt_interface_desc)
102
103 hs_interrupt_in_endpoint_desc = usb_descriptors.EndpointDescriptor(
104 bEndpointAddress=0x01,
105 bmAttributes=usb_constants.TransferType.INTERRUPT,
106 wMaxPacketSize=256,
107 bInterval=1
108 )
109 hs_alt_interface_desc.AddEndpoint(hs_interrupt_in_endpoint_desc)
110
111 hs_interrupt_out_endpoint_desc = usb_descriptors.EndpointDescriptor(
112 bEndpointAddress=0x81,
113 bmAttributes=usb_constants.TransferType.INTERRUPT,
114 wMaxPacketSize=256,
115 bInterval=1
116 )
117 hs_alt_interface_desc.AddEndpoint(hs_interrupt_out_endpoint_desc)
118
119
120 class GadgetTest(unittest.TestCase):
121
122 def test_get_descriptors(self):
123 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
124 self.assertEquals(g.GetDeviceDescriptor(), device_desc)
125 self.assertEquals(g.GetFullSpeedConfigurationDescriptor(), fs_config_desc)
126 self.assertEquals(g.GetHighSpeedConfigurationDescriptor(), hs_config_desc)
127 with self.assertRaisesRegexp(RuntimeError, 'not connected'):
128 g.GetConfigurationDescriptor()
129
130 def test_connect_full_speed(self):
131 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
132 g.Connected(mock.Mock(), usb_constants.Speed.FULL)
133 self.assertTrue(g.IsConnected())
134 self.assertEquals(g.GetSpeed(), usb_constants.Speed.FULL)
135 self.assertEquals(g.GetConfigurationDescriptor(), fs_config_desc)
136 g.Disconnected()
137 self.assertFalse(g.IsConnected())
138
139 def test_connect_high_speed(self):
140 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
141 g.Connected(mock.Mock(), usb_constants.Speed.HIGH)
142 self.assertTrue(g.IsConnected())
143 self.assertEquals(g.GetSpeed(), usb_constants.Speed.HIGH)
144 self.assertEquals(g.GetConfigurationDescriptor(), hs_config_desc)
145 g.Disconnected()
146 self.assertFalse(g.IsConnected())
147
148 def test_string_index_out_of_range(self):
149 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
150 with self.assertRaisesRegexp(ValueError, 'index out of range'):
151 g.AddStringDescriptor(0, 'Hello world!')
152
153 def test_language_id_out_of_range(self):
154 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
155 with self.assertRaisesRegexp(ValueError, 'language code out of range'):
156 g.AddStringDescriptor(1, 'Hello world!', lang=-1)
157
158 def test_get_languages(self):
159 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
160 g.AddStringDescriptor(1, 'Hello world!')
161 desc = g.ControlRead(0x80, 6, 0x0300, 0, 255)
162 self.assertEquals(desc, '\x04\x03\x09\x04')
163
164 def test_get_string_descriptor(self):
165 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
166 g.AddStringDescriptor(1, 'Hello world!')
167 desc = g.ControlRead(0x80, 6, 0x0301, 0x0409, 255)
168 self.assertEquals(desc, '\x1A\x03H\0e\0l\0l\0o\0 \0w\0o\0r\0l\0d\0!\0')
169
170 def test_get_missing_string_descriptor(self):
171 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
172 g.AddStringDescriptor(1, 'Hello world!')
173 desc = g.ControlRead(0x80, 6, 0x0302, 0x0409, 255)
174 self.assertEquals(desc, None)
175
176 def test_get_missing_string_language(self):
177 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
178 g.AddStringDescriptor(1, 'Hello world!')
179 desc = g.ControlRead(0x80, 6, 0x0301, 0x040C, 255)
180 self.assertEquals(desc, None)
181
182 def test_class_and_vendor_transfers(self):
183 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
184 self.assertIsNone(g.ControlRead(0xA0, 0, 0, 0, 0))
185 self.assertIsNone(g.ControlRead(0xC0, 0, 0, 0, 0))
186 self.assertIsNone(g.ControlWrite(0x20, 0, 0, 0, ''))
187 self.assertIsNone(g.ControlWrite(0x40, 0, 0, 0, ''))
188
189 def test_set_configuration(self):
190 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
191 chip = mock.Mock()
192 g.Connected(chip, usb_constants.Speed.HIGH)
193 g.ControlWrite(0, 9, 1, 0, 0)
194 chip.StartEndpoint.assert_has_calls([
195 mock.call(hs_bulk_in_endpoint_desc),
196 mock.call(hs_bulk_out_endpoint_desc)
197 ])
198
199 def test_set_configuration_zero(self):
200 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
201 chip = mock.Mock()
202 g.Connected(chip, usb_constants.Speed.HIGH)
203 g.ControlWrite(0, 9, 1, 0, 0)
204 chip.StartEndpoint.reset_mock()
205 g.ControlWrite(0, 9, 0, 0, 0)
206 chip.StopEndpoint.assert_has_calls([
207 mock.call(0x01),
208 mock.call(0x81)
209 ])
210
211 def test_set_bad_configuration(self):
212 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
213 g.Connected(mock.Mock(), usb_constants.Speed.HIGH)
214 self.assertIsNone(g.ControlWrite(0, 9, 2, 0, 0))
215
216 def test_set_interface(self):
217 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
218 chip = mock.Mock()
219 g.Connected(chip, usb_constants.Speed.HIGH)
220 self.assertTrue(g.ControlWrite(0, 9, 1, 0, 0))
221 chip.reset_mock()
222 self.assertTrue(g.ControlWrite(1, 11, 1, 0, 0))
223 chip.StopEndpoint.assert_has_calls([
224 mock.call(0x01),
225 mock.call(0x81)
226 ])
227 chip.StartEndpoint.assert_has_calls([
228 mock.call(hs_interrupt_in_endpoint_desc),
229 mock.call(hs_interrupt_out_endpoint_desc)
230 ])
231 chip.reset_mock()
232 self.assertTrue(g.ControlWrite(1, 11, 0, 0, 0))
233 chip.StopEndpoint.assert_has_calls([
234 mock.call(0x01),
235 mock.call(0x81)
236 ])
237 chip.StartEndpoint.assert_has_calls([
238 mock.call(hs_bulk_in_endpoint_desc),
239 mock.call(hs_bulk_out_endpoint_desc)
240 ])
241
242 def test_set_bad_interface(self):
243 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
244 g.Connected(mock.Mock(), usb_constants.Speed.HIGH)
245 self.assertTrue(g.ControlWrite(0, 9, 1, 0, 0))
246 self.assertIsNone(g.ControlWrite(1, 11, 0, 1, 0))
247
248 def test_send_packet(self):
249 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
250 chip = mock.Mock()
251 g.Connected(chip, usb_constants.Speed.HIGH)
252 g.SendPacket(0x81, 'Hello world!')
253 chip.SendPacket.assert_called_once_with(0x81, 'Hello world!')
254
255 def test_send_packet_disconnected(self):
256 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
257 with self.assertRaisesRegexp(RuntimeError, 'not connected'):
258 g.SendPacket(0x81, 'Hello world!')
259 g.Connected(mock.Mock(), usb_constants.Speed.HIGH)
260 g.SendPacket(0x81, 'Hello world!')
261 g.Disconnected()
262 with self.assertRaisesRegexp(RuntimeError, 'not connected'):
263 g.SendPacket(0x81, 'Hello world!')
264
265 def test_send_invalid_endpoint(self):
266 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
267 chip = mock.Mock()
268 g.Connected(chip, usb_constants.Speed.HIGH)
269 with self.assertRaisesRegexp(ValueError, 'non-input endpoint'):
270 g.SendPacket(0x01, 'Hello world!')
271
272 def test_receive_packet(self):
273 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
274 self.assertIsNone(g.ReceivePacket(0x01, 'Hello world!'))
275
276 def test_halt_endpoint(self):
277 g = gadget.Gadget(device_desc, fs_config_desc, hs_config_desc)
278 chip = mock.Mock()
279 g.Connected(chip, usb_constants.Speed.HIGH)
280 g.HaltEndpoint(0x01)
281 chip.HaltEndpoint.assert_called_once_with(0x01)
282
283
284 if __name__ == '__main__':
285 unittest.main()
OLDNEW
« no previous file with comments | « tools/usb_gadget/gadget.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698