Index: device/usb/usb_descriptors_unittest.cc |
diff --git a/device/usb/usb_descriptors_unittest.cc b/device/usb/usb_descriptors_unittest.cc |
index 402304f6b855fc25f0c008e1539ee6fa7e10fd66..5bc2943da6ee91b7dc223c37962497c7b4c6fa7c 100644 |
--- a/device/usb/usb_descriptors_unittest.cc |
+++ b/device/usb/usb_descriptors_unittest.cc |
@@ -32,6 +32,81 @@ void ExpectStringDescriptors( |
class UsbDescriptorsTest : public ::testing::Test {}; |
+TEST_F(UsbDescriptorsTest, NoInterfaceAssociations) { |
+ UsbConfigDescriptor config(1, false, false, 0); |
+ config.interfaces.emplace_back(0, 0, 255, 255, 255); |
+ config.interfaces.emplace_back(0, 1, 255, 255, 255); |
+ config.interfaces.emplace_back(1, 0, 255, 255, 255); |
+ config.AssignFirstInterfaceNumbers(); |
+ |
+ EXPECT_EQ(0, config.interfaces[0].first_interface); |
+ EXPECT_EQ(0, config.interfaces[1].first_interface); |
+ EXPECT_EQ(1, config.interfaces[2].first_interface); |
+} |
+ |
+TEST_F(UsbDescriptorsTest, InterfaceAssociations) { |
+ // Links interfaces 0 and 1 into a single function. |
+ static const uint8_t kIAD1[] = {0x08, 0x0b, 0x00, 0x02, |
+ 0xff, 0xff, 0xff, 0x00}; |
+ // Only references a single interface, 2. |
+ static const uint8_t kIAD2[] = {0x08, 0x0b, 0x02, 0x01, |
+ 0xff, 0xff, 0xff, 0x00}; |
+ // Malformed. References interface 3 but bInterfaceCount is 0. |
+ static const uint8_t kIAD3[] = {0x08, 0x0b, 0x03, 0x00, |
+ 0xff, 0xff, 0xff, 0x00}; |
+ // Malformed. References an indefined interface. |
+ static const uint8_t kIAD4[] = {0x08, 0x0b, 0x07, 0x00, |
+ 0xff, 0xff, 0xff, 0x00}; |
+ // Links interfaces 4 and 5 into a single function. |
+ static const uint8_t kIAD5[] = {0x08, 0x0b, 0x04, 0x01, |
+ 0xff, 0xff, 0xff, 0x00}; |
+ |
+ UsbConfigDescriptor config(1, false, false, 0); |
+ config.extra_data.assign(kIAD1, kIAD1 + sizeof(kIAD1)); |
+ config.extra_data.insert(config.extra_data.end(), kIAD2, |
+ kIAD2 + sizeof(kIAD2)); |
+ config.interfaces.emplace_back(0, 0, 255, 255, 255); |
+ config.interfaces.emplace_back(1, 0, 255, 255, 255); |
+ UsbInterfaceDescriptor iface1a(1, 1, 255, 255, 255); |
+ iface1a.extra_data.assign(kIAD3, kIAD3 + sizeof(kIAD3)); |
+ config.interfaces.push_back(std::move(iface1a)); |
+ config.interfaces.emplace_back(2, 0, 255, 255, 255); |
+ config.interfaces.emplace_back(3, 0, 255, 255, 255); |
+ UsbInterfaceDescriptor iface4(4, 0, 255, 255, 255); |
+ iface4.extra_data.assign(kIAD4, kIAD4 + sizeof(kIAD4)); |
+ iface4.extra_data.insert(iface4.extra_data.end(), kIAD5, |
+ kIAD5 + sizeof(kIAD5)); |
+ config.interfaces.push_back(std::move(iface4)); |
+ config.interfaces.emplace_back(5, 0, 255, 255, 255); |
+ config.AssignFirstInterfaceNumbers(); |
+ |
+ EXPECT_EQ(0, config.interfaces[0].first_interface); |
+ EXPECT_EQ(0, config.interfaces[1].first_interface); |
+ EXPECT_EQ(0, config.interfaces[2].first_interface); |
+ EXPECT_EQ(2, config.interfaces[3].first_interface); |
+ EXPECT_EQ(3, config.interfaces[4].first_interface); |
+ EXPECT_EQ(4, config.interfaces[5].first_interface); |
+ EXPECT_EQ(4, config.interfaces[5].first_interface); |
+} |
+ |
+TEST_F(UsbDescriptorsTest, CorruptInterfaceAssociations) { |
+ { |
+ // Descriptor is too short. |
+ static const uint8_t kIAD[] = {0x01}; |
+ UsbConfigDescriptor config(1, false, false, 0); |
+ config.extra_data.assign(kIAD, kIAD + sizeof(kIAD)); |
+ config.AssignFirstInterfaceNumbers(); |
+ } |
+ { |
+ // Descriptor is too long. |
+ static const uint8_t kIAD[] = {0x09, 0x0b, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00}; |
+ UsbConfigDescriptor config(1, false, false, 0); |
+ config.extra_data.assign(kIAD, kIAD + sizeof(kIAD)); |
+ config.AssignFirstInterfaceNumbers(); |
+ } |
+} |
+ |
TEST_F(UsbDescriptorsTest, StringDescriptor) { |
static const uint8_t kBuffer[] = {0x1a, 0x03, 'H', 0, 'e', 0, 'l', 0, 'l', 0, |
'o', 0, ' ', 0, 'w', 0, 'o', 0, 'r', 0, |