// Copyright (c) 2013 The Chromium 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 <stddef.h>

#include "base/stl_util.h"
#include "build/build_config.h"
#include "gpu/config/gpu_control_list.h"
#include "gpu/config/gpu_control_list_testing_data.h"
#include "gpu/config/gpu_info.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace gpu {

namespace {

constexpr auto kOsLinux = GpuControlList::kOsLinux;
constexpr auto kOsMacosx = GpuControlList::kOsMacosx;
constexpr auto kOsWin = GpuControlList::kOsWin;
constexpr auto kOsChromeOS = GpuControlList::kOsChromeOS;
constexpr auto kOsAndroid = GpuControlList::kOsAndroid;
constexpr auto kOsAny = GpuControlList::kOsAny;

}  // namespace anonymous

class GpuControlListEntryTest : public testing::Test {
 public:
  typedef GpuControlList::Entry Entry;

  GpuControlListEntryTest() = default;
  ~GpuControlListEntryTest() override = default;

  const GPUInfo& gpu_info() const {
    return gpu_info_;
  }

  const Entry& GetEntry(size_t index) {
    EXPECT_LT(index, kGpuControlListTestingEntryCount);
    EXPECT_EQ(index + 1, kGpuControlListTestingEntries[index].id);
    return kGpuControlListTestingEntries[index];
  }

  size_t CountFeature(const Entry& entry, int feature) {
    size_t count = 0;
    for (size_t ii = 0; ii < entry.feature_size; ++ii) {
      if (entry.features[ii] == feature) {
        ++count;
      }
    }
    return count;
  }

 protected:
  void SetUp() override {
    gpu_info_.gpu.vendor_id = 0x10de;
    gpu_info_.gpu.device_id = 0x0640;
    gpu_info_.gpu.active = true;
    gpu_info_.gpu.driver_vendor = "NVIDIA";
    gpu_info_.gpu.driver_version = "1.6.18";
    gpu_info_.gpu.driver_date = "7-14-2009";
    gpu_info_.gl_version = "2.1 NVIDIA-8.24.11 310.90.9b01";
    gpu_info_.gl_vendor = "NVIDIA Corporation";
    gpu_info_.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  }

  GPUInfo gpu_info_;
};

TEST_F(GpuControlListEntryTest, DetailedEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_DetailedEntry);
  EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  EXPECT_STREQ("GpuControlListEntryTest.DetailedEntry", entry.description);
  EXPECT_EQ(2u, entry.cr_bug_size);
  EXPECT_EQ(1024u, entry.cr_bugs[0]);
  EXPECT_EQ(678u, entry.cr_bugs[1]);
  EXPECT_EQ(1u, entry.feature_size);
  EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_0));
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info(), true));
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6.4", gpu_info()));
  EXPECT_EQ(2u, entry.disabled_extension_size);
  EXPECT_STREQ("test_extension1", entry.disabled_extensions[0]);
  EXPECT_STREQ("test_extension2", entry.disabled_extensions[1]);
}

TEST_F(GpuControlListEntryTest, VendorOnAllOsEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_VendorOnAllOsEntry);
  EXPECT_EQ(kOsAny, entry.conditions.os_type);
  const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsLinux,
                                            kOsChromeOS, kOsAndroid};
  for (size_t i = 0; i < base::size(os_type); ++i)
    EXPECT_TRUE(entry.Contains(os_type[i], "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, VendorOnLinuxEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_VendorOnLinuxEntry);
  EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsChromeOS,
                                            kOsAndroid};
  for (size_t i = 0; i < base::size(os_type); ++i)
    EXPECT_FALSE(entry.Contains(os_type[i], "10.6", gpu_info()));
  EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, AllExceptNVidiaOnLinuxEntry) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_AllExceptNVidiaOnLinuxEntry);
  EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsLinux,
                                            kOsChromeOS, kOsAndroid};
  for (size_t i = 0; i < base::size(os_type); ++i)
    EXPECT_FALSE(entry.Contains(os_type[i], "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, AllExceptIntelOnLinuxEntry) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_AllExceptIntelOnLinuxEntry);
  EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsChromeOS,
                                            kOsAndroid};
  for (size_t i = 0; i < base::size(os_type); ++i)
    EXPECT_FALSE(entry.Contains(os_type[i], "10.6", gpu_info()));
  EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, DateOnWindowsEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_DateOnWindowsEntry);
  EXPECT_EQ(kOsWin, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.gpu.driver_date = "4-12-2010";
  EXPECT_TRUE(entry.Contains(kOsWin, "10.6", gpu_info));
  gpu_info.gpu.driver_date = "5-8-2010";
  EXPECT_FALSE(entry.Contains(kOsWin, "10.6", gpu_info));
  gpu_info.gpu.driver_date = "5-9-2010";
  EXPECT_FALSE(entry.Contains(kOsWin, "10.6", gpu_info));
}

