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..560ac3715df0512843a27eee9fd01527a7ba0d01 100644 |
--- a/device/usb/usb_descriptors_unittest.cc |
+++ b/device/usb/usb_descriptors_unittest.cc |
@@ -32,6 +32,100 @@ 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}; |
+ // Links interfaces 4 and 5 into a single function. |
+ static const uint8_t kIAD4[] = {0x08, 0x0b, 0x04, 0x02, |
+ 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)); |
+ config.interfaces.push_back(std::move(iface4)); |
+ config.interfaces.emplace_back(5, 0, 255, 255, 255); |
+ config.AssignFirstInterfaceNumbers(); |
+ |
+ // Interfaces 0 and 1 (plus 1's alternate) are a single function. |
+ EXPECT_EQ(0, config.interfaces[0].interface_number); |
+ EXPECT_EQ(0, config.interfaces[0].first_interface); |
+ EXPECT_EQ(1, config.interfaces[1].interface_number); |
+ EXPECT_EQ(0, config.interfaces[1].first_interface); |
+ EXPECT_EQ(1, config.interfaces[2].interface_number); |
+ EXPECT_EQ(0, config.interfaces[2].first_interface); |
+ |
+ // Interfaces 2 and 3 are their own functions. |
+ EXPECT_EQ(2, config.interfaces[3].interface_number); |
+ EXPECT_EQ(2, config.interfaces[3].first_interface); |
+ EXPECT_EQ(3, config.interfaces[4].interface_number); |
+ EXPECT_EQ(3, config.interfaces[4].first_interface); |
+ |
+ // Interfaces 4 and 5 are a single function. |
+ EXPECT_EQ(4, config.interfaces[5].interface_number); |
+ EXPECT_EQ(4, config.interfaces[5].first_interface); |
+ EXPECT_EQ(5, config.interfaces[6].interface_number); |
+ EXPECT_EQ(4, config.interfaces[6].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(); |
+ } |
+ { |
+ // References an undefined interface. |
+ static const uint8_t kIAD[] = {0x08, 0x0b, 0x07, 0x00, |
+ 0xff, 0xff, 0xff, 0x00}; |
+ UsbConfigDescriptor config(1, false, false, 0); |
+ config.interfaces.emplace_back(0, 0, 255, 255, 255); |
+ config.extra_data.assign(kIAD, kIAD + sizeof(kIAD)); |
+ config.AssignFirstInterfaceNumbers(); |
+ |
+ EXPECT_EQ(0, config.interfaces[0].interface_number); |
+ EXPECT_EQ(0, config.interfaces[0].first_interface); |
+ } |
+} |
+ |
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, |