| OLD | NEW |
| 1 /// Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "athena/activity/public/activity.h" | 5 #include "athena/activity/public/activity.h" |
| 6 #include "athena/activity/public/activity_manager.h" | 6 #include "athena/activity/public/activity_manager.h" |
| 7 #include "athena/activity/public/activity_view_model.h" | 7 #include "athena/activity/public/activity_view_model.h" |
| 8 #include "athena/resource_manager/memory_pressure_notifier.h" | 8 #include "athena/resource_manager/memory_pressure_notifier.h" |
| 9 #include "athena/resource_manager/public/resource_manager.h" | 9 #include "athena/resource_manager/public/resource_manager.h" |
| 10 #include "athena/test/athena_test_base.h" | 10 #include "athena/test/athena_test_base.h" |
| 11 #include "athena/wm/public/window_manager.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 12 #include "ui/gfx/image/image_skia.h" | 13 #include "ui/gfx/image/image_skia.h" |
| 13 #include "ui/views/view.h" | 14 #include "ui/views/view.h" |
| 14 #include "ui/views/widget/widget.h" | 15 #include "ui/views/widget/widget.h" |
| 15 | 16 |
| 16 namespace athena { | 17 namespace athena { |
| 17 namespace test { | 18 namespace test { |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 } // namespace | 79 } // namespace |
| 79 | 80 |
| 80 // Our testing base. | 81 // Our testing base. |
| 81 class ResourceManagerTest : public AthenaTestBase { | 82 class ResourceManagerTest : public AthenaTestBase { |
| 82 public: | 83 public: |
| 83 ResourceManagerTest() {} | 84 ResourceManagerTest() {} |
| 84 virtual ~ResourceManagerTest() {} | 85 virtual ~ResourceManagerTest() {} |
| 85 | 86 |
| 86 virtual void TearDown() OVERRIDE { | 87 virtual void TearDown() OVERRIDE { |
| 87 while (!activity_list_.empty()) | 88 while (!activity_list_.empty()) |
| 88 CloseActivity(activity_list_[0]); | 89 DeleteActivity(activity_list_[0]); |
| 89 AthenaTestBase::TearDown(); | 90 AthenaTestBase::TearDown(); |
| 90 } | 91 } |
| 91 | 92 |
| 92 TestActivity* CreateActivity(const std::string& title) { | 93 TestActivity* CreateActivity(const std::string& title) { |
| 93 TestActivity* activity = new TestActivity(title); | 94 TestActivity* activity = new TestActivity(title); |
| 94 ActivityManager::Get()->AddActivity(activity); | 95 ActivityManager::Get()->AddActivity(activity); |
| 95 activity->SetCurrentState(Activity::ACTIVITY_INVISIBLE); | 96 activity->SetCurrentState(Activity::ACTIVITY_INVISIBLE); |
| 96 activity_list_.push_back(activity); | 97 activity_list_.push_back(activity); |
| 97 return activity; | 98 return activity; |
| 98 } | 99 } |
| 99 | 100 |
| 100 void CloseActivity(Activity* activity) { | 101 void DeleteActivity(Activity* activity) { |
| 101 delete activity; | 102 Activity::Delete(activity); |
| 102 RunAllPendingInMessageLoop(); | 103 RunAllPendingInMessageLoop(); |
| 103 std::vector<TestActivity*>::iterator it = std::find(activity_list_.begin(), | 104 std::vector<TestActivity*>::iterator it = std::find(activity_list_.begin(), |
| 104 activity_list_.end(), | 105 activity_list_.end(), |
| 105 activity); | 106 activity); |
| 106 DCHECK(it != activity_list_.end()); | 107 DCHECK(it != activity_list_.end()); |
| 107 activity_list_.erase(it); | 108 activity_list_.erase(it); |
| 108 } | 109 } |
| 109 | 110 |
| 110 private: | 111 private: |
| 111 std::vector<TestActivity*> activity_list_; | 112 std::vector<TestActivity*> activity_list_; |
| 112 | 113 |
| 113 DISALLOW_COPY_AND_ASSIGN(ResourceManagerTest); | 114 DISALLOW_COPY_AND_ASSIGN(ResourceManagerTest); |
| 114 }; | 115 }; |
| 115 | 116 |
| 116 // Only creates and destroys it to see that the system gets properly shut down. | 117 // Only creates and destroys it to see that the system gets properly shut down. |
| 117 TEST_F(ResourceManagerTest, SimpleTest) { | 118 TEST_F(ResourceManagerTest, SimpleTest) { |
| 118 } | 119 } |
| 119 | 120 |
| 120 // Test that we release an activity when the memory pressure goes critical. | 121 // Test that we release an activity when the memory pressure goes critical. |
| 121 TEST_F(ResourceManagerTest, OnCriticalWillUnloadOneActivity) { | 122 TEST_F(ResourceManagerTest, OnCriticalWillUnloadOneActivity) { |
| 122 // create a few dummy activities. | 123 // Create a few dummy activities in the reverse order as we need them. |
| 124 TestActivity* app_unloadable2 = CreateActivity("unloadable2"); |
| 125 TestActivity* app_unloadable1 = CreateActivity("unloadable1"); |
| 123 TestActivity* app_visible = CreateActivity("visible"); | 126 TestActivity* app_visible = CreateActivity("visible"); |
| 124 TestActivity* app_unloadable1 = CreateActivity("unloadable1"); | |
| 125 TestActivity* app_unloadable2 = CreateActivity("unloadable2"); | |
| 126 app_visible->set_visible(true); | 127 app_visible->set_visible(true); |
| 127 app_unloadable1->set_visible(false); | 128 app_unloadable1->set_visible(false); |
| 128 app_unloadable2->set_visible(false); | 129 app_unloadable2->set_visible(false); |
| 129 | 130 |
| 130 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 131 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| 131 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); | 132 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); |
| 132 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); | 133 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); |
| 133 | 134 |
| 134 // Call the resource manager and say we are in a critical memory condition. | 135 // Call the resource manager and say we are in a critical memory condition. |
| 135 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 136 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 149 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 150 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 150 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); | 151 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 151 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 152 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| 152 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); | 153 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); |
| 153 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); | 154 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); |
| 154 } | 155 } |
| 155 | 156 |
| 156 // Test that media playing activities only get unloaded if there is no other | 157 // Test that media playing activities only get unloaded if there is no other |
| 157 // way. | 158 // way. |
| 158 TEST_F(ResourceManagerTest, OnCriticalMediaHandling) { | 159 TEST_F(ResourceManagerTest, OnCriticalMediaHandling) { |
| 159 // create a few dummy activities. | 160 // Create a few dummy activities in the reverse order as we need them. |
| 161 TestActivity* app_media_locked2 = CreateActivity("medialocked2"); |
| 162 TestActivity* app_unloadable = CreateActivity("unloadable2"); |
| 163 TestActivity* app_media_locked1 = CreateActivity("medialocked1"); |
| 160 TestActivity* app_visible = CreateActivity("visible"); | 164 TestActivity* app_visible = CreateActivity("visible"); |
| 161 TestActivity* app_media_locked1 = CreateActivity("medialocked1"); | |
| 162 TestActivity* app_unloadable = CreateActivity("unloadable2"); | |
| 163 TestActivity* app_media_locked2 = CreateActivity("medialocked2"); | |
| 164 app_visible->set_visible(true); | 165 app_visible->set_visible(true); |
| 165 app_unloadable->set_visible(false); | 166 app_unloadable->set_visible(false); |
| 166 app_media_locked1->set_visible(false); | 167 app_media_locked1->set_visible(false); |
| 167 app_media_locked2->set_visible(false); | 168 app_media_locked2->set_visible(false); |
| 168 | 169 |
| 169 app_media_locked1->set_media_state( | 170 app_media_locked1->set_media_state( |
| 170 Activity::ACTIVITY_MEDIA_STATE_AUDIO_PLAYING); | 171 Activity::ACTIVITY_MEDIA_STATE_AUDIO_PLAYING); |
| 171 app_media_locked2->set_media_state(Activity::ACTIVITY_MEDIA_STATE_RECORDING); | 172 app_media_locked2->set_media_state(Activity::ACTIVITY_MEDIA_STATE_RECORDING); |
| 172 | 173 |
| 173 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 174 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 196 // Calling it the third time, the oldest media playing activity will get | 197 // Calling it the third time, the oldest media playing activity will get |
| 197 // unloaded. | 198 // unloaded. |
| 198 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 199 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 199 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); | 200 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 200 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 201 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| 201 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_media_locked1->GetCurrentState()); | 202 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_media_locked1->GetCurrentState()); |
| 202 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable->GetCurrentState()); | 203 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable->GetCurrentState()); |
| 203 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_media_locked2->GetCurrentState()); | 204 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_media_locked2->GetCurrentState()); |
| 204 } | 205 } |
| 205 | 206 |
| 207 // Test the visibility of items. |
| 208 TEST_F(ResourceManagerTest, VisibilityChanges) { |
| 209 // Create a few dummy activities in the reverse order as we need them. |
| 210 TestActivity* app4 = CreateActivity("app4"); |
| 211 TestActivity* app3 = CreateActivity("app3"); |
| 212 TestActivity* app2 = CreateActivity("app2"); |
| 213 TestActivity* app1 = CreateActivity("app1"); |
| 214 app1->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 215 app2->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 216 app3->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 217 app4->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 218 |
| 219 // Applying low resource pressure should keep everything as is. |
| 220 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 221 MemoryPressureObserver::MEMORY_PRESSURE_LOW); |
| 222 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 223 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app2->GetCurrentState()); |
| 224 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app3->GetCurrentState()); |
| 225 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app4->GetCurrentState()); |
| 226 |
| 227 // Applying moderate resource pressure we should see 3 visible activities. |
| 228 // This is testing an internal algorithm constant, but for the time being |
| 229 // this should suffice. |
| 230 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 231 MemoryPressureObserver::MEMORY_PRESSURE_MODERATE); |
| 232 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 233 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app2->GetCurrentState()); |
| 234 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app3->GetCurrentState()); |
| 235 EXPECT_EQ(Activity::ACTIVITY_INVISIBLE, app4->GetCurrentState()); |
| 236 |
| 237 // Applying higher pressure should get rid of everything unneeded. |
| 238 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 239 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 240 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 241 EXPECT_EQ(Activity::ACTIVITY_INVISIBLE, app2->GetCurrentState()); |
| 242 EXPECT_EQ(Activity::ACTIVITY_INVISIBLE, app3->GetCurrentState()); |
| 243 // Note: This might very well be unloaded with this memory pressure. |
| 244 EXPECT_NE(Activity::ACTIVITY_VISIBLE, app4->GetCurrentState()); |
| 245 |
| 246 // Once the split view mode gets turned on, more windows should become |
| 247 // visible. |
| 248 WindowManager::GetInstance()->ToggleSplitViewForTest(); |
| 249 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 250 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app2->GetCurrentState()); |
| 251 EXPECT_NE(Activity::ACTIVITY_VISIBLE, app3->GetCurrentState()); |
| 252 EXPECT_NE(Activity::ACTIVITY_VISIBLE, app4->GetCurrentState()); |
| 253 |
| 254 // Going back to a relaxed memory pressure should reload the old activities. |
| 255 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 256 MemoryPressureObserver::MEMORY_PRESSURE_LOW); |
| 257 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 258 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app2->GetCurrentState()); |
| 259 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app3->GetCurrentState()); |
| 260 EXPECT_NE(Activity::ACTIVITY_INVISIBLE, app4->GetCurrentState()); |
| 261 } |
| 262 |
| 206 } // namespace test | 263 } // namespace test |
| 207 } // namespace athena | 264 } // namespace athena |
| OLD | NEW |