| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/memory/tab_manager_delegate_chromeos.h" | 5 #include "chrome/browser/memory/tab_manager_delegate_chromeos.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 // chrome app. | 95 // chrome app. |
| 96 EXPECT_EQ(500, candidates[6].tab()->tab_contents_id); | 96 EXPECT_EQ(500, candidates[6].tab()->tab_contents_id); |
| 97 // internal page. | 97 // internal page. |
| 98 EXPECT_EQ(200, candidates[7].tab()->tab_contents_id); | 98 EXPECT_EQ(200, candidates[7].tab()->tab_contents_id); |
| 99 // background service. | 99 // background service. |
| 100 EXPECT_EQ("service", candidates[8].app()->process_name()); | 100 EXPECT_EQ("service", candidates[8].app()->process_name()); |
| 101 } | 101 } |
| 102 | 102 |
| 103 class MockTabManagerDelegate : public TabManagerDelegate { | 103 class MockTabManagerDelegate : public TabManagerDelegate { |
| 104 public: | 104 public: |
| 105 MockTabManagerDelegate(): TabManagerDelegate(nullptr) { | 105 MockTabManagerDelegate() |
| 106 } | 106 : TabManagerDelegate(nullptr), |
| 107 always_return_true_from_is_recently_killed_(false) {} |
| 107 | 108 |
| 108 explicit MockTabManagerDelegate(TabManagerDelegate::MemoryStat* mem_stat) | 109 explicit MockTabManagerDelegate(TabManagerDelegate::MemoryStat* mem_stat) |
| 109 : TabManagerDelegate(nullptr, mem_stat) { | 110 : TabManagerDelegate(nullptr, mem_stat), |
| 110 } | 111 always_return_true_from_is_recently_killed_(false) {} |
| 111 | 112 |
| 112 // unit test. | 113 // unit test. |
| 113 std::vector<int> GetKilledArcProcesses() { | 114 std::vector<int> GetKilledArcProcesses() { |
| 114 return killed_arc_processes_; | 115 return killed_arc_processes_; |
| 115 } | 116 } |
| 116 | 117 |
| 117 // unit test. | 118 // unit test. |
| 118 std::vector<int64_t> GetKilledTabs() { | 119 std::vector<int64_t> GetKilledTabs() { |
| 119 return killed_tabs_; | 120 return killed_tabs_; |
| 120 } | 121 } |
| 121 | 122 |
| 122 // unit test. | 123 // unit test. |
| 123 void Clear() { | 124 void Clear() { |
| 124 killed_arc_processes_.clear(); | 125 killed_arc_processes_.clear(); |
| 125 killed_tabs_.clear(); | 126 killed_tabs_.clear(); |
| 126 } | 127 } |
| 127 | 128 |
| 129 // unit test. |
| 130 void set_always_return_true_from_is_recently_killed( |
| 131 bool always_return_true_from_is_recently_killed) { |
| 132 always_return_true_from_is_recently_killed_ = |
| 133 always_return_true_from_is_recently_killed; |
| 134 } |
| 135 |
| 136 bool IsRecentlyKilledArcProcess(const std::string& process_name, |
| 137 const base::TimeTicks& now) override { |
| 138 if (always_return_true_from_is_recently_killed_) |
| 139 return true; |
| 140 return TabManagerDelegate::IsRecentlyKilledArcProcess(process_name, now); |
| 141 } |
| 142 |
| 128 protected: | 143 protected: |
| 129 bool KillArcProcess(const int nspid) override { | 144 bool KillArcProcess(const int nspid) override { |
| 130 killed_arc_processes_.push_back(nspid); | 145 killed_arc_processes_.push_back(nspid); |
| 131 return true; | 146 return true; |
| 132 } | 147 } |
| 133 | 148 |
| 134 bool KillTab(int64_t tab_id) override { | 149 bool KillTab(int64_t tab_id) override { |
| 135 killed_tabs_.push_back(tab_id); | 150 killed_tabs_.push_back(tab_id); |
| 136 return true; | 151 return true; |
| 137 } | 152 } |
| 138 | 153 |
| 139 chromeos::DebugDaemonClient* GetDebugDaemonClient() override { | 154 chromeos::DebugDaemonClient* GetDebugDaemonClient() override { |
| 140 return &debugd_client_; | 155 return &debugd_client_; |
| 141 } | 156 } |
| 142 | 157 |
| 143 private: | 158 private: |
| 144 chromeos::FakeDebugDaemonClient debugd_client_; | 159 chromeos::FakeDebugDaemonClient debugd_client_; |
| 145 std::vector<int> killed_arc_processes_; | 160 std::vector<int> killed_arc_processes_; |
| 146 std::vector<int64_t> killed_tabs_; | 161 std::vector<int64_t> killed_tabs_; |
| 162 bool always_return_true_from_is_recently_killed_; |
| 147 }; | 163 }; |
| 148 | 164 |
| 149 class MockMemoryStat : public TabManagerDelegate::MemoryStat { | 165 class MockMemoryStat : public TabManagerDelegate::MemoryStat { |
| 150 public: | 166 public: |
| 151 MockMemoryStat() {} | 167 MockMemoryStat() {} |
| 152 ~MockMemoryStat() override {} | 168 ~MockMemoryStat() override {} |
| 153 | 169 |
| 154 int TargetMemoryToFreeKB() override { | 170 int TargetMemoryToFreeKB() override { |
| 155 return target_memory_to_free_kb_; | 171 return target_memory_to_free_kb_; |
| 156 } | 172 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 EXPECT_EQ(300, oom_score_map[10]); | 240 EXPECT_EQ(300, oom_score_map[10]); |
| 225 EXPECT_EQ(344, oom_score_map[20]); | 241 EXPECT_EQ(344, oom_score_map[20]); |
| 226 EXPECT_EQ(388, oom_score_map[40]); | 242 EXPECT_EQ(388, oom_score_map[40]); |
| 227 EXPECT_EQ(431, oom_score_map[12]); | 243 EXPECT_EQ(431, oom_score_map[12]); |
| 228 EXPECT_EQ(475, oom_score_map[11]); | 244 EXPECT_EQ(475, oom_score_map[11]); |
| 229 | 245 |
| 230 // Lower priority part. | 246 // Lower priority part. |
| 231 EXPECT_EQ(650, oom_score_map[30]); | 247 EXPECT_EQ(650, oom_score_map[30]); |
| 232 } | 248 } |
| 233 | 249 |
| 250 TEST_F(TabManagerDelegateTest, IsRecentlyKilledArcProcess) { |
| 251 constexpr char kProcessName1[] = "org.chromium.arc.test1"; |
| 252 constexpr char kProcessName2[] = "org.chromium.arc.test2"; |
| 253 |
| 254 // Not owned. |
| 255 MockMemoryStat* memory_stat = new MockMemoryStat(); |
| 256 // Instantiate the mock instance. |
| 257 MockTabManagerDelegate tab_manager_delegate(memory_stat); |
| 258 |
| 259 // When the process name is not in the map, IsRecentlyKilledArcProcess should |
| 260 // return false. |
| 261 const base::TimeTicks now = base::TimeTicks::Now(); |
| 262 EXPECT_FALSE( |
| 263 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now)); |
| 264 EXPECT_FALSE( |
| 265 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now)); |
| 266 |
| 267 // Update the map to tell the manager that the process was killed very |
| 268 // recently. |
| 269 tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] = now; |
| 270 EXPECT_TRUE( |
| 271 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now)); |
| 272 EXPECT_FALSE( |
| 273 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now)); |
| 274 tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] = |
| 275 now - base::TimeDelta::FromMicroseconds(1); |
| 276 EXPECT_TRUE( |
| 277 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now)); |
| 278 EXPECT_FALSE( |
| 279 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now)); |
| 280 tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] = |
| 281 now - TabManagerDelegate::GetArcRespawnKillDelay(); |
| 282 EXPECT_TRUE( |
| 283 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now)); |
| 284 EXPECT_FALSE( |
| 285 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now)); |
| 286 |
| 287 // Update the map to tell the manager that the process was killed |
| 288 // (GetArcRespawnKillDelay() + 1) seconds ago. In this case, |
| 289 // IsRecentlyKilledArcProcess(kProcessName1) should return false. |
| 290 tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] = |
| 291 now - TabManagerDelegate::GetArcRespawnKillDelay() - |
| 292 base::TimeDelta::FromSeconds(1); |
| 293 EXPECT_FALSE( |
| 294 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now)); |
| 295 EXPECT_FALSE( |
| 296 tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now)); |
| 297 } |
| 298 |
| 299 TEST_F(TabManagerDelegateTest, DoNotKillRecentlyKilledArcProcesses) { |
| 300 // Not owned. |
| 301 MockMemoryStat* memory_stat = new MockMemoryStat(); |
| 302 |
| 303 // Instantiate the mock instance. |
| 304 MockTabManagerDelegate tab_manager_delegate(memory_stat); |
| 305 tab_manager_delegate.set_always_return_true_from_is_recently_killed(true); |
| 306 |
| 307 std::vector<arc::ArcProcess> arc_processes; |
| 308 arc_processes.emplace_back( |
| 309 1, 10, "service", arc::mojom::ProcessState::SERVICE, kNotFocused, 500); |
| 310 |
| 311 memory_stat->SetTargetMemoryToFreeKB(250000); |
| 312 memory_stat->SetProcessPss(30, 10000); |
| 313 TabStatsList tab_list; |
| 314 tab_manager_delegate.LowMemoryKillImpl(tab_list, arc_processes); |
| 315 |
| 316 auto killed_arc_processes = tab_manager_delegate.GetKilledArcProcesses(); |
| 317 EXPECT_EQ(0U, killed_arc_processes.size()); |
| 318 } |
| 319 |
| 234 TEST_F(TabManagerDelegateTest, KillMultipleProcesses) { | 320 TEST_F(TabManagerDelegateTest, KillMultipleProcesses) { |
| 235 // Not owned. | 321 // Not owned. |
| 236 MockMemoryStat* memory_stat = new MockMemoryStat(); | 322 MockMemoryStat* memory_stat = new MockMemoryStat(); |
| 237 | 323 |
| 238 // Instantiate the mock instance. | 324 // Instantiate the mock instance. |
| 239 MockTabManagerDelegate tab_manager_delegate(memory_stat); | 325 MockTabManagerDelegate tab_manager_delegate(memory_stat); |
| 240 | 326 |
| 241 std::vector<arc::ArcProcess> arc_processes; | 327 std::vector<arc::ArcProcess> arc_processes; |
| 242 arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, | 328 arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, |
| 243 kIsFocused, 100); | 329 kIsFocused, 100); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 ASSERT_EQ(2U, killed_arc_processes.size()); | 392 ASSERT_EQ(2U, killed_arc_processes.size()); |
| 307 EXPECT_EQ(3, killed_arc_processes[0]); | 393 EXPECT_EQ(3, killed_arc_processes[0]); |
| 308 EXPECT_EQ(5, killed_arc_processes[1]); | 394 EXPECT_EQ(5, killed_arc_processes[1]); |
| 309 // Killed tabs and their content id. | 395 // Killed tabs and their content id. |
| 310 // Note that process with pid 11 is counted twice. But so far I don't have a | 396 // Note that process with pid 11 is counted twice. But so far I don't have a |
| 311 // good way to estimate the memory freed if multiple tabs share one process. | 397 // good way to estimate the memory freed if multiple tabs share one process. |
| 312 ASSERT_EQ(3U, killed_tabs.size()); | 398 ASSERT_EQ(3U, killed_tabs.size()); |
| 313 EXPECT_EQ(2, killed_tabs[0]); | 399 EXPECT_EQ(2, killed_tabs[0]); |
| 314 EXPECT_EQ(5, killed_tabs[1]); | 400 EXPECT_EQ(5, killed_tabs[1]); |
| 315 EXPECT_EQ(1, killed_tabs[2]); | 401 EXPECT_EQ(1, killed_tabs[2]); |
| 402 |
| 403 // Check that killed apps are in the map. |
| 404 const TabManagerDelegate::KilledArcProcessesMap& processes_map = |
| 405 tab_manager_delegate.recently_killed_arc_processes_; |
| 406 EXPECT_EQ(2U, processes_map.size()); |
| 407 EXPECT_EQ(1U, processes_map.count("service")); |
| 408 EXPECT_EQ(1U, processes_map.count("not-visible")); |
| 316 } | 409 } |
| 317 | 410 |
| 318 } // namespace memory | 411 } // namespace memory |
| OLD | NEW |