1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <optional>
10*6777b538SAndroid Build Coastguard Worker #include <utility>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #include "base/environment.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/process/process_metrics.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/strings/pattern.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/strings/sys_string_conversions.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_chromeos_version_info.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_running_on_chromeos.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/threading/scoped_blocking_call.h"
30*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
31*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
32*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest-death-test.h"
33*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
34*6777b538SAndroid Build Coastguard Worker #include "testing/platform_test.h"
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
37*6777b538SAndroid Build Coastguard Worker #include "base/win/com_init_util.h"
38*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_bstr.h"
39*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_com_initializer.h"
40*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_variant.h"
41*6777b538SAndroid Build Coastguard Worker #include "base/win/wmi.h"
42*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
45*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info_internal.h"
46*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
47*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_MAC)
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker namespace base {
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
52*6777b538SAndroid Build Coastguard Worker // Some Android (Cast) test devices have a large portion of physical memory
53*6777b538SAndroid Build Coastguard Worker // reserved. During investigation, around 115-150 MB were seen reserved, so we
54*6777b538SAndroid Build Coastguard Worker // track this here with a factory of safety of 2.
55*6777b538SAndroid Build Coastguard Worker static constexpr int kReservedPhysicalMemory = 300 * 1024; // In _K_bytes.
56*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker using SysInfoTest = PlatformTest;
59*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,NumProcs)60*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, NumProcs) {
61*6777b538SAndroid Build Coastguard Worker // We aren't actually testing that it's correct, just that it's sane.
62*6777b538SAndroid Build Coastguard Worker EXPECT_GE(SysInfo::NumberOfProcessors(), 1);
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker EXPECT_GE(SysInfo::NumberOfEfficientProcessors(), 0);
65*6777b538SAndroid Build Coastguard Worker EXPECT_LT(SysInfo::NumberOfEfficientProcessors(),
66*6777b538SAndroid Build Coastguard Worker SysInfo::NumberOfProcessors());
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
TEST_F(SysInfoTest,NumProcsWithSecurityMitigationEnabled)70*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, NumProcsWithSecurityMitigationEnabled) {
71*6777b538SAndroid Build Coastguard Worker // Reset state so that the call to SetCpuSecurityMitigationsEnabled() below
72*6777b538SAndroid Build Coastguard Worker // succeeds even if SysInfo::NumberOfProcessors() was previously called.
73*6777b538SAndroid Build Coastguard Worker SysInfo::ResetCpuSecurityMitigationsEnabledForTesting();
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker // Verify that the number of number of available processors available when CPU
76*6777b538SAndroid Build Coastguard Worker // security mitigation is enabled is the number of available "physical"
77*6777b538SAndroid Build Coastguard Worker // processors.
78*6777b538SAndroid Build Coastguard Worker test::ScopedFeatureList feature_list_;
79*6777b538SAndroid Build Coastguard Worker feature_list_.InitAndEnableFeature(kNumberOfCoresWithCpuSecurityMitigation);
80*6777b538SAndroid Build Coastguard Worker SysInfo::SetCpuSecurityMitigationsEnabled();
81*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SysInfo::NumberOfProcessors(),
82*6777b538SAndroid Build Coastguard Worker internal::NumberOfPhysicalProcessors());
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker // Reset state set by this test.
85*6777b538SAndroid Build Coastguard Worker SysInfo::ResetCpuSecurityMitigationsEnabledForTesting();
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_MAC)
88*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,AmountOfMem)89*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, AmountOfMem) {
90*6777b538SAndroid Build Coastguard Worker // We aren't actually testing that it's correct, just that it's sane.
91*6777b538SAndroid Build Coastguard Worker EXPECT_GT(SysInfo::AmountOfPhysicalMemory(), 0u);
92*6777b538SAndroid Build Coastguard Worker EXPECT_GT(SysInfo::AmountOfPhysicalMemoryMB(), 0);
93*6777b538SAndroid Build Coastguard Worker // The maxmimal amount of virtual memory can be zero which means unlimited.
94*6777b538SAndroid Build Coastguard Worker EXPECT_GE(SysInfo::AmountOfVirtualMemory(), 0u);
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
98*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
99*6777b538SAndroid Build Coastguard Worker #define MAYBE_AmountOfAvailablePhysicalMemory \
100*6777b538SAndroid Build Coastguard Worker DISABLED_AmountOfAvailablePhysicalMemory
101*6777b538SAndroid Build Coastguard Worker #else
102*6777b538SAndroid Build Coastguard Worker #define MAYBE_AmountOfAvailablePhysicalMemory AmountOfAvailablePhysicalMemory
103*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
TEST_F(SysInfoTest,MAYBE_AmountOfAvailablePhysicalMemory)104*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, MAYBE_AmountOfAvailablePhysicalMemory) {
105*6777b538SAndroid Build Coastguard Worker // Note: info is in _K_bytes.
106*6777b538SAndroid Build Coastguard Worker SystemMemoryInfoKB info;
107*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetSystemMemoryInfo(&info));
108*6777b538SAndroid Build Coastguard Worker EXPECT_GT(info.free, 0);
109*6777b538SAndroid Build Coastguard Worker if (info.available != 0) {
110*6777b538SAndroid Build Coastguard Worker // If there is MemAvailable from kernel.
111*6777b538SAndroid Build Coastguard Worker EXPECT_LT(info.available, info.total);
112*6777b538SAndroid Build Coastguard Worker const uint64_t amount = SysInfo::AmountOfAvailablePhysicalMemory(info);
113*6777b538SAndroid Build Coastguard Worker // We aren't actually testing that it's correct, just that it's sane.
114*6777b538SAndroid Build Coastguard Worker // Available memory is |free - reserved + reclaimable (inactive, non-free)|.
115*6777b538SAndroid Build Coastguard Worker // On some android platforms, reserved is a substantial portion.
116*6777b538SAndroid Build Coastguard Worker const int available =
117*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
118*6777b538SAndroid Build Coastguard Worker std::max(info.free - kReservedPhysicalMemory, 0);
119*6777b538SAndroid Build Coastguard Worker #else
120*6777b538SAndroid Build Coastguard Worker info.free;
121*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
122*6777b538SAndroid Build Coastguard Worker EXPECT_GT(amount, checked_cast<uint64_t>(available) * 1024);
123*6777b538SAndroid Build Coastguard Worker EXPECT_LT(amount / 1024, checked_cast<uint64_t>(info.available));
124*6777b538SAndroid Build Coastguard Worker // Simulate as if there is no MemAvailable.
125*6777b538SAndroid Build Coastguard Worker info.available = 0;
126*6777b538SAndroid Build Coastguard Worker }
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker // There is no MemAvailable. Check the fallback logic.
129*6777b538SAndroid Build Coastguard Worker const uint64_t amount = SysInfo::AmountOfAvailablePhysicalMemory(info);
130*6777b538SAndroid Build Coastguard Worker // We aren't actually testing that it's correct, just that it's sane.
131*6777b538SAndroid Build Coastguard Worker EXPECT_GT(amount, checked_cast<uint64_t>(info.free) * 1024);
132*6777b538SAndroid Build Coastguard Worker EXPECT_LT(amount / 1024, checked_cast<uint64_t>(info.total));
133*6777b538SAndroid Build Coastguard Worker }
134*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
135*6777b538SAndroid Build Coastguard Worker // BUILDFLAG(IS_ANDROID)
136*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,AmountOfFreeDiskSpace)137*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, AmountOfFreeDiskSpace) {
138*6777b538SAndroid Build Coastguard Worker // We aren't actually testing that it's correct, just that it's sane.
139*6777b538SAndroid Build Coastguard Worker FilePath tmp_path;
140*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetTempDir(&tmp_path));
141*6777b538SAndroid Build Coastguard Worker EXPECT_GE(SysInfo::AmountOfFreeDiskSpace(tmp_path), 0) << tmp_path;
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,AmountOfTotalDiskSpace)144*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, AmountOfTotalDiskSpace) {
145*6777b538SAndroid Build Coastguard Worker // We aren't actually testing that it's correct, just that it's sane.
146*6777b538SAndroid Build Coastguard Worker FilePath tmp_path;
147*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetTempDir(&tmp_path));
148*6777b538SAndroid Build Coastguard Worker EXPECT_GT(SysInfo::AmountOfTotalDiskSpace(tmp_path), 0) << tmp_path;
149*6777b538SAndroid Build Coastguard Worker }
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
152*6777b538SAndroid Build Coastguard Worker // Verify that specifying total disk space for nested directories matches
153*6777b538SAndroid Build Coastguard Worker // the deepest-nested.
TEST_F(SysInfoTest,NestedVolumesAmountOfTotalDiskSpace)154*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, NestedVolumesAmountOfTotalDiskSpace) {
155*6777b538SAndroid Build Coastguard Worker constexpr int64_t kOuterVolumeQuota = 1024;
156*6777b538SAndroid Build Coastguard Worker constexpr int64_t kInnerVolumeQuota = kOuterVolumeQuota / 2;
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker FilePath tmp_path;
159*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetTempDir(&tmp_path));
160*6777b538SAndroid Build Coastguard Worker SysInfo::SetAmountOfTotalDiskSpace(tmp_path, kOuterVolumeQuota);
161*6777b538SAndroid Build Coastguard Worker const FilePath subdirectory_path = tmp_path.Append("subdirectory");
162*6777b538SAndroid Build Coastguard Worker SysInfo::SetAmountOfTotalDiskSpace(subdirectory_path, kInnerVolumeQuota);
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SysInfo::AmountOfTotalDiskSpace(tmp_path), kOuterVolumeQuota);
165*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SysInfo::AmountOfTotalDiskSpace(subdirectory_path),
166*6777b538SAndroid Build Coastguard Worker kInnerVolumeQuota);
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Worker // Remove the inner directory quota setting and check again.
169*6777b538SAndroid Build Coastguard Worker SysInfo::SetAmountOfTotalDiskSpace(subdirectory_path, -1);
170*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SysInfo::AmountOfTotalDiskSpace(subdirectory_path),
171*6777b538SAndroid Build Coastguard Worker kOuterVolumeQuota);
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_FUCHSIA)
174*6777b538SAndroid Build Coastguard Worker
175*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
176*6777b538SAndroid Build Coastguard Worker BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
177*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,OperatingSystemVersion)178*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, OperatingSystemVersion) {
179*6777b538SAndroid Build Coastguard Worker std::string version = SysInfo::OperatingSystemVersion();
180*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(version.empty());
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,OperatingSystemVersionNumbers)183*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, OperatingSystemVersionNumbers) {
184*6777b538SAndroid Build Coastguard Worker int32_t os_major_version = -1;
185*6777b538SAndroid Build Coastguard Worker int32_t os_minor_version = -1;
186*6777b538SAndroid Build Coastguard Worker int32_t os_bugfix_version = -1;
187*6777b538SAndroid Build Coastguard Worker SysInfo::OperatingSystemVersionNumbers(&os_major_version, &os_minor_version,
188*6777b538SAndroid Build Coastguard Worker &os_bugfix_version);
189*6777b538SAndroid Build Coastguard Worker EXPECT_GT(os_major_version, -1);
190*6777b538SAndroid Build Coastguard Worker EXPECT_GT(os_minor_version, -1);
191*6777b538SAndroid Build Coastguard Worker EXPECT_GT(os_bugfix_version, -1);
192*6777b538SAndroid Build Coastguard Worker }
193*6777b538SAndroid Build Coastguard Worker #endif
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
TEST_F(SysInfoTest,GetIOSBuildNumber)196*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GetIOSBuildNumber) {
197*6777b538SAndroid Build Coastguard Worker std::string build_number(SysInfo::GetIOSBuildNumber());
198*6777b538SAndroid Build Coastguard Worker EXPECT_GT(build_number.length(), 0U);
199*6777b538SAndroid Build Coastguard Worker }
200*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_IOS)
201*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,Uptime)202*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, Uptime) {
203*6777b538SAndroid Build Coastguard Worker TimeDelta up_time_1 = SysInfo::Uptime();
204*6777b538SAndroid Build Coastguard Worker // UpTime() is implemented internally using TimeTicks::Now(), which documents
205*6777b538SAndroid Build Coastguard Worker // system resolution as being 1-15ms. Sleep a little longer than that.
206*6777b538SAndroid Build Coastguard Worker PlatformThread::Sleep(Milliseconds(20));
207*6777b538SAndroid Build Coastguard Worker TimeDelta up_time_2 = SysInfo::Uptime();
208*6777b538SAndroid Build Coastguard Worker EXPECT_GT(up_time_1.InMicroseconds(), 0);
209*6777b538SAndroid Build Coastguard Worker EXPECT_GT(up_time_2.InMicroseconds(), up_time_1.InMicroseconds());
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
TEST_F(SysInfoTest,HardwareModelNameFormatMacAndiOS)213*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, HardwareModelNameFormatMacAndiOS) {
214*6777b538SAndroid Build Coastguard Worker std::string hardware_model = SysInfo::HardwareModelName();
215*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(hardware_model.empty());
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker // Check that the model is of the expected format, which is different on iOS
218*6777b538SAndroid Build Coastguard Worker // simulators and real iOS / MacOS devices.
219*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS) && TARGET_OS_SIMULATOR
220*6777b538SAndroid Build Coastguard Worker // On iOS simulators, the device model looks like "iOS Simulator (Foo[,Bar])"
221*6777b538SAndroid Build Coastguard Worker // where Foo is either "Unknown", "iPhone" or "iPad", and Bar, if present, is
222*6777b538SAndroid Build Coastguard Worker // a number.
223*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::MatchPattern(hardware_model, "iOS Simulator (*)"))
224*6777b538SAndroid Build Coastguard Worker << hardware_model;
225*6777b538SAndroid Build Coastguard Worker std::vector<StringPiece> mainPieces =
226*6777b538SAndroid Build Coastguard Worker SplitStringPiece(hardware_model, "()", KEEP_WHITESPACE, SPLIT_WANT_ALL);
227*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(3u, mainPieces.size()) << hardware_model;
228*6777b538SAndroid Build Coastguard Worker std::vector<StringPiece> modelPieces =
229*6777b538SAndroid Build Coastguard Worker SplitStringPiece(mainPieces[1], ",", KEEP_WHITESPACE, SPLIT_WANT_ALL);
230*6777b538SAndroid Build Coastguard Worker ASSERT_GE(modelPieces.size(), 1u) << hardware_model;
231*6777b538SAndroid Build Coastguard Worker if (modelPieces.size() == 1u) {
232*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(modelPieces[0] == "Unknown" || modelPieces[0] == "iPhone" ||
233*6777b538SAndroid Build Coastguard Worker modelPieces[0] == "iPad")
234*6777b538SAndroid Build Coastguard Worker << hardware_model;
235*6777b538SAndroid Build Coastguard Worker } else {
236*6777b538SAndroid Build Coastguard Worker int value;
237*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(StringToInt(modelPieces[1], &value)) << hardware_model;
238*6777b538SAndroid Build Coastguard Worker }
239*6777b538SAndroid Build Coastguard Worker #else
240*6777b538SAndroid Build Coastguard Worker // The expected format is "Foo,Bar" where Foo is "iPhone" or "iPad" and Bar is
241*6777b538SAndroid Build Coastguard Worker // a number.
242*6777b538SAndroid Build Coastguard Worker std::vector<StringPiece> pieces =
243*6777b538SAndroid Build Coastguard Worker SplitStringPiece(hardware_model, ",", KEEP_WHITESPACE, SPLIT_WANT_ALL);
244*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, pieces.size()) << hardware_model;
245*6777b538SAndroid Build Coastguard Worker int value;
246*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(StringToInt(pieces[1], &value)) << hardware_model;
247*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_IOS) && TARGET_OS_SIMULATOR
248*6777b538SAndroid Build Coastguard Worker }
249*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_APPLE)
250*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,GetHardwareInfo)251*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GetHardwareInfo) {
252*6777b538SAndroid Build Coastguard Worker test::TaskEnvironment task_environment;
253*6777b538SAndroid Build Coastguard Worker std::optional<SysInfo::HardwareInfo> hardware_info;
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker auto callback = base::BindOnce(
256*6777b538SAndroid Build Coastguard Worker [](std::optional<SysInfo::HardwareInfo>* target_info,
257*6777b538SAndroid Build Coastguard Worker SysInfo::HardwareInfo info) { *target_info = std::move(info); },
258*6777b538SAndroid Build Coastguard Worker &hardware_info);
259*6777b538SAndroid Build Coastguard Worker SysInfo::GetHardwareInfo(std::move(callback));
260*6777b538SAndroid Build Coastguard Worker task_environment.RunUntilIdle();
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(hardware_info.has_value());
263*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsStringUTF8(hardware_info->manufacturer));
264*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsStringUTF8(hardware_info->model));
265*6777b538SAndroid Build Coastguard Worker bool empty_result_expected =
266*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || \
267*6777b538SAndroid Build Coastguard Worker BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
268*6777b538SAndroid Build Coastguard Worker false;
269*6777b538SAndroid Build Coastguard Worker #else
270*6777b538SAndroid Build Coastguard Worker true;
271*6777b538SAndroid Build Coastguard Worker #endif
272*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(hardware_info->manufacturer.empty(), empty_result_expected);
273*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(hardware_info->model.empty(), empty_result_expected);
274*6777b538SAndroid Build Coastguard Worker }
275*6777b538SAndroid Build Coastguard Worker
276*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TEST_F(SysInfoTest,GetHardwareInfoWMIMatchRegistry)277*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GetHardwareInfoWMIMatchRegistry) {
278*6777b538SAndroid Build Coastguard Worker base::win::ScopedCOMInitializer com_initializer;
279*6777b538SAndroid Build Coastguard Worker test::TaskEnvironment task_environment;
280*6777b538SAndroid Build Coastguard Worker std::optional<SysInfo::HardwareInfo> hardware_info;
281*6777b538SAndroid Build Coastguard Worker
282*6777b538SAndroid Build Coastguard Worker auto callback = base::BindOnce(
283*6777b538SAndroid Build Coastguard Worker [](std::optional<SysInfo::HardwareInfo>* target_info,
284*6777b538SAndroid Build Coastguard Worker SysInfo::HardwareInfo info) { *target_info = std::move(info); },
285*6777b538SAndroid Build Coastguard Worker &hardware_info);
286*6777b538SAndroid Build Coastguard Worker SysInfo::GetHardwareInfo(std::move(callback));
287*6777b538SAndroid Build Coastguard Worker task_environment.RunUntilIdle();
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(hardware_info.has_value());
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IWbemServices> wmi_services;
292*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::win::CreateLocalWmiConnection(true, &wmi_services));
293*6777b538SAndroid Build Coastguard Worker
294*6777b538SAndroid Build Coastguard Worker static constexpr wchar_t query_computer_system[] =
295*6777b538SAndroid Build Coastguard Worker L"SELECT Manufacturer,Model FROM Win32_ComputerSystem";
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IEnumWbemClassObject> enumerator_computer_system;
298*6777b538SAndroid Build Coastguard Worker HRESULT hr = wmi_services->ExecQuery(
299*6777b538SAndroid Build Coastguard Worker base::win::ScopedBstr(L"WQL").Get(),
300*6777b538SAndroid Build Coastguard Worker base::win::ScopedBstr(query_computer_system).Get(),
301*6777b538SAndroid Build Coastguard Worker WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, nullptr,
302*6777b538SAndroid Build Coastguard Worker &enumerator_computer_system);
303*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(FAILED(hr) || !enumerator_computer_system.Get());
304*6777b538SAndroid Build Coastguard Worker
305*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IWbemClassObject> class_object;
306*6777b538SAndroid Build Coastguard Worker ULONG items_returned = 0;
307*6777b538SAndroid Build Coastguard Worker hr = enumerator_computer_system->Next(WBEM_INFINITE, 1, &class_object,
308*6777b538SAndroid Build Coastguard Worker &items_returned);
309*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(FAILED(hr) || !items_returned);
310*6777b538SAndroid Build Coastguard Worker
311*6777b538SAndroid Build Coastguard Worker base::win::ScopedVariant manufacturerVar;
312*6777b538SAndroid Build Coastguard Worker std::wstring manufacturer;
313*6777b538SAndroid Build Coastguard Worker hr = class_object->Get(L"Manufacturer", 0, manufacturerVar.Receive(), nullptr,
314*6777b538SAndroid Build Coastguard Worker nullptr);
315*6777b538SAndroid Build Coastguard Worker if (SUCCEEDED(hr) && manufacturerVar.type() == VT_BSTR) {
316*6777b538SAndroid Build Coastguard Worker manufacturer.assign(V_BSTR(manufacturerVar.ptr()),
317*6777b538SAndroid Build Coastguard Worker ::SysStringLen(V_BSTR(manufacturerVar.ptr())));
318*6777b538SAndroid Build Coastguard Worker }
319*6777b538SAndroid Build Coastguard Worker base::win::ScopedVariant modelVar;
320*6777b538SAndroid Build Coastguard Worker std::wstring model;
321*6777b538SAndroid Build Coastguard Worker hr = class_object->Get(L"Model", 0, modelVar.Receive(), nullptr, nullptr);
322*6777b538SAndroid Build Coastguard Worker if (SUCCEEDED(hr) && modelVar.type() == VT_BSTR) {
323*6777b538SAndroid Build Coastguard Worker model.assign(V_BSTR(modelVar.ptr()),
324*6777b538SAndroid Build Coastguard Worker ::SysStringLen(V_BSTR(modelVar.ptr())));
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(hardware_info->manufacturer == base::SysWideToUTF8(manufacturer));
328*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(hardware_info->model == base::SysWideToUTF8(model));
329*6777b538SAndroid Build Coastguard Worker }
330*6777b538SAndroid Build Coastguard Worker #endif
331*6777b538SAndroid Build Coastguard Worker
332*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
333*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,GoogleChromeOSVersionNumbers)334*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSVersionNumbers) {
335*6777b538SAndroid Build Coastguard Worker int32_t os_major_version = -1;
336*6777b538SAndroid Build Coastguard Worker int32_t os_minor_version = -1;
337*6777b538SAndroid Build Coastguard Worker int32_t os_bugfix_version = -1;
338*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] =
339*6777b538SAndroid Build Coastguard Worker "FOO=1234123.34.5\n"
340*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
341*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, Time());
342*6777b538SAndroid Build Coastguard Worker SysInfo::OperatingSystemVersionNumbers(&os_major_version, &os_minor_version,
343*6777b538SAndroid Build Coastguard Worker &os_bugfix_version);
344*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, os_major_version);
345*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, os_minor_version);
346*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, os_bugfix_version);
347*6777b538SAndroid Build Coastguard Worker }
348*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,GoogleChromeOSVersionNumbersFirst)349*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSVersionNumbersFirst) {
350*6777b538SAndroid Build Coastguard Worker int32_t os_major_version = -1;
351*6777b538SAndroid Build Coastguard Worker int32_t os_minor_version = -1;
352*6777b538SAndroid Build Coastguard Worker int32_t os_bugfix_version = -1;
353*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] =
354*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
355*6777b538SAndroid Build Coastguard Worker "FOO=1234123.34.5\n";
356*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, Time());
357*6777b538SAndroid Build Coastguard Worker SysInfo::OperatingSystemVersionNumbers(&os_major_version, &os_minor_version,
358*6777b538SAndroid Build Coastguard Worker &os_bugfix_version);
359*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, os_major_version);
360*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, os_minor_version);
361*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, os_bugfix_version);
362*6777b538SAndroid Build Coastguard Worker }
363*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,GoogleChromeOSNoVersionNumbers)364*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSNoVersionNumbers) {
365*6777b538SAndroid Build Coastguard Worker int32_t os_major_version = -1;
366*6777b538SAndroid Build Coastguard Worker int32_t os_minor_version = -1;
367*6777b538SAndroid Build Coastguard Worker int32_t os_bugfix_version = -1;
368*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] = "FOO=1234123.34.5\n";
369*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, Time());
370*6777b538SAndroid Build Coastguard Worker SysInfo::OperatingSystemVersionNumbers(&os_major_version, &os_minor_version,
371*6777b538SAndroid Build Coastguard Worker &os_bugfix_version);
372*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, os_major_version);
373*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, os_minor_version);
374*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, os_bugfix_version);
375*6777b538SAndroid Build Coastguard Worker }
376*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,GoogleChromeOSLsbReleaseTime)377*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSLsbReleaseTime) {
378*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] = "CHROMEOS_RELEASE_VERSION=1.2.3.4";
379*6777b538SAndroid Build Coastguard Worker // Use a fake time that can be safely displayed as a string.
380*6777b538SAndroid Build Coastguard Worker const Time lsb_release_time(Time::FromSecondsSinceUnixEpoch(12345.6));
381*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, lsb_release_time);
382*6777b538SAndroid Build Coastguard Worker Time parsed_lsb_release_time = SysInfo::GetLsbReleaseTime();
383*6777b538SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(lsb_release_time.InSecondsFSinceUnixEpoch(),
384*6777b538SAndroid Build Coastguard Worker parsed_lsb_release_time.InSecondsFSinceUnixEpoch());
385*6777b538SAndroid Build Coastguard Worker }
386*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,IsRunningOnChromeOS)387*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, IsRunningOnChromeOS) {
388*6777b538SAndroid Build Coastguard Worker {
389*6777b538SAndroid Build Coastguard Worker const char kLsbRelease1[] =
390*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_NAME=Non Chrome OS\n"
391*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
392*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease1, Time());
393*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SysInfo::IsRunningOnChromeOS());
394*6777b538SAndroid Build Coastguard Worker }
395*6777b538SAndroid Build Coastguard Worker {
396*6777b538SAndroid Build Coastguard Worker const char kLsbRelease2[] =
397*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_NAME=Chrome OS\n"
398*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
399*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease2, Time());
400*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
401*6777b538SAndroid Build Coastguard Worker }
402*6777b538SAndroid Build Coastguard Worker {
403*6777b538SAndroid Build Coastguard Worker const char kLsbRelease3[] = "CHROMEOS_RELEASE_NAME=Chromium OS\n";
404*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease3, Time());
405*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
406*6777b538SAndroid Build Coastguard Worker }
407*6777b538SAndroid Build Coastguard Worker }
408*6777b538SAndroid Build Coastguard Worker
409*6777b538SAndroid Build Coastguard Worker // Regression test for https://crbug.com/1148904.
TEST_F(SysInfoTest,ScopedChromeOSVersionInfoDoesNotChangeEnvironment)410*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, ScopedChromeOSVersionInfoDoesNotChangeEnvironment) {
411*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Environment> environment = Environment::Create();
412*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(environment->HasVar("LSB_RELEASE"));
413*6777b538SAndroid Build Coastguard Worker {
414*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] =
415*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_NAME=Chrome OS\n"
416*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
417*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, Time());
418*6777b538SAndroid Build Coastguard Worker }
419*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(environment->HasVar("LSB_RELEASE"));
420*6777b538SAndroid Build Coastguard Worker }
421*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,CrashOnBaseImage)422*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, CrashOnBaseImage) {
423*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] =
424*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_NAME=Chrome OS\n"
425*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
426*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_TRACK=stable-channel\n";
427*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, Time());
428*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
429*6777b538SAndroid Build Coastguard Worker EXPECT_DEATH_IF_SUPPORTED({ SysInfo::CrashIfChromeOSNonTestImage(); }, "");
430*6777b538SAndroid Build Coastguard Worker }
431*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,NoCrashOnTestImage)432*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, NoCrashOnTestImage) {
433*6777b538SAndroid Build Coastguard Worker const char kLsbRelease[] =
434*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_NAME=Chrome OS\n"
435*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
436*6777b538SAndroid Build Coastguard Worker "CHROMEOS_RELEASE_TRACK=testimage-channel\n";
437*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version(kLsbRelease, Time());
438*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
439*6777b538SAndroid Build Coastguard Worker // Should not crash.
440*6777b538SAndroid Build Coastguard Worker SysInfo::CrashIfChromeOSNonTestImage();
441*6777b538SAndroid Build Coastguard Worker }
442*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,NoCrashOnLinuxBuild)443*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, NoCrashOnLinuxBuild) {
444*6777b538SAndroid Build Coastguard Worker test::ScopedChromeOSVersionInfo version("", Time());
445*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SysInfo::IsRunningOnChromeOS());
446*6777b538SAndroid Build Coastguard Worker // Should not crash.
447*6777b538SAndroid Build Coastguard Worker SysInfo::CrashIfChromeOSNonTestImage();
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker
TEST_F(SysInfoTest,ScopedRunningOnChromeOS)450*6777b538SAndroid Build Coastguard Worker TEST_F(SysInfoTest, ScopedRunningOnChromeOS) {
451*6777b538SAndroid Build Coastguard Worker // base_unittests run both on linux-chromeos and actual devices, so the
452*6777b538SAndroid Build Coastguard Worker // initial state of IsRunningOnChromeOS may vary.
453*6777b538SAndroid Build Coastguard Worker bool was_running = SysInfo::IsRunningOnChromeOS();
454*6777b538SAndroid Build Coastguard Worker {
455*6777b538SAndroid Build Coastguard Worker test::ScopedRunningOnChromeOS running_on_chromeos;
456*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
457*6777b538SAndroid Build Coastguard Worker }
458*6777b538SAndroid Build Coastguard Worker // Previous value restored.
459*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(was_running, SysInfo::IsRunningOnChromeOS());
460*6777b538SAndroid Build Coastguard Worker }
461*6777b538SAndroid Build Coastguard Worker
462*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_CHROMEOS)
463*6777b538SAndroid Build Coastguard Worker
464*6777b538SAndroid Build Coastguard Worker } // namespace base
465