1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // feature_support_util_unittest.cpp: Unit test for the feature-support utility.
8
9 #include <gtest/gtest.h>
10
11 #include "../gpu_info_util/SystemInfo.h"
12 #include "feature_support_util.h"
13
14 using namespace angle;
15
16 constexpr char kMfr[] = "MfrFoo";
17 constexpr char kModel[] = "ModelX";
18
19 class FeatureSupportUtilTest : public testing::Test
20 {
21 protected:
FeatureSupportUtilTest()22 FeatureSupportUtilTest()
23 {
24 mSystemInfo.machineManufacturer = kMfr;
25 mSystemInfo.machineModelName = kModel;
26 mSystemInfo.gpus.resize(1);
27 mSystemInfo.gpus[0].vendorId = 123;
28 mSystemInfo.gpus[0].deviceId = 234;
29 mSystemInfo.gpus[0].driverVendor = "GPUVendorA";
30 mSystemInfo.gpus[0].detailedDriverVersion = {1, 2, 3, 4};
31 }
32
33 SystemInfo mSystemInfo;
34 };
35
36 // Test the ANGLEGetFeatureSupportUtilAPIVersion function
TEST_F(FeatureSupportUtilTest,APIVersion)37 TEST_F(FeatureSupportUtilTest, APIVersion)
38 {
39 unsigned int versionToUse;
40 unsigned int zero = 0;
41 unsigned int lowestMinusOne =
42 (kFeatureVersion_LowestSupported > 1) ? kFeatureVersion_LowestSupported - 1 : zero;
43
44 versionToUse = kFeatureVersion_LowestSupported;
45 EXPECT_TRUE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
46 EXPECT_EQ(kFeatureVersion_LowestSupported, versionToUse);
47
48 versionToUse = kFeatureVersion_HighestSupported;
49 EXPECT_TRUE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
50 EXPECT_EQ(kFeatureVersion_HighestSupported, versionToUse);
51
52 versionToUse = zero;
53 EXPECT_FALSE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
54 EXPECT_EQ(zero, versionToUse);
55
56 versionToUse = lowestMinusOne;
57 EXPECT_FALSE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
58 EXPECT_EQ(lowestMinusOne, versionToUse);
59
60 versionToUse = kFeatureVersion_HighestSupported + 1;
61 EXPECT_TRUE(ANGLEGetFeatureSupportUtilAPIVersion(&versionToUse));
62 EXPECT_EQ(kFeatureVersion_HighestSupported, versionToUse);
63 }
64
65 // Test the ANGLEAddDeviceInfoToSystemInfo function
TEST_F(FeatureSupportUtilTest,SystemInfo)66 TEST_F(FeatureSupportUtilTest, SystemInfo)
67 {
68 SystemInfo systemInfo = mSystemInfo;
69 systemInfo.machineManufacturer = "BAD";
70 systemInfo.machineModelName = "BAD";
71
72 ANGLEAddDeviceInfoToSystemInfo(kMfr, kModel, &systemInfo);
73 EXPECT_EQ(kMfr, systemInfo.machineManufacturer);
74 EXPECT_EQ(kModel, systemInfo.machineModelName);
75 }
76
77 // Test the ANGLEAndroidParseRulesString function
TEST_F(FeatureSupportUtilTest,ParseRules)78 TEST_F(FeatureSupportUtilTest, ParseRules)
79 {
80 constexpr char kRulesFileContents[] = R"rulefile(
81 {
82 "Rules" : [
83 {
84 "Rule" : "Default Rule (i.e. do not use ANGLE)",
85 "UseANGLE" : false
86 }
87 ]
88 }
89 )rulefile";
90 RulesHandle rulesHandle = nullptr;
91 int rulesVersion = 0;
92 EXPECT_TRUE(ANGLEAndroidParseRulesString(kRulesFileContents, &rulesHandle, &rulesVersion));
93 EXPECT_NE(nullptr, rulesHandle);
94 ANGLEFreeRulesHandle(rulesHandle);
95 }
96
97 // Test the ANGLEAndroidParseRulesString and ANGLEShouldBeUsedForApplication functions
TEST_F(FeatureSupportUtilTest,TestRuleProcessing)98 TEST_F(FeatureSupportUtilTest, TestRuleProcessing)
99 {
100 SystemInfo systemInfo = mSystemInfo;
101
102 constexpr char kRulesFileContents[] = R"rulefile(
103 {
104 "Rules" : [
105 {
106 "Rule" : "Default Rule (i.e. do not use ANGLE)",
107 "UseANGLE" : false
108 },
109 {
110 "Rule" : "Supported application(s)",
111 "UseANGLE" : true,
112 "Applications" : [
113 {
114 "AppName" : "com.isvA.app1"
115 }
116 ]
117 },
118 {
119 "Rule" : "Exceptions for bad drivers(s)",
120 "UseANGLE" : false,
121 "Applications" : [
122 {
123 "AppName" : "com.isvA.app1"
124 }
125 ],
126 "Devices" : [
127 {
128 "Manufacturer" : "MfrFoo",
129 "Model" : "ModelX",
130 "GPUs" : [
131 {
132 "Vendor" : "GPUVendorA",
133 "DeviceId" : 234,
134 "VerMajor" : 1, "VerMinor" : 2, "VerSubMinor" : 3, "VerPatch" : 4
135 }
136 ]
137 }
138 ]
139 }
140 ]
141 }
142 )rulefile";
143 RulesHandle rulesHandle = nullptr;
144 int rulesVersion = 0;
145 EXPECT_TRUE(ANGLEAndroidParseRulesString(kRulesFileContents, &rulesHandle, &rulesVersion));
146 EXPECT_NE(nullptr, rulesHandle);
147
148 // Test app1 with a SystemInfo that has an unsupported driver--should fail:
149 constexpr char kApp1[] = "com.isvA.app1";
150 EXPECT_FALSE(ANGLEShouldBeUsedForApplication(rulesHandle, rulesVersion, &systemInfo, kApp1));
151
152 // Test app1 with a SystemInfo that has a supported driver--should pass:
153 systemInfo.gpus[0].detailedDriverVersion = {1, 2, 3, 5};
154 EXPECT_TRUE(ANGLEShouldBeUsedForApplication(rulesHandle, rulesVersion, &systemInfo, kApp1));
155
156 // Test unsupported app2--should fail:
157 constexpr char kApp2[] = "com.isvB.app2";
158 EXPECT_FALSE(ANGLEShouldBeUsedForApplication(rulesHandle, rulesVersion, &systemInfo, kApp2));
159
160 // Free the rules data structures:
161 ANGLEFreeRulesHandle(rulesHandle);
162 }
163