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 |
deleted file mode 100644 |
index f922ef9dbde850aa1f4adfd2ba80dbaf2c69fc5b..0000000000000000000000000000000000000000 |
--- a/chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc |
+++ /dev/null |
@@ -1,448 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/memory/tab_manager_delegate_chromeos.h" |
- |
-#include <map> |
-#include <string> |
-#include <vector> |
- |
-#include "base/process/process_handle.h" |
-#include "chromeos/dbus/fake_debug_daemon_client.h" |
-#include "content/public/test/test_browser_thread_bundle.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace memory { |
- |
-class TabManagerDelegateTest : public testing::Test { |
- public: |
- TabManagerDelegateTest() {} |
- ~TabManagerDelegateTest() override {} |
- |
- private: |
- content::TestBrowserThreadBundle thread_bundle_; |
-}; |
- |
-namespace { |
-constexpr bool kIsFocused = true; |
-constexpr bool kNotFocused = false; |
-} // namespace |
- |
-TEST_F(TabManagerDelegateTest, CandidatesSorted) { |
- std::vector<arc::ArcProcess> arc_processes; |
- arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, |
- kIsFocused, 100); |
- arc_processes.emplace_back(2, 20, "visible1", arc::mojom::ProcessState::TOP, |
- kNotFocused, 200); |
- arc_processes.emplace_back( |
- 3, 30, "service", arc::mojom::ProcessState::SERVICE, kNotFocused, 500); |
- arc_processes.emplace_back(4, 40, "visible2", arc::mojom::ProcessState::TOP, |
- kNotFocused, 150); |
- |
- TabStats tab1, tab2, tab3, tab4, tab5; |
- tab1.tab_contents_id = 100; |
- tab1.is_pinned = true; |
- |
- tab2.tab_contents_id = 200; |
- tab2.is_internal_page = true; |
- |
- tab3.tab_contents_id = 300; |
- tab3.is_pinned = true; |
- tab3.is_media = true; |
- |
- tab4.tab_contents_id = 400; |
- tab4.is_media = true; |
- |
- tab5.tab_contents_id = 500; |
- tab5.is_app = true; |
- TabStatsList tab_list = { |
- tab1, tab2, tab3, tab4, tab5 |
- }; |
- |
- std::vector<TabManagerDelegate::Candidate> candidates; |
- |
- candidates = TabManagerDelegate::GetSortedCandidates( |
- tab_list, arc_processes); |
- ASSERT_EQ(9U, candidates.size()); |
- |
- // focused app. |
- ASSERT_TRUE(candidates[0].app()); |
- EXPECT_EQ("focused", candidates[0].app()->process_name()); |
- // visible app 1, last_activity_time larger than visible app 2. |
- ASSERT_TRUE(candidates[1].app()); |
- EXPECT_EQ("visible1", candidates[1].app()->process_name()); |
- // visible app 2, last_activity_time less than visible app 1. |
- ASSERT_TRUE(candidates[2].app()); |
- EXPECT_EQ("visible2", candidates[2].app()->process_name()); |
- // pinned and media. |
- ASSERT_TRUE(candidates[3].tab()); |
- EXPECT_EQ(300, candidates[3].tab()->tab_contents_id); |
- // media. |
- ASSERT_TRUE(candidates[4].tab()); |
- EXPECT_EQ(400, candidates[4].tab()->tab_contents_id); |
- // pinned. |
- ASSERT_TRUE(candidates[5].tab()); |
- EXPECT_EQ(100, candidates[5].tab()->tab_contents_id); |
- // chrome app. |
- ASSERT_TRUE(candidates[6].tab()); |
- EXPECT_EQ(500, candidates[6].tab()->tab_contents_id); |
- // internal page. |
- ASSERT_TRUE(candidates[7].tab()); |
- EXPECT_EQ(200, candidates[7].tab()->tab_contents_id); |
- // background service. |
- ASSERT_TRUE(candidates[8].app()); |
- EXPECT_EQ("service", candidates[8].app()->process_name()); |
-} |
- |
-// Occasionally, Chrome sees both FOCUSED_TAB and FOCUSED_APP at the same time. |
-// Test that Chrome treats the former as a more important process. |
-TEST_F(TabManagerDelegateTest, CandidatesSortedWithFocusedAppAndTab) { |
- std::vector<arc::ArcProcess> arc_processes; |
- arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, |
- kIsFocused, 100); |
- TabStats tab1; |
- tab1.tab_contents_id = 100; |
- tab1.is_pinned = true; |
- tab1.is_selected = true; |
- const TabStatsList tab_list = {tab1}; |
- |
- const std::vector<TabManagerDelegate::Candidate> candidates = |
- TabManagerDelegate::GetSortedCandidates(tab_list, arc_processes); |
- ASSERT_EQ(2U, candidates.size()); |
- // FOCUSED_TAB should be the first one. |
- ASSERT_TRUE(candidates[0].tab()); |
- EXPECT_EQ(100, candidates[0].tab()->tab_contents_id); |
- ASSERT_TRUE(candidates[1].app()); |
- EXPECT_EQ("focused", candidates[1].app()->process_name()); |
-} |
- |
-class MockTabManagerDelegate : public TabManagerDelegate { |
- public: |
- MockTabManagerDelegate() |
- : TabManagerDelegate(nullptr), |
- always_return_true_from_is_recently_killed_(false) {} |
- |
- explicit MockTabManagerDelegate(TabManagerDelegate::MemoryStat* mem_stat) |
- : TabManagerDelegate(nullptr, mem_stat), |
- always_return_true_from_is_recently_killed_(false) {} |
- |
- // unit test. |
- std::vector<int> GetKilledArcProcesses() { |
- return killed_arc_processes_; |
- } |
- |
- // unit test. |
- std::vector<int64_t> GetKilledTabs() { |
- return killed_tabs_; |
- } |
- |
- // unit test. |
- void Clear() { |
- killed_arc_processes_.clear(); |
- 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); |
- return true; |
- } |
- |
- bool KillTab(int64_t tab_id) override { |
- killed_tabs_.push_back(tab_id); |
- return true; |
- } |
- |
- chromeos::DebugDaemonClient* GetDebugDaemonClient() override { |
- return &debugd_client_; |
- } |
- |
- private: |
- 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 { |
- public: |
- MockMemoryStat() {} |
- ~MockMemoryStat() override {} |
- |
- int TargetMemoryToFreeKB() override { |
- return target_memory_to_free_kb_; |
- } |
- |
- int EstimatedMemoryFreedKB(base::ProcessHandle pid) override { |
- return process_pss_[pid]; |
- } |
- |
- // unittest. |
- void SetTargetMemoryToFreeKB(const int target) { |
- target_memory_to_free_kb_ = target; |
- } |
- |
- // unittest. |
- void SetProcessPss(base::ProcessHandle pid, int pss) { |
- process_pss_[pid] = pss; |
- } |
- |
- private: |
- int target_memory_to_free_kb_; |
- std::map<base::ProcessHandle, int> process_pss_; |
-}; |
- |
-TEST_F(TabManagerDelegateTest, SetOomScoreAdj) { |
- MockTabManagerDelegate tab_manager_delegate; |
- |
- std::vector<arc::ArcProcess> arc_processes; |
- arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, |
- kIsFocused, 100); |
- arc_processes.emplace_back(2, 20, "visible1", arc::mojom::ProcessState::TOP, |
- kNotFocused, 200); |
- arc_processes.emplace_back( |
- 3, 30, "service", arc::mojom::ProcessState::SERVICE, kNotFocused, 500); |
- arc_processes.emplace_back(4, 40, "visible2", arc::mojom::ProcessState::TOP, |
- kNotFocused, 150); |
- arc_processes.emplace_back(5, 50, "persistent", |
- arc::mojom::ProcessState::PERSISTENT, kNotFocused, |
- 600); |
- arc_processes.emplace_back(6, 60, "persistent_ui", |
- arc::mojom::ProcessState::PERSISTENT_UI, |
- kNotFocused, 700); |
- |
- TabStats tab1, tab2, tab3, tab4, tab5; |
- tab1.is_pinned = true; |
- tab1.renderer_handle = 11; |
- |
- tab2.is_internal_page = true; |
- tab2.renderer_handle = 11; |
- |
- tab3.is_pinned = true; |
- tab3.is_media = true; |
- tab3.renderer_handle = 12; |
- |
- tab4.is_media = true; |
- tab4.renderer_handle = 12; |
- |
- tab5.is_app = true; |
- tab5.renderer_handle = 12; |
- TabStatsList tab_list = {tab1, tab2, tab3, tab4, tab5}; |
- |
- // Sorted order (by GetSortedCandidates): |
- // app "focused" pid: 10 |
- // app "persistent" pid: 50 |
- // app "persistent_ui" pid: 60 |
- // app "visible1" pid: 20 |
- // app "visible2" pid: 40 |
- // tab3 pid: 12 |
- // tab4 pid: 12 |
- // tab1 pid: 11 |
- // tab5 pid: 12 |
- // tab2 pid: 11 |
- // app "service" pid: 30 |
- tab_manager_delegate.AdjustOomPrioritiesImpl(tab_list, arc_processes); |
- auto& oom_score_map = tab_manager_delegate.oom_score_map_; |
- |
- // 6 PIDs for apps + 2 PIDs for tabs. |
- EXPECT_EQ(6U + 2U, oom_score_map.size()); |
- |
- // Non-killable part. AdjustOomPrioritiesImpl() does make a focused app/tab |
- // kernel-killable, but does not do that for PERSISTENT and PERSISTENT_UI |
- // apps. |
- EXPECT_EQ(TabManagerDelegate::kLowestOomScore, oom_score_map[50]); |
- EXPECT_EQ(TabManagerDelegate::kLowestOomScore, oom_score_map[60]); |
- |
- // Higher priority part. |
- EXPECT_EQ(300, oom_score_map[10]); |
- EXPECT_EQ(344, oom_score_map[20]); |
- EXPECT_EQ(388, oom_score_map[40]); |
- EXPECT_EQ(431, oom_score_map[12]); |
- EXPECT_EQ(475, oom_score_map[11]); |
- |
- // Lower priority part. |
- 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(); |
- |
- // Instantiate the mock instance. |
- MockTabManagerDelegate tab_manager_delegate(memory_stat); |
- |
- std::vector<arc::ArcProcess> arc_processes; |
- arc_processes.emplace_back(1, 10, "focused", arc::mojom::ProcessState::TOP, |
- kIsFocused, 100); |
- arc_processes.emplace_back(2, 20, "visible1", arc::mojom::ProcessState::TOP, |
- kNotFocused, 200); |
- arc_processes.emplace_back( |
- 3, 30, "service", arc::mojom::ProcessState::SERVICE, kNotFocused, 500); |
- arc_processes.emplace_back(4, 40, "visible2", |
- arc::mojom::ProcessState::IMPORTANT_FOREGROUND, |
- kNotFocused, 150); |
- arc_processes.emplace_back(5, 50, "not-visible", |
- arc::mojom::ProcessState::IMPORTANT_BACKGROUND, |
- kNotFocused, 300); |
- arc_processes.emplace_back(6, 60, "persistent", |
- arc::mojom::ProcessState::PERSISTENT, kNotFocused, |
- 400); |
- |
- TabStats tab1, tab2, tab3, tab4, tab5; |
- tab1.is_pinned = true; |
- tab1.renderer_handle = 11; |
- tab1.tab_contents_id = 1; |
- |
- tab2.is_internal_page = true; |
- tab2.renderer_handle = 11; |
- tab2.tab_contents_id = 2; |
- |
- tab3.is_pinned = true; |
- tab3.is_media = true; |
- tab3.renderer_handle = 12; |
- tab3.tab_contents_id = 3; |
- |
- tab4.is_media = true; |
- tab4.renderer_handle = 12; |
- tab4.tab_contents_id = 4; |
- |
- tab5.is_app = true; |
- tab5.renderer_handle = 12; |
- tab5.tab_contents_id = 5; |
- TabStatsList tab_list = {tab1, tab2, tab3, tab4, tab5}; |
- |
- // Sorted order (by GetSortedCandidates): |
- // app "focused" pid: 10 nspid 1 |
- // app "persistent" pid: 60 nspid 6 |
- // app "visible1" pid: 20 nspid 2 |
- // app "visible2" pid: 40 nspid 4 |
- // tab3 pid: 12 tab_contents_id 3 |
- // tab4 pid: 12 tab_contents_id 4 |
- // tab1 pid: 11 tab_contents_id 1 |
- // tab5 pid: 12 tab_contents_id 5 |
- // tab2 pid: 11 tab_contents_id 2 |
- // app "not-visible" pid: 50 nspid 5 |
- // app "service" pid: 30 nspid 3 |
- memory_stat->SetTargetMemoryToFreeKB(250000); |
- // Entities to be killed. |
- memory_stat->SetProcessPss(30, 10000); |
- memory_stat->SetProcessPss(50, 5000); |
- memory_stat->SetProcessPss(11, 200000); |
- memory_stat->SetProcessPss(12, 30000); |
- // Should not be used. |
- memory_stat->SetProcessPss(60, 500000); |
- memory_stat->SetProcessPss(40, 50000); |
- memory_stat->SetProcessPss(20, 30000); |
- memory_stat->SetProcessPss(10, 100000); |
- |
- tab_manager_delegate.LowMemoryKillImpl(tab_list, arc_processes); |
- |
- auto killed_arc_processes = tab_manager_delegate.GetKilledArcProcesses(); |
- auto killed_tabs = tab_manager_delegate.GetKilledTabs(); |
- |
- // Killed apps and their nspid. |
- ASSERT_EQ(2U, killed_arc_processes.size()); |
- EXPECT_EQ(3, killed_arc_processes[0]); |
- EXPECT_EQ(5, killed_arc_processes[1]); |
- // Killed tabs and their content id. |
- // Note that process with pid 11 is counted twice. But so far I don't have a |
- // good way to estimate the memory freed if multiple tabs share one process. |
- ASSERT_EQ(3U, killed_tabs.size()); |
- 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 |