xref: /aosp_15_r20/external/angle/src/feature_support_util/feature_support_util_unittest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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