1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/performance_monitor/system_monitor.h"
#include "base/memory/ptr_util.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace performance_monitor {
namespace {
using SamplingFrequency = SystemMonitor::SamplingFrequency;
using SystemObserver = SystemMonitor::SystemObserver;
using MetricsRefreshFrequencies = SystemObserver::MetricRefreshFrequencies;
const int kFakeFreePhysMemoryMb = 42;
class MockMetricsMonitorObserver : public SystemObserver {
public:
~MockMetricsMonitorObserver() override = default;
MOCK_METHOD1(OnFreePhysicalMemoryMbSample, void(int free_phys_memory_mb));
MOCK_METHOD1(OnSystemMetricsStruct,
void(const base::SystemMetrics& system_metrics));
};
// Test version of a MetricEvaluatorsHelper that returns constant values.
class TestMetricEvaluatorsHelper : public MetricEvaluatorsHelper {
public:
TestMetricEvaluatorsHelper() = default;
TestMetricEvaluatorsHelper(const TestMetricEvaluatorsHelper&) = delete;
TestMetricEvaluatorsHelper& operator=(const TestMetricEvaluatorsHelper&) =
delete;
~TestMetricEvaluatorsHelper() override = default;
std::optional<int> GetFreePhysicalMemoryMb() override {
return kFakeFreePhysMemoryMb;
}
};
} // namespace
class SystemMonitorTest : public testing::Test {
protected:
using MetricEvaluator = SystemMonitor::MetricEvaluator;
using MetricMetadata = SystemMonitor::MetricMetadata;
SystemMonitorTest()
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
SystemMonitorTest(const SystemMonitorTest&) = delete;
SystemMonitorTest& operator=(const SystemMonitorTest&) = delete;
void SetUp() override {
EXPECT_EQ(nullptr, SystemMonitor::Get());
system_monitor_ = base::WrapUnique(
new SystemMonitor(std::make_unique<TestMetricEvaluatorsHelper>()));
}
void TearDown() override { system_monitor_.reset(); }
void EnsureMetricsAreObservedAtExpectedFrequency(
SamplingFrequency expected_free_memory_mb_freq =
SamplingFrequency::kNoSampling,
SamplingFrequency expected_system_metrics_struct_freq =
SamplingFrequency::kNoSampling) {
const auto& observed_metrics_and_frequencies =
system_monitor_->GetMetricSamplingFrequencyArrayForTesting();
EXPECT_EQ(2U, observed_metrics_and_frequencies.size());
EXPECT_EQ(expected_free_memory_mb_freq,
observed_metrics_and_frequencies[static_cast<size_t>(
SystemMonitor::MetricEvaluator::Type::kFreeMemoryMb)]);
EXPECT_EQ(expected_system_metrics_struct_freq,
observed_metrics_and_frequencies[static_cast<size_t>(
SystemMonitor::MetricEvaluator::Type::kSystemMetricsStruct)]);
}
std::unique_ptr<SystemMonitor> system_monitor_;
protected:
base::test::TaskEnvironment task_environment_;
};
TEST_F(SystemMonitorTest, GetReturnsSingleInstance) {
EXPECT_EQ(system_monitor_.get(), SystemMonitor::Get());
system_monitor_.reset();
EXPECT_EQ(nullptr, SystemMonitor::Get());
}
TEST_F(SystemMonitorTest, AddAndUpdateObservers) {
SystemObserver obs1;
SystemObserver obs2;
SystemObserver obs3;
// The first observer doesn't observe anything yet.
MetricsRefreshFrequencies obs1_metrics_frequencies = {};
system_monitor_->AddOrUpdateObserver(&obs1, obs1_metrics_frequencies);
EnsureMetricsAreObservedAtExpectedFrequency();
// Add a second observer that observes the amount of free memory at the
// default frequency.
MetricsRefreshFrequencies obs2_metrics_frequencies =
MetricsRefreshFrequencies::Builder()
.SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
.Build();
system_monitor_->AddOrUpdateObserver(&obs2, obs2_metrics_frequencies);
EnsureMetricsAreObservedAtExpectedFrequency(
SamplingFrequency::kDefaultFrequency);
// Add a third observer that observes the amount of free memory and the system
// metrics at the default frequency.
MetricsRefreshFrequencies obs3_metrics_frequencies =
MetricsRefreshFrequencies::Builder()
.SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
.SetSystemMetricsSamplingFrequency(
SamplingFrequency::kDefaultFrequency)
.Build();
system_monitor_->AddOrUpdateObserver(&obs3, obs3_metrics_frequencies);
EnsureMetricsAreObservedAtExpectedFrequency(
SamplingFrequency::kDefaultFrequency,
SamplingFrequency::kDefaultFrequency);
// Stop observing any metric with the second observer.
obs2_metrics_frequencies.free_phys_memory_mb_frequency =
SamplingFrequency::kNoSampling;
obs2_metrics_frequencies.system_metrics_sampling_frequency =
SamplingFrequency::kNoSampling;
system_monitor_->AddOrUpdateObserver(&obs2, obs2_metrics_frequencies);
EnsureMetricsAreObservedAtExpectedFrequency(
SamplingFrequency::kDefaultFrequency,
SamplingFrequency::kDefaultFrequency);
// Remove the third observer, ensure that no metrics are observed anymore.
system_monitor_->RemoveObserver(&obs3);
EnsureMetricsAreObservedAtExpectedFrequency();
}
TEST_F(SystemMonitorTest, ObserverGetsCalled) {
::testing::StrictMock<MockMetricsMonitorObserver> mock_observer_1;
system_monitor_->AddOrUpdateObserver(
&mock_observer_1,
MetricsRefreshFrequencies::Builder()
.SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
.Build());
::testing::StrictMock<MockMetricsMonitorObserver> mock_observer_2;
system_monitor_->AddOrUpdateObserver(
&mock_observer_2,
MetricsRefreshFrequencies::Builder()
.SetSystemMetricsSamplingFrequency(
SamplingFrequency::kDefaultFrequency)
.Build());
EnsureMetricsAreObservedAtExpectedFrequency(
SamplingFrequency::kDefaultFrequency,
SamplingFrequency::kDefaultFrequency);
// Ensure that we get several samples to verify that the timer logic works.
EXPECT_CALL(mock_observer_1,
OnFreePhysicalMemoryMbSample(kFakeFreePhysMemoryMb))
.Times(2);
EXPECT_CALL(mock_observer_2, OnSystemMetricsStruct(::testing::_)).Times(2);
// Fast forward by enough time to get multiple samples and wait for the tasks
// to complete.
task_environment_.FastForwardBy(
2 * system_monitor_->refresh_timer_for_testing().GetCurrentDelay());
task_environment_.RunUntilIdle();
::testing::Mock::VerifyAndClear(&mock_observer_1);
::testing::Mock::VerifyAndClear(&mock_observer_2);
}
} // namespace performance_monitor
|