1 /*
2  *  Copyright 2009 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/base/gunit.h"
12 #include "webrtc/base/stringutils.h"
13 #include "webrtc/base/systeminfo.h"
14 
15 #if defined(CPU_X86) || defined(CPU_ARM)
TEST(SystemInfoTest,CpuVendorNonEmpty)16 TEST(SystemInfoTest, CpuVendorNonEmpty) {
17   rtc::SystemInfo info;
18   LOG(LS_INFO) << "CpuVendor: " << info.GetCpuVendor();
19   EXPECT_FALSE(info.GetCpuVendor().empty());
20 }
21 
22 // Tests Vendor identification is Intel or AMD.
23 // See Also http://en.wikipedia.org/wiki/CPUID
TEST(SystemInfoTest,CpuVendorIntelAMDARM)24 TEST(SystemInfoTest, CpuVendorIntelAMDARM) {
25   rtc::SystemInfo info;
26 #if defined(CPU_X86)
27   EXPECT_TRUE(rtc::string_match(info.GetCpuVendor().c_str(),
28                                       "GenuineIntel") ||
29               rtc::string_match(info.GetCpuVendor().c_str(),
30                                       "AuthenticAMD"));
31 #elif defined(CPU_ARM)
32   EXPECT_TRUE(rtc::string_match(info.GetCpuVendor().c_str(), "ARM"));
33 #endif
34 }
35 #endif  // defined(CPU_X86) || defined(CPU_ARM)
36 
37 // Tests CpuArchitecture matches expectations.
TEST(SystemInfoTest,GetCpuArchitecture)38 TEST(SystemInfoTest, GetCpuArchitecture) {
39   rtc::SystemInfo info;
40   LOG(LS_INFO) << "CpuArchitecture: " << info.GetCpuArchitecture();
41   rtc::SystemInfo::Architecture architecture = info.GetCpuArchitecture();
42 #if defined(CPU_X86) || defined(CPU_ARM)
43   if (sizeof(intptr_t) == 8) {
44     EXPECT_EQ(rtc::SystemInfo::SI_ARCH_X64, architecture);
45   } else if (sizeof(intptr_t) == 4) {
46 #if defined(CPU_ARM)
47     EXPECT_EQ(rtc::SystemInfo::SI_ARCH_ARM, architecture);
48 #else
49     EXPECT_EQ(rtc::SystemInfo::SI_ARCH_X86, architecture);
50 #endif
51   }
52 #endif
53 }
54 
55 // Tests MachineModel is set.  On Mac test machine model is known.
TEST(SystemInfoTest,MachineModelKnown)56 TEST(SystemInfoTest, MachineModelKnown) {
57   rtc::SystemInfo info;
58   EXPECT_FALSE(info.GetMachineModel().empty());
59   const char *machine_model = info.GetMachineModel().c_str();
60   LOG(LS_INFO) << "MachineModel: " << machine_model;
61   bool known = true;
62 #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
63   // Full list as of May 2012.  Update when new OSX based models are added.
64   known = rtc::string_match(machine_model, "MacBookPro*") ||
65           rtc::string_match(machine_model, "MacBookAir*") ||
66           rtc::string_match(machine_model, "MacBook*") ||
67           rtc::string_match(machine_model, "MacPro*") ||
68           rtc::string_match(machine_model, "Macmini*") ||
69           rtc::string_match(machine_model, "iMac*") ||
70           rtc::string_match(machine_model, "Xserve*");
71 #elif !defined(WEBRTC_IOS)
72   // All other machines return Not available.
73   known = rtc::string_match(info.GetMachineModel().c_str(),
74                                   "Not available");
75 #endif
76   if (!known) {
77     LOG(LS_WARNING) << "Machine Model Unknown: " << machine_model;
78   }
79 }
80 
81 // Tests physical memory size.
TEST(SystemInfoTest,MemorySize)82 TEST(SystemInfoTest, MemorySize) {
83   rtc::SystemInfo info;
84   LOG(LS_INFO) << "MemorySize: " << info.GetMemorySize();
85   EXPECT_GT(info.GetMemorySize(), -1);
86 }
87 
88 // Tests number of logical cpus available to the system.
TEST(SystemInfoTest,MaxCpus)89 TEST(SystemInfoTest, MaxCpus) {
90   rtc::SystemInfo info;
91   LOG(LS_INFO) << "MaxCpus: " << info.GetMaxCpus();
92   EXPECT_GT(info.GetMaxCpus(), 0);
93 }
94 
95 // Tests number of logical cpus available to the process.
TEST(SystemInfoTest,CurCpus)96 TEST(SystemInfoTest, CurCpus) {
97   rtc::SystemInfo info;
98   LOG(LS_INFO) << "CurCpus: " << info.GetCurCpus();
99   EXPECT_GT(info.GetCurCpus(), 0);
100   EXPECT_LE(info.GetCurCpus(), info.GetMaxCpus());
101 }
102 
103 #ifdef CPU_X86
104 // CPU family/model/stepping is only available on X86. The following tests
105 // that they are set when running on x86 CPUs. Valid Family/Model/Stepping
106 // values are non-zero on known CPUs.
107 
108 // Tests Intel CPU Family identification.
TEST(SystemInfoTest,CpuFamily)109 TEST(SystemInfoTest, CpuFamily) {
110   rtc::SystemInfo info;
111   LOG(LS_INFO) << "CpuFamily: " << info.GetCpuFamily();
112   EXPECT_GT(info.GetCpuFamily(), 0);
113 }
114 
115 // Tests Intel CPU Model identification.
TEST(SystemInfoTest,CpuModel)116 TEST(SystemInfoTest, CpuModel) {
117   rtc::SystemInfo info;
118   LOG(LS_INFO) << "CpuModel: " << info.GetCpuModel();
119   EXPECT_GT(info.GetCpuModel(), 0);
120 }
121 
122 // Tests Intel CPU Stepping identification.
TEST(SystemInfoTest,CpuStepping)123 TEST(SystemInfoTest, CpuStepping) {
124   rtc::SystemInfo info;
125   LOG(LS_INFO) << "CpuStepping: " << info.GetCpuStepping();
126   EXPECT_GT(info.GetCpuStepping(), 0);
127 }
128 #else  // CPU_X86
129 // If not running on x86 CPU the following tests expect the functions to
130 // return 0.
TEST(SystemInfoTest,CpuFamily)131 TEST(SystemInfoTest, CpuFamily) {
132   rtc::SystemInfo info;
133   LOG(LS_INFO) << "CpuFamily: " << info.GetCpuFamily();
134   EXPECT_EQ(0, info.GetCpuFamily());
135 }
136 
137 // Tests Intel CPU Model identification.
TEST(SystemInfoTest,CpuModel)138 TEST(SystemInfoTest, CpuModel) {
139   rtc::SystemInfo info;
140   LOG(LS_INFO) << "CpuModel: " << info.GetCpuModel();
141   EXPECT_EQ(0, info.GetCpuModel());
142 }
143 
144 // Tests Intel CPU Stepping identification.
TEST(SystemInfoTest,CpuStepping)145 TEST(SystemInfoTest, CpuStepping) {
146   rtc::SystemInfo info;
147   LOG(LS_INFO) << "CpuStepping: " << info.GetCpuStepping();
148   EXPECT_EQ(0, info.GetCpuStepping());
149 }
150 #endif  // CPU_X86
151