udev_unittest.cc 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2015 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 "device/udev_linux/udev.h"
  5. #include <vector>
  6. #include "base/files/file_path.h"
  7. #include "device/udev_linux/fake_udev_loader.h"
  8. #include "device/udev_linux/udev_loader.h"
  9. #include "testing/gmock/include/gmock/gmock.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace device {
  12. TEST(UdevTest, DecodeString) {
  13. ASSERT_EQ("", UdevDecodeString(""));
  14. ASSERT_EQ("\\", UdevDecodeString("\\x5c"));
  15. ASSERT_EQ("\\x5", UdevDecodeString("\\x5"));
  16. ASSERT_EQ("049f", UdevDecodeString("049f"));
  17. ASSERT_EQ(
  18. "HD Pro Webcam C920", UdevDecodeString("HD\\x20Pro\\x20Webcam\\x20C920"));
  19. ASSERT_EQ("E-MU Systems,Inc.", UdevDecodeString("E-MU\\x20Systems\\x2cInc."));
  20. }
  21. TEST(UdevTest, Loader) {
  22. ASSERT_NE(nullptr, UdevLoader::Get());
  23. }
  24. TEST(UdevTest, GetPropertyWithNone) {
  25. testing::FakeUdevLoader fake_udev;
  26. udev_device* device =
  27. fake_udev.AddFakeDevice(/*name=*/"Foo", /*syspath=*/"/device/foo",
  28. /*subsystem=*/"", /*devnode=*/absl::nullopt,
  29. /*devtype=*/absl::nullopt, /*sysattrs=*/{},
  30. /*properties=*/{});
  31. const std::string attr_value = UdevDeviceGetPropertyValue(device, "prop");
  32. EXPECT_TRUE(attr_value.empty());
  33. }
  34. TEST(UdevTest, GetSysPropSimple) {
  35. testing::FakeUdevLoader fake_udev;
  36. std::map<std::string, std::string> props;
  37. props.emplace("prop", "prop value");
  38. udev_device* device = fake_udev.AddFakeDevice(
  39. /*name=*/"Foo", /*syspath=*/"/device/foo",
  40. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  41. /*sysattrs=*/{}, std::move(props));
  42. std::string attr_value = UdevDeviceGetPropertyValue(device, "prop");
  43. EXPECT_EQ("prop value", attr_value);
  44. attr_value = UdevDeviceGetPropertyValue(device, "unknown prop");
  45. EXPECT_TRUE(attr_value.empty());
  46. }
  47. TEST(UdevTest, GetFullSysPropertiesList) {
  48. testing::FakeUdevLoader fake_udev;
  49. std::map<std::string, std::string> props = {
  50. {"TAGS", ":powerd:"},
  51. {"DEVNAME", "/dev/dri/card0"},
  52. {"DEVTYPE", "drm_minor"},
  53. {"HOTPLUG", "1"},
  54. {"USEC_INITIALIZED", "1234567"},
  55. {"MINOR", "0"},
  56. {"ID_PATH_TAG", "pci-0000_00_02_0"},
  57. {"PROPERTY", "456"},
  58. {"DEVPATH", "/devices/pci0000:00/0000:00:02.0/drm/card0"},
  59. {"ID_PATH", "pci-0000:00:02.0"},
  60. {"SUBSYSTEM", "drm"},
  61. {"CONNECTOR", "123"},
  62. {"MAJOR", "226"},
  63. {"SEQNUM", "1234"},
  64. {"ACTION", "change"}};
  65. udev_device* device = fake_udev.AddFakeDevice(
  66. /*name=*/"/dev/dri/card0",
  67. /*syspath=*/"/devices/pci0000:00/0000:00:02.0/drm/card0",
  68. /*subsystem=*/"drm", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  69. /*sysattrs=*/{}, std::move(props));
  70. udev_list_entry* prop_list = udev_device_get_properties_list_entry(device);
  71. udev_list_entry* entry;
  72. std::vector<std::string> output_prop_list;
  73. udev_list_entry_foreach(entry, prop_list) {
  74. output_prop_list.emplace_back(udev_list_entry_get_name(entry));
  75. }
  76. // Expect the properties to be sorted when enumerated.
  77. EXPECT_THAT(
  78. output_prop_list,
  79. testing::UnorderedElementsAre(
  80. "ACTION", "CONNECTOR", "DEVNAME", "DEVPATH", "DEVTYPE", "HOTPLUG",
  81. "ID_PATH", "ID_PATH_TAG", "MAJOR", "MINOR", "PROPERTY", "SEQNUM",
  82. "SUBSYSTEM", "TAGS", "USEC_INITIALIZED"));
  83. }
  84. TEST(UdevTest, GetSysAttrNoAttrs) {
  85. testing::FakeUdevLoader fake_udev;
  86. udev_device* device = fake_udev.AddFakeDevice(
  87. /*name=*/"Foo", /*syspath=*/"/device/foo",
  88. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  89. /*sysattrs=*/{}, /*properties=*/{});
  90. const std::string attr_value = UdevDeviceGetSysattrValue(device, "attr");
  91. EXPECT_TRUE(attr_value.empty());
  92. }
  93. TEST(UdevTest, GetSysAttrSimple) {
  94. testing::FakeUdevLoader fake_udev;
  95. std::map<std::string, std::string> attrs;
  96. attrs.emplace("attr", "attr value");
  97. udev_device* device = fake_udev.AddFakeDevice(
  98. /*name=*/"Foo", /*syspath=*/"/device/foo",
  99. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  100. std::move(attrs), /*properties=*/{});
  101. std::string attr_value = UdevDeviceGetSysattrValue(device, "attr");
  102. EXPECT_EQ("attr value", attr_value);
  103. attr_value = UdevDeviceGetSysattrValue(device, "unknown attr");
  104. EXPECT_TRUE(attr_value.empty());
  105. }
  106. TEST(UdevTest, GetParent) {
  107. testing::FakeUdevLoader fake_udev;
  108. std::map<std::string, std::string> attrs;
  109. udev_device* grandparent = fake_udev.AddFakeDevice(
  110. /*name=*/"Foo", /*syspath=*/"/device/foo",
  111. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  112. /*sysattrs=*/{}, /*properties=*/{});
  113. udev_device* parent = fake_udev.AddFakeDevice(
  114. /*name=*/"Foo", /*syspath=*/"/device/foo/bar",
  115. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  116. /*sysattrs=*/{}, /*properties=*/{});
  117. udev_device* device = fake_udev.AddFakeDevice(
  118. /*name=*/"Foo", /*syspath=*/"/device/foo/bar/baz",
  119. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  120. /*sysattrs=*/{}, /*properties=*/{});
  121. EXPECT_EQ(parent, udev_device_get_parent(device));
  122. EXPECT_EQ(grandparent, udev_device_get_parent(parent));
  123. EXPECT_EQ(nullptr, udev_device_get_parent(grandparent));
  124. }
  125. TEST(UdevTest, GetSysAttrRecursiveOneLevel) {
  126. testing::FakeUdevLoader fake_udev;
  127. std::map<std::string, std::string> attrs;
  128. attrs.emplace("attr", "attr value");
  129. fake_udev.AddFakeDevice(/*name=*/"Foo", /*syspath=*/"/device/foo",
  130. /*subsystem=*/"", /*devnode=*/absl::nullopt,
  131. /*devtype=*/absl::nullopt, std::move(attrs),
  132. /*properties=*/{});
  133. udev_device* device = fake_udev.AddFakeDevice(
  134. /*name=*/"Foo", /*syspath=*/"/device/foo/bar",
  135. /*subsystem=*/"", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
  136. /*sysattrs=*/{}, /*properties=*/{});
  137. // Don't find the attr on the current device.
  138. std::string attr_value = UdevDeviceGetSysattrValue(device, "attr");
  139. EXPECT_TRUE(attr_value.empty());
  140. // Find it when searching recursive.
  141. attr_value = UdevDeviceRecursiveGetSysattrValue(device, "attr");
  142. EXPECT_EQ("attr value", attr_value);
  143. }
  144. } // namespace device