TEST_F(GpuControlListEntryTest, MultipleDevicesEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_MultipleDevicesEntry);
  EXPECT_EQ(kOsAny, entry.conditions.os_type);
  const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsLinux,
                                            kOsChromeOS, kOsAndroid};
  for (size_t i = 0; i < base::size(os_type); ++i)
    EXPECT_TRUE(entry.Contains(os_type[i], "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, ChromeOSEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_ChromeOSEntry);
  EXPECT_EQ(kOsChromeOS, entry.conditions.os_type);
  const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsLinux,
                                            kOsAndroid};
  for (size_t i = 0; i < base::size(os_type); ++i)
    EXPECT_FALSE(entry.Contains(os_type[i], "10.6", gpu_info()));
  EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, GlVersionGLESEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVersionGLESEntry);
  GPUInfo gpu_info;
  gpu_info.gl_version = "OpenGL ES 3.0 V@66.0 AU@ (CL@)";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  gpu_info.gl_version = "OpenGL ES 3.0V@66.0 AU@ (CL@)";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  gpu_info.gl_version = "OpenGL ES 3.1 V@66.0 AU@ (CL@)";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  gpu_info.gl_version = "3.0 NVIDIA-8.24.11 310.90.9b01";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_version = "OpenGL ES 3.0 (ANGLE 1.2.0.2450)";
  EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlVersionANGLEEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVersionANGLEEntry);
  GPUInfo gpu_info;
  gpu_info.gl_version = "OpenGL ES 3.0 V@66.0 AU@ (CL@)";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  gpu_info.gl_version = "3.0 NVIDIA-8.24.11 310.90.9b01";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_version = "OpenGL ES 3.0 (ANGLE 1.2.0.2450)";
  EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info));
  gpu_info.gl_version = "OpenGL ES 2.0 (ANGLE 1.2.0.2450)";
  EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlVersionGLEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVersionGLEntry);
  GPUInfo gpu_info;
  gpu_info.gl_version = "OpenGL ES 3.0 V@66.0 AU@ (CL@)";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  gpu_info.gl_version = "3.0 NVIDIA-8.24.11 310.90.9b01";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_version = "4.0 NVIDIA-8.24.11 310.90.9b01";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_version = "OpenGL ES 3.0 (ANGLE 1.2.0.2450)";
  EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlVendorEqual) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVendorEqual);
  GPUInfo gpu_info;
  gpu_info.gl_vendor = "NVIDIA";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  // Case sensitive.
  gpu_info.gl_vendor = "NVidia";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_vendor = "NVIDIA-x";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlVendorWithDot) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVendorWithDot);
  GPUInfo gpu_info;
  gpu_info.gl_vendor = "X.Org R300 Project";
  EXPECT_TRUE(entry.Contains(kOsLinux, "", gpu_info));
  gpu_info.gl_vendor = "X.Org";
  EXPECT_TRUE(entry.Contains(kOsLinux, "", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlRendererContains) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlRendererContains);
  GPUInfo gpu_info;
  gpu_info.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  // Case sensitive.
  gpu_info.gl_renderer = "NVIDIA GEFORCE GT 120 OpenGL Engine";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_renderer = "GeForce GT 120 OpenGL Engine";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_renderer = "NVIDIA GeForce";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_renderer = "NVIDIA Ge Force";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlRendererCaseInsensitive) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_GlRendererCaseInsensitive);
  GPUInfo gpu_info;
  gpu_info.gl_renderer = "software rasterizer";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_renderer = "Software Rasterizer";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
}

