Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc

Issue 2850203003: Do not kill recently killed ARC processes again (Closed)
Patch Set: address comments from Luis Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/memory/tab_manager_delegate_chromeos.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/memory/tab_manager_delegate_chromeos.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698