| Index: components/memory_pressure/memory_pressure_monitor_unittest.cc
|
| diff --git a/components/memory_pressure/memory_pressure_monitor_unittest.cc b/components/memory_pressure/memory_pressure_monitor_unittest.cc
|
| deleted file mode 100644
|
| index b957832bef131233389e71a1ebe27185a7f7d8b9..0000000000000000000000000000000000000000
|
| --- a/components/memory_pressure/memory_pressure_monitor_unittest.cc
|
| +++ /dev/null
|
| @@ -1,389 +0,0 @@
|
| -// Copyright 2016 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 "components/memory_pressure/memory_pressure_monitor.h"
|
| -
|
| -#include <memory>
|
| -#include <utility>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/task_runner.h"
|
| -#include "base/test/simple_test_tick_clock.h"
|
| -#include "base/tracked_objects.h"
|
| -#include "components/memory_pressure/memory_pressure_stats_collector.h"
|
| -#include "components/memory_pressure/test_memory_pressure_calculator.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace memory_pressure {
|
| -
|
| -namespace {
|
| -
|
| -using MemoryPressureLevel = MemoryPressureMonitor::MemoryPressureLevel;
|
| -const MemoryPressureLevel MEMORY_PRESSURE_LEVEL_NONE =
|
| - MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
|
| -const MemoryPressureLevel MEMORY_PRESSURE_LEVEL_MODERATE =
|
| - MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE;
|
| -const MemoryPressureLevel MEMORY_PRESSURE_LEVEL_CRITICAL =
|
| - MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL;
|
| -
|
| -using testing::_;
|
| -
|
| -} // namespace
|
| -
|
| -// A mock task runner. This isn't directly a TaskRunner as the reference
|
| -// counting confuses gmock.
|
| -class LenientMockTaskRunner {
|
| - public:
|
| - MOCK_METHOD2(PostDelayedTask,
|
| - bool(const tracked_objects::Location&, base::TimeDelta));
|
| -};
|
| -using MockTaskRunner = testing::StrictMock<LenientMockTaskRunner>;
|
| -
|
| -// A TaskRunner implementation that wraps a MockTaskRunner.
|
| -class TaskRunnerProxy : public base::TaskRunner {
|
| - public:
|
| - // The provided |mock| must outlive this object.
|
| - explicit TaskRunnerProxy(MockTaskRunner* mock) : mock_(mock) {}
|
| - bool RunsTasksInCurrentSequence() const override { return true; }
|
| - bool PostDelayedTask(const tracked_objects::Location& location,
|
| - base::OnceClosure closure,
|
| - base::TimeDelta delta) override {
|
| - return mock_->PostDelayedTask(location, delta);
|
| - }
|
| -
|
| - private:
|
| - MockTaskRunner* mock_;
|
| - ~TaskRunnerProxy() override {}
|
| -};
|
| -
|
| -class TestMemoryPressureMonitor : public MemoryPressureMonitor {
|
| - public:
|
| - // Expose the callback that is used for scheduled checks.
|
| - using MemoryPressureMonitor::CheckPressureAndUpdateStats;
|
| -
|
| -#if !defined(MEMORY_PRESSURE_IS_POLLING)
|
| - using MemoryPressureMonitor::OnMemoryPressureChanged;
|
| -#endif
|
| -
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| - TestMemoryPressureMonitor(scoped_refptr<base::TaskRunner> task_runner,
|
| - base::TickClock* tick_clock,
|
| - MemoryPressureStatsCollector* stats_collector,
|
| - MemoryPressureCalculator* calculator,
|
| - DispatchCallback dispatch_callback)
|
| - : MemoryPressureMonitor(task_runner,
|
| - tick_clock,
|
| - stats_collector,
|
| - calculator,
|
| - dispatch_callback) {}
|
| -#else // MEMORY_PRESSURE_IS_POLLING
|
| - TestMemoryPressureMonitor(scoped_refptr<base::TaskRunner> task_runner,
|
| - base::TickClock* tick_clock,
|
| - MemoryPressureStatsCollector* stats_collector,
|
| - DispatchCallback dispatch_callback,
|
| - MemoryPressureLevel initial_level)
|
| - : MemoryPressureMonitor(task_runner,
|
| - tick_clock,
|
| - stats_collector,
|
| - dispatch_callback,
|
| - initial_level) {}
|
| -#endif // !MEMORY_PRESSURE_IS_POLLING
|
| -
|
| - // A handful of accessors for unittesting.
|
| - MemoryPressureLevel current_memory_pressure_level() const {
|
| - return current_memory_pressure_level_;
|
| - }
|
| - const std::map<int, base::TimeTicks>& scheduled_checks() const {
|
| - return scheduled_checks_;
|
| - }
|
| - int serial_number() const { return serial_number_; }
|
| -};
|
| -
|
| -// A mock dispatch class.
|
| -class LenientMockDispatch {
|
| - public:
|
| - MOCK_METHOD1(Dispatch, void(MemoryPressureLevel));
|
| -};
|
| -using MockDispatch = testing::StrictMock<LenientMockDispatch>;
|
| -
|
| -class MemoryPressureMonitorTest : public testing::Test {
|
| - public:
|
| - MemoryPressureMonitorTest()
|
| - : task_runner_proxy_(new TaskRunnerProxy(&mock_task_runner_)),
|
| - stats_collector_(&tick_clock_) {}
|
| -
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| - // Creates a monitor in the given initial pressure level and validates its
|
| - // state.
|
| - void CreateMonitor(MemoryPressureLevel initial_level) {
|
| - calculator_.SetLevel(initial_level);
|
| - Tick(1); // Advance the clock so it doesn't return zero.
|
| -
|
| - // Determine the delay with which we expect the task to be posted.
|
| - int delay = MemoryPressureMonitor::kDefaultPollingIntervalMs;
|
| - if (initial_level == MEMORY_PRESSURE_LEVEL_MODERATE)
|
| - delay = MemoryPressureMonitor::kNotificationIntervalPressureModerateMs;
|
| - else if (initial_level == MEMORY_PRESSURE_LEVEL_CRITICAL)
|
| - delay = MemoryPressureMonitor::kNotificationIntervalPressureCriticalMs;
|
| -
|
| - // The monitor will make one call to the task runner during construction.
|
| - ExpectTaskPosted(delay);
|
| - monitor_.reset(new TestMemoryPressureMonitor(
|
| - task_runner_proxy_, &tick_clock_, &stats_collector_, &calculator_,
|
| - base::Bind(&MockDispatch::Dispatch,
|
| - base::Unretained(&mock_dispatch_))));
|
| - VerifyAndClearExpectations();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -
|
| - // The monitor should have made one call immediately to the calculator_.
|
| - EXPECT_EQ(1, calculator_.calls());
|
| - ExpectPressure(initial_level);
|
| - calculator_.ResetCalls();
|
| - }
|
| -#else // MEMORY_PRESSURE_IS_POLLING
|
| - void CreateMonitor(MemoryPressureLevel initial_level) {
|
| - Tick(1); // Advance the clock so it doesn't return zero.
|
| -
|
| - // The monitor will make one call to the task runner during construction.
|
| - ExpectTaskPosted(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - monitor_.reset(new TestMemoryPressureMonitor(
|
| - task_runner_proxy_, &tick_clock_, &stats_collector_,
|
| - base::Bind(&MockDispatch::Dispatch, base::Unretained(&mock_dispatch_)),
|
| - initial_level));
|
| - VerifyAndClearExpectations();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -
|
| - // The monitor should have made one call immediately to the calculator_.
|
| - ExpectPressure(initial_level);
|
| - }
|
| -#endif // !MEMORY_PRESSURE_IS_POLLING
|
| -
|
| - // Advances the tick clock by the given number of milliseconds.
|
| - void Tick(int ms) {
|
| - tick_clock_.Advance(base::TimeDelta::FromMilliseconds(ms));
|
| - }
|
| -
|
| - // Sets expectations for tasks scheduled via |mock_task_runner_|.
|
| - void ExpectTaskPosted(int delay_ms) {
|
| - base::TimeDelta delay = base::TimeDelta::FromMilliseconds(delay_ms);
|
| - EXPECT_CALL(mock_task_runner_, PostDelayedTask(_, delay))
|
| - .WillOnce(testing::Return(true));
|
| - }
|
| -
|
| - // Sets up expectations for calls to |mock_dispatch_|.
|
| - void ExpectDispatch(MemoryPressureLevel level) {
|
| - EXPECT_CALL(mock_dispatch_, Dispatch(level));
|
| - }
|
| - void ExpectDispatchModerate() {
|
| - EXPECT_CALL(mock_dispatch_, Dispatch(MEMORY_PRESSURE_LEVEL_MODERATE));
|
| - }
|
| - void ExpectDispatchCritical() {
|
| - EXPECT_CALL(mock_dispatch_, Dispatch(MEMORY_PRESSURE_LEVEL_CRITICAL));
|
| - }
|
| -
|
| - // Verifies and clears expectations for both |mock_task_runner_| and
|
| - // |mock_dispatch_|.
|
| - void VerifyAndClearExpectations() {
|
| - testing::Mock::VerifyAndClearExpectations(&mock_task_runner_);
|
| - testing::Mock::VerifyAndClearExpectations(&mock_dispatch_);
|
| - }
|
| -
|
| - // Checks expectations on |monitor_->current_memory_pressure_level()|.
|
| - void ExpectPressure(MemoryPressureLevel level) {
|
| - EXPECT_EQ(level, monitor_->current_memory_pressure_level());
|
| - }
|
| - void ExpectNone() {
|
| - EXPECT_EQ(MEMORY_PRESSURE_LEVEL_NONE,
|
| - monitor_->current_memory_pressure_level());
|
| - }
|
| - void ExpectModerate() {
|
| - EXPECT_EQ(MEMORY_PRESSURE_LEVEL_MODERATE,
|
| - monitor_->current_memory_pressure_level());
|
| - }
|
| - void ExpectCritical() {
|
| - EXPECT_EQ(MEMORY_PRESSURE_LEVEL_CRITICAL,
|
| - monitor_->current_memory_pressure_level());
|
| - }
|
| -
|
| - MockTaskRunner mock_task_runner_;
|
| - scoped_refptr<TaskRunnerProxy> task_runner_proxy_;
|
| - base::SimpleTestTickClock tick_clock_;
|
| - MemoryPressureStatsCollector stats_collector_;
|
| -
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| - TestMemoryPressureCalculator calculator_;
|
| -#endif
|
| -
|
| - MockDispatch mock_dispatch_;
|
| - std::unique_ptr<TestMemoryPressureMonitor> monitor_;
|
| -};
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, NormalScheduling) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - ExpectTaskPosted(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - monitor_->CheckPressureAndUpdateStats(monitor_->serial_number());
|
| - VerifyAndClearExpectations();
|
| -
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - ExpectTaskPosted(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - monitor_->CheckPressureAndUpdateStats(monitor_->serial_number());
|
| - VerifyAndClearExpectations();
|
| -}
|
| -
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, CalculatorNotAlwaysInvoked) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // Callback into the monitor too soon and expect nothing to happen.
|
| - Tick(1);
|
| - EXPECT_EQ(MEMORY_PRESSURE_LEVEL_NONE, monitor_->GetCurrentPressureLevel());
|
| - VerifyAndClearExpectations();
|
| - EXPECT_EQ(0, calculator_.calls());
|
| - ExpectNone();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -
|
| - // Pass sufficient time that the rate limiter will allow another calculation.
|
| - // Don't expect another scheduled call because there's already one pending.
|
| - Tick(MemoryPressureMonitor::kMinimumTimeBetweenSamplesMs);
|
| - EXPECT_EQ(MEMORY_PRESSURE_LEVEL_NONE, monitor_->GetCurrentPressureLevel());
|
| - VerifyAndClearExpectations();
|
| - EXPECT_EQ(1, calculator_.calls());
|
| - ExpectNone();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, NoPressureScheduling) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // Step forward by a polling interval. This should cause another scheduled
|
| - // check to be posted.
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - ExpectTaskPosted(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - monitor_->CheckPressureAndUpdateStats(monitor_->serial_number());
|
| - VerifyAndClearExpectations();
|
| - ExpectNone();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, NoPressureToModerateViaScheduling) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // Step forward by a polling interval. This should cause another scheduled
|
| - // check to be posted.
|
| - calculator_.SetModerate();
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - ExpectTaskPosted(
|
| - MemoryPressureMonitor::kNotificationIntervalPressureModerateMs);
|
| - ExpectDispatchModerate();
|
| - monitor_->CheckPressureAndUpdateStats(monitor_->serial_number());
|
| - VerifyAndClearExpectations();
|
| - ExpectModerate();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, NoPressureToCriticalViaScheduling) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // Step forward by a polling interval. This should cause another scheduled
|
| - // check to be posted.
|
| - calculator_.SetCritical();
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs);
|
| - ExpectTaskPosted(
|
| - MemoryPressureMonitor::kNotificationIntervalPressureCriticalMs);
|
| - ExpectDispatchCritical();
|
| - monitor_->CheckPressureAndUpdateStats(monitor_->serial_number());
|
| - VerifyAndClearExpectations();
|
| - ExpectCritical();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, ModeratePressureToCriticalViaScheduling) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_MODERATE);
|
| -
|
| - // Step forward by a polling interval. This should cause another scheduled
|
| - // check to be posted.
|
| - calculator_.SetCritical();
|
| - Tick(MemoryPressureMonitor::kNotificationIntervalPressureModerateMs);
|
| - ExpectTaskPosted(
|
| - MemoryPressureMonitor::kNotificationIntervalPressureCriticalMs);
|
| - ExpectDispatchCritical();
|
| - monitor_->CheckPressureAndUpdateStats(monitor_->serial_number());
|
| - VerifyAndClearExpectations();
|
| - ExpectCritical();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, UnscheduledStateChange) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // Callback into the monitor directly. This will change the memory pressure
|
| - // and cause a new call to be scheduled as the higher memory pressure has a
|
| - // higher renotification frequency.
|
| - // NOTE: This test relies implicitly on the following facts:
|
| - // kMinimumTimeBetweenSamplesMs < kDefaultPollingIntervalMs / 2
|
| - // kNotificationIntervalPressureCriticalMs < kDefaultPollingIntervalMs / 2
|
| - calculator_.SetCritical();
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs / 2);
|
| - ExpectTaskPosted(
|
| - MemoryPressureMonitor::kNotificationIntervalPressureCriticalMs);
|
| - ExpectDispatchCritical();
|
| - EXPECT_EQ(MEMORY_PRESSURE_LEVEL_CRITICAL,
|
| - monitor_->GetCurrentPressureLevel());
|
| - VerifyAndClearExpectations();
|
| - EXPECT_EQ(1, calculator_.calls());
|
| - ExpectCritical();
|
| - EXPECT_EQ(2u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -#else // MEMORY_PRESSURE_IS_POLLING
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, PressureChangeNop) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // The pressure hasn't changed so this should be a nop.
|
| - Tick(1);
|
| - monitor_->OnMemoryPressureChanged(MEMORY_PRESSURE_LEVEL_NONE);
|
| - VerifyAndClearExpectations();
|
| - ExpectNone();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, PressureChangeNoNewScheduledTask) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // The pressure is increasing and the renotification frequency has changed.
|
| - // However, a pending event is already scheduled soon enough so no new one
|
| - // should be scheduled.
|
| - Tick(MemoryPressureMonitor::kDefaultPollingIntervalMs -
|
| - MemoryPressureMonitor::kNotificationIntervalPressureModerateMs / 2);
|
| - ExpectDispatchModerate();
|
| - monitor_->OnMemoryPressureChanged(MEMORY_PRESSURE_LEVEL_MODERATE);
|
| - VerifyAndClearExpectations();
|
| - ExpectModerate();
|
| - EXPECT_EQ(1u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -TEST_F(MemoryPressureMonitorTest, PressureChangeNewScheduledTask) {
|
| - CreateMonitor(MEMORY_PRESSURE_LEVEL_NONE);
|
| -
|
| - // The pressure is increasing and the renotification frequency has changed.
|
| - // The already scheduled event is too far in the future so a new event should
|
| - // be scheduled.
|
| - Tick(1);
|
| - ExpectTaskPosted(
|
| - MemoryPressureMonitor::kNotificationIntervalPressureCriticalMs);
|
| - ExpectDispatchCritical();
|
| - monitor_->OnMemoryPressureChanged(MEMORY_PRESSURE_LEVEL_CRITICAL);
|
| - VerifyAndClearExpectations();
|
| - ExpectCritical();
|
| - EXPECT_EQ(2u, monitor_->scheduled_checks().size());
|
| -}
|
| -
|
| -#endif // !MEMORY_PRESSURE_IS_POLLING
|
| -
|
| -} // namespace memory_pressure
|
|
|