| Index: base/process/process_metrics_unittest.cc
|
| diff --git a/base/process/process_metrics_unittest.cc b/base/process/process_metrics_unittest.cc
|
| index b29ceb6ea57ece99dc3a14145051f5d38ecc890b..bbf55c33d6c78c66ffd8b0f537e6d8ca1fd39ec0 100644
|
| --- a/base/process/process_metrics_unittest.cc
|
| +++ b/base/process/process_metrics_unittest.cc
|
| @@ -8,10 +8,15 @@
|
| #include <string>
|
|
|
| #include "base/bind.h"
|
| +#include "base/command_line.h"
|
| +#include "base/files/file.h"
|
| +#include "base/files/file_util.h"
|
| +#include "base/files/scoped_temp_dir.h"
|
| #include "base/strings/string_number_conversions.h"
|
| +#include "base/test/multiprocess_test.h"
|
| #include "base/threading/thread.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| +#include "testing/multiprocess_func_list.h"
|
|
|
| namespace base {
|
| namespace debug {
|
| @@ -23,7 +28,7 @@ void BusyWork(std::vector<std::string>* vec) {
|
| int64_t test_value = 0;
|
| for (int i = 0; i < 100000; ++i) {
|
| ++test_value;
|
| - vec->push_back(base::Int64ToString(test_value));
|
| + vec->push_back(Int64ToString(test_value));
|
| }
|
| }
|
|
|
| @@ -292,7 +297,7 @@ TEST_F(SystemMetricsTest, ParseVmstat) {
|
| // the number of threads running on the process decreases between two successive
|
| // calls to it.
|
| TEST_F(SystemMetricsTest, TestNoNegativeCpuUsage) {
|
| - base::ProcessHandle handle = base::GetCurrentProcessHandle();
|
| + ProcessHandle handle = GetCurrentProcessHandle();
|
| scoped_ptr<ProcessMetrics> metrics(
|
| ProcessMetrics::CreateProcessMetrics(handle));
|
|
|
| @@ -313,9 +318,9 @@ TEST_F(SystemMetricsTest, TestNoNegativeCpuUsage) {
|
| std::vector<std::string> vec2;
|
| std::vector<std::string> vec3;
|
|
|
| - thread1.task_runner()->PostTask(FROM_HERE, base::Bind(&BusyWork, &vec1));
|
| - thread2.task_runner()->PostTask(FROM_HERE, base::Bind(&BusyWork, &vec2));
|
| - thread3.task_runner()->PostTask(FROM_HERE, base::Bind(&BusyWork, &vec3));
|
| + thread1.task_runner()->PostTask(FROM_HERE, Bind(&BusyWork, &vec1));
|
| + thread2.task_runner()->PostTask(FROM_HERE, Bind(&BusyWork, &vec2));
|
| + thread3.task_runner()->PostTask(FROM_HERE, Bind(&BusyWork, &vec3));
|
|
|
| EXPECT_GE(metrics->GetCPUUsage(), 0.0);
|
|
|
| @@ -334,8 +339,8 @@ TEST_F(SystemMetricsTest, TestNoNegativeCpuUsage) {
|
| #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \
|
| defined(OS_LINUX) || defined(OS_ANDROID)
|
| TEST(SystemMetrics2Test, GetSystemMemoryInfo) {
|
| - base::SystemMemoryInfoKB info;
|
| - EXPECT_TRUE(base::GetSystemMemoryInfo(&info));
|
| + SystemMemoryInfoKB info;
|
| + EXPECT_TRUE(GetSystemMemoryInfo(&info));
|
|
|
| // Ensure each field received a value.
|
| EXPECT_GT(info.total, 0);
|
| @@ -380,7 +385,7 @@ TEST(ProcessMetricsTest, ParseProcStatCPU) {
|
| "20 0 1 0 121946157 15077376 314 18446744073709551615 4194304 "
|
| "4246868 140733983044336 18446744073709551615 140244213071219 "
|
| "0 0 0 138047495 0 0 0 17 1 0 0 0 0 0";
|
| - EXPECT_EQ(12 + 16, base::ParseProcStatCPU(kTopStat));
|
| + EXPECT_EQ(12 + 16, ParseProcStatCPU(kTopStat));
|
|
|
| // cat /proc/self/stat on a random other machine I have.
|
| const char kSelfStat[] = "5364 (cat) R 5354 5364 5354 34819 5364 "
|
| @@ -389,7 +394,7 @@ TEST(ProcessMetricsTest, ParseProcStatCPU) {
|
| "16 0 1 0 1676099790 2957312 114 4294967295 134512640 134528148 "
|
| "3221224832 3221224344 3086339742 0 0 0 0 0 0 0 17 0 0 0";
|
|
|
| - EXPECT_EQ(0, base::ParseProcStatCPU(kSelfStat));
|
| + EXPECT_EQ(0, ParseProcStatCPU(kSelfStat));
|
|
|
| // Some weird long-running process with a weird name that I created for the
|
| // purposes of this test.
|
| @@ -400,29 +405,96 @@ TEST(ProcessMetricsTest, ParseProcStatCPU) {
|
| "140735857761568 140735857761160 4195644 0 0 0 0 0 0 0 17 14 0 0 0 0 0 "
|
| "6295056 6295616 16519168 140735857770710 140735857770737 "
|
| "140735857770737 140735857774557 0";
|
| - EXPECT_EQ(5186 + 11, base::ParseProcStatCPU(kWeirdNameStat));
|
| + EXPECT_EQ(5186 + 11, ParseProcStatCPU(kWeirdNameStat));
|
| }
|
| -#endif // defined(OS_LINUX) || defined(OS_ANDROID)
|
| +#endif // defined(OS_LINUX) || defined(OS_ANDROID)
|
|
|
| // Disable on Android because base_unittests runs inside a Dalvik VM that
|
| // starts and stop threads (crbug.com/175563).
|
| #if defined(OS_LINUX)
|
| // http://crbug.com/396455
|
| TEST(ProcessMetricsTest, DISABLED_GetNumberOfThreads) {
|
| - const base::ProcessHandle current = base::GetCurrentProcessHandle();
|
| - const int initial_threads = base::GetNumberOfThreads(current);
|
| + const ProcessHandle current = GetCurrentProcessHandle();
|
| + const int initial_threads = GetNumberOfThreads(current);
|
| ASSERT_GT(initial_threads, 0);
|
| const int kNumAdditionalThreads = 10;
|
| {
|
| - scoped_ptr<base::Thread> my_threads[kNumAdditionalThreads];
|
| + scoped_ptr<Thread> my_threads[kNumAdditionalThreads];
|
| for (int i = 0; i < kNumAdditionalThreads; ++i) {
|
| - my_threads[i].reset(new base::Thread("GetNumberOfThreadsTest"));
|
| + my_threads[i].reset(new Thread("GetNumberOfThreadsTest"));
|
| my_threads[i]->Start();
|
| - ASSERT_EQ(base::GetNumberOfThreads(current), initial_threads + 1 + i);
|
| + ASSERT_EQ(GetNumberOfThreads(current), initial_threads + 1 + i);
|
| }
|
| }
|
| // The Thread destructor will stop them.
|
| - ASSERT_EQ(initial_threads, base::GetNumberOfThreads(current));
|
| + ASSERT_EQ(initial_threads, GetNumberOfThreads(current));
|
| +}
|
| +#endif // defined(OS_LINUX)
|
| +
|
| +#if defined(OS_LINUX)
|
| +namespace {
|
| +
|
| +// Keep these in sync so the GetOpenFdCount test can refer to correct test main.
|
| +#define ChildMain ChildFdCount
|
| +#define ChildMainString "ChildFdCount"
|
| +
|
| +// Command line flag name and file name used for synchronization.
|
| +const char kTempDirFlag[] = "temp-dir";
|
| +const char kSignalClosed[] = "closed";
|
| +
|
| +bool SignalEvent(const FilePath& signal_dir, const char* signal_file) {
|
| + File file(signal_dir.AppendASCII(signal_file),
|
| + File::FLAG_CREATE | File::FLAG_WRITE);
|
| + return file.IsValid();
|
| +}
|
| +
|
| +// Check whether an event was signaled.
|
| +bool CheckEvent(const FilePath& signal_dir, const char* signal_file) {
|
| + File file(signal_dir.AppendASCII(signal_file),
|
| + File::FLAG_OPEN | File::FLAG_READ);
|
| + return file.IsValid();
|
| +}
|
| +
|
| +// Busy-wait for an event to be signaled.
|
| +void WaitForEvent(const FilePath& signal_dir, const char* signal_file) {
|
| + while (!CheckEvent(signal_dir, signal_file))
|
| + PlatformThread::Sleep(TimeDelta::FromMilliseconds(10));
|
| +}
|
| +
|
| +// Subprocess to test the number of open file descriptors.
|
| +MULTIPROCESS_TEST_MAIN(ChildMain) {
|
| + CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| + const FilePath temp_path = command_line->GetSwitchValuePath(kTempDirFlag);
|
| + CHECK(DirectoryExists(temp_path));
|
| +
|
| + // Try to close all the file descriptors, so the open count goes to 0.
|
| + for (size_t i = 0; i < 1000; ++i)
|
| + close(i);
|
| + CHECK(SignalEvent(temp_path, kSignalClosed));
|
| +
|
| + // Wait to be terminated.
|
| + while (true)
|
| + PlatformThread::Sleep(TimeDelta::FromSeconds(1));
|
| + return 0;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +TEST(ProcessMetricsTest, GetOpenFdCount) {
|
| + ScopedTempDir temp_dir;
|
| + ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| + const FilePath temp_path = temp_dir.path();
|
| + CommandLine child_command_line(GetMultiProcessTestChildBaseCommandLine());
|
| + child_command_line.AppendSwitchPath(kTempDirFlag, temp_path);
|
| + Process child = SpawnMultiProcessTestChild(
|
| + ChildMainString, child_command_line, LaunchOptions());
|
| + ASSERT_TRUE(child.IsValid());
|
| + WaitForEvent(temp_path, kSignalClosed);
|
| +
|
| + scoped_ptr<ProcessMetrics> metrics(
|
| + ProcessMetrics::CreateProcessMetrics(child.Handle()));
|
| + EXPECT_EQ(0, metrics->GetOpenFdCount());
|
| + ASSERT_TRUE(child.Terminate(0, true));
|
| }
|
| #endif // defined(OS_LINUX)
|
|
|
|
|