1 /// Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "athena/resource_manager/memory_pressure_notifier.h"
6 #include "athena/resource_manager/public/resource_manager_delegate.h"
7 #include "athena/test/base/athena_test_base.h"
14 // Our OS delegate abstraction class to override the memory fill level.
15 class TestResourceManagerDelegate
: public ResourceManagerDelegate
{
17 TestResourceManagerDelegate() : memory_fill_level_percent_(0) {}
18 ~TestResourceManagerDelegate() override
{}
20 virtual int GetUsedMemoryInPercent() override
{
22 return memory_fill_level_percent_
;
25 virtual int MemoryPressureIntervalInMS() override
{
29 void set_memory_fill_level_percent(int memory_fill_level_percent
) {
30 memory_fill_level_percent_
= memory_fill_level_percent
;
33 // Returns the number of timer calls to the GetMemoryInPercent() calls.
34 int timer_called() { return timer_called_
; }
37 // The to be returned memory fill level value in percent.
38 int memory_fill_level_percent_
;
40 // How often was the timer calling the GetUsedMemoryInPercent() function.
43 DISALLOW_COPY_AND_ASSIGN(TestResourceManagerDelegate
);
46 // Our memory pressure observer class.
47 class TestMemoryPressureObserver
: public MemoryPressureObserver
{
49 TestMemoryPressureObserver(ResourceManagerDelegate
* delegate
)
50 : delegate_(delegate
),
52 pressure_(ResourceManager::MEMORY_PRESSURE_UNKNOWN
) {}
53 ~TestMemoryPressureObserver() override
{}
56 virtual void OnMemoryPressure(
57 ResourceManager::MemoryPressure pressure
) override
{
62 virtual ResourceManagerDelegate
* GetDelegate() override
{
63 return delegate_
.get();
66 int number_of_calls() { return number_of_calls_
; }
67 ResourceManager::MemoryPressure
pressure() { return pressure_
; }
70 scoped_ptr
<ResourceManagerDelegate
> delegate_
;
72 // Number of calls received.
75 // Last posted memory pressure.
76 ResourceManager::MemoryPressure pressure_
;
78 DISALLOW_COPY_AND_ASSIGN(TestMemoryPressureObserver
);
84 class MemoryPressureTest
: public AthenaTestBase
{
86 MemoryPressureTest() : test_resource_manager_delegate_(nullptr) {}
87 ~MemoryPressureTest() override
{}
90 virtual void SetUp() override
{
91 AthenaTestBase::SetUp();
92 // Create and install our TestAppContentDelegate with instrumentation.
93 test_resource_manager_delegate_
=
94 new TestResourceManagerDelegate();
95 test_memory_pressure_observer_
.reset(new TestMemoryPressureObserver(
96 test_resource_manager_delegate_
));
97 memory_pressure_notifier_
.reset(
98 new MemoryPressureNotifier(test_memory_pressure_observer_
.get()));
101 virtual void TearDown() override
{
102 memory_pressure_notifier_
.reset();
103 RunAllPendingInMessageLoop();
104 test_memory_pressure_observer_
.reset();
105 AthenaTestBase::TearDown();
109 TestResourceManagerDelegate
* test_resource_manager_delegate() {
110 return test_resource_manager_delegate_
;
113 TestMemoryPressureObserver
* test_memory_pressure_observer() {
114 return test_memory_pressure_observer_
.get();
117 // Waits until a timer interrupt occurs. Returns false if no timer is
119 bool WaitForTimer() {
120 int first_counter
= test_resource_manager_delegate()->timer_called();
121 // Wait up to 500ms for any poll on our memory status function from the
122 // MemoryPressureNotifier.
123 for (int i
= 0; i
< 500; ++i
) {
124 if (test_resource_manager_delegate()->timer_called() != first_counter
)
127 RunAllPendingInMessageLoop();
133 // Not owned: the resource manager delegate.
134 TestResourceManagerDelegate
* test_resource_manager_delegate_
;
135 scoped_ptr
<TestMemoryPressureObserver
> test_memory_pressure_observer_
;
136 scoped_ptr
<MemoryPressureNotifier
> memory_pressure_notifier_
;
137 DISALLOW_COPY_AND_ASSIGN(MemoryPressureTest
);
140 // Only creates and destroys it to see that the system gets properly shut down.
141 TEST_F(MemoryPressureTest
, SimpleTest
) {
144 // Test that we get only a single call while the memory pressure is low.
145 TEST_F(MemoryPressureTest
, OneEventOnLowPressure
) {
146 ASSERT_TRUE(WaitForTimer());
147 // No call should have happened at this time to the
148 EXPECT_FALSE(test_memory_pressure_observer()->number_of_calls());
149 // Set to something below 50% and check that we still get no call.
150 test_resource_manager_delegate()->set_memory_fill_level_percent(49);
151 ASSERT_TRUE(WaitForTimer());
152 EXPECT_EQ(1, test_memory_pressure_observer()->number_of_calls());
153 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_LOW
,
154 test_memory_pressure_observer()->pressure());
155 ASSERT_TRUE(WaitForTimer());
156 EXPECT_EQ(1, test_memory_pressure_observer()->number_of_calls());
157 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_LOW
,
158 test_memory_pressure_observer()->pressure());
161 // Test that we get a |MEMORY_PRESSURE_UNKNOWN| if it cannot be determined.
162 TEST_F(MemoryPressureTest
, TestNoCallsOnMemoryPressureUnknown
) {
163 test_resource_manager_delegate()->set_memory_fill_level_percent(0);
164 ASSERT_TRUE(WaitForTimer());
165 // We shouldn't have gotten a single call.
166 EXPECT_FALSE(test_memory_pressure_observer()->number_of_calls());
167 // And the memory pressure should be unknown.
168 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_UNKNOWN
,
169 test_memory_pressure_observer()->pressure());
172 // Test that we get a change to MODERATE if the memory pressure is at 60%.
173 TEST_F(MemoryPressureTest
, TestModeratePressure
) {
174 test_resource_manager_delegate()->set_memory_fill_level_percent(60);
175 ASSERT_TRUE(WaitForTimer());
176 // At least one call should have happened.
177 int calls
= test_memory_pressure_observer()->number_of_calls();
179 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_MODERATE
,
180 test_memory_pressure_observer()->pressure());
181 // Even if the value does not change, we should get more calls.
182 ASSERT_TRUE(WaitForTimer());
183 EXPECT_LT(calls
, test_memory_pressure_observer()->number_of_calls());
184 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_MODERATE
,
185 test_memory_pressure_observer()->pressure());
188 // Test that increasing and decreasing the memory pressure does the right thing.
189 TEST_F(MemoryPressureTest
, TestPressureUpAndDown
) {
190 test_resource_manager_delegate()->set_memory_fill_level_percent(60);
191 ASSERT_TRUE(WaitForTimer());
192 // At least one call should have happened.
193 int calls1
= test_memory_pressure_observer()->number_of_calls();
195 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_MODERATE
,
196 test_memory_pressure_observer()->pressure());
198 // Check to the next level.
199 test_resource_manager_delegate()->set_memory_fill_level_percent(80);
200 ASSERT_TRUE(WaitForTimer());
201 int calls2
= test_memory_pressure_observer()->number_of_calls();
202 EXPECT_LT(calls1
, calls2
);
203 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_HIGH
,
204 test_memory_pressure_observer()->pressure());
206 // Check to no pressure again.
207 test_resource_manager_delegate()->set_memory_fill_level_percent(20);
208 ASSERT_TRUE(WaitForTimer());
209 int calls3
= test_memory_pressure_observer()->number_of_calls();
210 EXPECT_LT(calls2
, calls3
);
211 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_LOW
,
212 test_memory_pressure_observer()->pressure());
214 // Even if the value does not change, we should not get any more calls.
215 ASSERT_TRUE(WaitForTimer());
216 EXPECT_EQ(calls3
, test_memory_pressure_observer()->number_of_calls());
217 EXPECT_EQ(ResourceManager::MEMORY_PRESSURE_LOW
,
218 test_memory_pressure_observer()->pressure());
222 } // namespace athena