Chromium Code Reviews| 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, sRecentlyKilledArcProcess should | |
|
Georges Khalil
2017/05/02 21:36:30
nit: s/sRecentlyKilledArcProcess/IsRecentlyKilledA
Yusuke Sato
2017/05/02 21:40:11
Done.
| |
| 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 // (kArcSkipKillingTimeInSeconds + 1) seconds ago. In this case, | |
|
cylee1
2017/05/02 20:59:53
nit: kArcSkipKillingTimeInSeconds no longer exists
Yusuke Sato
2017/05/02 21:40:11
Done.
| |
| 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 tab_manager_delegate.LowMemoryKillImpl({} /* tab_list */, arc_processes); | |
| 314 | |
| 315 auto killed_arc_processes = tab_manager_delegate.GetKilledArcProcesses(); | |
| 316 EXPECT_EQ(0U, killed_arc_processes.size()); | |
| 317 } | |
| 318 | |
| 234 TEST_F(TabManagerDelegateTest, KillMultipleProcesses) { | 319 TEST_F(TabManagerDelegateTest, KillMultipleProcesses) { |
| 235 // Not owned. | 320 // Not owned. |
| 236 MockMemoryStat* memory_stat = new MockMemoryStat(); | 321 MockMemoryStat* memory_stat = new MockMemoryStat(); |
| 237 | 322 |
| 238 // Instantiate the mock instance. | 323 // Instantiate the mock instance. |
| 239 MockTabManagerDelegate tab_manager_delegate(memory_stat); | 324 MockTabManagerDelegate tab_manager_delegate(memory_stat); |
| 240 | 325 |
| 241 std::vector<arc::ArcProcess> arc_processes; | 326 std::vector<arc::ArcProcess> arc_processes; |
| 242 arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, | 327 arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, |
| 243 kIsFocused, 100); | 328 kIsFocused, 100); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 // Killed apps and their nspid. | 384 // Killed apps and their nspid. |
| 300 EXPECT_EQ(1U, killed_arc_processes.size()); | 385 EXPECT_EQ(1U, killed_arc_processes.size()); |
| 301 EXPECT_EQ(3, killed_arc_processes[0]); | 386 EXPECT_EQ(3, killed_arc_processes[0]); |
| 302 // Killed tabs and their content id. | 387 // Killed tabs and their content id. |
| 303 // Note that process with pid 11 is counted twice. But so far I don't have a | 388 // Note that process with pid 11 is counted twice. But so far I don't have a |
| 304 // good way to estimate the memory freed if multiple tabs share one process. | 389 // good way to estimate the memory freed if multiple tabs share one process. |
| 305 EXPECT_EQ(3U, killed_tabs.size()); | 390 EXPECT_EQ(3U, killed_tabs.size()); |
| 306 EXPECT_EQ(2, killed_tabs[0]); | 391 EXPECT_EQ(2, killed_tabs[0]); |
| 307 EXPECT_EQ(5, killed_tabs[1]); | 392 EXPECT_EQ(5, killed_tabs[1]); |
| 308 EXPECT_EQ(1, killed_tabs[2]); | 393 EXPECT_EQ(1, killed_tabs[2]); |
| 394 | |
| 395 // Check that killed apps are in the map. | |
| 396 const TabManagerDelegate::KilledArcProcessesMap& processes_map = | |
| 397 tab_manager_delegate.recently_killed_arc_processes_; | |
| 398 EXPECT_EQ(1U, processes_map.size()); | |
| 399 EXPECT_EQ(1U, processes_map.count("service")); | |
| 309 } | 400 } |
| 310 | 401 |
| 311 } // namespace memory | 402 } // namespace memory |
| OLD | NEW |