//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// feature_support_util_unittest.cpp: Unit test for the feature-support utility.

#include <gtest/gtest.h>

#include "../gpu_info_util/SystemInfo.h"
#include "feature_support_util.h"

using namespace angle;

constexpr char kMfr[]   = "MfrFoo";
constexpr char kModel[] = "ModelX";

class FeatureSupportUtilTest : public testing::Test
{
  protected:
    FeatureSupportUtilTest()
    {
        mSystemInfo.machineManufacturer = kMfr;
        mSystemInfo.machineModelName    = kModel;
        mSystemInfo.gpus.resize(1);
        mSystemInfo.gpus[0].vendorId              = 123;
        mSystemInfo.gpus[0].deviceId              = 234;
        mSystemInfo.gpus[0].driverVendor          = "GPUVendorA";
        mSystemInfo.gpus[0].detailedDriverVersion = {1, 2, 3, 4};
    }

    SystemInfo mSystemInfo;
};

// Test the ANGLEGetFeatureSupportUtilAPIVersion function
TEST_F(FeatureSupportUtilTest, APIVersion)
{
    unsigned int versionToUse;
    unsigned int zero = 0;
    unsigned int lowestMinusOne =
        (kFeatureVersion_LowestSupported > 1) ? kFeatureVersion_LowestSupported - 1 : zero;

    versionToUse = kFeatureVersion_LowestSupported;
    EXPECT_TRUE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
    EXPECT_EQ(kFeatureVersion_LowestSupported, versionToUse);

    versionToUse = kFeatureVersion_HighestSupported;
    EXPECT_TRUE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
    EXPECT_EQ(kFeatureVersion_HighestSupported, versionToUse);

    versionToUse = zero;
    EXPECT_FALSE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
    EXPECT_EQ(zero, versionToUse);

    versionToUse = lowestMinusOne;
    EXPECT_FALSE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
    EXPECT_EQ(lowestMinusOne, versionToUse);

    versionToUse = kFeatureVersion_HighestSupported + 1;
    EXPECT_TRUE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
    EXPECT_EQ(kFeatureVersion_HighestSupported, versionToUse);
}

// Test the ANGLEAddDeviceInfoToSystemInfo function
TEST_F(FeatureSupportUtilTest, SystemInfo)
{
    SystemInfo systemInfo          = mSystemInfo;
    systemInfo.machineManufacturer = "BAD";
    systemInfo.machineModelName    = "BAD";

    ANGLEAddDeviceInfoToSystemInfo(kMfr, kModel, &systemInfo);
    EXPECT_EQ(kMfr, systemInfo.machineManufacturer);
    EXPECT_EQ(kModel, systemInfo.machineModelName);
}

// Test the ANGLEAndroidParseRulesString function
TEST_F(FeatureSupportUtilTest, ParseRules)
{
    constexpr char kRulesFileContents[] = R"rulefile(
{
    "Rules" : [
        {
            "Rule" : "Default Rule (i.e. do not use ANGLE)",
            "UseANGLE" : false
        }
    ]
}
)rulefile";
    RulesHandle rulesHandle             = nullptr;
    int rulesVersion                    = 0;
    EXPECT_TRUE(ANGLEAndroidParseRulesString(kRulesFileContents, &rulesHandle, &rulesVersion));
    EXPECT_NE(nullptr, rulesHandle);
    ANGLEFreeRulesHandle(rulesHandle);
}

// Test the ANGLEAndroidParseRulesString and ANGLEShouldBeUsedForApplication functions
TEST_F(FeatureSupportUtilTest, TestRuleProcessing)
{
    SystemInfo systemInfo = mSystemInfo;

    constexpr char kRulesFileContents[] = R"rulefile(
{
    "Rules" : [
        {
            "Rule" : "Default Rule (i.e. do not use ANGLE)",
            "UseANGLE" : false
        },
        {
            "Rule" : "Supported application(s)",
            "UseANGLE" : true,
            "Applications" : [
                {
                    "AppName" : "com.isvA.app1"
                }
            ]
        },
        {
            "Rule" : "Exceptions for bad drivers(s)",
            "UseANGLE" : false,
            "Applications" : [
                {
                    "AppName" : "com.isvA.app1"
                }
            ],
            "Devices" : [
                {
                    "Manufacturer" : "MfrFoo",
                    "Model" : "ModelX",
                    "GPUs" : [
                        {
                            "Vendor" : "GPUVendorA",
                            "DeviceId" : 234,
                            "VerMajor" : 1, "VerMinor" : 2, "VerSubMinor" : 3, "VerPatch" : 4}
                        }
                    ]
                }
            ]
        }
    ]
}
)rulefile";
    RulesHandle rulesHandle             = nullptr;
    int rulesVersion                    = 0;
    EXPECT_TRUE(ANGLEAndroidParseRulesString(kRulesFileContents, &rulesHandle, &rulesVersion));
    EXPECT_NE(nullptr, rulesHandle);

    // Test app1 with a SystemInfo that has an unsupported driver--should fail:
    constexpr char kApp1[] = "com.isvA.app1";
    EXPECT_FALSE(ANGLEShouldBeUsedForApplication(rulesHandle, rulesVersion, &systemInfo, kApp1));

    // Test app1 with a SystemInfo that has a supported driver--should pass:
    systemInfo.gpus[0].detailedDriverVersion = {1, 2, 3, 5};
    EXPECT_TRUE(ANGLEShouldBeUsedForApplication(rulesHandle, rulesVersion, &systemInfo, kApp1));

    // Test unsupported app2--should fail:
    constexpr char kApp2[] = "com.isvB.app2";
    EXPECT_FALSE(ANGLEShouldBeUsedForApplication(rulesHandle, rulesVersion, &systemInfo, kApp2));

    // Free the rules data structures:
    ANGLEFreeRulesHandle(rulesHandle);
}