TEST_F(GpuControlListEntryTest, GlExtensionsEndWith) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GlExtensionsEndWith);
  GPUInfo gpu_info;
  gpu_info.gl_extensions = "GL_SGIS_generate_mipmap "
                           "GL_SGIX_shadow "
                           "GL_SUN_slice_accum";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gl_extensions = "GL_SGIS_generate_mipmap "
                           "GL_SUN_slice_accum "
                           "GL_SGIX_shadow";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
}

TEST_F(GpuControlListEntryTest, OptimusEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_OptimusEntry);
  EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.optimus = true;
  EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
}

TEST_F(GpuControlListEntryTest, AMDSwitchableEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_AMDSwitchableEntry);
  EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.amd_switchable = true;
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
}

TEST_F(GpuControlListEntryTest, DriverVendorBeginWith) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_DriverVendorBeginWith);
  GPUInfo gpu_info;
  gpu_info.gpu.driver_vendor = "NVIDIA Corporation";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  // Case sensitive.
  gpu_info.gpu.driver_vendor = "NVidia Corporation";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gpu.driver_vendor = "NVIDIA";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.gpu.driver_vendor = "USA NVIDIA";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
}

TEST_F(GpuControlListEntryTest, LexicalDriverVersionEntry) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_LexicalDriverVersionEntry);
  EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x1002;
  gpu_info.gpu.driver_version = "8.76";
  EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
  gpu_info.gpu.driver_version = "8.768";
  EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
  gpu_info.gpu.driver_version = "8.76.8";
  EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
}

TEST_F(GpuControlListEntryTest, NeedsMoreInfoEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_NeedsMoreInfoEntry);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x8086;
  EXPECT_TRUE(entry.NeedsMoreInfo(gpu_info, true));
  gpu_info.gpu.driver_version = "10.6";
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, true));
}

TEST_F(GpuControlListEntryTest, NeedsMoreInfoForExceptionsEntry) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_NeedsMoreInfoForExceptionsEntry);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x8086;
  EXPECT_TRUE(entry.NeedsMoreInfo(gpu_info, true));
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  gpu_info.gl_renderer = "mesa";
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, true));
}

TEST_F(GpuControlListEntryTest, NeedsMoreInfoForGlVersionEntry) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_NeedsMoreInfoForGlVersionEntry);
  GPUInfo gpu_info;
  EXPECT_TRUE(entry.NeedsMoreInfo(gpu_info, true));
  EXPECT_TRUE(entry.Contains(kOsLinux, std::string(), gpu_info));
  gpu_info.gl_version = "3.1 Mesa 11.1.0";
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  EXPECT_TRUE(entry.Contains(kOsLinux, std::string(), gpu_info));
  gpu_info.gl_version = "4.1 Mesa 12.1.0";
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  EXPECT_FALSE(entry.Contains(kOsLinux, std::string(), gpu_info));
  gpu_info.gl_version = "OpenGL ES 2.0 Mesa 12.1.0";
  EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  EXPECT_FALSE(entry.Contains(kOsLinux, std::string(), gpu_info));
}

TEST_F(GpuControlListEntryTest, FeatureTypeAllEntry) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_FeatureTypeAllEntry);

  EXPECT_EQ(3u, entry.feature_size);
  EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_0));
  EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_1));
  EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_2));
}

TEST_F(GpuControlListEntryTest, FeatureTypeAllEntryWithExceptions) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_FeatureTypeAllEntryWithExceptions);
  EXPECT_EQ(2u, entry.feature_size);
  EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_1));
  EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_2));
}

TEST_F(GpuControlListEntryTest, SingleActiveGPU) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_SingleActiveGPU);
  EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info()));
}

TEST_F(GpuControlListEntryTest, MachineModelName) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_MachineModelName);
  EXPECT_EQ(kOsAndroid, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.machine_model_name = "Nexus 4";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "XT1032";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "XT1032i";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "Nexus 5";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "Nexus";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "GT-N7100";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "GT-I9300";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  gpu_info.machine_model_name = "SCH-I545";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, MachineModelNameException) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_MachineModelNameException);
  EXPECT_EQ(kOsAny, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.machine_model_name = "Nexus 4";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  EXPECT_TRUE(entry.Contains(kOsLinux, "4.1", gpu_info));
  gpu_info.machine_model_name = "Nexus 7";
  EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  EXPECT_TRUE(entry.Contains(kOsLinux, "4.1", gpu_info));
  gpu_info.machine_model_name = "";
  EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  EXPECT_TRUE(entry.Contains(kOsLinux, "4.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, MachineModelVersion) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_MachineModelVersion);
  GPUInfo gpu_info;
  gpu_info.machine_model_name = "MacBookPro";
  gpu_info.machine_model_version = "7.1";
  EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
}

TEST_F(GpuControlListEntryTest, MachineModelVersionException) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_MachineModelVersionException);
  EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.machine_model_name = "MacBookPro";
  gpu_info.machine_model_version = "7.0";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  gpu_info.machine_model_version = "7.2";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  gpu_info.machine_model_version = "";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
}

