1 //
2 // Copyright 2017 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 // SystemInfo_unittest.cpp: Unit tests for SystemInfo* helper functions.
7 //
8
9 #include "common/platform.h"
10 #include "gpu_info_util/SystemInfo_internal.h"
11
12 #if defined(ANGLE_PLATFORM_APPLE)
13 # include "common/apple_platform_utils.h"
14 #endif // defined(ANGLE_PLATFORM_APPLE)
15
16 #include <gtest/gtest.h>
17
18 using namespace angle;
19
20 namespace
21 {
22
23 // Test AMD Brahma driver version parsing
TEST(SystemInfoTest,AMDBrahmaVersionParsing)24 TEST(SystemInfoTest, AMDBrahmaVersionParsing)
25 {
26 std::string version;
27
28 // Check parsing fails when no version string is present.
29 ASSERT_FALSE(ParseAMDBrahmaDriverVersion("I am a lumberjack.", &version));
30 ASSERT_EQ("", version);
31
32 // Check parsing when the string is just the version string, with and without dots
33 ASSERT_TRUE(ParseAMDBrahmaDriverVersion("42", &version));
34 ASSERT_EQ("42", version);
35 ASSERT_TRUE(ParseAMDBrahmaDriverVersion("42.0.56", &version));
36 ASSERT_EQ("42.0.56", version);
37
38 // Check parsing with prefix / suffix
39 ASSERT_TRUE(ParseAMDBrahmaDriverVersion("Version=42.0.56", &version));
40 ASSERT_EQ("42.0.56", version);
41 ASSERT_TRUE(ParseAMDBrahmaDriverVersion("42.0.56 is the version", &version));
42 ASSERT_EQ("42.0.56", version);
43 ASSERT_TRUE(ParseAMDBrahmaDriverVersion("42.0.56 is the version, 111", &version));
44 ASSERT_EQ("42.0.56", version);
45 }
46
47 // Test AMD Catalyst version parsing
TEST(SystemInfoTest,AMDCatalystVersionParsing)48 TEST(SystemInfoTest, AMDCatalystVersionParsing)
49 {
50 std::string version;
51
52 // Check parsing fails when no version string is present.
53 ASSERT_FALSE(ParseAMDCatalystDriverVersion("I am a lumberjack.\nReleaseVersion=", &version));
54 ASSERT_EQ("", version);
55
56 // Check parsing fails when ReleaseVersion= is present but no number appears in the line
57 ASSERT_FALSE(ParseAMDCatalystDriverVersion("11\nReleaseVersion=\n12", &version));
58 ASSERT_EQ("", version);
59
60 // Check parsing works on the simple case
61 ASSERT_TRUE(ParseAMDCatalystDriverVersion("ReleaseVersion=42.0.56", &version));
62 ASSERT_EQ("42.0.56", version);
63
64 // Check parsing works if there are other lines
65 ASSERT_TRUE(ParseAMDCatalystDriverVersion("11\nReleaseVersion=42.0.56\n12", &version));
66 ASSERT_EQ("42.0.56", version);
67
68 // Check parsing get the first version string
69 ASSERT_TRUE(
70 ParseAMDCatalystDriverVersion("ReleaseVersion=42.0.56\nReleaseVersion=0", &version));
71 ASSERT_EQ("42.0.56", version);
72
73 // Check parsing with prefix / suffix
74 ASSERT_TRUE(ParseAMDCatalystDriverVersion("ReleaseVersion=version is 42.0.56", &version));
75 ASSERT_EQ("42.0.56", version);
76 ASSERT_TRUE(ParseAMDCatalystDriverVersion("ReleaseVersion=42.0.56 is the version", &version));
77 ASSERT_EQ("42.0.56", version);
78 }
79
80 #if defined(ANGLE_PLATFORM_MACOS)
81
82 // Test Mac machine model parsing
TEST(SystemInfoTest,MacMachineModelParsing)83 TEST(SystemInfoTest, MacMachineModelParsing)
84 {
85 std::string model;
86 int32_t major = 1, minor = 2;
87
88 // Test on the empty string, that is returned by GetMachineModel on an error
89 EXPECT_FALSE(ParseMacMachineModel("", &model, &major, &minor));
90 EXPECT_EQ(0U, model.length());
91 EXPECT_EQ(1, major);
92 EXPECT_EQ(2, minor);
93
94 // Test on an invalid string
95 EXPECT_FALSE(ParseMacMachineModel("FooBar", &model, &major, &minor));
96
97 // Test on a MacPro model
98 EXPECT_TRUE(ParseMacMachineModel("MacPro4,1", &model, &major, &minor));
99 EXPECT_EQ("MacPro", model);
100 EXPECT_EQ(4, major);
101 EXPECT_EQ(1, minor);
102
103 // Test on a MacBookPro model
104 EXPECT_TRUE(ParseMacMachineModel("MacBookPro6,2", &model, &major, &minor));
105 EXPECT_EQ("MacBookPro", model);
106 EXPECT_EQ(6, major);
107 EXPECT_EQ(2, minor);
108 }
109
110 #endif // defined(ANGLE_PLATFORM_MACOS)
111
112 // Test Windows CM Device ID parsing
TEST(SystemInfoTest,CMDeviceIDToDeviceAndVendorID)113 TEST(SystemInfoTest, CMDeviceIDToDeviceAndVendorID)
114 {
115 uint32_t vendor = 0;
116 uint32_t device = 0;
117
118 // Test on a real-life CM Device ID
119 EXPECT_TRUE(CMDeviceIDToDeviceAndVendorID(
120 "PCI\\VEN_10DE&DEV_0FFA&SUBSYS_094B10DE&REV_A1\\4&95673C&0&0018", &vendor, &device));
121 EXPECT_EQ(0x10deu, vendor);
122 EXPECT_EQ(0x0ffau, device);
123
124 // Test on a stripped-down but valid CM Device ID string
125 EXPECT_TRUE(CMDeviceIDToDeviceAndVendorID("PCI\\VEN_10DE&DEV_0FFA", &vendor, &device));
126 EXPECT_EQ(0x10deu, vendor);
127 EXPECT_EQ(0x0ffau, device);
128
129 // Test on a string that is too small
130 EXPECT_FALSE(CMDeviceIDToDeviceAndVendorID("\\VEN_10DE&DEV_0FFA", &vendor, &device));
131 EXPECT_EQ(0u, vendor);
132 EXPECT_EQ(0u, device);
133
134 // Test with invalid number
135 EXPECT_FALSE(CMDeviceIDToDeviceAndVendorID("PCI\\VEN_XXXX&DEV_XXXX", &vendor, &device));
136 EXPECT_EQ(0u, vendor);
137 EXPECT_EQ(0u, device);
138 }
139
140 } // anonymous namespace
141