OLD | NEW |
(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 usb_descriptors |
| 9 |
| 10 |
| 11 class DescriptorWithField(usb_descriptors.Descriptor): |
| 12 pass |
| 13 |
| 14 DescriptorWithField.AddField('bField', 'B') |
| 15 |
| 16 |
| 17 class DescriptorWithDefault(usb_descriptors.Descriptor): |
| 18 pass |
| 19 |
| 20 DescriptorWithDefault.AddField('bDefault', 'B', default=42) |
| 21 |
| 22 |
| 23 class DescriptorWithFixed(usb_descriptors.Descriptor): |
| 24 pass |
| 25 |
| 26 DescriptorWithFixed.AddFixedField('bFixed', 'B', 42) |
| 27 |
| 28 |
| 29 class DescriptorWithComputed(usb_descriptors.Descriptor): |
| 30 |
| 31 @property |
| 32 def foo(self): |
| 33 return 42 |
| 34 |
| 35 DescriptorWithComputed.AddComputedField('bComputed', 'B', 'foo') |
| 36 |
| 37 |
| 38 class DescriptorWithDescriptors(usb_descriptors.DescriptorContainer): |
| 39 pass |
| 40 |
| 41 DescriptorWithDescriptors.AddField('bType', 'B') |
| 42 |
| 43 |
| 44 class DescriptorTest(unittest.TestCase): |
| 45 |
| 46 def test_default(self): |
| 47 obj = DescriptorWithDefault() |
| 48 self.assertEquals(obj.bDefault, 42) |
| 49 |
| 50 def test_change_default(self): |
| 51 obj = DescriptorWithDefault() |
| 52 obj.bDefault = 1 |
| 53 self.assertEquals(obj.bDefault, 1) |
| 54 |
| 55 def test_override_default(self): |
| 56 obj = DescriptorWithDefault(bDefault=56) |
| 57 self.assertEquals(obj.bDefault, 56) |
| 58 |
| 59 def test_fixed(self): |
| 60 obj = DescriptorWithFixed() |
| 61 self.assertEquals(obj.bFixed, 42) |
| 62 |
| 63 def test_set_fixed(self): |
| 64 with self.assertRaises(RuntimeError): |
| 65 DescriptorWithFixed(bFixed=1) |
| 66 |
| 67 def test_modify_fixed(self): |
| 68 obj = DescriptorWithFixed() |
| 69 with self.assertRaises(RuntimeError): |
| 70 obj.bFixed = 1 |
| 71 |
| 72 def test_computed(self): |
| 73 obj = DescriptorWithComputed() |
| 74 self.assertEquals(obj.bComputed, 42) |
| 75 |
| 76 def test_set_computed(self): |
| 77 with self.assertRaises(RuntimeError): |
| 78 DescriptorWithComputed(bComputed=1) |
| 79 |
| 80 def test_modify_computed(self): |
| 81 obj = DescriptorWithComputed() |
| 82 with self.assertRaises(RuntimeError): |
| 83 obj.bComputed = 1 |
| 84 |
| 85 def test_unexpected(self): |
| 86 with self.assertRaisesRegexp(TypeError, 'Unexpected'): |
| 87 DescriptorWithField(bUnexpected=1) |
| 88 |
| 89 def test_missing(self): |
| 90 with self.assertRaisesRegexp(TypeError, 'Missing'): |
| 91 DescriptorWithField() |
| 92 |
| 93 def test_size(self): |
| 94 obj = DescriptorWithField(bField=42) |
| 95 self.assertEquals(obj.struct_size, 1) |
| 96 self.assertEquals(obj.total_size, 1) |
| 97 |
| 98 def test_encode(self): |
| 99 obj = DescriptorWithField(bField=0xff) |
| 100 self.assertEquals(obj.Encode(), '\xff') |
| 101 |
| 102 def test_string(self): |
| 103 obj = DescriptorWithField(bField=42) |
| 104 string = str(obj) |
| 105 self.assertIn('bField', string) |
| 106 self.assertIn('42', string) |
| 107 |
| 108 def test_container(self): |
| 109 parent = DescriptorWithDescriptors(bType=0) |
| 110 child1 = DescriptorWithField(bField=1) |
| 111 parent.Add(child1) |
| 112 child2 = DescriptorWithField(bField=2) |
| 113 parent.Add(child2) |
| 114 self.assertEquals(parent.total_size, 3) |
| 115 self.assertEquals(parent.Encode(), '\x00\x01\x02') |
| 116 string = str(parent) |
| 117 self.assertIn('bType', string) |
| 118 self.assertIn('bField', string) |
| 119 |
| 120 |
| 121 class TestUsbDescriptors(unittest.TestCase): |
| 122 |
| 123 def test_device_descriptor(self): |
| 124 device_desc = usb_descriptors.DeviceDescriptor( |
| 125 idVendor=0xDEAD, |
| 126 idProduct=0xBEEF, |
| 127 bcdDevice=0x0100, |
| 128 bNumConfigurations=1) |
| 129 self.assertEquals( |
| 130 device_desc.Encode(), |
| 131 '\x12\x01\x00\x02\x00\x00\x00\x40\xAD\xDE\xEF\xBE\x00\x01\x00\x00\x00' |
| 132 '\x01') |
| 133 |
| 134 def test_unique_interfaces(self): |
| 135 interface_desc1 = usb_descriptors.InterfaceDescriptor(bInterfaceNumber=1) |
| 136 interface_desc2 = usb_descriptors.InterfaceDescriptor(bInterfaceNumber=1, |
| 137 bAlternateSetting=1) |
| 138 interface_desc3 = usb_descriptors.InterfaceDescriptor(bInterfaceNumber=1) |
| 139 |
| 140 configuration_desc = usb_descriptors.ConfigurationDescriptor( |
| 141 bmAttributes=0xC0, |
| 142 MaxPower=100) |
| 143 configuration_desc.AddInterface(interface_desc1) |
| 144 configuration_desc.AddInterface(interface_desc2) |
| 145 with self.assertRaisesRegexp(RuntimeError, r'Interface 1 \(alternate 0\)'): |
| 146 configuration_desc.AddInterface(interface_desc3) |
| 147 |
| 148 def test_unique_endpoints(self): |
| 149 endpoint_desc1 = usb_descriptors.EndpointDescriptor( |
| 150 bEndpointAddress=0x01, |
| 151 bmAttributes=0x02, |
| 152 wMaxPacketSize=64, |
| 153 bInterval=1) |
| 154 endpoint_desc2 = usb_descriptors.EndpointDescriptor( |
| 155 bEndpointAddress=0x81, |
| 156 bmAttributes=0x02, |
| 157 wMaxPacketSize=64, |
| 158 bInterval=1) |
| 159 endpoint_desc3 = usb_descriptors.EndpointDescriptor( |
| 160 bEndpointAddress=0x01, |
| 161 bmAttributes=0x01, |
| 162 wMaxPacketSize=32, |
| 163 bInterval=10) |
| 164 |
| 165 interface_desc = usb_descriptors.InterfaceDescriptor(bInterfaceNumber=1) |
| 166 interface_desc.AddEndpoint(endpoint_desc1) |
| 167 interface_desc.AddEndpoint(endpoint_desc2) |
| 168 with self.assertRaisesRegexp(RuntimeError, 'Endpoint 0x01 already defined'): |
| 169 interface_desc.AddEndpoint(endpoint_desc3) |
| 170 |
| 171 def test_configuration_descriptor(self): |
| 172 endpoint_desc = usb_descriptors.EndpointDescriptor( |
| 173 bEndpointAddress=0x01, |
| 174 bmAttributes=0x02, |
| 175 wMaxPacketSize=64, |
| 176 bInterval=1) |
| 177 encoded_endpoint = '\x07\x05\x01\x02\x40\x00\x01' |
| 178 self.assertEquals(endpoint_desc.Encode(), encoded_endpoint) |
| 179 |
| 180 interface_desc = usb_descriptors.InterfaceDescriptor(bInterfaceNumber=1) |
| 181 interface_desc.AddEndpoint(endpoint_desc) |
| 182 self.assertEquals([endpoint_desc], interface_desc.GetEndpoints()) |
| 183 encoded_interface = ('\x09\x04\x01\x00\x01\xFF\xFF\xFF\x00' + |
| 184 encoded_endpoint) |
| 185 self.assertEquals(interface_desc.Encode(), encoded_interface) |
| 186 |
| 187 configuration_desc = usb_descriptors.ConfigurationDescriptor( |
| 188 bmAttributes=0xC0, |
| 189 MaxPower=100) |
| 190 configuration_desc.AddInterface(interface_desc) |
| 191 self.assertEquals([interface_desc], configuration_desc.GetInterfaces()) |
| 192 encoded_configuration = ('\x09\x02\x19\x00\x01\x01\x00\xC0\x64' + |
| 193 encoded_interface) |
| 194 self.assertEquals(configuration_desc.Encode(), encoded_configuration) |
| 195 |
| 196 def test_encode_hid_descriptor(self): |
| 197 hid_desc = usb_descriptors.HidDescriptor() |
| 198 hid_desc.AddDescriptor(0x22, 0x80) |
| 199 hid_desc.AddDescriptor(0x23, 0x60) |
| 200 encoded_desc = '\x0C\x21\x11\x01\x00\x02\x22\x80\x00\x23\x60\x00' |
| 201 self.assertEquals(hid_desc.Encode(), encoded_desc) |
| 202 |
| 203 def test_print_hid_descriptor(self): |
| 204 hid_desc = usb_descriptors.HidDescriptor() |
| 205 hid_desc.AddDescriptor(0x22, 0x80) |
| 206 hid_desc.AddDescriptor(0x23, 0x60) |
| 207 string = str(hid_desc) |
| 208 self.assertIn('0x22', string) |
| 209 self.assertIn('0x23', string) |
| 210 |
| 211 |
| 212 if __name__ == '__main__': |
| 213 unittest.main() |
OLD | NEW |