class GpuControlListEntryDualGPUTest : public GpuControlListEntryTest {
 public:
  GpuControlListEntryDualGPUTest() = default;
  ~GpuControlListEntryDualGPUTest() override = default;

  void SetUp() override {
    // Set up a NVIDIA/Intel dual, with NVIDIA as primary and Intel as
    // secondary, and initially Intel is active.
    gpu_info_.gpu.vendor_id = 0x10de;
    gpu_info_.gpu.device_id = 0x0640;
    gpu_info_.gpu.active = false;
    GPUInfo::GPUDevice second_gpu;
    second_gpu.vendor_id = 0x8086;
    second_gpu.device_id = 0x0166;
    second_gpu.active = true;
    gpu_info_.secondary_gpus.push_back(second_gpu);
  }

  void ActivatePrimaryGPU() {
    gpu_info_.gpu.active = true;
    gpu_info_.secondary_gpus[0].active = false;
  }

  void EntryShouldApply(const Entry& entry) const {
    EXPECT_TRUE(EntryApplies(entry));
  }

  void EntryShouldNotApply(const Entry& entry) const {
    EXPECT_FALSE(EntryApplies(entry));
  }

 private:
  bool EntryApplies(const Entry& entry) const {
    EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
    return entry.Contains(kOsMacosx, "10.6", gpu_info());
  }
};

TEST_F(GpuControlListEntryDualGPUTest, CategoryAny) {
  const Entry& entry_intel =
      GetEntry(kGpuControlListEntryDualGPUTest_CategoryAny_Intel);
  EntryShouldApply(entry_intel);
  const Entry& entry_nvidia =
      GetEntry(kGpuControlListEntryDualGPUTest_CategoryAny_NVidia);
  EntryShouldApply(entry_nvidia);
}

TEST_F(GpuControlListEntryDualGPUTest, CategoryPrimarySecondary) {
  const Entry& entry_secondary =
      GetEntry(kGpuControlListEntryDualGPUTest_CategorySecondary);
  EntryShouldApply(entry_secondary);
  const Entry& entry_primary =
      GetEntry(kGpuControlListEntryDualGPUTest_CategoryPrimary);
  EntryShouldNotApply(entry_primary);
  const Entry& entry_default =
      GetEntry(kGpuControlListEntryDualGPUTest_CategoryDefault);
  // Default is active, and the secondary Intel GPU is active.
  EntryShouldApply(entry_default);
}

TEST_F(GpuControlListEntryDualGPUTest, ActiveSecondaryGPU) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryDualGPUTest_ActiveSecondaryGPU);
  // By default, secondary GPU is active.
  EntryShouldApply(entry);
  ActivatePrimaryGPU();
  EntryShouldNotApply(entry);
}

TEST_F(GpuControlListEntryDualGPUTest, VendorOnlyActiveSecondaryGPU) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryDualGPUTest_VendorOnlyActiveSecondaryGPU);
  // By default, secondary GPU is active.
  EntryShouldApply(entry);
  ActivatePrimaryGPU();
  EntryShouldNotApply(entry);
}

TEST_F(GpuControlListEntryDualGPUTest, ActivePrimaryGPU) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryDualGPUTest_ActivePrimaryGPU);
  // By default, secondary GPU is active.
  EntryShouldNotApply(entry);
  ActivatePrimaryGPU();
  EntryShouldApply(entry);
}

TEST_F(GpuControlListEntryDualGPUTest, VendorOnlyActivePrimaryGPU) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryDualGPUTest_VendorOnlyActivePrimaryGPU);
  // By default, secondary GPU is active.
  EntryShouldNotApply(entry);
  ActivatePrimaryGPU();
  EntryShouldApply(entry);
}

