xref: /aosp_15_r20/external/libchrome/base/sys_info_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/environment.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/files/file_util.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/process/process_metrics.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/sys_info.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
15*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
16*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*635a8641SAndroid Build Coastguard Worker #include "testing/platform_test.h"
18*635a8641SAndroid Build Coastguard Worker 
19*635a8641SAndroid Build Coastguard Worker namespace base {
20*635a8641SAndroid Build Coastguard Worker 
21*635a8641SAndroid Build Coastguard Worker using SysInfoTest = PlatformTest;
22*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,NumProcs)23*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, NumProcs) {
24*635a8641SAndroid Build Coastguard Worker   // We aren't actually testing that it's correct, just that it's sane.
25*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(SysInfo::NumberOfProcessors(), 1);
26*635a8641SAndroid Build Coastguard Worker }
27*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,AmountOfMem)28*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, AmountOfMem) {
29*635a8641SAndroid Build Coastguard Worker   // We aren't actually testing that it's correct, just that it's sane.
30*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(SysInfo::AmountOfPhysicalMemory(), 0);
31*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(SysInfo::AmountOfPhysicalMemoryMB(), 0);
32*635a8641SAndroid Build Coastguard Worker   // The maxmimal amount of virtual memory can be zero which means unlimited.
33*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(SysInfo::AmountOfVirtualMemory(), 0);
34*635a8641SAndroid Build Coastguard Worker }
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX) || defined(OS_ANDROID)
37*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX)
38*635a8641SAndroid Build Coastguard Worker #define MAYBE_AmountOfAvailablePhysicalMemory \
39*635a8641SAndroid Build Coastguard Worker   DISABLED_AmountOfAvailablePhysicalMemory
40*635a8641SAndroid Build Coastguard Worker #else
41*635a8641SAndroid Build Coastguard Worker #define MAYBE_AmountOfAvailablePhysicalMemory AmountOfAvailablePhysicalMemory
42*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_LINUX)
TEST_F(SysInfoTest,MAYBE_AmountOfAvailablePhysicalMemory)43*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, MAYBE_AmountOfAvailablePhysicalMemory) {
44*635a8641SAndroid Build Coastguard Worker   // Note: info is in _K_bytes.
45*635a8641SAndroid Build Coastguard Worker   SystemMemoryInfoKB info;
46*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetSystemMemoryInfo(&info));
47*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(info.free, 0);
48*635a8641SAndroid Build Coastguard Worker 
49*635a8641SAndroid Build Coastguard Worker   if (info.available != 0) {
50*635a8641SAndroid Build Coastguard Worker     // If there is MemAvailable from kernel.
51*635a8641SAndroid Build Coastguard Worker     EXPECT_LT(info.available, info.total);
52*635a8641SAndroid Build Coastguard Worker     const int64_t amount = SysInfo::AmountOfAvailablePhysicalMemory(info);
53*635a8641SAndroid Build Coastguard Worker     // We aren't actually testing that it's correct, just that it's sane.
54*635a8641SAndroid Build Coastguard Worker     EXPECT_GT(amount, static_cast<int64_t>(info.free) * 1024);
55*635a8641SAndroid Build Coastguard Worker     EXPECT_LT(amount / 1024, info.available);
56*635a8641SAndroid Build Coastguard Worker     // Simulate as if there is no MemAvailable.
57*635a8641SAndroid Build Coastguard Worker     info.available = 0;
58*635a8641SAndroid Build Coastguard Worker   }
59*635a8641SAndroid Build Coastguard Worker 
60*635a8641SAndroid Build Coastguard Worker   // There is no MemAvailable. Check the fallback logic.
61*635a8641SAndroid Build Coastguard Worker   const int64_t amount = SysInfo::AmountOfAvailablePhysicalMemory(info);
62*635a8641SAndroid Build Coastguard Worker   // We aren't actually testing that it's correct, just that it's sane.
63*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(amount, static_cast<int64_t>(info.free) * 1024);
64*635a8641SAndroid Build Coastguard Worker   EXPECT_LT(amount / 1024, info.total);
65*635a8641SAndroid Build Coastguard Worker }
66*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_LINUX) || defined(OS_ANDROID)
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker #if defined(OS_FUCHSIA)
69*635a8641SAndroid Build Coastguard Worker // TODO(crbug.com/851734): Implementation depends on statvfs, which is not
70*635a8641SAndroid Build Coastguard Worker // implemented on Fuchsia
71*635a8641SAndroid Build Coastguard Worker #define MAYBE_AmountOfFreeDiskSpace DISABLED_AmountOfFreeDiskSpace
72*635a8641SAndroid Build Coastguard Worker #else
73*635a8641SAndroid Build Coastguard Worker #define MAYBE_AmountOfFreeDiskSpace AmountOfFreeDiskSpace
74*635a8641SAndroid Build Coastguard Worker #endif
TEST_F(SysInfoTest,MAYBE_AmountOfFreeDiskSpace)75*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, MAYBE_AmountOfFreeDiskSpace) {
76*635a8641SAndroid Build Coastguard Worker   // We aren't actually testing that it's correct, just that it's sane.
77*635a8641SAndroid Build Coastguard Worker   FilePath tmp_path;
78*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetTempDir(&tmp_path));
79*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(SysInfo::AmountOfFreeDiskSpace(tmp_path), 0) << tmp_path.value();
80*635a8641SAndroid Build Coastguard Worker }
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker #if defined(OS_FUCHSIA)
83*635a8641SAndroid Build Coastguard Worker // TODO(crbug.com/851734): Implementation depends on statvfs, which is not
84*635a8641SAndroid Build Coastguard Worker // implemented on Fuchsia
85*635a8641SAndroid Build Coastguard Worker #define MAYBE_AmountOfTotalDiskSpace DISABLED_AmountOfTotalDiskSpace
86*635a8641SAndroid Build Coastguard Worker #else
87*635a8641SAndroid Build Coastguard Worker #define MAYBE_AmountOfTotalDiskSpace AmountOfTotalDiskSpace
88*635a8641SAndroid Build Coastguard Worker #endif
TEST_F(SysInfoTest,MAYBE_AmountOfTotalDiskSpace)89*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, MAYBE_AmountOfTotalDiskSpace) {
90*635a8641SAndroid Build Coastguard Worker   // We aren't actually testing that it's correct, just that it's sane.
91*635a8641SAndroid Build Coastguard Worker   FilePath tmp_path;
92*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetTempDir(&tmp_path));
93*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(SysInfo::AmountOfTotalDiskSpace(tmp_path), 0) << tmp_path.value();
94*635a8641SAndroid Build Coastguard Worker }
95*635a8641SAndroid Build Coastguard Worker 
96*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
TEST_F(SysInfoTest,OperatingSystemVersionNumbers)97*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, OperatingSystemVersionNumbers) {
98*635a8641SAndroid Build Coastguard Worker   int32_t os_major_version = -1;
99*635a8641SAndroid Build Coastguard Worker   int32_t os_minor_version = -1;
100*635a8641SAndroid Build Coastguard Worker   int32_t os_bugfix_version = -1;
101*635a8641SAndroid Build Coastguard Worker   SysInfo::OperatingSystemVersionNumbers(&os_major_version,
102*635a8641SAndroid Build Coastguard Worker                                          &os_minor_version,
103*635a8641SAndroid Build Coastguard Worker                                          &os_bugfix_version);
104*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(os_major_version, -1);
105*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(os_minor_version, -1);
106*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(os_bugfix_version, -1);
107*635a8641SAndroid Build Coastguard Worker }
108*635a8641SAndroid Build Coastguard Worker #endif
109*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,Uptime)110*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, Uptime) {
111*635a8641SAndroid Build Coastguard Worker   TimeDelta up_time_1 = SysInfo::Uptime();
112*635a8641SAndroid Build Coastguard Worker   // UpTime() is implemented internally using TimeTicks::Now(), which documents
113*635a8641SAndroid Build Coastguard Worker   // system resolution as being 1-15ms. Sleep a little longer than that.
114*635a8641SAndroid Build Coastguard Worker   PlatformThread::Sleep(TimeDelta::FromMilliseconds(20));
115*635a8641SAndroid Build Coastguard Worker   TimeDelta up_time_2 = SysInfo::Uptime();
116*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(up_time_1.InMicroseconds(), 0);
117*635a8641SAndroid Build Coastguard Worker   EXPECT_GT(up_time_2.InMicroseconds(), up_time_1.InMicroseconds());
118*635a8641SAndroid Build Coastguard Worker }
119*635a8641SAndroid Build Coastguard Worker 
120*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
TEST_F(SysInfoTest,HardwareModelNameFormatMacAndiOS)121*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, HardwareModelNameFormatMacAndiOS) {
122*635a8641SAndroid Build Coastguard Worker   std::string hardware_model = SysInfo::HardwareModelName();
123*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(hardware_model.empty());
124*635a8641SAndroid Build Coastguard Worker   // Check that the model is of the expected format "Foo,Bar" where "Bar" is
125*635a8641SAndroid Build Coastguard Worker   // a number.
126*635a8641SAndroid Build Coastguard Worker   std::vector<StringPiece> pieces =
127*635a8641SAndroid Build Coastguard Worker       SplitStringPiece(hardware_model, ",", KEEP_WHITESPACE, SPLIT_WANT_ALL);
128*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(2u, pieces.size()) << hardware_model;
129*635a8641SAndroid Build Coastguard Worker   int value;
130*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(StringToInt(pieces[1], &value)) << hardware_model;
131*635a8641SAndroid Build Coastguard Worker }
132*635a8641SAndroid Build Coastguard Worker #endif
133*635a8641SAndroid Build Coastguard Worker 
134*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS)
135*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,GoogleChromeOSVersionNumbers)136*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSVersionNumbers) {
137*635a8641SAndroid Build Coastguard Worker   int32_t os_major_version = -1;
138*635a8641SAndroid Build Coastguard Worker   int32_t os_minor_version = -1;
139*635a8641SAndroid Build Coastguard Worker   int32_t os_bugfix_version = -1;
140*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease[] =
141*635a8641SAndroid Build Coastguard Worker       "FOO=1234123.34.5\n"
142*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
143*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, Time());
144*635a8641SAndroid Build Coastguard Worker   SysInfo::OperatingSystemVersionNumbers(&os_major_version,
145*635a8641SAndroid Build Coastguard Worker                                          &os_minor_version,
146*635a8641SAndroid Build Coastguard Worker                                          &os_bugfix_version);
147*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, os_major_version);
148*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, os_minor_version);
149*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, os_bugfix_version);
150*635a8641SAndroid Build Coastguard Worker }
151*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,GoogleChromeOSVersionNumbersFirst)152*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSVersionNumbersFirst) {
153*635a8641SAndroid Build Coastguard Worker   int32_t os_major_version = -1;
154*635a8641SAndroid Build Coastguard Worker   int32_t os_minor_version = -1;
155*635a8641SAndroid Build Coastguard Worker   int32_t os_bugfix_version = -1;
156*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease[] =
157*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
158*635a8641SAndroid Build Coastguard Worker       "FOO=1234123.34.5\n";
159*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, Time());
160*635a8641SAndroid Build Coastguard Worker   SysInfo::OperatingSystemVersionNumbers(&os_major_version,
161*635a8641SAndroid Build Coastguard Worker                                          &os_minor_version,
162*635a8641SAndroid Build Coastguard Worker                                          &os_bugfix_version);
163*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, os_major_version);
164*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, os_minor_version);
165*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, os_bugfix_version);
166*635a8641SAndroid Build Coastguard Worker }
167*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,GoogleChromeOSNoVersionNumbers)168*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSNoVersionNumbers) {
169*635a8641SAndroid Build Coastguard Worker   int32_t os_major_version = -1;
170*635a8641SAndroid Build Coastguard Worker   int32_t os_minor_version = -1;
171*635a8641SAndroid Build Coastguard Worker   int32_t os_bugfix_version = -1;
172*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease[] = "FOO=1234123.34.5\n";
173*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, Time());
174*635a8641SAndroid Build Coastguard Worker   SysInfo::OperatingSystemVersionNumbers(&os_major_version,
175*635a8641SAndroid Build Coastguard Worker                                          &os_minor_version,
176*635a8641SAndroid Build Coastguard Worker                                          &os_bugfix_version);
177*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, os_major_version);
178*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, os_minor_version);
179*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, os_bugfix_version);
180*635a8641SAndroid Build Coastguard Worker }
181*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,GoogleChromeOSLsbReleaseTime)182*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, GoogleChromeOSLsbReleaseTime) {
183*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease[] = "CHROMEOS_RELEASE_VERSION=1.2.3.4";
184*635a8641SAndroid Build Coastguard Worker   // Use a fake time that can be safely displayed as a string.
185*635a8641SAndroid Build Coastguard Worker   const Time lsb_release_time(Time::FromDoubleT(12345.6));
186*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, lsb_release_time);
187*635a8641SAndroid Build Coastguard Worker   Time parsed_lsb_release_time = SysInfo::GetLsbReleaseTime();
188*635a8641SAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(lsb_release_time.ToDoubleT(),
189*635a8641SAndroid Build Coastguard Worker                    parsed_lsb_release_time.ToDoubleT());
190*635a8641SAndroid Build Coastguard Worker }
191*635a8641SAndroid Build Coastguard Worker 
TEST_F(SysInfoTest,IsRunningOnChromeOS)192*635a8641SAndroid Build Coastguard Worker TEST_F(SysInfoTest, IsRunningOnChromeOS) {
193*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest("", Time());
194*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(SysInfo::IsRunningOnChromeOS());
195*635a8641SAndroid Build Coastguard Worker 
196*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease1[] =
197*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_NAME=Non Chrome OS\n"
198*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
199*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease1, Time());
200*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(SysInfo::IsRunningOnChromeOS());
201*635a8641SAndroid Build Coastguard Worker 
202*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease2[] =
203*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_NAME=Chrome OS\n"
204*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
205*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease2, Time());
206*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
207*635a8641SAndroid Build Coastguard Worker 
208*635a8641SAndroid Build Coastguard Worker   const char kLsbRelease3[] =
209*635a8641SAndroid Build Coastguard Worker       "CHROMEOS_RELEASE_NAME=Chromium OS\n";
210*635a8641SAndroid Build Coastguard Worker   SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease3, Time());
211*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
212*635a8641SAndroid Build Coastguard Worker }
213*635a8641SAndroid Build Coastguard Worker 
214*635a8641SAndroid Build Coastguard Worker #endif  // OS_CHROMEOS
215*635a8641SAndroid Build Coastguard Worker 
216*635a8641SAndroid Build Coastguard Worker }  // namespace base
217