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