TEST_F(GpuControlListEntryTest, PixelShaderVersion) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_PixelShaderVersion);
  EXPECT_EQ(kOsAny, entry.conditions.os_type);
  GPUInfo gpu_info;
  gpu_info.pixel_shader_version = "3.2";
  EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  gpu_info.pixel_shader_version = "4.9";
  EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
}

TEST_F(GpuControlListEntryTest, OsVersionZero) {
  {
    const Entry& entry = GetEntry(kGpuControlListEntryTest_OsVersionZeroLT);
    // All forms of version 0 is considered invalid.
    EXPECT_FALSE(entry.Contains(kOsAndroid, "0", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsAndroid, "0.0", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsAndroid, "0.00.0", gpu_info()));
  }
  {
    const Entry& entry = GetEntry(kGpuControlListEntryTest_OsVersionZeroAny);
    EXPECT_TRUE(entry.Contains(kOsAndroid, "0", gpu_info()));
    EXPECT_TRUE(entry.Contains(kOsAndroid, "0.0", gpu_info()));
    EXPECT_TRUE(entry.Contains(kOsAndroid, "0.00.0", gpu_info()));
  }
}

TEST_F(GpuControlListEntryTest, OsComparison) {
  {
    const Entry& entry = GetEntry(kGpuControlListEntryTest_OsComparisonAny);
    const GpuControlList::OsType os_type[] = {kOsWin, kOsLinux, kOsMacosx,
                                              kOsChromeOS, kOsAndroid};
    for (size_t i = 0; i < base::size(os_type); ++i) {
      EXPECT_TRUE(entry.Contains(os_type[i], std::string(), gpu_info()));
      EXPECT_TRUE(entry.Contains(os_type[i], "7.8", gpu_info()));
    }
  }
  {
    const Entry& entry = GetEntry(kGpuControlListEntryTest_OsComparisonGE);
    EXPECT_FALSE(entry.Contains(kOsMacosx, "10.8.3", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsLinux, "10", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsChromeOS, "13", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsAndroid, "7", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsWin, std::string(), gpu_info()));
    EXPECT_TRUE(entry.Contains(kOsWin, "6", gpu_info()));
    EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info()));
    EXPECT_TRUE(entry.Contains(kOsWin, "7", gpu_info()));
    EXPECT_FALSE(entry.Contains(kOsWin, "5", gpu_info()));
  }
}

TEST_F(GpuControlListEntryTest, ExceptionWithoutVendorId) {
  const Entry& entry =
      GetEntry(kGpuControlListEntryTest_ExceptionWithoutVendorId);
  EXPECT_EQ(0x8086u, entry.exceptions[0].vendor_id);
  EXPECT_EQ(0x8086u, entry.exceptions[1].vendor_id);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x8086;
  gpu_info.gpu.device_id = 0x2a02;
  gpu_info.gpu.driver_version = "9.1";
  EXPECT_FALSE(entry.Contains(kOsLinux, "2.1", gpu_info));
  gpu_info.gpu.driver_version = "9.0";
  EXPECT_TRUE(entry.Contains(kOsLinux, "2.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, MultiGpuStyleAMDSwitchable) {
  GPUInfo gpu_info;
  gpu_info.amd_switchable = true;
  gpu_info.gpu.vendor_id = 0x1002;
  gpu_info.gpu.device_id = 0x6760;
  GPUInfo::GPUDevice integrated_gpu;
  integrated_gpu.vendor_id = 0x8086;
  integrated_gpu.device_id = 0x0116;
  gpu_info.secondary_gpus.push_back(integrated_gpu);

  {  // amd_switchable_discrete entry
    const Entry& entry =
        GetEntry(kGpuControlListEntryTest_MultiGpuStyleAMDSwitchableDiscrete);
    // Integrated GPU is active
    gpu_info.gpu.active = false;
    gpu_info.secondary_gpus[0].active = true;
    EXPECT_FALSE(entry.Contains(kOsWin, "6.0", gpu_info));
    // Discrete GPU is active
    gpu_info.gpu.active = true;
    gpu_info.secondary_gpus[0].active = false;
    EXPECT_TRUE(entry.Contains(kOsWin, "6.0", gpu_info));
  }

  {  // amd_switchable_integrated entry
    const Entry& entry =
        GetEntry(kGpuControlListEntryTest_MultiGpuStyleAMDSwitchableIntegrated);
    // Discrete GPU is active
    gpu_info.gpu.active = true;
    gpu_info.secondary_gpus[0].active = false;
    EXPECT_FALSE(entry.Contains(kOsWin, "6.0", gpu_info));
    // Integrated GPU is active
    gpu_info.gpu.active = false;
    gpu_info.secondary_gpus[0].active = true;
    EXPECT_TRUE(entry.Contains(kOsWin, "6.0", gpu_info));
    // For non AMD switchable
    gpu_info.amd_switchable = false;
    EXPECT_FALSE(entry.Contains(kOsWin, "6.0", gpu_info));
  }
}

TEST_F(GpuControlListEntryTest, InProcessGPU) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_InProcessGPU);
  GPUInfo gpu_info;
  gpu_info.in_process_gpu = true;
  EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info));
  gpu_info.in_process_gpu = false;
  EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, SameGPUTwiceTest) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_SameGPUTwiceTest);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x8086;
  // Real case on Intel GMA* on Windows
  gpu_info.secondary_gpus.push_back(gpu_info.gpu);
  EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info));
}

