1 // Copyright (c) 2013 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 <stddef.h>
6 
7 #include "gpu/config/gpu_control_list.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
10 namespace gpu {
11 
12 namespace {
13 
14 constexpr auto kNumerical = GpuControlList::kVersionStyleNumerical;
15 constexpr auto kLexical = GpuControlList::kVersionStyleLexical;
16 
17 constexpr auto kCommon = GpuControlList::kVersionSchemaCommon;
18 constexpr auto kIntelDriver = GpuControlList::kVersionSchemaIntelDriver;
19 constexpr auto kNvidiaDriver = GpuControlList::kVersionSchemaNvidiaDriver;
20 
21 constexpr auto kBetween = GpuControlList::kBetween;
22 constexpr auto kEQ = GpuControlList::kEQ;
23 constexpr auto kLT = GpuControlList::kLT;
24 constexpr auto kLE = GpuControlList::kLE;
25 constexpr auto kGT = GpuControlList::kGT;
26 constexpr auto kGE = GpuControlList::kGE;
27 constexpr auto kAny = GpuControlList::kAny;
28 
29 }  // namespace anonymous
30 
31 class VersionTest : public testing::Test {
32  public:
33   VersionTest() = default;
34   ~VersionTest() override = default;
35 
36   typedef GpuControlList::Version Version;
37 };
38 
TEST_F(VersionTest,VersionComparison)39 TEST_F(VersionTest, VersionComparison) {
40   {
41     Version info = {kAny, kNumerical, kCommon, nullptr, nullptr};
42     EXPECT_TRUE(info.Contains("0"));
43     EXPECT_TRUE(info.Contains("8.9"));
44     EXPECT_TRUE(info.Contains("100"));
45     EXPECT_TRUE(info.Contains("1.9.alpha"));
46   }
47   {
48     Version info = {kGT, kNumerical, kCommon, "8.9", nullptr};
49     EXPECT_FALSE(info.Contains("7"));
50     EXPECT_FALSE(info.Contains("8.9"));
51     EXPECT_FALSE(info.Contains("8.9.hs762"));
52     EXPECT_FALSE(info.Contains("8.9.1"));
53     EXPECT_TRUE(info.Contains("9"));
54     EXPECT_TRUE(info.Contains("9.hs762"));
55   }
56   {
57     Version info = {kGE, kNumerical, kCommon, "8.9", nullptr};
58     EXPECT_FALSE(info.Contains("7"));
59     EXPECT_FALSE(info.Contains("7.07hdy"));
60     EXPECT_TRUE(info.Contains("8.9"));
61     EXPECT_TRUE(info.Contains("8.9.1"));
62     EXPECT_TRUE(info.Contains("8.9.1beta0"));
63     EXPECT_TRUE(info.Contains("9"));
64     EXPECT_TRUE(info.Contains("9.0rel"));
65   }
66   {
67     Version info = {kEQ, kNumerical, kCommon, "8.9", nullptr};
68     EXPECT_FALSE(info.Contains("7"));
69     EXPECT_TRUE(info.Contains("8"));
70     EXPECT_TRUE(info.Contains("8.1uhdy"));
71     EXPECT_TRUE(info.Contains("8.9"));
72     EXPECT_TRUE(info.Contains("8.9.8alp9"));
73     EXPECT_TRUE(info.Contains("8.9.1"));
74     EXPECT_FALSE(info.Contains("9"));
75   }
76   {
77     Version info = {kLT, kNumerical, kCommon, "8.9", nullptr};
78     EXPECT_TRUE(info.Contains("7"));
79     EXPECT_TRUE(info.Contains("7.txt"));
80     EXPECT_TRUE(info.Contains("8.8"));
81     EXPECT_TRUE(info.Contains("8.8.test"));
82     EXPECT_FALSE(info.Contains("8"));
83     EXPECT_FALSE(info.Contains("8.9"));
84     EXPECT_FALSE(info.Contains("8.9.1"));
85     EXPECT_FALSE(info.Contains("8.9.duck"));
86     EXPECT_FALSE(info.Contains("9"));
87   }
88   {
89     Version info = {kLE, kNumerical, kCommon, "8.9", nullptr};
90     EXPECT_TRUE(info.Contains("7"));
91     EXPECT_TRUE(info.Contains("8.8"));
92     EXPECT_TRUE(info.Contains("8"));
93     EXPECT_TRUE(info.Contains("8.9"));
94     EXPECT_TRUE(info.Contains("8.9.chicken"));
95     EXPECT_TRUE(info.Contains("8.9.1"));
96     EXPECT_FALSE(info.Contains("9"));
97     EXPECT_FALSE(info.Contains("9.pork"));
98   }
99   {
100     Version info = {kBetween, kNumerical, kCommon, "8.9", "9.1"};
101     EXPECT_FALSE(info.Contains("7"));
102     EXPECT_FALSE(info.Contains("8.8"));
103     EXPECT_TRUE(info.Contains("8"));
104     EXPECT_TRUE(info.Contains("8.9"));
105     EXPECT_TRUE(info.Contains("8.9.1"));
106     EXPECT_TRUE(info.Contains("9"));
107     EXPECT_TRUE(info.Contains("9.1"));
108     EXPECT_TRUE(info.Contains("9.1.9"));
109     EXPECT_FALSE(info.Contains("9.2"));
110     EXPECT_FALSE(info.Contains("10"));
111   }
112 }
113 
TEST_F(VersionTest,DateComparison)114 TEST_F(VersionTest, DateComparison) {
115   // When we use '-' as splitter, we assume a format of mm-dd-yyyy
116   // or mm-yyyy, i.e., a date.
117   {
118     Version info = {kEQ, kNumerical, kCommon, "1976.3.21", nullptr};
119     EXPECT_TRUE(info.Contains("3-21-1976", '-'));
120     EXPECT_TRUE(info.Contains("3-1976", '-'));
121     EXPECT_TRUE(info.Contains("03-1976", '-'));
122     EXPECT_FALSE(info.Contains("21-3-1976", '-'));
123   }
124   {
125     Version info = {kGT, kNumerical, kCommon, "1976.3.21", nullptr};
126     EXPECT_TRUE(info.Contains("3-22-1976", '-'));
127     EXPECT_TRUE(info.Contains("4-1976", '-'));
128     EXPECT_TRUE(info.Contains("04-1976", '-'));
129     EXPECT_FALSE(info.Contains("3-1976", '-'));
130     EXPECT_FALSE(info.Contains("2-1976", '-'));
131   }
132   {
133     Version info = {kBetween, kNumerical, kCommon, "1976.3.21", "2012.12.25"};
134     EXPECT_FALSE(info.Contains("3-20-1976", '-'));
135     EXPECT_TRUE(info.Contains("3-21-1976", '-'));
136     EXPECT_TRUE(info.Contains("3-22-1976", '-'));
137     EXPECT_TRUE(info.Contains("3-1976", '-'));
138     EXPECT_TRUE(info.Contains("4-1976", '-'));
139     EXPECT_TRUE(info.Contains("1-1-2000", '-'));
140     EXPECT_TRUE(info.Contains("1-2000", '-'));
141     EXPECT_TRUE(info.Contains("2000", '-'));
142     EXPECT_TRUE(info.Contains("11-2012", '-'));
143     EXPECT_TRUE(info.Contains("12-2012", '-'));
144     EXPECT_TRUE(info.Contains("12-24-2012", '-'));
145     EXPECT_TRUE(info.Contains("12-25-2012", '-'));
146     EXPECT_FALSE(info.Contains("12-26-2012", '-'));
147     EXPECT_FALSE(info.Contains("1-2013", '-'));
148     EXPECT_FALSE(info.Contains("2013", '-'));
149   }
150 }
151 
TEST_F(VersionTest,LexicalComparison)152 TEST_F(VersionTest, LexicalComparison) {
153   // When we use lexical style, we assume a format major.minor.*.
154   // We apply numerical comparison to major, lexical comparison to others.
155   {
156     Version info = {kLT, kLexical, kCommon, "8.201", nullptr};
157     EXPECT_TRUE(info.Contains("8.001.100"));
158     EXPECT_TRUE(info.Contains("8.109"));
159     EXPECT_TRUE(info.Contains("8.10900"));
160     EXPECT_TRUE(info.Contains("8.109.100"));
161     EXPECT_TRUE(info.Contains("8.2"));
162     EXPECT_TRUE(info.Contains("8.20"));
163     EXPECT_TRUE(info.Contains("8.200"));
164     EXPECT_TRUE(info.Contains("8.20.100"));
165     EXPECT_FALSE(info.Contains("8.201"));
166     EXPECT_FALSE(info.Contains("8.2010"));
167     EXPECT_FALSE(info.Contains("8.21"));
168     EXPECT_FALSE(info.Contains("8.21.100"));
169     EXPECT_FALSE(info.Contains("9.002"));
170     EXPECT_FALSE(info.Contains("9.201"));
171     EXPECT_FALSE(info.Contains("12"));
172     EXPECT_FALSE(info.Contains("12.201"));
173   }
174   {
175     Version info = {kLT, kLexical, kCommon, "9.002", nullptr};
176     EXPECT_TRUE(info.Contains("8.001.100"));
177     EXPECT_TRUE(info.Contains("8.109"));
178     EXPECT_TRUE(info.Contains("8.10900"));
179     EXPECT_TRUE(info.Contains("8.109.100"));
180     EXPECT_TRUE(info.Contains("8.2"));
181     EXPECT_TRUE(info.Contains("8.20"));
182     EXPECT_TRUE(info.Contains("8.200"));
183     EXPECT_TRUE(info.Contains("8.20.100"));
184     EXPECT_TRUE(info.Contains("8.201"));
185     EXPECT_TRUE(info.Contains("8.2010"));
186     EXPECT_TRUE(info.Contains("8.21"));
187     EXPECT_TRUE(info.Contains("8.21.100"));
188     EXPECT_FALSE(info.Contains("9.002"));
189     EXPECT_FALSE(info.Contains("9.201"));
190     EXPECT_FALSE(info.Contains("12"));
191     EXPECT_FALSE(info.Contains("12.201"));
192   }
193 }
194 
TEST_F(VersionTest,IntelDriverSchema)195 TEST_F(VersionTest, IntelDriverSchema) {
196   {
197     // New drivers, AA.BB.CCC.DDDD, only CCC.DDDD is considered.
198     Version info = {kLT, kNumerical, kIntelDriver, "25.20.100.6952", nullptr};
199     EXPECT_TRUE(info.Contains("0.0.100.6000"));
200     EXPECT_FALSE(info.Contains("0.0.100.7000"));
201     EXPECT_FALSE(info.Contains("0.0.200.6000"));
202     EXPECT_TRUE(info.Contains("26.20.100.6000"));
203     EXPECT_FALSE(info.Contains("24.20.100.7000"));
204 
205     // Doesn't match old drivers.
206     EXPECT_FALSE(info.Contains("22.20.16.7000"));
207     EXPECT_FALSE(info.Contains("15.45.16.4248"));
208   }
209   {
210     // Old drivers, AA.BB.CC.DDDD, only DDDD is considered.
211     Version info = {kGT, kNumerical, kIntelDriver, "10.18.15.4256", nullptr};
212     EXPECT_TRUE(info.Contains("0.0.0.6000"));
213     EXPECT_FALSE(info.Contains("0.0.0.4000"));
214     EXPECT_FALSE(info.Contains("0.0.16.4000"));
215     EXPECT_TRUE(info.Contains("10.18.15.4279"));
216     EXPECT_FALSE(info.Contains("15.40.19.4058"));
217 
218     // Doesn't match new drivers.
219     EXPECT_FALSE(info.Contains("24.20.100.6346"));
220   }
221 }
222 
TEST_F(VersionTest,NvidiaDriverSchema)223 TEST_F(VersionTest, NvidiaDriverSchema) {
224   {
225     // Nvidia drivers, XX.XX.XXXA.AABB, only AAA.BB is considered.  The version
226     // is specified as "AAA.BB" or "AAA" in the workaround file.
227     {
228       // "AAA.BB" should exactly specify one version.
229       Version info = {kLT, kNumerical, kNvidiaDriver, "234.56", nullptr};
230       EXPECT_TRUE(info.Contains("26.10.0012.3455"));
231       EXPECT_TRUE(info.Contains("00.00.0012.3455"));
232       EXPECT_TRUE(info.Contains("00.00.012.3455"));
233       EXPECT_TRUE(info.Contains("00.00.12.3455"));
234       EXPECT_FALSE(info.Contains("26.10.0012.3456"));
235       EXPECT_FALSE(info.Contains("26.10.012.3456"));
236       EXPECT_FALSE(info.Contains("26.10.12.3456"));
237       EXPECT_FALSE(info.Contains("26.10.0012.3457"));
238       EXPECT_FALSE(info.Contains("00.00.0012.3457"));
239       EXPECT_TRUE(info.Contains("26.10.0012.2457"));
240       EXPECT_TRUE(info.Contains("26.10.0011.3457"));
241 
242       // Leading zeros in the third stanza are okay.
243       EXPECT_TRUE(info.Contains("26.10.0002.3455"));
244       EXPECT_FALSE(info.Contains("26.10.0002.3456"));
245       EXPECT_FALSE(info.Contains("26.10.0002.3457"));
246       EXPECT_TRUE(info.Contains("26.10.0010.3457"));
247       EXPECT_TRUE(info.Contains("26.10.0000.3457"));
248 
249       // Missing zeros in the fourth stanza are replaced.
250       EXPECT_TRUE(info.Contains("26.10.0012.455"));
251       EXPECT_TRUE(info.Contains("26.10.0012.57"));
252       EXPECT_FALSE(info.Contains("26.10.0013.456"));
253       EXPECT_FALSE(info.Contains("26.10.0013.57"));
254 
255       // Too short is rejected.
256       EXPECT_FALSE(info.Contains("26.10..57"));
257       EXPECT_FALSE(info.Contains("26.10.100"));
258       EXPECT_FALSE(info.Contains("26.10.100."));
259     }
260 
261     {
262       // "AAA" should allow "AAA.*"
263       Version info = {kEQ, kNumerical, kNvidiaDriver, "234", nullptr};
264       EXPECT_FALSE(info.Contains("26.10.0012.3556"));
265       EXPECT_TRUE(info.Contains("26.10.0012.3456"));
266     }
267   }
268 }
269 
270 }  // namespace gpu
271