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.
11 import hid_descriptors
16 report_desc
= hid_descriptors
.ReportDescriptor(
17 hid_descriptors
.UsagePage(0xFF00), # Vendor Defined
18 hid_descriptors
.Usage(0x00),
19 hid_descriptors
.Collection(
20 hid_constants
.CollectionType
.APPLICATION
,
21 hid_descriptors
.LogicalMinimum(0, force_length
=1),
22 hid_descriptors
.LogicalMaximum(255, force_length
=2),
23 hid_descriptors
.ReportSize(8),
24 hid_descriptors
.ReportCount(8),
25 hid_descriptors
.Input(hid_descriptors
.Data
,
26 hid_descriptors
.Variable
,
27 hid_descriptors
.Absolute
,
28 hid_descriptors
.BufferedBytes
),
29 hid_descriptors
.Output(hid_descriptors
.Data
,
30 hid_descriptors
.Variable
,
31 hid_descriptors
.Absolute
,
32 hid_descriptors
.BufferedBytes
),
33 hid_descriptors
.Feature(hid_descriptors
.Data
,
34 hid_descriptors
.Variable
,
35 hid_descriptors
.Absolute
,
36 hid_descriptors
.BufferedBytes
)
40 combo_report_desc
= hid_descriptors
.ReportDescriptor(
41 hid_descriptors
.ReportID(1),
43 hid_descriptors
.ReportID(2),
48 class HidGadgetTest(unittest
.TestCase
):
50 def test_bad_intervals(self
):
51 with self
.assertRaisesRegexp(ValueError, 'Full speed'):
52 hid_gadget
.HidGadget(report_desc
, features
={}, interval_ms
=50000,
53 vendor_id
=0, product_id
=0)
54 with self
.assertRaisesRegexp(ValueError, 'High speed'):
55 hid_gadget
.HidGadget(report_desc
, features
={}, interval_ms
=5000,
56 vendor_id
=0, product_id
=0)
58 def test_get_string_descriptor(self
):
59 g
= hid_gadget
.HidGadget(report_desc
=report_desc
, features
={},
60 vendor_id
=0, product_id
=0)
62 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
63 g
.AddStringDescriptor(2, 'HID Gadget')
64 desc
= g
.ControlRead(0x80, 6, 0x0302, 0x0409, 255)
65 self
.assertEquals(desc
, '\x16\x03H\0I\0D\0 \0G\0a\0d\0g\0e\0t\0')
67 def test_get_report_descriptor(self
):
68 g
= hid_gadget
.HidGadget(report_desc
=report_desc
, features
={},
69 vendor_id
=0, product_id
=0)
71 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
72 desc
= g
.ControlRead(0x81, 6, 0x2200, 0, 63)
73 self
.assertEquals(desc
, report_desc
)
75 def test_set_idle(self
):
76 g
= hid_gadget
.HidGadget(report_desc
=report_desc
, features
={},
77 vendor_id
=0, product_id
=0)
79 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
80 self
.assertTrue(g
.ControlWrite(0x21, 0x0A, 0, 0, ''))
82 def test_class_wrong_target(self
):
83 g
= hid_gadget
.HidGadget(report_desc
=report_desc
, features
={},
84 vendor_id
=0, product_id
=0)
86 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
87 self
.assertIsNone(g
.ControlRead(0xA0, 0, 0, 0, 0)) # Device
88 self
.assertIsNone(g
.ControlRead(0xA1, 0, 0, 1, 0)) # Interface 1
89 self
.assertIsNone(g
.ControlWrite(0x20, 0, 0, 0, '')) # Device
90 self
.assertIsNone(g
.ControlWrite(0x21, 0, 0, 1, '')) # Interface 1
92 def test_send_report_zero(self
):
93 g
= hid_gadget
.HidGadget(report_desc
=report_desc
, features
={},
94 vendor_id
=0, product_id
=0)
96 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
97 g
.SendReport(0, 'Hello world!')
98 chip
.SendPacket
.assert_called_once_with(0x81, 'Hello world!')
100 def test_send_multiple_reports(self
):
101 g
= hid_gadget
.HidGadget(report_desc
=report_desc
, features
={},
102 vendor_id
=0, product_id
=0)
104 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
105 g
.SendReport(1, 'Hello!')
106 g
.SendReport(2, 'World!')
107 chip
.SendPacket
.assert_has_calls([
108 mock
.call(0x81, '\x01Hello!'),
109 mock
.call(0x81, '\x02World!'),
113 class TestFeature(hid_gadget
.HidFeature
):
115 def SetInputReport(self
, data
):
116 self
.input_report
= data
119 def SetOutputReport(self
, data
):
120 self
.output_report
= data
123 def SetFeatureReport(self
, data
):
124 self
.feature_report
= data
127 def GetInputReport(self
):
128 return 'Input report.'
130 def GetOutputReport(self
):
131 return 'Output report.'
133 def GetFeatureReport(self
):
134 return 'Feature report.'
137 class HidFeatureTest(unittest
.TestCase
):
139 def test_disconnected(self
):
140 feature
= TestFeature()
141 with self
.assertRaisesRegexp(RuntimeError, 'not connected'):
142 feature
.SendReport('Hello world!')
144 def test_send_report(self
):
145 feature
= TestFeature()
146 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
147 vendor_id
=0, product_id
=0)
149 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
150 feature
.SendReport('Hello world!')
151 chip
.SendPacket
.assert_called_once_with(0x81, '\x01Hello world!')
154 def test_get_bad_report(self
):
155 feature
= TestFeature()
156 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
157 vendor_id
=0, product_id
=0)
159 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
160 self
.assertIsNone(g
.ControlRead(0xA1, 1, 0x0102, 0, 8))
162 def test_set_bad_report(self
):
163 feature
= TestFeature()
164 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
165 vendor_id
=0, product_id
=0)
167 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
168 self
.assertIsNone(g
.ControlWrite(0x21, 0x09, 0x0102, 0, 'Hello!'))
170 def test_get_input_report(self
):
171 feature
= TestFeature()
172 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
173 vendor_id
=0, product_id
=0)
175 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
176 report
= g
.ControlRead(0xA1, 1, 0x0101, 0, 8)
177 self
.assertEquals(report
, 'Input re')
179 def test_set_input_report(self
):
180 feature
= TestFeature()
181 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
182 vendor_id
=0, product_id
=0)
184 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
185 self
.assertTrue(g
.ControlWrite(0x21, 0x09, 0x0101, 0, 'Hello!'))
186 self
.assertEquals(feature
.input_report
, 'Hello!')
188 def test_get_output_report(self
):
189 feature
= TestFeature()
190 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
191 vendor_id
=0, product_id
=0)
193 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
194 report
= g
.ControlRead(0xA1, 1, 0x0201, 0, 8)
195 self
.assertEquals(report
, 'Output r')
197 def test_set_output_report(self
):
198 feature
= TestFeature()
199 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
200 vendor_id
=0, product_id
=0)
202 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
203 self
.assertTrue(g
.ControlWrite(0x21, 0x09, 0x0201, 0, 'Hello!'))
204 self
.assertEquals(feature
.output_report
, 'Hello!')
206 def test_receive_interrupt(self
):
207 feature
= TestFeature()
208 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
209 vendor_id
=0, product_id
=0)
211 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
212 g
.SetConfiguration(1)
213 g
.ReceivePacket(0x01, '\x01Hello!')
214 self
.assertFalse(chip
.HaltEndpoint
.called
)
215 self
.assertEquals(feature
.output_report
, 'Hello!')
217 def test_receive_interrupt_report_zero(self
):
218 feature
= TestFeature()
219 g
= hid_gadget
.HidGadget(report_desc
, features
={0: feature
},
220 vendor_id
=0, product_id
=0)
222 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
223 g
.SetConfiguration(1)
224 g
.ReceivePacket(0x01, 'Hello!')
225 self
.assertFalse(chip
.HaltEndpoint
.called
)
226 self
.assertEquals(feature
.output_report
, 'Hello!')
228 def test_receive_bad_interrupt(self
):
229 feature
= TestFeature()
230 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
231 vendor_id
=0, product_id
=0)
233 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
234 g
.SetConfiguration(1)
235 g
.ReceivePacket(0x01, '\x00Hello!')
236 chip
.HaltEndpoint
.assert_called_once_with(0x01)
238 def test_get_feature_report(self
):
239 feature
= TestFeature()
240 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
241 vendor_id
=0, product_id
=0)
243 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
244 report
= g
.ControlRead(0xA1, 1, 0x0301, 0, 8)
245 self
.assertEquals(report
, 'Feature ')
247 def test_set_feature_report(self
):
248 feature
= TestFeature()
249 g
= hid_gadget
.HidGadget(report_desc
, features
={1: feature
},
250 vendor_id
=0, product_id
=0)
252 g
.Connected(chip
, usb_constants
.Speed
.HIGH
)
253 self
.assertTrue(g
.ControlWrite(0x21, 0x09, 0x0301, 0, 'Hello!'))
254 self
.assertEquals(feature
.feature_report
, 'Hello!')
257 if __name__
== '__main__':