TEST_F(GpuControlListEntryTest, NVidiaNumberingScheme) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_NVidiaNumberingScheme);
  GPUInfo gpu_info;
  gpu_info.gl_vendor = "NVIDIA";
  gpu_info.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  gpu_info.gpu.vendor_id = 0x10de;
  gpu_info.gpu.device_id = 0x0640;
  // test the same driver version number
  gpu_info.gpu.driver_version = "8.17.12.6973";
  EXPECT_TRUE(entry.Contains(kOsWin, "7.0", gpu_info));
  // test a lower driver version number
  gpu_info.gpu.driver_version = "8.15.11.8647";
  EXPECT_TRUE(entry.Contains(kOsWin, "7.0", gpu_info));
  // test a higher driver version number
  gpu_info.gpu.driver_version = "9.18.13.2723";
  EXPECT_FALSE(entry.Contains(kOsWin, "7.0", gpu_info));
}

TEST_F(GpuControlListEntryTest, DirectRendering) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_DirectRendering);
  GPUInfo gpu_info;
  gpu_info.direct_rendering = true;
  EXPECT_FALSE(entry.Contains(kOsLinux, "7.0", gpu_info));
  gpu_info.direct_rendering = false;
  EXPECT_TRUE(entry.Contains(kOsLinux, "7.0", gpu_info));
}

TEST_F(GpuControlListEntryTest, GpuSeries) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeries);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x8086;
  // Intel KabyLake
  gpu_info.gpu.device_id = 0x5916;
  EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  // Intel SandyBridge
  gpu_info.gpu.device_id = 0x0116;
  EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  // Intel SkyLake
  gpu_info.gpu.device_id = 0x1916;
  EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  // Non-Intel GPU
  gpu_info.gpu.vendor_id = 0x10de;
  gpu_info.gpu.device_id = 0x0df8;
  EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
}

TEST_F(GpuControlListEntryTest, GpuSeriesActive) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesActive);

  GPUInfo::GPUDevice intel_gpu;
  intel_gpu.vendor_id = 0x8086;
  intel_gpu.device_id = 0x5916;
  GPUInfo::GPUDevice nvidia_gpu;
  nvidia_gpu.vendor_id = 0x10de;
  nvidia_gpu.device_id = 0x0df8;

  {  // Single GPU
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is primary and active
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    gpu_info.gpu.active = true;
    gpu_info.secondary_gpus.push_back(nvidia_gpu);
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is secondary and active
    GPUInfo gpu_info;
    gpu_info.gpu = nvidia_gpu;
    gpu_info.secondary_gpus.push_back(intel_gpu);
    gpu_info.secondary_gpus[0].active = true;
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, NVidia is primary and active
    GPUInfo gpu_info;
    gpu_info.gpu = nvidia_gpu;
    gpu_info.gpu.active = true;
    gpu_info.secondary_gpus.push_back(intel_gpu);
    EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, NVidia is secondary and active
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    gpu_info.secondary_gpus.push_back(nvidia_gpu);
    gpu_info.secondary_gpus[0].active = true;
    EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  }
}

