usb_midi_descriptor_parser_unittest.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/midi/usb_midi_descriptor_parser.h"
  5. #include <stdint.h>
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. namespace midi {
  8. namespace {
  9. TEST(UsbMidiDescriptorParserTest, ParseEmpty) {
  10. UsbMidiDescriptorParser parser;
  11. std::vector<UsbMidiJack> jacks;
  12. EXPECT_TRUE(parser.Parse(nullptr, nullptr, 0, &jacks));
  13. EXPECT_TRUE(jacks.empty());
  14. }
  15. TEST(UsbMidiDescriptorParserTest, InvalidSize) {
  16. UsbMidiDescriptorParser parser;
  17. std::vector<UsbMidiJack> jacks;
  18. uint8_t data[] = {0x04};
  19. EXPECT_FALSE(parser.Parse(nullptr, data, std::size(data), &jacks));
  20. EXPECT_TRUE(jacks.empty());
  21. }
  22. TEST(UsbMidiDescriptorParserTest, NonExistingJackIsAssociated) {
  23. UsbMidiDescriptorParser parser;
  24. std::vector<UsbMidiJack> jacks;
  25. // Jack id=1 is found in a CS_ENDPOINT descriptor, but there is no definition
  26. // for the jack.
  27. uint8_t data[] = {
  28. 0x09, 0x04, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, 0x07, 0x24,
  29. 0x01, 0x00, 0x01, 0x07, 0x00, 0x05, 0x25, 0x01, 0x01, 0x01,
  30. };
  31. EXPECT_FALSE(parser.Parse(nullptr, data, std::size(data), &jacks));
  32. EXPECT_TRUE(jacks.empty());
  33. }
  34. TEST(UsbMidiDescriptorParserTest,
  35. JacksShouldBeIgnoredWhenParserIsNotParsingMidiInterface) {
  36. UsbMidiDescriptorParser parser;
  37. std::vector<UsbMidiJack> jacks;
  38. // a NON-MIDI INTERFACE descriptor followed by ENDPOINT and CS_ENDPOINT
  39. // descriptors (Compare with the previous test case).
  40. uint8_t data[] = {
  41. 0x09, 0x04, 0x01, 0x00, 0x02, 0x01, 0x02, 0x00, 0x00, 0x07, 0x24,
  42. 0x01, 0x00, 0x01, 0x07, 0x00, 0x05, 0x25, 0x01, 0x01, 0x01,
  43. };
  44. EXPECT_TRUE(parser.Parse(nullptr, data, std::size(data), &jacks));
  45. EXPECT_TRUE(jacks.empty());
  46. }
  47. TEST(UsbMidiDescriptorParserTest, Parse) {
  48. UsbMidiDescriptorParser parser;
  49. std::vector<UsbMidiJack> jacks;
  50. // A complete device descriptor.
  51. uint8_t data[] = {
  52. 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a, 0x2d, 0x75,
  53. 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02, 0x75, 0x00, 0x02, 0x01,
  54. 0x00, 0x80, 0x30, 0x09, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
  55. 0x09, 0x24, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, 0x09, 0x04, 0x01,
  56. 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, 0x07, 0x24, 0x01, 0x00, 0x01, 0x51,
  57. 0x00, 0x06, 0x24, 0x02, 0x01, 0x02, 0x00, 0x06, 0x24, 0x02, 0x01, 0x03,
  58. 0x00, 0x06, 0x24, 0x02, 0x02, 0x06, 0x00, 0x09, 0x24, 0x03, 0x01, 0x07,
  59. 0x01, 0x06, 0x01, 0x00, 0x09, 0x24, 0x03, 0x02, 0x04, 0x01, 0x02, 0x01,
  60. 0x00, 0x09, 0x24, 0x03, 0x02, 0x05, 0x01, 0x03, 0x01, 0x00, 0x09, 0x05,
  61. 0x02, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x01, 0x02, 0x02,
  62. 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x25,
  63. 0x01, 0x01, 0x07,
  64. };
  65. EXPECT_TRUE(parser.Parse(nullptr, data, std::size(data), &jacks));
  66. ASSERT_EQ(3u, jacks.size());
  67. EXPECT_EQ(2u, jacks[0].jack_id);
  68. EXPECT_EQ(0u, jacks[0].cable_number);
  69. EXPECT_EQ(2u, jacks[0].endpoint_number());
  70. EXPECT_EQ(UsbMidiJack::DIRECTION_OUT, jacks[0].direction());
  71. EXPECT_EQ(nullptr, jacks[0].device);
  72. EXPECT_EQ(3u, jacks[1].jack_id);
  73. EXPECT_EQ(1u, jacks[1].cable_number);
  74. EXPECT_EQ(2u, jacks[1].endpoint_number());
  75. EXPECT_EQ(UsbMidiJack::DIRECTION_OUT, jacks[1].direction());
  76. EXPECT_EQ(nullptr, jacks[1].device);
  77. EXPECT_EQ(7u, jacks[2].jack_id);
  78. EXPECT_EQ(0u, jacks[2].cable_number);
  79. EXPECT_EQ(2u, jacks[2].endpoint_number());
  80. EXPECT_EQ(UsbMidiJack::DIRECTION_IN, jacks[2].direction());
  81. EXPECT_EQ(nullptr, jacks[2].device);
  82. }
  83. TEST(UsbMidiDescriptorParserTest, ParseDeviceInfoEmpty) {
  84. UsbMidiDescriptorParser parser;
  85. UsbMidiDescriptorParser::DeviceInfo info;
  86. EXPECT_FALSE(parser.ParseDeviceInfo(nullptr, 0, &info));
  87. }
  88. TEST(UsbMidiDescriptorParserTest, ParseDeviceInfo) {
  89. UsbMidiDescriptorParser parser;
  90. UsbMidiDescriptorParser::DeviceInfo info;
  91. uint8_t data[] = {
  92. 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x01,
  93. 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x0a,
  94. };
  95. EXPECT_TRUE(parser.ParseDeviceInfo(data, std::size(data), &info));
  96. EXPECT_EQ(0x2301, info.vendor_id);
  97. EXPECT_EQ(0x6745, info.product_id);
  98. EXPECT_EQ(0xab89, info.bcd_device_version);
  99. EXPECT_EQ(0xcd, info.manufacturer_index);
  100. EXPECT_EQ(0xef, info.product_index);
  101. }
  102. TEST(UsbMidiDescriptorParserTest, BcdVersionToString) {
  103. UsbMidiDescriptorParser::DeviceInfo device_info;
  104. {
  105. const std::string version = device_info.BcdVersionToString(0x3456);
  106. EXPECT_EQ(version, "34.56");
  107. }
  108. {
  109. const std::string invalid_version = device_info.BcdVersionToString(0xb456);
  110. EXPECT_EQ(invalid_version, "Invalid BCD $b4.56");
  111. }
  112. {
  113. const std::string invalid_version = device_info.BcdVersionToString(0x345d);
  114. EXPECT_EQ(invalid_version, "Invalid BCD $34.5d");
  115. }
  116. }
  117. } // namespace
  118. } // namespace midi