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