TEST_F(GpuControlListEntryTest, GpuSeriesAny) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesAny);

  GPUInfo::GPUDevice intel_gpu;
  intel_gpu.vendor_id = 0x8086;
  intel_gpu.device_id = 0x5916;
  GPUInfo::GPUDevice nvidia_gpu;
  nvidia_gpu.vendor_id = 0x10de;
  nvidia_gpu.device_id = 0x0df8;

  {  // Single GPU Intel
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Single GPU NVidia
    GPUInfo gpu_info;
    gpu_info.gpu = nvidia_gpu;
    EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is primary
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    gpu_info.secondary_gpus.push_back(nvidia_gpu);
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is secondary
    GPUInfo gpu_info;
    gpu_info.gpu = nvidia_gpu;
    gpu_info.secondary_gpus.push_back(intel_gpu);
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }
}

TEST_F(GpuControlListEntryTest, GpuSeriesPrimary) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesPrimary);

  GPUInfo::GPUDevice intel_gpu;
  intel_gpu.vendor_id = 0x8086;
  intel_gpu.device_id = 0x5916;
  GPUInfo::GPUDevice nvidia_gpu;
  nvidia_gpu.vendor_id = 0x10de;
  nvidia_gpu.device_id = 0x0df8;

  {  // Single GPU
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is primary
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    gpu_info.secondary_gpus.push_back(nvidia_gpu);
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is secondary
    GPUInfo gpu_info;
    gpu_info.gpu = nvidia_gpu;
    gpu_info.secondary_gpus.push_back(intel_gpu);
    EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  }
}

TEST_F(GpuControlListEntryTest, GpuSeriesSecondary) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesSecondary);

  GPUInfo::GPUDevice intel_gpu;
  intel_gpu.vendor_id = 0x8086;
  intel_gpu.device_id = 0x5916;
  GPUInfo::GPUDevice nvidia_gpu;
  nvidia_gpu.vendor_id = 0x10de;
  nvidia_gpu.device_id = 0x0df8;

  {  // Single GPU
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is primary
    GPUInfo gpu_info;
    gpu_info.gpu = intel_gpu;
    gpu_info.secondary_gpus.push_back(nvidia_gpu);
    EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  }

  {  // Dual GPU, Intel is secondary
    GPUInfo gpu_info;
    gpu_info.gpu = nvidia_gpu;
    gpu_info.secondary_gpus.push_back(intel_gpu);
    EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  }
}

TEST_F(GpuControlListEntryTest, GpuSeriesInException) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesInException);

  GPUInfo gpu_info;
  // Intel KabyLake
  gpu_info.gpu.vendor_id = 0x8086;
  gpu_info.gpu.device_id = 0x5916;
  EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  // Intel SandyBridge
  gpu_info.gpu.vendor_id = 0x8086;
  gpu_info.gpu.device_id = 0x0116;
  EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
}

TEST_F(GpuControlListEntryTest, MultipleDrivers) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_MultipleDrivers);
  // The GPUInfo data came from https://crbug.com/810713#c58.
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x1002;
  gpu_info.gpu.device_id = 0x6741;
  gpu_info.gpu.driver_version = "8.951.0.0";
  GPUInfo::GPUDevice intel_device;
  intel_device.vendor_id = 0x8086;
  intel_device.device_id = 0x0116;
  intel_device.driver_version = "8.15.0010.2476";
  gpu_info.secondary_gpus.push_back(intel_device);

  gpu_info.gpu.active = true;
  gpu_info.secondary_gpus[0].active = false;
  EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));

  gpu_info.gpu.active = false;
  gpu_info.secondary_gpus[0].active = true;
  EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
}

#if defined(OS_WIN)
TEST_F(GpuControlListEntryTest, HardwareOverlay) {
  const Entry& entry = GetEntry(kGpuControlListEntryTest_HardwareOverlay);
  GPUInfo gpu_info;
  gpu_info.gpu.vendor_id = 0x8086;
  gpu_info.supports_overlays = true;
  EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));

  gpu_info.supports_overlays = false;
  EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
}
#endif  // OS_WIN

}  // namespace gpu
