blob: 87b5a6181409b215321c7d386c4f51ffbbffc339 [file] [log] [blame]
//
// 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);
}