| 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,
|
|
|