Chromium Code Reviews| 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> |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 "Inactive: 21221496 kB\n" | 99 "Inactive: 21221496 kB\n" |
| 100 "Active(anon): 5674352 kB\n" | 100 "Active(anon): 5674352 kB\n" |
| 101 "Inactive(anon): 633992 kB\n"; | 101 "Inactive(anon): 633992 kB\n"; |
| 102 EXPECT_FALSE(ParseProcMeminfo(invalid_input1, &meminfo)); | 102 EXPECT_FALSE(ParseProcMeminfo(invalid_input1, &meminfo)); |
| 103 EXPECT_FALSE(ParseProcMeminfo(invalid_input2, &meminfo)); | 103 EXPECT_FALSE(ParseProcMeminfo(invalid_input2, &meminfo)); |
| 104 EXPECT_FALSE(ParseProcMeminfo(invalid_input3, &meminfo)); | 104 EXPECT_FALSE(ParseProcMeminfo(invalid_input3, &meminfo)); |
| 105 | 105 |
| 106 std::string valid_input1 = | 106 std::string valid_input1 = |
| 107 "MemTotal: 3981504 kB\n" | 107 "MemTotal: 3981504 kB\n" |
| 108 "MemFree: 140764 kB\n" | 108 "MemFree: 140764 kB\n" |
| 109 "MemAvailable: 2746720 kB\n" | |
|
Primiano Tucci (use gerrit)
2017/02/15 11:18:33
since this is not avialable on all kernels we supp
Michael K. (Yandex Team)
2017/02/17 13:38:48
When MemAvailable is absent, meminfo.available is
Primiano Tucci (use gerrit)
2017/02/20 14:13:27
I want to check that when we are in kernels that d
Michael K. (Yandex Team)
2017/02/20 14:33:13
Acknowledged.
Primiano Tucci (use gerrit)
2017/03/08 12:36:41
I might be missing something but... where did this
Michael K. (Yandex Team)
2017/03/09 07:21:15
See the new SysInfoTest.AmountOfAvailablePhysicalM
Primiano Tucci (use gerrit)
2017/03/09 10:24:03
The problem of that test you wrote is that what co
Michael K. (Yandex Team)
2017/03/09 10:40:56
Not exactly. See below.
| |
| 109 "Buffers: 116480 kB\n" | 110 "Buffers: 116480 kB\n" |
| 110 "Cached: 406160 kB\n" | 111 "Cached: 406160 kB\n" |
| 111 "SwapCached: 21304 kB\n" | 112 "SwapCached: 21304 kB\n" |
| 112 "Active: 3152040 kB\n" | 113 "Active: 3152040 kB\n" |
| 113 "Inactive: 472856 kB\n" | 114 "Inactive: 472856 kB\n" |
| 114 "Active(anon): 2972352 kB\n" | 115 "Active(anon): 2972352 kB\n" |
| 115 "Inactive(anon): 270108 kB\n" | 116 "Inactive(anon): 270108 kB\n" |
| 116 "Active(file): 179688 kB\n" | 117 "Active(file): 179688 kB\n" |
| 117 "Inactive(file): 202748 kB\n" | 118 "Inactive(file): 202748 kB\n" |
| 118 "Unevictable: 0 kB\n" | 119 "Unevictable: 0 kB\n" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 "VmallocTotal: 3874808 kB\n" | 165 "VmallocTotal: 3874808 kB\n" |
| 165 "VmallocUsed: 1416 kB\n" | 166 "VmallocUsed: 1416 kB\n" |
| 166 "VmallocChunk: 3872908 kB\n" | 167 "VmallocChunk: 3872908 kB\n" |
| 167 "HugePages_Total: 0\n" | 168 "HugePages_Total: 0\n" |
| 168 "HugePages_Free: 0\n" | 169 "HugePages_Free: 0\n" |
| 169 "Hugepagesize: 4096 kB\n"; | 170 "Hugepagesize: 4096 kB\n"; |
| 170 | 171 |
| 171 EXPECT_TRUE(ParseProcMeminfo(valid_input1, &meminfo)); | 172 EXPECT_TRUE(ParseProcMeminfo(valid_input1, &meminfo)); |
| 172 EXPECT_EQ(meminfo.total, 3981504); | 173 EXPECT_EQ(meminfo.total, 3981504); |
| 173 EXPECT_EQ(meminfo.free, 140764); | 174 EXPECT_EQ(meminfo.free, 140764); |
| 175 EXPECT_EQ(meminfo.available, 2746720); | |
| 174 EXPECT_EQ(meminfo.buffers, 116480); | 176 EXPECT_EQ(meminfo.buffers, 116480); |
| 175 EXPECT_EQ(meminfo.cached, 406160); | 177 EXPECT_EQ(meminfo.cached, 406160); |
| 176 EXPECT_EQ(meminfo.active_anon, 2972352); | 178 EXPECT_EQ(meminfo.active_anon, 2972352); |
| 177 EXPECT_EQ(meminfo.active_file, 179688); | 179 EXPECT_EQ(meminfo.active_file, 179688); |
| 178 EXPECT_EQ(meminfo.inactive_anon, 270108); | 180 EXPECT_EQ(meminfo.inactive_anon, 270108); |
| 179 EXPECT_EQ(meminfo.inactive_file, 202748); | 181 EXPECT_EQ(meminfo.inactive_file, 202748); |
| 180 EXPECT_EQ(meminfo.swap_total, 5832280); | 182 EXPECT_EQ(meminfo.swap_total, 5832280); |
| 181 EXPECT_EQ(meminfo.swap_free, 3672368); | 183 EXPECT_EQ(meminfo.swap_free, 3672368); |
| 182 EXPECT_EQ(meminfo.dirty, 184); | 184 EXPECT_EQ(meminfo.dirty, 184); |
| 185 EXPECT_EQ(meminfo.reclaimable, 30936); | |
| 183 #if defined(OS_CHROMEOS) | 186 #if defined(OS_CHROMEOS) |
| 184 EXPECT_EQ(meminfo.shmem, 140204); | 187 EXPECT_EQ(meminfo.shmem, 140204); |
| 185 EXPECT_EQ(meminfo.slab, 54212); | 188 EXPECT_EQ(meminfo.slab, 54212); |
| 186 #endif | 189 #endif |
| 187 EXPECT_TRUE(ParseProcMeminfo(valid_input2, &meminfo)); | 190 EXPECT_TRUE(ParseProcMeminfo(valid_input2, &meminfo)); |
| 188 EXPECT_EQ(meminfo.total, 255908); | 191 EXPECT_EQ(meminfo.total, 255908); |
| 189 EXPECT_EQ(meminfo.free, 69936); | 192 EXPECT_EQ(meminfo.free, 69936); |
| 190 EXPECT_EQ(meminfo.buffers, 15812); | 193 EXPECT_EQ(meminfo.buffers, 15812); |
| 191 EXPECT_EQ(meminfo.cached, 115124); | 194 EXPECT_EQ(meminfo.cached, 115124); |
| 192 EXPECT_EQ(meminfo.swap_total, 524280); | 195 EXPECT_EQ(meminfo.swap_total, 524280); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 | 337 |
| 335 thread2.Stop(); | 338 thread2.Stop(); |
| 336 EXPECT_GE(metrics->GetCPUUsage(), 0.0); | 339 EXPECT_GE(metrics->GetCPUUsage(), 0.0); |
| 337 | 340 |
| 338 thread3.Stop(); | 341 thread3.Stop(); |
| 339 EXPECT_GE(metrics->GetCPUUsage(), 0.0); | 342 EXPECT_GE(metrics->GetCPUUsage(), 0.0); |
| 340 } | 343 } |
| 341 | 344 |
| 342 #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) | 345 #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) |
| 343 | 346 |
| 344 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ | 347 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_IOS) || \ |
| 345 defined(OS_LINUX) || defined(OS_ANDROID) | 348 defined(OS_LINUX) || defined(OS_ANDROID) |
| 346 TEST(SystemMetrics2Test, GetSystemMemoryInfo) { | 349 TEST(SystemMetrics2Test, GetSystemMemoryInfo) { |
| 347 SystemMemoryInfoKB info; | 350 SystemMemoryInfoKB info; |
| 348 EXPECT_TRUE(GetSystemMemoryInfo(&info)); | 351 EXPECT_TRUE(GetSystemMemoryInfo(&info)); |
| 349 | 352 |
| 350 // Ensure each field received a value. | 353 // Ensure each field received a value. |
| 351 EXPECT_GT(info.total, 0); | 354 EXPECT_GT(info.total, 0); |
| 355 #if defined(OS_WIN) | |
| 356 EXPECT_GT(info.available, 0); | |
| 357 EXPECT_GT(info.free + info.zero, 0); | |
| 358 #else | |
| 352 EXPECT_GT(info.free, 0); | 359 EXPECT_GT(info.free, 0); |
| 360 #endif | |
| 353 #if defined(OS_LINUX) || defined(OS_ANDROID) | 361 #if defined(OS_LINUX) || defined(OS_ANDROID) |
| 354 EXPECT_GT(info.buffers, 0); | 362 EXPECT_GT(info.buffers, 0); |
| 355 EXPECT_GT(info.cached, 0); | 363 EXPECT_GT(info.cached, 0); |
| 356 EXPECT_GT(info.active_anon, 0); | 364 EXPECT_GT(info.active_anon, 0); |
| 357 EXPECT_GT(info.inactive_anon, 0); | 365 EXPECT_GT(info.inactive_anon, 0); |
| 358 EXPECT_GT(info.active_file, 0); | 366 EXPECT_GT(info.active_file, 0); |
| 359 EXPECT_GT(info.inactive_file, 0); | 367 EXPECT_GT(info.inactive_file, 0); |
| 360 #endif // defined(OS_LINUX) || defined(OS_ANDROID) | 368 #endif // defined(OS_LINUX) || defined(OS_ANDROID) |
| 361 | 369 |
| 362 // All the values should be less than the total amount of memory. | 370 // All the values should be less than the total amount of memory. |
| 363 EXPECT_LT(info.free, info.total); | 371 EXPECT_LT(info.free, info.total); |
| 364 #if defined(OS_LINUX) || defined(OS_ANDROID) | 372 #if defined(OS_LINUX) || defined(OS_ANDROID) |
| 365 EXPECT_LT(info.buffers, info.total); | 373 EXPECT_LT(info.buffers, info.total); |
| 366 EXPECT_LT(info.cached, info.total); | 374 EXPECT_LT(info.cached, info.total); |
| 367 EXPECT_LT(info.active_anon, info.total); | 375 EXPECT_LT(info.active_anon, info.total); |
| 368 EXPECT_LT(info.inactive_anon, info.total); | 376 EXPECT_LT(info.inactive_anon, info.total); |
| 369 EXPECT_LT(info.active_file, info.total); | 377 EXPECT_LT(info.active_file, info.total); |
| 370 EXPECT_LT(info.inactive_file, info.total); | 378 EXPECT_LT(info.inactive_file, info.total); |
| 371 #endif // defined(OS_LINUX) || defined(OS_ANDROID) | 379 #endif // defined(OS_LINUX) || defined(OS_ANDROID) |
| 372 | 380 |
| 381 #if defined(OS_MACOSX) || defined(OS_IOS) | |
| 382 EXPECT_GT(info.file_backed, 0); | |
| 383 #endif | |
| 384 | |
| 373 #if defined(OS_CHROMEOS) | 385 #if defined(OS_CHROMEOS) |
| 374 // Chrome OS exposes shmem. | 386 // Chrome OS exposes shmem. |
| 375 EXPECT_GT(info.shmem, 0); | 387 EXPECT_GT(info.shmem, 0); |
| 376 EXPECT_LT(info.shmem, info.total); | 388 EXPECT_LT(info.shmem, info.total); |
| 377 // Chrome unit tests are not run on actual Chrome OS hardware, so gem_objects | 389 // Chrome unit tests are not run on actual Chrome OS hardware, so gem_objects |
| 378 // and gem_size cannot be tested here. | 390 // and gem_size cannot be tested here. |
| 379 #endif | 391 #endif |
| 380 } | 392 } |
| 381 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || | 393 #endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_IOS) || |
| 382 // defined(OS_LINUX) || defined(OS_ANDROID) | 394 // defined(OS_LINUX) || defined(OS_ANDROID) |
| 383 | 395 |
| 384 #if defined(OS_LINUX) || defined(OS_ANDROID) | 396 #if defined(OS_LINUX) || defined(OS_ANDROID) |
| 385 TEST(ProcessMetricsTest, ParseProcStatCPU) { | 397 TEST(ProcessMetricsTest, ParseProcStatCPU) { |
| 386 // /proc/self/stat for a process running "top". | 398 // /proc/self/stat for a process running "top". |
| 387 const char kTopStat[] = "960 (top) S 16230 960 16230 34818 960 " | 399 const char kTopStat[] = "960 (top) S 16230 960 16230 34818 960 " |
| 388 "4202496 471 0 0 0 " | 400 "4202496 471 0 0 0 " |
| 389 "12 16 0 0 " // <- These are the goods. | 401 "12 16 0 0 " // <- These are the goods. |
| 390 "20 0 1 0 121946157 15077376 314 18446744073709551615 4194304 " | 402 "20 0 1 0 121946157 15077376 314 18446744073709551615 4194304 " |
| 391 "4246868 140733983044336 18446744073709551615 140244213071219 " | 403 "4246868 140733983044336 18446744073709551615 140244213071219 " |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 498 | 510 |
| 499 std::unique_ptr<ProcessMetrics> metrics( | 511 std::unique_ptr<ProcessMetrics> metrics( |
| 500 ProcessMetrics::CreateProcessMetrics(child.Handle())); | 512 ProcessMetrics::CreateProcessMetrics(child.Handle())); |
| 501 EXPECT_EQ(0, metrics->GetOpenFdCount()); | 513 EXPECT_EQ(0, metrics->GetOpenFdCount()); |
| 502 ASSERT_TRUE(child.Terminate(0, true)); | 514 ASSERT_TRUE(child.Terminate(0, true)); |
| 503 } | 515 } |
| 504 #endif // defined(OS_LINUX) | 516 #endif // defined(OS_LINUX) |
| 505 | 517 |
| 506 } // namespace debug | 518 } // namespace debug |
| 507 } // namespace base | 519 } // namespace base |
| OLD | NEW |