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

Unified Diff: chrome/browser/memory/tab_manager_delegate_chromeos_unittest.cc

Issue 2898033002: [TabManager] Move TabManager into chrome/browser/resource_coordinator. (Closed)
Patch Set: rebase 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698