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.
5 #include "base/json/json_reader.h"
6 #include "gpu/config/gpu_control_list.h"
7 #include "gpu/config/gpu_info.h"
8 #include "testing/gtest/include/gtest/gtest.h"
10 #define LONG_STRING_CONST(...) #__VA_ARGS__
14 enum TestFeatureType {
20 class GpuControlListEntryTest : public testing::Test {
22 GpuControlListEntryTest() { }
23 virtual ~GpuControlListEntryTest() { }
25 const GPUInfo& gpu_info() const {
29 typedef GpuControlList::ScopedGpuControlListEntry ScopedEntry;
31 static ScopedEntry GetEntryFromString(
32 const std::string& json, bool supports_feature_type_all) {
33 scoped_ptr<base::Value> root;
34 root.reset(base::JSONReader::Read(json));
35 DictionaryValue* value = NULL;
36 if (root.get() == NULL || !root->GetAsDictionary(&value))
39 GpuControlList::FeatureMap feature_map;
40 feature_map["test_feature_0"] = TEST_FEATURE_0;
41 feature_map["test_feature_1"] = TEST_FEATURE_1;
42 feature_map["test_feature_2"] = TEST_FEATURE_2;
44 return GpuControlList::GpuControlListEntry::GetEntryFromValue(
45 value, true, feature_map, supports_feature_type_all);
48 static ScopedEntry GetEntryFromString(const std::string& json) {
49 return GetEntryFromString(json, false);
52 virtual void SetUp() {
53 gpu_info_.gpu.vendor_id = 0x10de;
54 gpu_info_.gpu.device_id = 0x0640;
55 gpu_info_.driver_vendor = "NVIDIA";
56 gpu_info_.driver_version = "1.6.18";
57 gpu_info_.driver_date = "7-14-2009";
58 gpu_info_.machine_model = "MacBookPro 7.1";
59 gpu_info_.gl_vendor = "NVIDIA Corporation";
60 gpu_info_.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
61 gpu_info_.performance_stats.graphics = 5.0;
62 gpu_info_.performance_stats.gaming = 5.0;
63 gpu_info_.performance_stats.overall = 5.0;
70 TEST_F(GpuControlListEntryTest, DetailedEntry) {
71 const std::string json = LONG_STRING_CONST(
74 "description": "test entry",
75 "cr_bugs": [1024, 678],
76 "webkit_bugs": [1950],
84 "vendor_id": "0x10de",
85 "device_id": ["0x0640"],
96 ScopedEntry entry(GetEntryFromString(json));
97 EXPECT_TRUE(entry.get() != NULL);
98 EXPECT_EQ(GpuControlList::kOsMacosx, entry->GetOsType());
99 EXPECT_FALSE(entry->disabled());
100 EXPECT_EQ(5u, entry->id());
101 EXPECT_STREQ("test entry", entry->description().c_str());
102 EXPECT_EQ(2u, entry->cr_bugs().size());
103 EXPECT_EQ(1024, entry->cr_bugs()[0]);
104 EXPECT_EQ(678, entry->cr_bugs()[1]);
105 EXPECT_EQ(1u, entry->webkit_bugs().size());
106 EXPECT_EQ(1950, entry->webkit_bugs()[0]);
107 EXPECT_EQ(1u, entry->features().size());
108 EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_0));
109 EXPECT_FALSE(entry->NeedsMoreInfo(gpu_info()));
110 EXPECT_TRUE(entry->Contains(
111 GpuControlList::kOsMacosx, "10.6.4", gpu_info()));
114 TEST_F(GpuControlListEntryTest, VendorOnAllOsEntry) {
115 const std::string json = LONG_STRING_CONST(
118 "vendor_id": "0x10de",
124 ScopedEntry entry(GetEntryFromString(json));
125 EXPECT_TRUE(entry.get() != NULL);
126 EXPECT_EQ(GpuControlList::kOsAny, entry->GetOsType());
128 const GpuControlList::OsType os_type[] = {
129 GpuControlList::kOsMacosx,
130 GpuControlList::kOsWin,
131 GpuControlList::kOsLinux,
132 GpuControlList::kOsChromeOS,
133 GpuControlList::kOsAndroid
135 for (size_t i = 0; i < arraysize(os_type); ++i)
136 EXPECT_TRUE(entry->Contains(os_type[i], "10.6", gpu_info()));
139 TEST_F(GpuControlListEntryTest, VendorOnLinuxEntry) {
140 const std::string json = LONG_STRING_CONST(
146 "vendor_id": "0x10de",
152 ScopedEntry entry(GetEntryFromString(json));
153 EXPECT_TRUE(entry.get() != NULL);
154 EXPECT_EQ(GpuControlList::kOsLinux, entry->GetOsType());
156 const GpuControlList::OsType os_type[] = {
157 GpuControlList::kOsMacosx,
158 GpuControlList::kOsWin,
159 GpuControlList::kOsChromeOS,
160 GpuControlList::kOsAndroid
162 for (size_t i = 0; i < arraysize(os_type); ++i)
163 EXPECT_FALSE(entry->Contains(os_type[i], "10.6", gpu_info()));
164 EXPECT_TRUE(entry->Contains(
165 GpuControlList::kOsLinux, "10.6", gpu_info()));
168 TEST_F(GpuControlListEntryTest, AllExceptNVidiaOnLinuxEntry) {
169 const std::string json = LONG_STRING_CONST(
177 "vendor_id": "0x10de"
185 ScopedEntry entry(GetEntryFromString(json));
186 EXPECT_TRUE(entry.get() != NULL);
187 EXPECT_EQ(GpuControlList::kOsLinux, entry->GetOsType());
189 const GpuControlList::OsType os_type[] = {
190 GpuControlList::kOsMacosx,
191 GpuControlList::kOsWin,
192 GpuControlList::kOsLinux,
193 GpuControlList::kOsChromeOS,
194 GpuControlList::kOsAndroid
196 for (size_t i = 0; i < arraysize(os_type); ++i)
197 EXPECT_FALSE(entry->Contains(os_type[i], "10.6", gpu_info()));
200 TEST_F(GpuControlListEntryTest, AllExceptIntelOnLinuxEntry) {
201 const std::string json = LONG_STRING_CONST(
209 "vendor_id": "0x8086"
217 ScopedEntry entry(GetEntryFromString(json));
218 EXPECT_TRUE(entry.get() != NULL);
219 EXPECT_EQ(GpuControlList::kOsLinux, entry->GetOsType());
221 const GpuControlList::OsType os_type[] = {
222 GpuControlList::kOsMacosx,
223 GpuControlList::kOsWin,
224 GpuControlList::kOsChromeOS,
225 GpuControlList::kOsAndroid
227 for (size_t i = 0; i < arraysize(os_type); ++i)
228 EXPECT_FALSE(entry->Contains(os_type[i], "10.6", gpu_info()));
229 EXPECT_TRUE(entry->Contains(
230 GpuControlList::kOsLinux, "10.6", gpu_info()));
233 TEST_F(GpuControlListEntryTest, DateOnWindowsEntry) {
234 const std::string json = LONG_STRING_CONST(
249 ScopedEntry entry(GetEntryFromString(json));
250 EXPECT_TRUE(entry.get() != NULL);
251 EXPECT_EQ(GpuControlList::kOsWin, entry->GetOsType());
254 gpu_info.driver_date = "4-12-2010";
255 EXPECT_TRUE(entry->Contains(
256 GpuControlList::kOsWin, "10.6", gpu_info));
257 gpu_info.driver_date = "5-8-2010";
258 EXPECT_FALSE(entry->Contains(
259 GpuControlList::kOsWin, "10.6", gpu_info));
260 gpu_info.driver_date = "5-9-2010";
261 EXPECT_FALSE(entry->Contains(
262 GpuControlList::kOsWin, "10.6", gpu_info));
265 TEST_F(GpuControlListEntryTest, MultipleDevicesEntry) {
266 const std::string json = LONG_STRING_CONST(
269 "vendor_id": "0x10de",
270 "device_id": ["0x1023", "0x0640"],
276 ScopedEntry entry(GetEntryFromString(json));
277 EXPECT_TRUE(entry.get() != NULL);
278 EXPECT_EQ(GpuControlList::kOsAny, entry->GetOsType());
280 const GpuControlList::OsType os_type[] = {
281 GpuControlList::kOsMacosx,
282 GpuControlList::kOsWin,
283 GpuControlList::kOsLinux,
284 GpuControlList::kOsChromeOS,
285 GpuControlList::kOsAndroid
287 for (size_t i = 0; i < arraysize(os_type); ++i)
288 EXPECT_TRUE(entry->Contains(os_type[i], "10.6", gpu_info()));
291 TEST_F(GpuControlListEntryTest, ChromeOSEntry) {
292 const std::string json = LONG_STRING_CONST(
303 ScopedEntry entry(GetEntryFromString(json));
304 EXPECT_TRUE(entry.get() != NULL);
305 EXPECT_EQ(GpuControlList::kOsChromeOS, entry->GetOsType());
307 const GpuControlList::OsType os_type[] = {
308 GpuControlList::kOsMacosx,
309 GpuControlList::kOsWin,
310 GpuControlList::kOsLinux,
311 GpuControlList::kOsAndroid
313 for (size_t i = 0; i < arraysize(os_type); ++i)
314 EXPECT_FALSE(entry->Contains(os_type[i], "10.6", gpu_info()));
315 EXPECT_TRUE(entry->Contains(
316 GpuControlList::kOsChromeOS, "10.6", gpu_info()));
319 TEST_F(GpuControlListEntryTest, MalformedVendor) {
320 const std::string json = LONG_STRING_CONST(
323 "vendor_id": "[0x10de]",
329 ScopedEntry entry(GetEntryFromString(json));
330 EXPECT_TRUE(entry.get() == NULL);
333 TEST_F(GpuControlListEntryTest, UnknownFieldEntry) {
334 const std::string json = LONG_STRING_CONST(
343 ScopedEntry entry(GetEntryFromString(json));
344 EXPECT_TRUE(entry.get() == NULL);
347 TEST_F(GpuControlListEntryTest, UnknownExceptionFieldEntry) {
348 const std::string json = LONG_STRING_CONST(
361 ScopedEntry entry(GetEntryFromString(json));
362 EXPECT_TRUE(entry.get() == NULL);
365 TEST_F(GpuControlListEntryTest, UnknownFeatureEntry) {
366 const std::string json = LONG_STRING_CONST(
370 "some_unknown_feature",
375 ScopedEntry entry(GetEntryFromString(json));
376 EXPECT_TRUE(entry.get() == NULL);
379 TEST_F(GpuControlListEntryTest, GlVendorEntry) {
380 const std::string json = LONG_STRING_CONST(
392 ScopedEntry entry(GetEntryFromString(json));
393 EXPECT_TRUE(entry.get() != NULL);
395 const GpuControlList::OsType os_type[] = {
396 GpuControlList::kOsMacosx,
397 GpuControlList::kOsWin,
398 GpuControlList::kOsLinux,
399 GpuControlList::kOsChromeOS,
400 GpuControlList::kOsAndroid
402 for (size_t i = 0; i < arraysize(os_type); ++i)
403 EXPECT_TRUE(entry->Contains(os_type[i], "10.6", gpu_info()));
406 TEST_F(GpuControlListEntryTest, GlRendererEntry) {
407 const std::string json = LONG_STRING_CONST(
419 ScopedEntry entry(GetEntryFromString(json));
420 EXPECT_TRUE(entry.get() != NULL);
422 const GpuControlList::OsType os_type[] = {
423 GpuControlList::kOsMacosx,
424 GpuControlList::kOsWin,
425 GpuControlList::kOsLinux,
426 GpuControlList::kOsChromeOS,
427 GpuControlList::kOsAndroid
429 for (size_t i = 0; i < arraysize(os_type); ++i)
430 EXPECT_TRUE(entry->Contains(os_type[i], "10.6", gpu_info()));
433 TEST_F(GpuControlListEntryTest, PerfGraphicsEntry) {
434 const std::string json = LONG_STRING_CONST(
446 ScopedEntry entry(GetEntryFromString(json));
447 EXPECT_TRUE(entry.get() != NULL);
448 EXPECT_TRUE(entry->Contains(GpuControlList::kOsWin, "10.6", gpu_info()));
451 TEST_F(GpuControlListEntryTest, PerfGamingEntry) {
452 const std::string json = LONG_STRING_CONST(
464 ScopedEntry entry(GetEntryFromString(json));
465 EXPECT_TRUE(entry.get() != NULL);
466 EXPECT_FALSE(entry->Contains(GpuControlList::kOsWin, "10.6", gpu_info()));
469 TEST_F(GpuControlListEntryTest, PerfOverallEntry) {
470 const std::string json = LONG_STRING_CONST(
483 ScopedEntry entry(GetEntryFromString(json));
484 EXPECT_TRUE(entry.get() != NULL);
485 EXPECT_TRUE(entry->Contains(GpuControlList::kOsWin, "10.6", gpu_info()));
488 TEST_F(GpuControlListEntryTest, DisabledEntry) {
489 const std::string json = LONG_STRING_CONST(
498 ScopedEntry entry(GetEntryFromString(json));
499 EXPECT_TRUE(entry.get() != NULL);
500 EXPECT_TRUE(entry->disabled());
503 TEST_F(GpuControlListEntryTest, OptimusEntry) {
504 const std::string json = LONG_STRING_CONST(
510 "multi_gpu_style": "optimus",
517 gpu_info.optimus = true;
519 ScopedEntry entry(GetEntryFromString(json));
520 EXPECT_TRUE(entry.get() != NULL);
521 EXPECT_EQ(GpuControlList::kOsLinux, entry->GetOsType());
522 EXPECT_TRUE(entry->Contains(
523 GpuControlList::kOsLinux, "10.6", gpu_info));
526 TEST_F(GpuControlListEntryTest, AMDSwitchableEntry) {
527 const std::string json = LONG_STRING_CONST(
533 "multi_gpu_style": "amd_switchable",
540 gpu_info.amd_switchable = true;
542 ScopedEntry entry(GetEntryFromString(json));
543 EXPECT_TRUE(entry.get() != NULL);
544 EXPECT_EQ(GpuControlList::kOsMacosx, entry->GetOsType());
545 EXPECT_TRUE(entry->Contains(
546 GpuControlList::kOsMacosx, "10.6", gpu_info));
549 TEST_F(GpuControlListEntryTest, LexicalDriverVersionEntry) {
550 const std::string json = LONG_STRING_CONST(
556 "vendor_id": "0x1002",
568 gpu_info.gpu.vendor_id = 0x1002;
570 ScopedEntry entry(GetEntryFromString(json));
571 EXPECT_TRUE(entry.get() != NULL);
572 EXPECT_EQ(GpuControlList::kOsLinux, entry->GetOsType());
574 gpu_info.driver_version = "8.76";
575 EXPECT_TRUE(entry->Contains(
576 GpuControlList::kOsLinux, "10.6", gpu_info));
578 gpu_info.driver_version = "8.768";
579 EXPECT_TRUE(entry->Contains(
580 GpuControlList::kOsLinux, "10.6", gpu_info));
582 gpu_info.driver_version = "8.76.8";
583 EXPECT_TRUE(entry->Contains(
584 GpuControlList::kOsLinux, "10.6", gpu_info));
587 TEST_F(GpuControlListEntryTest, MultipleGPUsAnyEntry) {
588 const std::string json = LONG_STRING_CONST(
594 "vendor_id": "0x8086",
595 "device_id": ["0x0166"],
596 "multi_gpu_category": "any",
602 ScopedEntry entry(GetEntryFromString(json));
603 EXPECT_TRUE(entry.get() != NULL);
604 EXPECT_EQ(GpuControlList::kOsMacosx, entry->GetOsType());
607 gpu_info.gpu.vendor_id = 0x10de;
608 gpu_info.gpu.device_id = 0x1976;
609 EXPECT_FALSE(entry->Contains(
610 GpuControlList::kOsMacosx, "10.6", gpu_info));
612 GPUInfo::GPUDevice gpu_device;
613 gpu_device.vendor_id = 0x8086;
614 gpu_device.device_id = 0x0166;
615 gpu_info.secondary_gpus.push_back(gpu_device);
616 EXPECT_TRUE(entry->Contains(
617 GpuControlList::kOsMacosx, "10.6", gpu_info));
620 TEST_F(GpuControlListEntryTest, MultipleGPUsSecondaryEntry) {
621 const std::string json = LONG_STRING_CONST(
627 "vendor_id": "0x8086",
628 "device_id": ["0x0166"],
629 "multi_gpu_category": "secondary",
635 ScopedEntry entry(GetEntryFromString(json));
636 EXPECT_TRUE(entry.get() != NULL);
637 EXPECT_EQ(GpuControlList::kOsMacosx, entry->GetOsType());
640 gpu_info.gpu.vendor_id = 0x10de;
641 gpu_info.gpu.device_id = 0x1976;
642 EXPECT_FALSE(entry->Contains(
643 GpuControlList::kOsMacosx, "10.6", gpu_info));
645 GPUInfo::GPUDevice gpu_device;
646 gpu_device.vendor_id = 0x8086;
647 gpu_device.device_id = 0x0166;
648 gpu_info.secondary_gpus.push_back(gpu_device);
649 EXPECT_TRUE(entry->Contains(
650 GpuControlList::kOsMacosx, "10.6", gpu_info));
653 TEST_F(GpuControlListEntryTest, NeedsMoreInfoEntry) {
654 const std::string json = LONG_STRING_CONST(
657 "vendor_id": "0x8086",
667 ScopedEntry entry(GetEntryFromString(json));
668 EXPECT_TRUE(entry.get() != NULL);
671 gpu_info.gpu.vendor_id = 0x8086;
672 EXPECT_TRUE(entry->NeedsMoreInfo(gpu_info));
674 gpu_info.driver_version = "10.6";
675 EXPECT_FALSE(entry->NeedsMoreInfo(gpu_info));
678 TEST_F(GpuControlListEntryTest, NeedsMoreInfoForExceptionsEntry) {
679 const std::string json = LONG_STRING_CONST(
682 "vendor_id": "0x8086",
696 ScopedEntry entry(GetEntryFromString(json));
697 EXPECT_TRUE(entry.get() != NULL);
700 gpu_info.gpu.vendor_id = 0x8086;
701 EXPECT_TRUE(entry->NeedsMoreInfo(gpu_info));
703 gpu_info.gl_renderer = "mesa";
704 EXPECT_FALSE(entry->NeedsMoreInfo(gpu_info));
707 TEST_F(GpuControlListEntryTest, FeatureTypeAllEntry) {
708 const std::string json = LONG_STRING_CONST(
716 ScopedEntry entry(GetEntryFromString(json, true));
717 EXPECT_TRUE(entry.get() != NULL);
718 EXPECT_EQ(3u, entry->features().size());
719 EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_0));
720 EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_1));
721 EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_2));