blob: 22641b0c9da67a2bf7c12efec7d36c492c59d3a0 [file] [log] [blame]
// Copyright 2019 The Chromium OS 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 "shill/device_id.h"
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
namespace shill {
TEST(DeviceIdTest, MatchByBusType) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb};
constexpr DeviceId kPattern{DeviceId::BusType::kUsb};
EXPECT_TRUE(kDeviceId.Match(kPattern))
<< kDeviceId << " does not match " << kPattern;
}
TEST(DeviceIdTest, NotMatchByBusType) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb};
constexpr DeviceId kPattern{DeviceId::BusType::kPci};
EXPECT_FALSE(kDeviceId.Match(kPattern))
<< kDeviceId << " matches " << kPattern;
}
TEST(DeviceIdTest, MatchByVendor) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb, 1234};
constexpr DeviceId kPattern{DeviceId::BusType::kUsb, 1234};
EXPECT_TRUE(kDeviceId.Match(kPattern))
<< kDeviceId << " does not match " << kPattern;
}
TEST(DeviceIdTest, MatchByAnyVendor) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kPci, 4567};
constexpr DeviceId kPattern{DeviceId::BusType::kPci};
EXPECT_TRUE(kDeviceId.Match(kPattern))
<< kDeviceId << " does not match " << kPattern;
}
TEST(DeviceIdTest, SpecificVendorNotMatchByVendor) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kPci, 9988};
constexpr DeviceId kPattern{DeviceId::BusType::kPci, 456};
EXPECT_FALSE(kDeviceId.Match(kPattern))
<< kDeviceId << " matches " << kPattern;
}
TEST(DeviceIdTest, AnyVendorNotMatchByVendor) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb};
constexpr DeviceId kPattern{DeviceId::BusType::kUsb, 3123};
EXPECT_FALSE(kDeviceId.Match(kPattern))
<< kDeviceId << " matches " << kPattern;
}
TEST(DeviceIdTest, MatchByProduct) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb, 453, 15};
constexpr DeviceId kPattern{DeviceId::BusType::kUsb, 453, 15};
EXPECT_TRUE(kDeviceId.Match(kPattern))
<< kDeviceId << " does not match " << kPattern;
}
TEST(DeviceIdTest, MatchByAnyProduct) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kPci, 782, 578};
constexpr DeviceId kPattern{DeviceId::BusType::kPci, 782};
EXPECT_TRUE(kDeviceId.Match(kPattern))
<< kDeviceId << " does not match " << kPattern;
}
TEST(DeviceIdTest, SpecificProductNotMatchByProduct) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb, 4633, 213};
constexpr DeviceId kPattern{DeviceId::BusType::kUsb, 4633, 3999};
EXPECT_FALSE(kDeviceId.Match(kPattern))
<< kDeviceId << " matches " << kPattern;
}
TEST(DeviceIdTest, AnyProductNotMatchByProduct) {
constexpr DeviceId kDeviceId{DeviceId::BusType::kUsb, 9721};
constexpr DeviceId kPattern{DeviceId::BusType::kUsb, 9721, 4647};
EXPECT_FALSE(kDeviceId.Match(kPattern))
<< kDeviceId << " matches " << kPattern;
}
namespace {
class DeviceIdFromSysfsTest : public testing::Test {
public:
void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
void CreateDeviceSysfs(const std::string& device_name,
const std::string& subsystem_name) const {
base::FilePath temp_dir_path = temp_dir_.GetPath();
base::FilePath device_path = temp_dir_path.Append(device_name);
base::FilePath subsystem_path = temp_dir_path.Append(subsystem_name);
ASSERT_TRUE(base::CreateDirectory(device_path));
ASSERT_TRUE(base::CreateDirectory(subsystem_path));
ASSERT_TRUE(base::CreateSymbolicLink(subsystem_path,
device_path.Append("subsystem")));
}
void CreateDeviceSysfsFile(const std::string& device_name,
const std::string& file_name,
const std::string& data) const {
base::FilePath file_path =
temp_dir_.GetPath().Append(device_name).Append(file_name);
ASSERT_EQ(base::WriteFile(file_path, data.c_str(), data.length()),
data.length());
}
base::FilePath GetDevicePath(const std::string& device_name) const {
return temp_dir_.GetPath().Append(device_name);
}
void ExpectDeviceId(const std::string& device_name,
const DeviceId& expected_device_id) const {
const auto device_id =
DeviceId::CreateFromSysfs(GetDevicePath(device_name));
ASSERT_TRUE(device_id);
EXPECT_TRUE(device_id->Match(expected_device_id))
<< *device_id << " does not match " << expected_device_id;
}
protected:
static const char kPciBusName[];
static const char kUsbBusName[];
static const char kDeviceName0[];
static const char kDeviceName1[];
private:
base::ScopedTempDir temp_dir_;
};
const char DeviceIdFromSysfsTest::kPciBusName[] = "pci";
const char DeviceIdFromSysfsTest::kUsbBusName[] = "usb";
const char DeviceIdFromSysfsTest::kDeviceName0[] = "eth0";
const char DeviceIdFromSysfsTest::kDeviceName1[] = "eth1";
} // namespace
TEST_F(DeviceIdFromSysfsTest, UnknownSubsystem) {
CreateDeviceSysfs(kDeviceName1, "unknown_subsystem");
EXPECT_FALSE(DeviceId::CreateFromSysfs(GetDevicePath(kDeviceName1)));
}
TEST_F(DeviceIdFromSysfsTest, PciDevice) {
CreateDeviceSysfs(kDeviceName1, kPciBusName);
CreateDeviceSysfsFile(kDeviceName1, "vendor", "0x97ba");
CreateDeviceSysfsFile(kDeviceName1, "product", "0x6012");
ExpectDeviceId(kDeviceName1, {DeviceId::BusType::kPci, 0x97ba, 0x6012});
}
TEST_F(DeviceIdFromSysfsTest, PciDeviceWithAnyProductId) {
CreateDeviceSysfs(kDeviceName0, kPciBusName);
CreateDeviceSysfsFile(kDeviceName0, "vendor", "0x6480");
ExpectDeviceId(kDeviceName0, {DeviceId::BusType::kPci, 0x6480});
}
TEST_F(DeviceIdFromSysfsTest, PciDeviceWithAnyVendorId) {
CreateDeviceSysfs(kDeviceName0, kPciBusName);
ExpectDeviceId(kDeviceName0, DeviceId{DeviceId::BusType::kPci});
}
TEST_F(DeviceIdFromSysfsTest, UsbDevice) {
CreateDeviceSysfs(kDeviceName1, kUsbBusName);
CreateDeviceSysfsFile(kDeviceName1, "idVendor", "af36");
CreateDeviceSysfsFile(kDeviceName1, "idProduct", "98ed");
ExpectDeviceId(kDeviceName1, {DeviceId::BusType::kUsb, 0xaf36, 0x98ed});
}
TEST_F(DeviceIdFromSysfsTest, UsbDeviceWithAnyProductId) {
CreateDeviceSysfs(kDeviceName0, kUsbBusName);
CreateDeviceSysfsFile(kDeviceName0, "idVendor", "ff00");
ExpectDeviceId(kDeviceName0, {DeviceId::BusType::kUsb, 0xff00});
}
TEST_F(DeviceIdFromSysfsTest, UsbDeviceWithAnyVendorId) {
CreateDeviceSysfs(kDeviceName1, kUsbBusName);
ExpectDeviceId(kDeviceName1, DeviceId{DeviceId::BusType::kUsb});
}
} // namespace shill