OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/process/process_metrics.h" | 5 #include "base/process/process_metrics.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <sstream> | 10 #include <sstream> |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
15 #include "base/files/file.h" | 15 #include "base/files/file.h" |
16 #include "base/files/file_util.h" | 16 #include "base/files/file_util.h" |
17 #include "base/files/scoped_temp_dir.h" | 17 #include "base/files/scoped_temp_dir.h" |
18 #include "base/macros.h" | 18 #include "base/macros.h" |
19 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
20 #include "base/sys_info.h" | |
21 #include "base/test/multiprocess_test.h" | 20 #include "base/test/multiprocess_test.h" |
22 #include "base/threading/thread.h" | 21 #include "base/threading/thread.h" |
23 #include "build/build_config.h" | 22 #include "build/build_config.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
25 #include "testing/multiprocess_func_list.h" | 24 #include "testing/multiprocess_func_list.h" |
26 | 25 |
27 namespace base { | 26 namespace base { |
28 namespace debug { | 27 namespace debug { |
29 | 28 |
30 #if defined(OS_LINUX) || defined(OS_CHROMEOS) | 29 #if defined(OS_LINUX) || defined(OS_CHROMEOS) |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 "Inactive: 21221496 kB\n" | 99 "Inactive: 21221496 kB\n" |
101 "Active(anon): 5674352 kB\n" | 100 "Active(anon): 5674352 kB\n" |
102 "Inactive(anon): 633992 kB\n"; | 101 "Inactive(anon): 633992 kB\n"; |
103 EXPECT_FALSE(ParseProcMeminfo(invalid_input1, &meminfo)); | 102 EXPECT_FALSE(ParseProcMeminfo(invalid_input1, &meminfo)); |
104 EXPECT_FALSE(ParseProcMeminfo(invalid_input2, &meminfo)); | 103 EXPECT_FALSE(ParseProcMeminfo(invalid_input2, &meminfo)); |
105 EXPECT_FALSE(ParseProcMeminfo(invalid_input3, &meminfo)); | 104 EXPECT_FALSE(ParseProcMeminfo(invalid_input3, &meminfo)); |
106 | 105 |
107 std::string valid_input1 = | 106 std::string valid_input1 = |
108 "MemTotal: 3981504 kB\n" | 107 "MemTotal: 3981504 kB\n" |
109 "MemFree: 140764 kB\n" | 108 "MemFree: 140764 kB\n" |
110 "MemAvailable: 535413 kB\n" | |
111 "Buffers: 116480 kB\n" | 109 "Buffers: 116480 kB\n" |
112 "Cached: 406160 kB\n" | 110 "Cached: 406160 kB\n" |
113 "SwapCached: 21304 kB\n" | 111 "SwapCached: 21304 kB\n" |
114 "Active: 3152040 kB\n" | 112 "Active: 3152040 kB\n" |
115 "Inactive: 472856 kB\n" | 113 "Inactive: 472856 kB\n" |
116 "Active(anon): 2972352 kB\n" | 114 "Active(anon): 2972352 kB\n" |
117 "Inactive(anon): 270108 kB\n" | 115 "Inactive(anon): 270108 kB\n" |
118 "Active(file): 179688 kB\n" | 116 "Active(file): 179688 kB\n" |
119 "Inactive(file): 202748 kB\n" | 117 "Inactive(file): 202748 kB\n" |
120 "Unevictable: 0 kB\n" | 118 "Unevictable: 0 kB\n" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 "VmallocTotal: 3874808 kB\n" | 164 "VmallocTotal: 3874808 kB\n" |
167 "VmallocUsed: 1416 kB\n" | 165 "VmallocUsed: 1416 kB\n" |
168 "VmallocChunk: 3872908 kB\n" | 166 "VmallocChunk: 3872908 kB\n" |
169 "HugePages_Total: 0\n" | 167 "HugePages_Total: 0\n" |
170 "HugePages_Free: 0\n" | 168 "HugePages_Free: 0\n" |
171 "Hugepagesize: 4096 kB\n"; | 169 "Hugepagesize: 4096 kB\n"; |
172 | 170 |
173 EXPECT_TRUE(ParseProcMeminfo(valid_input1, &meminfo)); | 171 EXPECT_TRUE(ParseProcMeminfo(valid_input1, &meminfo)); |
174 EXPECT_EQ(meminfo.total, 3981504); | 172 EXPECT_EQ(meminfo.total, 3981504); |
175 EXPECT_EQ(meminfo.free, 140764); | 173 EXPECT_EQ(meminfo.free, 140764); |
176 EXPECT_EQ(meminfo.available, 535413); | |
177 EXPECT_EQ(meminfo.buffers, 116480); | 174 EXPECT_EQ(meminfo.buffers, 116480); |
178 EXPECT_EQ(meminfo.cached, 406160); | 175 EXPECT_EQ(meminfo.cached, 406160); |
179 EXPECT_EQ(meminfo.active_anon, 2972352); | 176 EXPECT_EQ(meminfo.active_anon, 2972352); |
180 EXPECT_EQ(meminfo.active_file, 179688); | 177 EXPECT_EQ(meminfo.active_file, 179688); |
181 EXPECT_EQ(meminfo.inactive_anon, 270108); | 178 EXPECT_EQ(meminfo.inactive_anon, 270108); |
182 EXPECT_EQ(meminfo.inactive_file, 202748); | 179 EXPECT_EQ(meminfo.inactive_file, 202748); |
183 EXPECT_EQ(meminfo.swap_total, 5832280); | 180 EXPECT_EQ(meminfo.swap_total, 5832280); |
184 EXPECT_EQ(meminfo.swap_free, 3672368); | 181 EXPECT_EQ(meminfo.swap_free, 3672368); |
185 EXPECT_EQ(meminfo.dirty, 184); | 182 EXPECT_EQ(meminfo.dirty, 184); |
186 EXPECT_EQ(meminfo.reclaimable, 30936); | |
187 #if defined(OS_CHROMEOS) | 183 #if defined(OS_CHROMEOS) |
188 EXPECT_EQ(meminfo.shmem, 140204); | 184 EXPECT_EQ(meminfo.shmem, 140204); |
189 EXPECT_EQ(meminfo.slab, 54212); | 185 EXPECT_EQ(meminfo.slab, 54212); |
190 #endif | 186 #endif |
191 EXPECT_EQ(355725, | |
192 base::SysInfo::AmountOfAvailablePhysicalMemory(meminfo) / 1024); | |
193 // Simulate as if there is no MemAvailable. | |
194 meminfo.available = 0; | |
195 EXPECT_EQ(374448, | |
196 base::SysInfo::AmountOfAvailablePhysicalMemory(meminfo) / 1024); | |
197 meminfo = {}; | |
198 EXPECT_TRUE(ParseProcMeminfo(valid_input2, &meminfo)); | 187 EXPECT_TRUE(ParseProcMeminfo(valid_input2, &meminfo)); |
199 EXPECT_EQ(meminfo.total, 255908); | 188 EXPECT_EQ(meminfo.total, 255908); |
200 EXPECT_EQ(meminfo.free, 69936); | 189 EXPECT_EQ(meminfo.free, 69936); |
201 EXPECT_EQ(meminfo.available, 0); | |
202 EXPECT_EQ(meminfo.buffers, 15812); | 190 EXPECT_EQ(meminfo.buffers, 15812); |
203 EXPECT_EQ(meminfo.cached, 115124); | 191 EXPECT_EQ(meminfo.cached, 115124); |
204 EXPECT_EQ(meminfo.swap_total, 524280); | 192 EXPECT_EQ(meminfo.swap_total, 524280); |
205 EXPECT_EQ(meminfo.swap_free, 524200); | 193 EXPECT_EQ(meminfo.swap_free, 524200); |
206 EXPECT_EQ(meminfo.dirty, 4); | 194 EXPECT_EQ(meminfo.dirty, 4); |
207 EXPECT_EQ(69936, | |
208 base::SysInfo::AmountOfAvailablePhysicalMemory(meminfo) / 1024); | |
209 } | 195 } |
210 | 196 |
211 TEST_F(SystemMetricsTest, ParseVmstat) { | 197 TEST_F(SystemMetricsTest, ParseVmstat) { |
212 struct SystemMemoryInfoKB meminfo; | 198 struct SystemMemoryInfoKB meminfo; |
213 // part of vmstat from a 3.2 kernel with numa enabled | 199 // part of vmstat from a 3.2 kernel with numa enabled |
214 std::string valid_input1 = | 200 std::string valid_input1 = |
215 "nr_free_pages 905104\n" | 201 "nr_free_pages 905104\n" |
216 "nr_inactive_anon 142478" | 202 "nr_inactive_anon 142478" |
217 "nr_active_anon 1520046\n" | 203 "nr_active_anon 1520046\n" |
218 "nr_inactive_file 4481001\n" | 204 "nr_inactive_file 4481001\n" |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 | 334 |
349 thread2.Stop(); | 335 thread2.Stop(); |
350 EXPECT_GE(metrics->GetCPUUsage(), 0.0); | 336 EXPECT_GE(metrics->GetCPUUsage(), 0.0); |
351 | 337 |
352 thread3.Stop(); | 338 thread3.Stop(); |
353 EXPECT_GE(metrics->GetCPUUsage(), 0.0); | 339 EXPECT_GE(metrics->GetCPUUsage(), 0.0); |
354 } | 340 } |
355 | 341 |
356 #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) | 342 #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) |
357 | 343 |
358 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ | 344 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ |
359 defined(OS_ANDROID) | 345 defined(OS_LINUX) || defined(OS_ANDROID) |
360 TEST(SystemMetrics2Test, GetSystemMemoryInfo) { | 346 TEST(SystemMetrics2Test, GetSystemMemoryInfo) { |
361 SystemMemoryInfoKB info; | 347 SystemMemoryInfoKB info; |
362 EXPECT_TRUE(GetSystemMemoryInfo(&info)); | 348 EXPECT_TRUE(GetSystemMemoryInfo(&info)); |
363 | 349 |
364 // Ensure each field received a value. | 350 // Ensure each field received a value. |
365 EXPECT_GT(info.total, 0); | 351 EXPECT_GT(info.total, 0); |
366 #if defined(OS_WIN) | |
367 EXPECT_GT(info.avail_phys, 0); | |
368 #else | |
369 EXPECT_GT(info.free, 0); | 352 EXPECT_GT(info.free, 0); |
370 #endif | |
371 #if defined(OS_LINUX) || defined(OS_ANDROID) | 353 #if defined(OS_LINUX) || defined(OS_ANDROID) |
372 EXPECT_GT(info.buffers, 0); | 354 EXPECT_GT(info.buffers, 0); |
373 EXPECT_GT(info.cached, 0); | 355 EXPECT_GT(info.cached, 0); |
374 EXPECT_GT(info.active_anon, 0); | 356 EXPECT_GT(info.active_anon, 0); |
375 EXPECT_GT(info.inactive_anon, 0); | 357 EXPECT_GT(info.inactive_anon, 0); |
376 EXPECT_GT(info.active_file, 0); | 358 EXPECT_GT(info.active_file, 0); |
377 EXPECT_GT(info.inactive_file, 0); | 359 EXPECT_GT(info.inactive_file, 0); |
378 #endif // defined(OS_LINUX) || defined(OS_ANDROID) | 360 #endif // defined(OS_LINUX) || defined(OS_ANDROID) |
379 | 361 |
380 // All the values should be less than the total amount of memory. | 362 // All the values should be less than the total amount of memory. |
381 #if !defined(OS_WIN) | |
382 EXPECT_LT(info.free, info.total); | 363 EXPECT_LT(info.free, info.total); |
383 #endif | |
384 #if defined(OS_LINUX) || defined(OS_ANDROID) | 364 #if defined(OS_LINUX) || defined(OS_ANDROID) |
385 EXPECT_LT(info.buffers, info.total); | 365 EXPECT_LT(info.buffers, info.total); |
386 EXPECT_LT(info.cached, info.total); | 366 EXPECT_LT(info.cached, info.total); |
387 EXPECT_LT(info.active_anon, info.total); | 367 EXPECT_LT(info.active_anon, info.total); |
388 EXPECT_LT(info.inactive_anon, info.total); | 368 EXPECT_LT(info.inactive_anon, info.total); |
389 EXPECT_LT(info.active_file, info.total); | 369 EXPECT_LT(info.active_file, info.total); |
390 EXPECT_LT(info.inactive_file, info.total); | 370 EXPECT_LT(info.inactive_file, info.total); |
391 #endif // defined(OS_LINUX) || defined(OS_ANDROID) | 371 #endif // defined(OS_LINUX) || defined(OS_ANDROID) |
392 | 372 |
393 #if defined(OS_MACOSX) || defined(OS_IOS) | |
394 EXPECT_GT(info.file_backed, 0); | |
395 #endif | |
396 | |
397 #if defined(OS_CHROMEOS) | 373 #if defined(OS_CHROMEOS) |
398 // Chrome OS exposes shmem. | 374 // Chrome OS exposes shmem. |
399 EXPECT_GT(info.shmem, 0); | 375 EXPECT_GT(info.shmem, 0); |
400 EXPECT_LT(info.shmem, info.total); | 376 EXPECT_LT(info.shmem, info.total); |
401 // Chrome unit tests are not run on actual Chrome OS hardware, so gem_objects | 377 // Chrome unit tests are not run on actual Chrome OS hardware, so gem_objects |
402 // and gem_size cannot be tested here. | 378 // and gem_size cannot be tested here. |
403 #endif | 379 #endif |
404 } | 380 } |
405 #endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || | 381 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || |
406 // defined(OS_ANDROID) | 382 // defined(OS_LINUX) || defined(OS_ANDROID) |
407 | 383 |
408 #if defined(OS_LINUX) || defined(OS_ANDROID) | 384 #if defined(OS_LINUX) || defined(OS_ANDROID) |
409 TEST(ProcessMetricsTest, ParseProcStatCPU) { | 385 TEST(ProcessMetricsTest, ParseProcStatCPU) { |
410 // /proc/self/stat for a process running "top". | 386 // /proc/self/stat for a process running "top". |
411 const char kTopStat[] = "960 (top) S 16230 960 16230 34818 960 " | 387 const char kTopStat[] = "960 (top) S 16230 960 16230 34818 960 " |
412 "4202496 471 0 0 0 " | 388 "4202496 471 0 0 0 " |
413 "12 16 0 0 " // <- These are the goods. | 389 "12 16 0 0 " // <- These are the goods. |
414 "20 0 1 0 121946157 15077376 314 18446744073709551615 4194304 " | 390 "20 0 1 0 121946157 15077376 314 18446744073709551615 4194304 " |
415 "4246868 140733983044336 18446744073709551615 140244213071219 " | 391 "4246868 140733983044336 18446744073709551615 140244213071219 " |
416 "0 0 0 138047495 0 0 0 17 1 0 0 0 0 0"; | 392 "0 0 0 138047495 0 0 0 17 1 0 0 0 0 0"; |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 | 498 |
523 std::unique_ptr<ProcessMetrics> metrics( | 499 std::unique_ptr<ProcessMetrics> metrics( |
524 ProcessMetrics::CreateProcessMetrics(child.Handle())); | 500 ProcessMetrics::CreateProcessMetrics(child.Handle())); |
525 EXPECT_EQ(0, metrics->GetOpenFdCount()); | 501 EXPECT_EQ(0, metrics->GetOpenFdCount()); |
526 ASSERT_TRUE(child.Terminate(0, true)); | 502 ASSERT_TRUE(child.Terminate(0, true)); |
527 } | 503 } |
528 #endif // defined(OS_LINUX) | 504 #endif // defined(OS_LINUX) |
529 | 505 |
530 } // namespace debug | 506 } // namespace debug |
531 } // namespace base | 507 } // namespace base |
OLD | NEW |