Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2200)

Unified Diff: chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc

Issue 1374283003: Reporting top cpu and memory consumers via rappor on chromeos (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: browser/gpu stats by UMA histograms, buckets for cpu cores. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
diff --git a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9339e99372a12143577e7fbfc34d8750a9210644
--- /dev/null
+++ b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
@@ -0,0 +1,309 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <limits>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/timer/mock_timer.h"
+#include "chrome/browser/chromeos/resource_reporter/resource_reporter.h"
+#include "chrome/browser/task_management/task_manager_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using task_management::TaskId;
+
+namespace chromeos {
+
+namespace {
+
+const int64_t k1KB = 1024;
+const int64_t k1MB = 1024 * 1024;
+const int64_t k1GB = 1024 * 1024 * 1024;
+
+// A list of task records that we'll use to fill the task manager.
+const ResourceReporter::TaskRecord kTestTasks[] = {
+ { 0, "0", 30.0, 43 * k1KB, false },
+ { 1, "1", 9.0, 20 * k1MB, false },
+ { 2, "2", 35.0, 3 * k1GB, false },
+ { 3, "3", 21.0, 300 * k1MB, false },
+ { 4, "4", 85.0, 400 * k1KB, false },
+ { 5, "5", 30.1, 500 * k1MB, false },
+ { 6, "6", 60.0, 900 * k1MB, false },
+ { 7, "7", 4.0, 1 * k1GB, false },
+ { 8, "8", 40.0, 64 * k1KB, false },
+ { 9, "9", 93.0, 64 * k1MB, false },
+ { 10, "10", 2.23, 2 * k1KB, false },
+ { 11, "11", 55.0, 40 * k1MB, false },
+ { 12, "12", 87.0, 30 * k1KB, false },
+};
+
+// A list of task IDs that will be removed from the task manager later after all
+// the above tasks have been added.
+const task_management::TaskId kIdsOfTasksToRemove[] = {
+ 4, 7, 12, 8, 5,
+};
+
+// Must be larger than |ResourceReporter::kTopConsumerCount|.
ncarter (slow) 2015/11/10 23:29:56 Instead of commenting about this, you can static_a
afakhry 2015/11/12 00:21:28 Actually we're already testing these assumptions a
+const size_t kTasksSize = arraysize(kTestTasks);
+
+// Must be smaller than |ResourceReporter::kTopConsumerCount|.
+const size_t kInitiallyAddedTasks = kTasksSize - 6;
+
+// Must be such that |kTasksSize| - |kTasksToBeRemovedSize| is less than
+// |ResourceReporter::kTopConsumerCount|.
+const size_t kTasksToBeRemovedSize = arraysize(kIdsOfTasksToRemove);
+
+// A test implementation of the task manager that can be used to collect CPU and
+// memory usage so that they can be tested with the resource reporter.
+class DummyTaskManager : public task_management::TestTaskManager {
+ public:
+ DummyTaskManager() {
+ set_timer_for_testing(
+ scoped_ptr<base::Timer>(new base::MockTimer(false, false)));
+ }
+ ~DummyTaskManager() override {}
+
+ // task_management::TestTaskManager:
+ double GetCpuUsage(TaskId task_id) const override {
+ return tasks_.at(task_id)->cpu;
+ }
+ int64 GetPhysicalMemoryUsage(TaskId task_id) const override {
+ return tasks_.at(task_id)->memory;
+ }
+ const std::string& GetRapporSampleName(TaskId task_id) const override {
+ return tasks_.at(task_id)->rappor_sample;
+ }
+
+ void AddTaskFromIndex(size_t index) {
+ tasks_[kTestTasks[index].id] = &kTestTasks[index];
+ }
+
+ void RemoveTask(TaskId id) {
+ NotifyObserversOnTaskToBeRemoved(id);
+
+ tasks_.erase(id);
+ }
+
+ void ManualRefresh() {
+ ids_.clear();
+ for (const auto& pair : tasks_) {
+ ids_.push_back(pair.first);
+ }
+
+ NotifyObserversOnRefresh(ids_);
+ }
+
+ private:
+ std::map<TaskId, const ResourceReporter::TaskRecord*> tasks_;
+
+ DISALLOW_COPY_AND_ASSIGN(DummyTaskManager);
+};
+
+} // namespace
+
+class ResourceReporterTest : public testing::Test {
+ public:
+ ResourceReporterTest() {}
+ ~ResourceReporterTest() override {}
+
+ // Start / Stop observing the task manager.
+ void Start() {
+ task_manager_.AddObserver(resource_reporter());
+ }
+ void Stop() {
+ task_manager_.RemoveObserver(resource_reporter());
+ }
+
+ // Adds a number of tasks less than |kTopConsumersCount| to the task manager.
+ void AddInitialTasks() {
+ for (size_t i = 0; i < kInitiallyAddedTasks; ++i)
+ task_manager_.AddTaskFromIndex(i);
+ }
+
+ // Adds all the remaining tasks to the task manager so that we have more than
+ // |kTopConsumersCount|.
+ void AddRemainingTasks() {
+ for (size_t i = kInitiallyAddedTasks; i < kTasksSize; ++i)
+ task_manager_.AddTaskFromIndex(i);
+ }
+
+ // Remove the task with |id| from the task manager.
+ void RemoveTask(TaskId id) {
+ task_manager_.RemoveTask(id);
+ }
+
+ // Manually refresh the task manager.
+ void RefreshTaskManager() {
+ task_manager_.ManualRefresh();
+ }
+
+ // Tests that the task records in |ResourceReporter::task_records_by_cpu_| are
+ // properly sorted by the CPU usage in a descending order.
+ bool IsCpuRecordsSetSorted() const {
+ double current_cpu = std::numeric_limits<double>::max();
+ for (const auto& record : resource_reporter()->task_records_by_cpu_) {
+ if (record->cpu > current_cpu)
+ return false;
+ current_cpu = record->cpu;
+ }
+
+ return true;
+ }
+
+ // Tests that the task records in |ResourceReporter::task_records_by_memory_|
+ // are properly sorted by the memory usage in a descending order.
+ bool IsMemoryRecordsSetSorted() const {
+ int64_t current_memory = std::numeric_limits<int64_t>::max();
+ for (const auto& record : resource_reporter()->task_records_by_memory_) {
+ if (record->memory > current_memory)
+ return false;
+ current_memory = record->memory;
+ }
+
+ return true;
+ }
+
+ ResourceReporter* resource_reporter() const {
+ return ResourceReporter::GetInstance();
+ }
+
+ private:
+ DummyTaskManager task_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(ResourceReporterTest);
+};
+
+// Tests that ResourceReporter::GetCpuRapporMetricName() returns the correct
+// metric name that corresponds to the given CPU usage.
+TEST_F(ResourceReporterTest, TestGetCpuRapporMetricName) {
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_10_PERCENT,
+ ResourceReporter::GetCpuUsageRange(0.3));
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_10_PERCENT,
+ ResourceReporter::GetCpuUsageRange(5.7));
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_10_PERCENT,
+ ResourceReporter::GetCpuUsageRange(9.99));
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_10_PERCENT,
+ ResourceReporter::GetCpuUsageRange(10.0));
+
+ EXPECT_EQ(ResourceReporter::RANGE_10_TO_30_PERCENT,
+ ResourceReporter::GetCpuUsageRange(10.1));
+ EXPECT_EQ(ResourceReporter::RANGE_10_TO_30_PERCENT,
+ ResourceReporter::GetCpuUsageRange(29.99));
+ EXPECT_EQ(ResourceReporter::RANGE_10_TO_30_PERCENT,
+ ResourceReporter::GetCpuUsageRange(30.0));
+
+ EXPECT_EQ(ResourceReporter::RANGE_30_TO_60_PERCENT,
+ ResourceReporter::GetCpuUsageRange(30.1));
+ EXPECT_EQ(ResourceReporter::RANGE_30_TO_60_PERCENT,
+ ResourceReporter::GetCpuUsageRange(59.99));
+ EXPECT_EQ(ResourceReporter::RANGE_30_TO_60_PERCENT,
+ ResourceReporter::GetCpuUsageRange(60.0));
+
+ EXPECT_EQ(ResourceReporter::RANGE_ABOVE_60_PERCENT,
+ ResourceReporter::GetCpuUsageRange(60.1));
+ EXPECT_EQ(ResourceReporter::RANGE_ABOVE_60_PERCENT,
+ ResourceReporter::GetCpuUsageRange(100.0));
+}
+
+// Tests that ResourceReporter::GetMemoryRapporMetricName() returns the correct
+// metric names for the given memory usage.
+TEST_F(ResourceReporterTest, TestGetMemoryRapporMetricName) {
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_200_MB,
+ ResourceReporter::GetMemoryUsageRange(2 * k1KB));
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_200_MB,
+ ResourceReporter::GetMemoryUsageRange(20 * k1MB));
+ EXPECT_EQ(ResourceReporter::RANGE_0_TO_200_MB,
+ ResourceReporter::GetMemoryUsageRange(200 * k1MB));
+
+ EXPECT_EQ(ResourceReporter::RANGE_200_TO_400_MB,
+ ResourceReporter::GetMemoryUsageRange(201 * k1MB));
+ EXPECT_EQ(ResourceReporter::RANGE_200_TO_400_MB,
+ ResourceReporter::GetMemoryUsageRange(400 * k1MB));
+
+ EXPECT_EQ(ResourceReporter::RANGE_400_TO_600_MB,
+ ResourceReporter::GetMemoryUsageRange(401 * k1MB));
+ EXPECT_EQ(ResourceReporter::RANGE_400_TO_600_MB,
+ ResourceReporter::GetMemoryUsageRange(600 * k1MB));
+
+ EXPECT_EQ(ResourceReporter::RANGE_600_TO_800_MB,
+ ResourceReporter::GetMemoryUsageRange(601 * k1MB));
+ EXPECT_EQ(ResourceReporter::RANGE_600_TO_800_MB,
+ ResourceReporter::GetMemoryUsageRange(800 * k1MB));
+
+ EXPECT_EQ(ResourceReporter::RANGE_800_TO_1_GB,
+ ResourceReporter::GetMemoryUsageRange(801 * k1MB));
+ EXPECT_EQ(ResourceReporter::RANGE_800_TO_1_GB,
+ ResourceReporter::GetMemoryUsageRange(1 * k1GB));
+
+ EXPECT_EQ(ResourceReporter::RANGE_ABOVE_1_GB,
+ ResourceReporter::GetMemoryUsageRange(1 * k1GB + 1 * k1KB));
+}
+
+// Tests all the interactions between the resource reporter and the task
+// manager.
+TEST_F(ResourceReporterTest, TestAll) {
+ // First start by making sure that our assumptions are correct.
+ ASSERT_LT(kInitiallyAddedTasks, ResourceReporter::kTopConsumersCount);
+ ASSERT_LT(ResourceReporter::kTopConsumersCount, kTasksSize);
+ ASSERT_LT(kTasksSize - kTasksToBeRemovedSize,
+ ResourceReporter::kTopConsumersCount);
+
+ Start();
+
+ // Add the initial tasks to the task manager, and expect that after a refresh
+ // that the resource reporter is already tracking them, and the records are
+ // sorted properly.
+ AddInitialTasks();
+ RefreshTaskManager();
+ EXPECT_EQ(kInitiallyAddedTasks, resource_reporter()->task_records_.size());
+ EXPECT_LE(resource_reporter()->task_records_by_cpu_.size(),
+ ResourceReporter::kTopConsumersCount);
+ EXPECT_LE(resource_reporter()->task_records_by_memory_.size(),
+ ResourceReporter::kTopConsumersCount);
+ EXPECT_TRUE(IsCpuRecordsSetSorted());
+ EXPECT_TRUE(IsMemoryRecordsSetSorted());
+
+ // After adding the remaining tasks which are more than |kTopConsumerCount|,
+ // we must expect that the records used for recording the samples are EQUAL to
+ // |kTopConsumerCount|, and the records are still properly sorted.
+ AddRemainingTasks();
+ RefreshTaskManager();
+ EXPECT_EQ(kTasksSize, resource_reporter()->task_records_.size());
+ EXPECT_EQ(ResourceReporter::kTopConsumersCount,
+ resource_reporter()->task_records_by_cpu_.size());
+ EXPECT_EQ(ResourceReporter::kTopConsumersCount,
+ resource_reporter()->task_records_by_memory_.size());
+ EXPECT_TRUE(IsCpuRecordsSetSorted());
+ EXPECT_TRUE(IsMemoryRecordsSetSorted());
+
+ // Removing tasks from the task manager must result in their removal from the
+ // resource reporter immediately without having to wait until the next
+ // refresh.
+ for (const auto& id : kIdsOfTasksToRemove)
+ RemoveTask(id);
+ const size_t kExpectedTasksCount = kTasksSize - kTasksToBeRemovedSize;
+ EXPECT_EQ(kExpectedTasksCount, resource_reporter()->task_records_.size());
+ EXPECT_LE(resource_reporter()->task_records_by_cpu_.size(),
+ ResourceReporter::kTopConsumersCount);
+ EXPECT_LE(resource_reporter()->task_records_by_memory_.size(),
+ ResourceReporter::kTopConsumersCount);
+ EXPECT_TRUE(IsCpuRecordsSetSorted());
+ EXPECT_TRUE(IsMemoryRecordsSetSorted());
+
+ // After refresh nothing changes.
+ RefreshTaskManager();
+ EXPECT_EQ(kExpectedTasksCount, resource_reporter()->task_records_.size());
+ EXPECT_LE(resource_reporter()->task_records_by_cpu_.size(),
+ ResourceReporter::kTopConsumersCount);
+ EXPECT_LE(resource_reporter()->task_records_by_memory_.size(),
+ ResourceReporter::kTopConsumersCount);
+ EXPECT_TRUE(IsCpuRecordsSetSorted());
+ EXPECT_TRUE(IsMemoryRecordsSetSorted());
+
+ Stop();
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698