| Index: chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc
|
| diff --git a/chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc b/chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc
|
| index ea9b783e1ca4ff6a9e9bffe5eb5541e9406c6335..dff31b85eeb8208fc9c8e2b5e37b9e797e1ebf33 100644
|
| --- a/chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc
|
| +++ b/chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc
|
| @@ -102,12 +102,13 @@ TEST_F(TabManagerDelegateTest, CandidatesSorted) {
|
|
|
| class MockTabManagerDelegate : public TabManagerDelegate {
|
| public:
|
| - MockTabManagerDelegate(): TabManagerDelegate(nullptr) {
|
| - }
|
| + MockTabManagerDelegate()
|
| + : TabManagerDelegate(nullptr),
|
| + always_return_true_from_is_recently_killed_(false) {}
|
|
|
| explicit MockTabManagerDelegate(TabManagerDelegate::MemoryStat* mem_stat)
|
| - : TabManagerDelegate(nullptr, mem_stat) {
|
| - }
|
| + : TabManagerDelegate(nullptr, mem_stat),
|
| + always_return_true_from_is_recently_killed_(false) {}
|
|
|
| // unit test.
|
| std::vector<int> GetKilledArcProcesses() {
|
| @@ -125,6 +126,20 @@ class MockTabManagerDelegate : public TabManagerDelegate {
|
| killed_tabs_.clear();
|
| }
|
|
|
| + // unit test.
|
| + void set_always_return_true_from_is_recently_killed(
|
| + bool always_return_true_from_is_recently_killed) {
|
| + always_return_true_from_is_recently_killed_ =
|
| + always_return_true_from_is_recently_killed;
|
| + }
|
| +
|
| + bool IsRecentlyKilledArcProcess(const std::string& process_name,
|
| + const base::TimeTicks& now) override {
|
| + if (always_return_true_from_is_recently_killed_)
|
| + return true;
|
| + return TabManagerDelegate::IsRecentlyKilledArcProcess(process_name, now);
|
| + }
|
| +
|
| protected:
|
| bool KillArcProcess(const int nspid) override {
|
| killed_arc_processes_.push_back(nspid);
|
| @@ -144,6 +159,7 @@ class MockTabManagerDelegate : public TabManagerDelegate {
|
| chromeos::FakeDebugDaemonClient debugd_client_;
|
| std::vector<int> killed_arc_processes_;
|
| std::vector<int64_t> killed_tabs_;
|
| + bool always_return_true_from_is_recently_killed_;
|
| };
|
|
|
| class MockMemoryStat : public TabManagerDelegate::MemoryStat {
|
| @@ -231,6 +247,76 @@ TEST_F(TabManagerDelegateTest, SetOomScoreAdj) {
|
| EXPECT_EQ(650, oom_score_map[30]);
|
| }
|
|
|
| +TEST_F(TabManagerDelegateTest, IsRecentlyKilledArcProcess) {
|
| + constexpr char kProcessName1[] = "org.chromium.arc.test1";
|
| + constexpr char kProcessName2[] = "org.chromium.arc.test2";
|
| +
|
| + // Not owned.
|
| + MockMemoryStat* memory_stat = new MockMemoryStat();
|
| + // Instantiate the mock instance.
|
| + MockTabManagerDelegate tab_manager_delegate(memory_stat);
|
| +
|
| + // When the process name is not in the map, IsRecentlyKilledArcProcess should
|
| + // return false.
|
| + const base::TimeTicks now = base::TimeTicks::Now();
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now));
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now));
|
| +
|
| + // Update the map to tell the manager that the process was killed very
|
| + // recently.
|
| + tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] = now;
|
| + EXPECT_TRUE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now));
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now));
|
| + tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] =
|
| + now - base::TimeDelta::FromMicroseconds(1);
|
| + EXPECT_TRUE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now));
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now));
|
| + tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] =
|
| + now - TabManagerDelegate::GetArcRespawnKillDelay();
|
| + EXPECT_TRUE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now));
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now));
|
| +
|
| + // Update the map to tell the manager that the process was killed
|
| + // (GetArcRespawnKillDelay() + 1) seconds ago. In this case,
|
| + // IsRecentlyKilledArcProcess(kProcessName1) should return false.
|
| + tab_manager_delegate.recently_killed_arc_processes_[kProcessName1] =
|
| + now - TabManagerDelegate::GetArcRespawnKillDelay() -
|
| + base::TimeDelta::FromSeconds(1);
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName1, now));
|
| + EXPECT_FALSE(
|
| + tab_manager_delegate.IsRecentlyKilledArcProcess(kProcessName2, now));
|
| +}
|
| +
|
| +TEST_F(TabManagerDelegateTest, DoNotKillRecentlyKilledArcProcesses) {
|
| + // Not owned.
|
| + MockMemoryStat* memory_stat = new MockMemoryStat();
|
| +
|
| + // Instantiate the mock instance.
|
| + MockTabManagerDelegate tab_manager_delegate(memory_stat);
|
| + tab_manager_delegate.set_always_return_true_from_is_recently_killed(true);
|
| +
|
| + std::vector<arc::ArcProcess> arc_processes;
|
| + arc_processes.emplace_back(
|
| + 1, 10, "service", arc::mojom::ProcessState::SERVICE, kNotFocused, 500);
|
| +
|
| + memory_stat->SetTargetMemoryToFreeKB(250000);
|
| + memory_stat->SetProcessPss(30, 10000);
|
| + TabStatsList tab_list;
|
| + tab_manager_delegate.LowMemoryKillImpl(tab_list, arc_processes);
|
| +
|
| + auto killed_arc_processes = tab_manager_delegate.GetKilledArcProcesses();
|
| + EXPECT_EQ(0U, killed_arc_processes.size());
|
| +}
|
| +
|
| TEST_F(TabManagerDelegateTest, KillMultipleProcesses) {
|
| // Not owned.
|
| MockMemoryStat* memory_stat = new MockMemoryStat();
|
| @@ -313,6 +399,13 @@ TEST_F(TabManagerDelegateTest, KillMultipleProcesses) {
|
| EXPECT_EQ(2, killed_tabs[0]);
|
| EXPECT_EQ(5, killed_tabs[1]);
|
| EXPECT_EQ(1, killed_tabs[2]);
|
| +
|
| + // Check that killed apps are in the map.
|
| + const TabManagerDelegate::KilledArcProcessesMap& processes_map =
|
| + tab_manager_delegate.recently_killed_arc_processes_;
|
| + EXPECT_EQ(2U, processes_map.size());
|
| + EXPECT_EQ(1U, processes_map.count("service"));
|
| + EXPECT_EQ(1U, processes_map.count("not-visible"));
|
| }
|
|
|
| } // namespace memory
|
|
|