// Copyright (c) 2012 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 "cros-disks/usb_device_info.h"

#include <base/files/file_util.h>
#include <gtest/gtest.h>

using base::FilePath;
using std::string;

namespace cros_disks {

class USBDeviceInfoTest : public ::testing::Test {
 public:
  void SetUp() override {
    info_file_ = CreateTestDataFile(
        "# This is a comment line\n"
        " \n"
        "\n"
        "18d1:4e11 mobile\n"
        "0bda:0138 sd\n");
    ASSERT_FALSE(info_file_.empty());

    ids_file_ = CreateTestDataFile(
        "#\n"
        "#\tList of USB ID's\n"
        "#\n"
        "\n"
        "# Syntax:\n"
        "# vendor  vendor_name\n"
        "\tdevice  device_name\n"
        "#\t\tinterface  interface_name\n"
        "  \n"
        "0123  Vendor A\n"
        "\tab01  Product 1\n"
        "\tab02  Product 2\n"
        "\tab03  Product 3\n"
        "  \n"
        "5678  Vendor with no product IDs\n"
        "abcd  Vendor B\n"
        "\t0004  Product X\n"
        "\t\n"
        "  \n"
        "# comment\n"
        "\t0005  Product Y\n"
        "\t0006  Product Z\n"
        "\n"
        "C 00  Class 0\n");
    ASSERT_FALSE(ids_file_.empty());
  }

  void TearDown() override {
    ASSERT_TRUE(base::DeleteFile(FilePath(info_file_), false));
    ASSERT_TRUE(base::DeleteFile(FilePath(ids_file_), false));
  }

 protected:
  string CreateTestDataFile(const string& content) const {
    FilePath temp_file;
    if (base::CreateTemporaryFile(&temp_file) &&
        (static_cast<size_t>(base::WriteFile(
             temp_file, content.c_str(), content.size())) == content.size())) {
      return temp_file.value();
    }
    return string();
  }

  string info_file_;
  string ids_file_;
  USBDeviceInfo info_;
};

TEST_F(USBDeviceInfoTest, GetDeviceMediaType) {
  EXPECT_EQ(DEVICE_MEDIA_USB, info_.GetDeviceMediaType("0bda", "0138"));

  EXPECT_TRUE(info_.RetrieveFromFile(info_file_));
  EXPECT_EQ(DEVICE_MEDIA_MOBILE, info_.GetDeviceMediaType("18d1", "4e11"));
  EXPECT_EQ(DEVICE_MEDIA_SD, info_.GetDeviceMediaType("0bda", "0138"));
  EXPECT_EQ(DEVICE_MEDIA_USB, info_.GetDeviceMediaType("1234", "5678"));
}

TEST_F(USBDeviceInfoTest, RetrieveFromFile) {
  EXPECT_TRUE(info_.RetrieveFromFile(info_file_));
}

TEST_F(USBDeviceInfoTest, GetVendorAndProductName) {
  string vendor_name, product_name;

  EXPECT_FALSE(info_.GetVendorAndProductName(
      "nonexistent-path", "0123", "ab01", &vendor_name, &product_name));
  EXPECT_FALSE(info_.GetVendorAndProductName(
      ids_file_, "1234", "ab01", &vendor_name, &product_name));

  EXPECT_TRUE(info_.GetVendorAndProductName(
      ids_file_, "0123", "0000", &vendor_name, &product_name));
  EXPECT_EQ("Vendor A", vendor_name);
  EXPECT_EQ("", product_name);

  EXPECT_TRUE(info_.GetVendorAndProductName(
      ids_file_, "0123", "ab03", &vendor_name, &product_name));
  EXPECT_EQ("Vendor A", vendor_name);
  EXPECT_EQ("Product 3", product_name);

  EXPECT_TRUE(info_.GetVendorAndProductName(
      ids_file_, "5678", "0005", &vendor_name, &product_name));
  EXPECT_EQ("Vendor with no product IDs", vendor_name);
  EXPECT_EQ("", product_name);

  EXPECT_TRUE(info_.GetVendorAndProductName(
      ids_file_, "abcd", "0005", &vendor_name, &product_name));
  EXPECT_EQ("Vendor B", vendor_name);
  EXPECT_EQ("Product Y", product_name);
}

TEST_F(USBDeviceInfoTest, ConvertToDeviceMediaType) {
  EXPECT_EQ(DEVICE_MEDIA_MOBILE, info_.ConvertToDeviceMediaType("mobile"));
  EXPECT_EQ(DEVICE_MEDIA_SD, info_.ConvertToDeviceMediaType("sd"));
  EXPECT_EQ(DEVICE_MEDIA_USB, info_.ConvertToDeviceMediaType("usb"));
  EXPECT_EQ(DEVICE_MEDIA_USB, info_.ConvertToDeviceMediaType(""));
  EXPECT_EQ(DEVICE_MEDIA_USB, info_.ConvertToDeviceMediaType("foo"));
}

TEST_F(USBDeviceInfoTest, ExtractIdAndName) {
  string id, name;
  EXPECT_FALSE(info_.ExtractIdAndName("", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("0123  ", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("012  test device", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("0123 test device", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("x123  test device", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("0x23  test device", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("01x3  test device", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("012x  test device", &id, &name));
  EXPECT_FALSE(info_.ExtractIdAndName("01234 test device", &id, &name));

  EXPECT_TRUE(info_.ExtractIdAndName("0123  test device", &id, &name));
  EXPECT_EQ("0123", id);
  EXPECT_EQ("test device", name);

  EXPECT_TRUE(info_.ExtractIdAndName("ABCD  T", &id, &name));
  EXPECT_EQ("abcd", id);
  EXPECT_EQ("T", name);
}

TEST_F(USBDeviceInfoTest, IsLineSkippable) {
  EXPECT_TRUE(info_.IsLineSkippable(""));
  EXPECT_TRUE(info_.IsLineSkippable("  "));
  EXPECT_TRUE(info_.IsLineSkippable("\t"));
  EXPECT_TRUE(info_.IsLineSkippable("#"));
  EXPECT_TRUE(info_.IsLineSkippable("# this is a comment"));
  EXPECT_TRUE(info_.IsLineSkippable(" # this is a comment"));
  EXPECT_TRUE(info_.IsLineSkippable("# this is a comment "));
  EXPECT_TRUE(info_.IsLineSkippable("\t#this is a comment"));
  EXPECT_FALSE(info_.IsLineSkippable("this is not a comment"));
}

}  // namespace cros_disks
