1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "gpu/config/gpu_info.h"
6 #include "gpu/config/gpu_test_config.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 
9 namespace gpu {
10 
11 class GPUTestConfigTest : public testing::Test {
12  public:
13   GPUTestConfigTest() = default;
14 
15   ~GPUTestConfigTest() override = default;
16 
17  protected:
SetUp()18   void SetUp() override {}
19 
TearDown()20   void TearDown() override {}
21 };
22 
TEST_F(GPUTestConfigTest,EmptyValues)23 TEST_F(GPUTestConfigTest, EmptyValues) {
24   GPUTestConfig config;
25   EXPECT_EQ(GPUTestConfig::kOsUnknown, config.os());
26   EXPECT_EQ(0u, config.gpu_vendor().size());
27   EXPECT_EQ(0u, config.gpu_device_id());
28   EXPECT_EQ(GPUTestConfig::kBuildTypeUnknown, config.build_type());
29   EXPECT_EQ(GPUTestConfig::kAPIUnknown, config.api());
30   EXPECT_EQ(GPUTestConfig::kCommandDecoderUnknown, config.command_decoder());
31 }
32 
TEST_F(GPUTestConfigTest,SetGPUInfo)33 TEST_F(GPUTestConfigTest, SetGPUInfo) {
34   GPUInfo gpu_info;
35   gpu_info.gpu.vendor_id = 0x10de;
36   gpu_info.gpu.device_id = 0x0640;
37   GPUTestBotConfig config;
38   EXPECT_TRUE(config.SetGPUInfo(gpu_info));
39   EXPECT_EQ(1u, config.gpu_vendor().size());
40   EXPECT_EQ(gpu_info.gpu.vendor_id, config.gpu_vendor()[0]);
41   EXPECT_EQ(gpu_info.gpu.device_id, config.gpu_device_id());
42 
43   gpu_info.gpu.vendor_id = 0x8086;
44   gpu_info.gpu.device_id = 0x0046;
45   EXPECT_TRUE(config.SetGPUInfo(gpu_info));
46   EXPECT_EQ(1u, config.gpu_vendor().size());
47   EXPECT_EQ(gpu_info.gpu.vendor_id, config.gpu_vendor()[0]);
48   EXPECT_EQ(gpu_info.gpu.device_id, config.gpu_device_id());
49 }
50 
TEST_F(GPUTestConfigTest,IsValid)51 TEST_F(GPUTestConfigTest, IsValid) {
52   {
53     GPUTestConfig config;
54     config.set_gpu_device_id(0x0640);
55     EXPECT_FALSE(config.IsValid());
56     config.AddGPUVendor(0x10de);
57     EXPECT_TRUE(config.IsValid());
58   }
59 
60   {
61     GPUTestBotConfig config;
62     config.set_build_type(GPUTestConfig::kBuildTypeRelease);
63     config.set_os(GPUTestConfig::kOsWin7);
64     config.set_gpu_device_id(0x0640);
65     EXPECT_FALSE(config.IsValid());
66     config.AddGPUVendor(0x10de);
67     EXPECT_TRUE(config.IsValid());
68 
69     // Device ID of 0 is valid only on macOS.
70     config.set_gpu_device_id(0);
71     config.set_os(GPUTestConfig::kOsMacBigSur);
72     EXPECT_TRUE(config.IsValid());
73     config.set_os(GPUTestConfig::kOsWin7);
74     EXPECT_FALSE(config.IsValid());
75 
76     config.set_gpu_device_id(0x0640);
77     EXPECT_TRUE(config.IsValid());
78 
79     config.set_os(GPUTestConfig::kOsWin);
80     EXPECT_FALSE(config.IsValid());
81     config.set_os(GPUTestConfig::kOsWin7 | GPUTestConfig::kOsWinXP);
82     EXPECT_FALSE(config.IsValid());
83     config.set_os(GPUTestConfig::kOsWin7);
84     EXPECT_TRUE(config.IsValid());
85 
86     config.set_build_type(GPUTestConfig::kBuildTypeUnknown);
87     EXPECT_FALSE(config.IsValid());
88     config.set_build_type(GPUTestConfig::kBuildTypeRelease);
89     EXPECT_TRUE(config.IsValid());
90   }
91 }
92 
TEST_F(GPUTestConfigTest,Matches)93 TEST_F(GPUTestConfigTest, Matches) {
94   GPUTestBotConfig config;
95   config.set_os(GPUTestConfig::kOsWin7);
96   config.set_build_type(GPUTestConfig::kBuildTypeRelease);
97   config.AddGPUVendor(0x10de);
98   config.set_gpu_device_id(0x0640);
99   config.set_api(GPUTestConfig::kAPID3D11);
100   config.set_command_decoder(GPUTestConfig::kCommandDecoderPassthrough);
101   EXPECT_TRUE(config.IsValid());
102 
103   {  // os matching
104     GPUTestConfig config2;
105     EXPECT_TRUE(config.Matches(config2));
106     config2.set_os(GPUTestConfig::kOsWin);
107     EXPECT_TRUE(config.Matches(config2));
108     config2.set_os(GPUTestConfig::kOsWin7);
109     EXPECT_TRUE(config.Matches(config2));
110     config2.set_os(GPUTestConfig::kOsMac);
111     EXPECT_FALSE(config.Matches(config2));
112     config2.set_os(GPUTestConfig::kOsWin7 | GPUTestConfig::kOsLinux);
113     EXPECT_TRUE(config.Matches(config2));
114   }
115 
116   {  // gpu vendor matching
117     {
118       GPUTestConfig config2;
119       config2.AddGPUVendor(0x10de);
120       EXPECT_TRUE(config.Matches(config2));
121       config2.AddGPUVendor(0x1004);
122       EXPECT_TRUE(config.Matches(config2));
123     }
124     {
125       GPUTestConfig config2;
126       config2.AddGPUVendor(0x8086);
127       EXPECT_FALSE(config.Matches(config2));
128     }
129   }
130 
131   {  // build type matching
132     GPUTestConfig config2;
133     config2.set_build_type(GPUTestConfig::kBuildTypeRelease);
134     EXPECT_TRUE(config.Matches(config2));
135     config2.set_build_type(GPUTestConfig::kBuildTypeRelease |
136                            GPUTestConfig::kBuildTypeDebug);
137     EXPECT_TRUE(config.Matches(config2));
138     config2.set_build_type(GPUTestConfig::kBuildTypeDebug);
139     EXPECT_FALSE(config.Matches(config2));
140   }
141 
142   {  // exact matching
143     GPUTestConfig config2;
144     config2.set_os(GPUTestConfig::kOsWin7);
145     config2.set_build_type(GPUTestConfig::kBuildTypeRelease);
146     config2.AddGPUVendor(0x10de);
147     config2.set_gpu_device_id(0x0640);
148     EXPECT_TRUE(config.Matches(config2));
149     config2.set_gpu_device_id(0x0641);
150     EXPECT_FALSE(config.Matches(config2));
151   }
152 
153   {  // api matching
154     {
155       GPUTestConfig config2;
156       config2.set_api(GPUTestConfig::kAPID3D11);
157       EXPECT_TRUE(config.Matches(config2));
158       config2.set_api(config2.api() | GPUTestConfig::kAPID3D9);
159       EXPECT_TRUE(config.Matches(config2));
160     }
161     {
162       GPUTestConfig config2;
163       config2.set_api(GPUTestConfig::kAPID3D9);
164       EXPECT_FALSE(config.Matches(config2));
165     }
166   }
167   {  // command decoder matching
168     {
169       GPUTestConfig config2;
170       config2.set_command_decoder(GPUTestConfig::kCommandDecoderPassthrough);
171       EXPECT_TRUE(config.Matches(config2));
172     }
173     {
174       GPUTestConfig config2;
175       config2.set_command_decoder(GPUTestConfig::kCommandDecoderValidating);
176       EXPECT_FALSE(config.Matches(config2));
177     }
178   }
179 }
180 
TEST_F(GPUTestConfigTest,StringMatches)181 TEST_F(GPUTestConfigTest, StringMatches) {
182   GPUTestBotConfig config;
183   config.set_os(GPUTestConfig::kOsWin7);
184   config.set_build_type(GPUTestConfig::kBuildTypeRelease);
185   config.AddGPUVendor(0x10de);
186   config.set_gpu_device_id(0x0640);
187   config.set_api(GPUTestConfig::kAPID3D11);
188   config.set_command_decoder(GPUTestConfig::kCommandDecoderPassthrough);
189   EXPECT_TRUE(config.IsValid());
190 
191   EXPECT_TRUE(config.Matches(std::string()));
192 
193   // os matching
194   EXPECT_TRUE(config.Matches("WIN"));
195   EXPECT_TRUE(config.Matches("WIN7"));
196   EXPECT_FALSE(config.Matches("MAC"));
197   EXPECT_TRUE(config.Matches("WIN7 LINUX"));
198 
199   // gpu vendor matching
200   EXPECT_TRUE(config.Matches("NVIDIA"));
201   EXPECT_TRUE(config.Matches("NVIDIA AMD"));
202   EXPECT_FALSE(config.Matches("INTEL"));
203 
204   // build type matching
205   EXPECT_TRUE(config.Matches("RELEASE"));
206   EXPECT_TRUE(config.Matches("RELEASE DEBUG"));
207   EXPECT_FALSE(config.Matches("DEBUG"));
208 
209   // exact matching
210   EXPECT_TRUE(config.Matches("WIN7 RELEASE NVIDIA 0X0640"));
211   EXPECT_FALSE(config.Matches("WIN7 RELEASE NVIDIA 0X0641"));
212 
213   // api matching
214   EXPECT_TRUE(config.Matches("D3D11"));
215   EXPECT_FALSE(config.Matches("D3D9 OPENGL GLES"));
216 
217   // command decoder matching
218   EXPECT_TRUE(config.Matches("PASSTHROUGH"));
219   EXPECT_FALSE(config.Matches("VALIDATING"));
220 }
221 
TEST_F(GPUTestConfigTest,OverlapsWith)222 TEST_F(GPUTestConfigTest, OverlapsWith) {
223   {  // os
224     // win vs win7
225     GPUTestConfig config;
226     config.set_os(GPUTestConfig::kOsWin);
227     GPUTestConfig config2;
228     config2.set_os(GPUTestConfig::kOsWin7);
229     EXPECT_TRUE(config.OverlapsWith(config2));
230     EXPECT_TRUE(config2.OverlapsWith(config));
231     // win vs win7+linux
232     config2.set_os(GPUTestConfig::kOsWin7 | GPUTestConfig::kOsLinux);
233     EXPECT_TRUE(config.OverlapsWith(config2));
234     EXPECT_TRUE(config2.OverlapsWith(config));
235     // win vs mac
236     config2.set_os(GPUTestConfig::kOsMac);
237     EXPECT_FALSE(config.OverlapsWith(config2));
238     EXPECT_FALSE(config2.OverlapsWith(config));
239     // win vs unknown
240     config2.set_os(GPUTestConfig::kOsUnknown);
241     EXPECT_TRUE(config.OverlapsWith(config2));
242     EXPECT_TRUE(config2.OverlapsWith(config));
243   }
244 
245   {  // gpu vendor
246     GPUTestConfig config;
247     config.AddGPUVendor(0x10de);
248     // nvidia vs unknown
249     GPUTestConfig config2;
250     EXPECT_TRUE(config.OverlapsWith(config2));
251     EXPECT_TRUE(config2.OverlapsWith(config));
252     // nvidia vs intel
253     config2.AddGPUVendor(0x1086);
254     EXPECT_FALSE(config.OverlapsWith(config2));
255     EXPECT_FALSE(config2.OverlapsWith(config));
256     // nvidia vs nvidia+intel
257     config2.AddGPUVendor(0x10de);
258     EXPECT_TRUE(config.OverlapsWith(config2));
259     EXPECT_TRUE(config2.OverlapsWith(config));
260   }
261 
262   {  // build type
263     // release vs debug
264     GPUTestConfig config;
265     config.set_build_type(GPUTestConfig::kBuildTypeRelease);
266     GPUTestConfig config2;
267     config2.set_build_type(GPUTestConfig::kBuildTypeDebug);
268     EXPECT_FALSE(config.OverlapsWith(config2));
269     EXPECT_FALSE(config2.OverlapsWith(config));
270     // release vs release+debug
271     config2.set_build_type(GPUTestConfig::kBuildTypeRelease |
272                            GPUTestConfig::kBuildTypeDebug);
273     EXPECT_TRUE(config.OverlapsWith(config2));
274     EXPECT_TRUE(config2.OverlapsWith(config));
275     // release vs unknown
276     config2.set_build_type(GPUTestConfig::kBuildTypeUnknown);
277     EXPECT_TRUE(config.OverlapsWith(config2));
278     EXPECT_TRUE(config2.OverlapsWith(config));
279   }
280 
281   {  // win7 vs nvidia
282     GPUTestConfig config;
283     config.set_os(GPUTestConfig::kOsWin7);
284     GPUTestConfig config2;
285     config2.AddGPUVendor(0x10de);
286     EXPECT_TRUE(config.OverlapsWith(config2));
287     EXPECT_TRUE(config2.OverlapsWith(config));
288   }
289 }
290 
TEST_F(GPUTestConfigTest,LoadCurrentConfig)291 TEST_F(GPUTestConfigTest, LoadCurrentConfig) {
292   GPUTestBotConfig config;
293   GPUInfo gpu_info;
294   gpu_info.gpu.vendor_id = 0x10de;
295   gpu_info.gpu.device_id = 0x0640;
296   EXPECT_TRUE(config.LoadCurrentConfig(&gpu_info));
297   EXPECT_TRUE(config.IsValid());
298 }
299 
300 }  // namespace gpu
301 
302