| Index: device/usb/webusb_descriptors_unittest.cc
|
| diff --git a/device/usb/webusb_descriptors_unittest.cc b/device/usb/webusb_descriptors_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..799f16f65b36a7a5e565f044c4682291b0a0370f
|
| --- /dev/null
|
| +++ b/device/usb/webusb_descriptors_unittest.cc
|
| @@ -0,0 +1,445 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "device/usb/webusb_descriptors.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace device {
|
| +
|
| +namespace {
|
| +
|
| +const uint8_t kExampleBosDescriptor[] = {
|
| + // BOS descriptor.
|
| + 0x05, 0x0F, 0x4C, 0x00, 0x03,
|
| +
|
| + // Container ID descriptor.
|
| + 0x14, 0x10, 0x04, 0x00, 0x2A, 0xF9, 0xF6, 0xC2, 0x98, 0x10, 0x2B, 0x49,
|
| + 0x8E, 0x64, 0xFF, 0x01, 0x0C, 0x7F, 0x94, 0xE1,
|
| +
|
| + // WebUSB Platform Capability descriptor.
|
| + 0x17, 0x10, 0x05, 0x00, 0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47,
|
| + 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65, 0x00, 0x01, 0x42,
|
| +
|
| + // Microsoft OS 2.0 Platform Capability descriptor.
|
| + 0x1C, 0x10, 0x05, 0x00, 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C,
|
| + 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F, 0x00, 0x00, 0x03, 0x06,
|
| + 0x00, 0x00, 0x01, 0x00};
|
| +
|
| +const uint8_t kExampleDescriptorSet[] = {
|
| + // Descriptor set header.
|
| + 0x04, 0x00, 0x9E, 0x00,
|
| +
|
| + // URL descriptor: https://example.com:80
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x', 'a', 'm', 'p',
|
| + 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '0',
|
| +
|
| + // Configuration subset header. {
|
| + 0x05, 0x01, 0x01, 0x6A, 0x00,
|
| +
|
| + // URL descriptor: https://example.com:81
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x', 'a', 'm', 'p',
|
| + 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '1',
|
| +
|
| + // Function subset header. {
|
| + 0x05, 0x02, 0x01, 0x35, 0x00,
|
| +
|
| + // URL descriptor: https://example.com:82
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x', 'a', 'm', 'p',
|
| + 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '2',
|
| +
|
| + // URL descriptor: https://example.com:83
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x', 'a', 'm', 'p',
|
| + 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '3',
|
| +
|
| + // }
|
| + // URL descriptor: https://example.com:84
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x', 'a', 'm', 'p',
|
| + 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '4',
|
| +
|
| + // }
|
| + // URL descriptor: https://example.com:85
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x', 'a', 'm', 'p',
|
| + 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '5',
|
| +};
|
| +
|
| +const uint8_t kExampleUrlDescriptor[] = {
|
| + 0x18, 0x03, 'h', 't', 't', 'p', 's', ':', '/', '/', 'e', 'x',
|
| + 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm', ':', '8', '0'};
|
| +
|
| +class WebUsbDescriptorsTest : public ::testing::Test {};
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, PlatformCapabilityDescriptor) {
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| +
|
| + ASSERT_TRUE(descriptor.ParseFromBosDescriptor(std::vector<uint8_t>(
|
| + kExampleBosDescriptor,
|
| + kExampleBosDescriptor + sizeof(kExampleBosDescriptor))));
|
| + EXPECT_EQ(0x0100, descriptor.version);
|
| + EXPECT_EQ(0x42, descriptor.vendor_code);
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortBosDescriptorHeader) {
|
| + // This BOS descriptor is just too short.
|
| + static const uint8_t kBuffer[] = {0x03, 0x0F, 0x03};
|
| +
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongBosDescriptorHeader) {
|
| + // BOS descriptor's bLength is too large.
|
| + static const uint8_t kBuffer[] = {0x06, 0x0F, 0x05, 0x00, 0x01};
|
| +
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, InvalidBosDescriptor) {
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(std::vector<uint8_t>(
|
| + kExampleUrlDescriptor,
|
| + kExampleUrlDescriptor + sizeof(kExampleUrlDescriptor))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortBosDescriptor) {
|
| + // wTotalLength is less than bLength. bNumDeviceCaps == 1 to expose buffer
|
| + // length checking bugs.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x04, 0x00, 0x01};
|
| +
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongBosDescriptor) {
|
| + // wTotalLength is too large. bNumDeviceCaps == 1 to expose buffer
|
| + // length checking bugs.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x06, 0x00, 0x01};
|
| +
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, UnexpectedlyEmptyBosDescriptor) {
|
| + // bNumDeviceCaps == 1 but there are no actual descriptors.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x05, 0x00, 0x01};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortCapabilityDescriptor) {
|
| + // The single capability descriptor in the BOS descriptor is too short.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x06, 0x00, 0x01, 0x02, 0x10};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongCapabilityDescriptor) {
|
| + // The bLength on a capability descriptor in the BOS descriptor is longer than
|
| + // the remaining space defined by wTotalLength.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x08, 0x00,
|
| + 0x01, 0x04, 0x10, 0x05};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, NotACapabilityDescriptor) {
|
| + // There is something other than a device capability descriptor in the BOS
|
| + // descriptor.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x08, 0x00,
|
| + 0x01, 0x03, 0x0F, 0x05};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, NoPlatformCapabilityDescriptor) {
|
| + // The BOS descriptor only contains a Container ID descriptor.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x19, 0x00, 0x01, 0x14, 0x10,
|
| + 0x04, 0x00, 0x2A, 0xF9, 0xF6, 0xC2, 0x98,
|
| + 0x10, 0x2B, 0x49, 0x8E, 0x64, 0xFF, 0x01,
|
| + 0x0C, 0x7F, 0x94, 0xE1};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortPlatformCapabilityDescriptor) {
|
| + // The platform capability descriptor is too short to contain a UUID.
|
| + static const uint8_t kBuffer[] = {
|
| + 0x05, 0x0F, 0x18, 0x00, 0x01, 0x13, 0x10, 0x05, 0x00, 0x2A, 0xF9, 0xF6,
|
| + 0xC2, 0x98, 0x10, 0x2B, 0x49, 0x8E, 0x64, 0xFF, 0x01, 0x0C, 0x7F, 0x94};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, NoWebUsbCapabilityDescriptor) {
|
| + // The BOS descriptor only contains another kind of platform capability
|
| + // descriptor.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x19, 0x00, 0x01, 0x14, 0x10,
|
| + 0x05, 0x00, 0x2A, 0xF9, 0xF6, 0xC2, 0x98,
|
| + 0x10, 0x2B, 0x49, 0x8E, 0x64, 0xFF, 0x01,
|
| + 0x0C, 0x7F, 0x94, 0xE1};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortWebUsbPlatformCapabilityDescriptor) {
|
| + // The WebUSB Platform Capability Descriptor is too short.
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x19, 0x00, 0x01, 0x14, 0x10,
|
| + 0x05, 0x00, 0x38, 0xB6, 0x08, 0x34, 0xA9,
|
| + 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76,
|
| + 0x88, 0x15, 0xB6, 0x65};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, WebUsbPlatformCapabilityDescriptorOutOfDate) {
|
| + // The WebUSB Platform Capability Descriptor is version 0.9 (too old).
|
| + static const uint8_t kBuffer[] = {0x05, 0x0F, 0x1C, 0x00, 0x01, 0x17, 0x10,
|
| + 0x05, 0x00, 0x38, 0xB6, 0x08, 0x34, 0xA9,
|
| + 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76,
|
| + 0x88, 0x15, 0xB6, 0x65, 0x90, 0x00, 0x01};
|
| + WebUsbPlatformCapabilityDescriptor descriptor;
|
| + ASSERT_FALSE(descriptor.ParseFromBosDescriptor(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, DescriptorSet) {
|
| + WebUsbDescriptorSet descriptor;
|
| +
|
| + ASSERT_TRUE(descriptor.Parse(std::vector<uint8_t>(
|
| + kExampleDescriptorSet,
|
| + kExampleDescriptorSet + sizeof(kExampleDescriptorSet))));
|
| + EXPECT_EQ(2u, descriptor.origins.size());
|
| + EXPECT_EQ(GURL("https://example.com:80"), descriptor.origins[0]);
|
| + EXPECT_EQ(GURL("https://example.com:85"), descriptor.origins[1]);
|
| + EXPECT_EQ(1u, descriptor.configurations.size());
|
| +
|
| + const WebUsbConfigurationSubset& config1 = descriptor.configurations[0];
|
| + EXPECT_EQ(2u, config1.origins.size());
|
| + EXPECT_EQ(GURL("https://example.com:81"), config1.origins[0]);
|
| + EXPECT_EQ(GURL("https://example.com:84"), config1.origins[1]);
|
| + EXPECT_EQ(1u, config1.functions.size());
|
| +
|
| + const WebUsbFunctionSubset& function1 = config1.functions[0];
|
| + EXPECT_EQ(2u, function1.origins.size());
|
| + EXPECT_EQ(GURL("https://example.com:82"), function1.origins[0]);
|
| + EXPECT_EQ(GURL("https://example.com:83"), function1.origins[1]);
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortDescriptorSetHeader) {
|
| + // bLength is too short for a WebUSB Descriptor Set Header.
|
| + static const uint8_t kBuffer[] = {0x03, 0x00, 0x03};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongDescriptorSetHeader) {
|
| + // bLength is too long for a WebUSB DescriptorSet Header.
|
| + static const uint8_t kBuffer[] = {0x05, 0x00, 0x04, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, UrlNotDescriptorSet) {
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(std::vector<uint8_t>(
|
| + kExampleUrlDescriptor,
|
| + kExampleUrlDescriptor + sizeof(kExampleUrlDescriptor))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortDescriptorSet) {
|
| + // wTotalLength is shorter than bLength, making the WebUSB Descriptor Set
|
| + // Header inconsistent.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x03, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongDescriptorSet) {
|
| + // The WebUSB Descriptor Set Header's wTotalLength is longer than the buffer.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x05, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortDescriptorInDescriptorSet) {
|
| + // bLength for the descriptor within the descriptor set is too short.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x05, 0x00, 0x01};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongDescriptorInDescriptorSet) {
|
| + // bLength for the descriptor within the descriptor set is longer than the
|
| + // remaining portion of the buffer and the wTotalLength of the descriptor set.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x06, 0x00, 0x03, 0x03};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, InvalidDescriptorInDescriptorSet) {
|
| + // A descriptor set cannot contain a descriptor with this bDescriptorType.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x06, 0x00, 0x02, 0x04};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, EmptyUrlInDescriptorSet) {
|
| + // The URL in this descriptor set is the empty string.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x06, 0x00, 0x02, 0x03};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, InvalidUrlInDescriptorSet) {
|
| + // The URL in this descriptor set is not a valid URL: "This is not a URL."
|
| + static const uint8_t kBuffer[] = {
|
| + 0x04, 0x00, 0x18, 0x00, 0x14, 0x03, 'T', 'h', 'i', 's', ' ', 'i',
|
| + 's', ' ', 'n', 'o', 't', ' ', 'a', ' ', 'U', 'R', 'L', '.'};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortConfigurationSubsetHeader) {
|
| + // bLength is too short for a WebUSB Configuration Subset Header.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x05, 0x00, 0x02, 0x01};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortConfigurationSubset) {
|
| + // The configuration subset header's wTotalLength is shorter than its bLength,
|
| + // making it inconsistent.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x09, 0x00, 0x05,
|
| + 0x01, 0x01, 0x04, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongConfigurationSubset) {
|
| + // wTotalLength of the configuration subset header extends beyond wTotalLength
|
| + // for the descriptor set and the length of the buffer.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x09, 0x00, 0x05,
|
| + 0x01, 0x01, 0x06, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortDescriptorInConfigurationSubset) {
|
| + // bLength for the descriptor within the configuration subset is too short.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0A, 0x00, 0x05,
|
| + 0x01, 0x01, 0x06, 0x00, 0x01};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongDescriptorInConfigurationSubset) {
|
| + // bLength for the descriptor within the configuration subset is longer than
|
| + // the remaining portion of the buffer and the wTotalLength of the
|
| + // configuration subset.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0B, 0x00, 0x05, 0x01,
|
| + 0x01, 0x07, 0x00, 0x03, 0x03};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, InvalidDescriptorInConfigurationSubset) {
|
| + // A configuration subset cannot contain a descriptor with this
|
| + // bDescriptorType.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0B, 0x00, 0x05, 0x01,
|
| + 0x01, 0x07, 0x00, 0x02, 0x01};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortFunctionSubsetHeader) {
|
| + // bLength is too short for a WebUSB Function Subset Header.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0B, 0x00, 0x05, 0x01,
|
| + 0x01, 0x07, 0x00, 0x02, 0x02};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortFunctionSubset) {
|
| + // The function subset header's wTotalLength is shorter than its bLength,
|
| + // making it inconsistent.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0E, 0x00, 0x05, 0x01, 0x01,
|
| + 0x0A, 0x00, 0x05, 0x02, 0x01, 0x04, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongFunctionSubset) {
|
| + // wTotalLength of the function subset header extends beyond wTotalLength for
|
| + // for the configuration subset and the length of the buffer.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0E, 0x00, 0x05, 0x01, 0x01,
|
| + 0x0A, 0x00, 0x05, 0x02, 0x01, 0x06, 0x00};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, ShortDescriptorInFunctionSubset) {
|
| + // bLength for the descriptor within the function subset is too short.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x0F, 0x00, 0x05,
|
| + 0x01, 0x01, 0x0B, 0x00, 0x05,
|
| + 0x02, 0x01, 0x06, 0x00, 0x01};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, LongDescriptorInFunctionSubset) {
|
| + // bLength for the descriptor within the function subset is longer than the
|
| + // remaining portion of the buffer and the wTotalLength of the function
|
| + // subset.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x10, 0x00, 0x05, 0x01,
|
| + 0x01, 0x0C, 0x00, 0x05, 0x02, 0x01,
|
| + 0x07, 0x00, 0x03, 0x03};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +TEST_F(WebUsbDescriptorsTest, InvalidDescriptorInFunctionSubset) {
|
| + // A function subset cannot contain a descriptor with this bDescriptorType.
|
| + static const uint8_t kBuffer[] = {0x04, 0x00, 0x10, 0x00, 0x05, 0x01,
|
| + 0x01, 0x0C, 0x00, 0x05, 0x02, 0x01,
|
| + 0x07, 0x00, 0x02, 0x02};
|
| + WebUsbDescriptorSet descriptor;
|
| + ASSERT_FALSE(descriptor.Parse(
|
| + std::vector<uint8_t>(kBuffer, kBuffer + sizeof(kBuffer))));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace device
|
|
|