| Index: athena/resource_manager/memory_pressure_notifier_unittest.cc
|
| diff --git a/athena/resource_manager/memory_pressure_notifier_unittest.cc b/athena/resource_manager/memory_pressure_notifier_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..be8e8f18ef22a69d2bedc6bc87bb304333a70454
|
| --- /dev/null
|
| +++ b/athena/resource_manager/memory_pressure_notifier_unittest.cc
|
| @@ -0,0 +1,221 @@
|
| +/// Copyright 2014 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 "athena/resource_manager/memory_pressure_notifier.h"
|
| +#include "athena/resource_manager/public/resource_manager_delegate.h"
|
| +#include "athena/test/athena_test_base.h"
|
| +
|
| +namespace athena {
|
| +namespace test {
|
| +
|
| +namespace {
|
| +
|
| +// Our OS delegate abstraction class to override the memory fill level.
|
| +class TestResourceManagerDelegate : public ResourceManagerDelegate {
|
| + public:
|
| + TestResourceManagerDelegate() : memory_fill_level_percent_(0) {}
|
| + virtual ~TestResourceManagerDelegate() {}
|
| +
|
| + virtual int GetUsedMemoryInPercent() OVERRIDE {
|
| + timer_called_++;
|
| + return memory_fill_level_percent_;
|
| + }
|
| +
|
| + virtual int MemoryPressureIntervalInMS() OVERRIDE {
|
| + return 5;
|
| + }
|
| +
|
| + void set_memory_fill_level_percent(int memory_fill_level_percent) {
|
| + memory_fill_level_percent_ = memory_fill_level_percent;
|
| + }
|
| +
|
| + // Returns the number of timer calls to the GetMemoryInPercent() calls.
|
| + int timer_called() { return timer_called_; }
|
| +
|
| + private:
|
| + // The to be returned memory fill level value in percent.
|
| + int memory_fill_level_percent_;
|
| +
|
| + // How often was the timer calling the GetUsedMemoryInPercent() function.
|
| + int timer_called_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestResourceManagerDelegate);
|
| +};
|
| +
|
| +// Our memory pressure observer class.
|
| +class TestMemoryPressureObserver : public MemoryPressureObserver {
|
| + public:
|
| + TestMemoryPressureObserver(ResourceManagerDelegate* delegate)
|
| + : delegate_(delegate),
|
| + number_of_calls_(0),
|
| + pressure_(MEMORY_PRESSURE_UNKNOWN) {}
|
| + virtual ~TestMemoryPressureObserver() {}
|
| +
|
| + // The observer.
|
| + virtual void OnMemoryPressure(MemoryPressure pressure) OVERRIDE {
|
| + number_of_calls_++;
|
| + pressure_ = pressure;
|
| + }
|
| +
|
| + virtual ResourceManagerDelegate* GetDelegate() OVERRIDE {
|
| + return delegate_.get();
|
| + }
|
| +
|
| + int number_of_calls() { return number_of_calls_; }
|
| + MemoryPressureObserver::MemoryPressure pressure() { return pressure_; }
|
| +
|
| + private:
|
| + scoped_ptr<ResourceManagerDelegate> delegate_;
|
| +
|
| + // Number of calls received.
|
| + int number_of_calls_;
|
| +
|
| + // Last posted memory pressure.
|
| + MemoryPressureObserver::MemoryPressure pressure_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestMemoryPressureObserver);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +// Our testing base.
|
| +class MemoryPressureTest : public AthenaTestBase {
|
| + public:
|
| + MemoryPressureTest() : test_resource_manager_delegate_(NULL) {}
|
| + virtual ~MemoryPressureTest() {}
|
| +
|
| + // AthenaTestBase:
|
| + virtual void SetUp() OVERRIDE {
|
| + AthenaTestBase::SetUp();
|
| + // Create and install our TestAppContentDelegate with instrumentation.
|
| + test_resource_manager_delegate_ =
|
| + new TestResourceManagerDelegate();
|
| + test_memory_pressure_observer_.reset(new TestMemoryPressureObserver(
|
| + test_resource_manager_delegate_));
|
| + memory_pressure_notifier_.reset(
|
| + new MemoryPressureNotifier(test_memory_pressure_observer_.get()));
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE {
|
| + memory_pressure_notifier_.reset();
|
| + RunAllPendingInMessageLoop();
|
| + test_memory_pressure_observer_.reset();
|
| + AthenaTestBase::TearDown();
|
| + }
|
| +
|
| + protected:
|
| + TestResourceManagerDelegate* test_resource_manager_delegate() {
|
| + return test_resource_manager_delegate_;
|
| + }
|
| +
|
| + TestMemoryPressureObserver* test_memory_pressure_observer() {
|
| + return test_memory_pressure_observer_.get();
|
| + }
|
| +
|
| + // Waits until a timer interrupt occurs. Returns false if no timer is
|
| + // registered.
|
| + bool WaitForTimer() {
|
| + int first_counter = test_resource_manager_delegate()->timer_called();
|
| + // Wait up to 500ms for any poll on our memory status function from the
|
| + // MemoryPressureNotifier.
|
| + for (int i = 0; i < 500; ++i) {
|
| + if (test_resource_manager_delegate()->timer_called() != first_counter)
|
| + return true;
|
| + usleep(1);
|
| + RunAllPendingInMessageLoop();
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + private:
|
| + // Not owned: the resource manager delegate.
|
| + TestResourceManagerDelegate* test_resource_manager_delegate_;
|
| + scoped_ptr<TestMemoryPressureObserver> test_memory_pressure_observer_;
|
| + scoped_ptr<MemoryPressureNotifier> memory_pressure_notifier_;
|
| + DISALLOW_COPY_AND_ASSIGN(MemoryPressureTest);
|
| +};
|
| +
|
| +// Only creates and destroys it to see that the system gets properly shut down.
|
| +TEST_F(MemoryPressureTest, SimpleTest) {
|
| +}
|
| +
|
| +// Test that we get only a single call while the memory pressure is low.
|
| +TEST_F(MemoryPressureTest, OneEventOnLowPressure) {
|
| + ASSERT_TRUE(WaitForTimer());
|
| + // No call should have happened at this time to the
|
| + EXPECT_FALSE(test_memory_pressure_observer()->number_of_calls());
|
| + // Set to something below 50% and check that we still get no call.
|
| + test_resource_manager_delegate()->set_memory_fill_level_percent(49);
|
| + ASSERT_TRUE(WaitForTimer());
|
| + EXPECT_EQ(1, test_memory_pressure_observer()->number_of_calls());
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_LOW,
|
| + test_memory_pressure_observer()->pressure());
|
| + ASSERT_TRUE(WaitForTimer());
|
| + EXPECT_EQ(1, test_memory_pressure_observer()->number_of_calls());
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_LOW,
|
| + test_memory_pressure_observer()->pressure());
|
| +}
|
| +
|
| +// Test that we get a |MEMORY_PRESSURE_UNKNOWN| if it cannot be determined.
|
| +TEST_F(MemoryPressureTest, TestNoCallsOnMemoryPressureUnknown) {
|
| + test_resource_manager_delegate()->set_memory_fill_level_percent(0);
|
| + ASSERT_TRUE(WaitForTimer());
|
| + // We shouldn't have gotten a single call.
|
| + EXPECT_FALSE(test_memory_pressure_observer()->number_of_calls());
|
| + // And the memory pressure should be unknown.
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_UNKNOWN,
|
| + test_memory_pressure_observer()->pressure());
|
| +}
|
| +
|
| +// Test that we get a change to MODERATE if the memory pressure is at 60%.
|
| +TEST_F(MemoryPressureTest, TestModeratePressure) {
|
| + test_resource_manager_delegate()->set_memory_fill_level_percent(60);
|
| + ASSERT_TRUE(WaitForTimer());
|
| + // At least one call should have happened.
|
| + int calls = test_memory_pressure_observer()->number_of_calls();
|
| + EXPECT_TRUE(calls);
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_MODERATE,
|
| + test_memory_pressure_observer()->pressure());
|
| + // Even if the value does not change, we should get more calls.
|
| + ASSERT_TRUE(WaitForTimer());
|
| + EXPECT_LT(calls, test_memory_pressure_observer()->number_of_calls());
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_MODERATE,
|
| + test_memory_pressure_observer()->pressure());
|
| +}
|
| +
|
| +// Test that increasing and decreasing the memory pressure does the right thing.
|
| +TEST_F(MemoryPressureTest, TestPressureUpAndDown) {
|
| + test_resource_manager_delegate()->set_memory_fill_level_percent(60);
|
| + ASSERT_TRUE(WaitForTimer());
|
| + // At least one call should have happened.
|
| + int calls1 = test_memory_pressure_observer()->number_of_calls();
|
| + EXPECT_TRUE(calls1);
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_MODERATE,
|
| + test_memory_pressure_observer()->pressure());
|
| +
|
| + // Check to the next level.
|
| + test_resource_manager_delegate()->set_memory_fill_level_percent(80);
|
| + ASSERT_TRUE(WaitForTimer());
|
| + int calls2 = test_memory_pressure_observer()->number_of_calls();
|
| + EXPECT_LT(calls1, calls2);
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_HIGH,
|
| + test_memory_pressure_observer()->pressure());
|
| +
|
| + // Check to no pressure again.
|
| + test_resource_manager_delegate()->set_memory_fill_level_percent(20);
|
| + ASSERT_TRUE(WaitForTimer());
|
| + int calls3 = test_memory_pressure_observer()->number_of_calls();
|
| + EXPECT_LT(calls2, calls3);
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_LOW,
|
| + test_memory_pressure_observer()->pressure());
|
| +
|
| + // Even if the value does not change, we should not get any more calls.
|
| + ASSERT_TRUE(WaitForTimer());
|
| + EXPECT_EQ(calls3, test_memory_pressure_observer()->number_of_calls());
|
| + EXPECT_EQ(MemoryPressureObserver::MEMORY_PRESSURE_LOW,
|
| + test_memory_pressure_observer()->pressure());
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace athena
|
|
|