Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/memory/memory_coordinator.h" | 5 #include "content/browser/memory/memory_coordinator.h" |
| 6 | 6 |
| 7 #include "base/memory/memory_pressure_monitor.h" | 7 #include "base/memory/memory_pressure_monitor.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "mojo/public/cpp/bindings/binding.h" | 10 #include "mojo/public/cpp/bindings/binding.h" |
| 11 | 11 |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 namespace content { | 14 namespace content { |
| 15 | 15 |
| 16 namespace { | 16 namespace { |
| 17 | 17 |
| 18 void RunUntilIdle() { | 18 void RunUntilIdle() { |
| 19 base::RunLoop loop; | 19 base::RunLoop loop; |
| 20 loop.RunUntilIdle(); | 20 loop.RunUntilIdle(); |
| 21 } | 21 } |
| 22 | 22 |
| 23 } // namespace | 23 } // namespace |
| 24 | 24 |
| 25 // A mock ChildMemoryCoordinator, for testing interaction between MC and CMC. | 25 // A mock ChildMemoryCoordinator, for testing interaction between MC and CMC. |
| 26 class MockChildMemoryCoordinator : public mojom::ChildMemoryCoordinator { | 26 class MockChildMemoryCoordinator : public mojom::ChildMemoryCoordinator { |
| 27 public: | 27 public: |
| 28 MockChildMemoryCoordinator() | 28 MockChildMemoryCoordinator() |
| 29 : state_(mojom::MemoryState::UNKNOWN), | 29 : state_(mojom::MemoryState::NORMAL), |
|
bashi
2016/12/09 03:11:16
I had to change the initial state to NORMAL becaus
| |
| 30 on_state_change_calls_(0) {} | 30 on_state_change_calls_(0) {} |
| 31 | 31 |
| 32 ~MockChildMemoryCoordinator() override {} | 32 ~MockChildMemoryCoordinator() override {} |
| 33 | 33 |
| 34 void OnStateChange(mojom::MemoryState state) override { | 34 void OnStateChange(mojom::MemoryState state) override { |
| 35 state_ = state; | 35 state_ = state; |
| 36 ++on_state_change_calls_; | 36 ++on_state_change_calls_; |
| 37 } | 37 } |
| 38 | 38 |
| 39 mojom::MemoryState state() const { return state_; } | 39 mojom::MemoryState state() const { return state_; } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 EXPECT_EQ(1, cmc1->on_state_change_calls()); | 131 EXPECT_EQ(1, cmc1->on_state_change_calls()); |
| 132 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc1->state()); | 132 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc1->state()); |
| 133 | 133 |
| 134 EXPECT_TRUE(mc.SetChildMemoryState(2, mojom::MemoryState::SUSPENDED)); | 134 EXPECT_TRUE(mc.SetChildMemoryState(2, mojom::MemoryState::SUSPENDED)); |
| 135 EXPECT_EQ(1, cmc2->on_state_change_calls()); | 135 EXPECT_EQ(1, cmc2->on_state_change_calls()); |
| 136 // Child processes are considered as visible (foreground) by default, | 136 // Child processes are considered as visible (foreground) by default, |
| 137 // and visible ones won't be suspended but throttled. | 137 // and visible ones won't be suspended but throttled. |
| 138 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc2->state()); | 138 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc2->state()); |
| 139 } | 139 } |
| 140 | 140 |
| 141 TEST_F(MemoryCoordinatorTest, SetChildMemoryState) { | |
| 142 TestMemoryCoordinator mc; | |
| 143 auto cmc = mc.CreateChildMemoryCoordinator(1); | |
| 144 auto iter = mc.children().find(1); | |
| 145 ASSERT_TRUE(iter != mc.children().end()); | |
| 146 | |
| 147 // Foreground | |
| 148 iter->second.is_visible = true; | |
| 149 EXPECT_TRUE(mc.SetChildMemoryState(1, mojom::MemoryState::NORMAL)); | |
| 150 EXPECT_EQ(mojom::MemoryState::NORMAL, cmc->state()); | |
| 151 EXPECT_TRUE(mc.SetChildMemoryState(1, mojom::MemoryState::THROTTLED)); | |
| 152 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc->state()); | |
| 153 EXPECT_TRUE(mc.SetChildMemoryState(1, mojom::MemoryState::SUSPENDED)); | |
| 154 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc->state()); | |
| 155 | |
| 156 // Background | |
| 157 iter->second.is_visible = false; | |
| 158 EXPECT_TRUE(mc.SetChildMemoryState(1, mojom::MemoryState::NORMAL)); | |
| 159 #if defined(OS_ANDROID) | |
| 160 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc->state()); | |
| 161 #else | |
| 162 EXPECT_EQ(mojom::MemoryState::NORMAL, cmc->state()); | |
| 163 #endif | |
| 164 EXPECT_TRUE(mc.SetChildMemoryState(1, mojom::MemoryState::THROTTLED)); | |
| 165 EXPECT_EQ(mojom::MemoryState::THROTTLED, cmc->state()); | |
| 166 EXPECT_TRUE(mc.SetChildMemoryState(1, mojom::MemoryState::SUSPENDED)); | |
| 167 EXPECT_EQ(mojom::MemoryState::SUSPENDED, cmc->state()); | |
| 168 } | |
| 169 | |
| 141 } // namespace content | 170 } // namespace content |
| OLD | NEW |