usb_descriptors_test.py 6.7 KB

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