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
3 // found in the LICENSE file.
8 #include "base/logging.h"
9 #include "base/strings/string16.h"
10 #include "base/time/time.h"
11 #include "chrome/browser/chromeos/memory/oom_priority_manager.h"
12 #include "chrome/common/url_constants.h"
13 #include "testing/gtest/include/gtest/gtest.h"
18 typedef testing::Test OomPriorityManagerTest
;
34 // Tests the sorting comparator so that we know it's producing the
36 TEST_F(OomPriorityManagerTest
, Comparator
) {
37 chromeos::OomPriorityManager::TabStatsList test_list
;
38 const base::TimeTicks now
= base::TimeTicks::Now();
40 // Add kSelected last to verify we are sorting the array.
43 OomPriorityManager::TabStats stats
;
44 stats
.is_pinned
= true;
45 stats
.renderer_handle
= kPinned
;
46 stats
.child_process_host_id
= kPinned
;
47 test_list
.push_back(stats
);
51 OomPriorityManager::TabStats stats
;
53 stats
.renderer_handle
= kApp
;
54 stats
.child_process_host_id
= kApp
;
55 test_list
.push_back(stats
);
59 OomPriorityManager::TabStats stats
;
60 stats
.is_playing_audio
= true;
61 stats
.renderer_handle
= kPlayingAudio
;
62 stats
.child_process_host_id
= kPlayingAudio
;
63 test_list
.push_back(stats
);
67 OomPriorityManager::TabStats stats
;
68 stats
.last_active
= now
- base::TimeDelta::FromSeconds(10);
69 stats
.renderer_handle
= kRecent
;
70 stats
.child_process_host_id
= kRecent
;
71 test_list
.push_back(stats
);
75 OomPriorityManager::TabStats stats
;
76 stats
.last_active
= now
- base::TimeDelta::FromMinutes(15);
77 stats
.renderer_handle
= kOld
;
78 stats
.child_process_host_id
= kOld
;
79 test_list
.push_back(stats
);
83 OomPriorityManager::TabStats stats
;
84 stats
.last_active
= now
- base::TimeDelta::FromDays(365);
85 stats
.renderer_handle
= kReallyOld
;
86 stats
.child_process_host_id
= kReallyOld
;
87 test_list
.push_back(stats
);
91 OomPriorityManager::TabStats stats
;
92 stats
.is_pinned
= true;
93 stats
.last_active
= now
- base::TimeDelta::FromDays(365);
94 stats
.renderer_handle
= kOldButPinned
;
95 stats
.child_process_host_id
= kOldButPinned
;
96 test_list
.push_back(stats
);
100 OomPriorityManager::TabStats stats
;
101 stats
.is_reloadable_ui
= true;
102 stats
.renderer_handle
= kReloadableUI
;
103 stats
.child_process_host_id
= kReloadableUI
;
104 test_list
.push_back(stats
);
107 // This entry sorts to the front, so by adding it last we verify that
108 // we are actually sorting the array.
110 OomPriorityManager::TabStats stats
;
111 stats
.is_selected
= true;
112 stats
.renderer_handle
= kSelected
;
113 stats
.child_process_host_id
= kSelected
;
114 test_list
.push_back(stats
);
117 std::sort(test_list
.begin(),
119 OomPriorityManager::CompareTabStats
);
122 EXPECT_EQ(kSelected
, test_list
[index
++].renderer_handle
);
123 EXPECT_EQ(kPinned
, test_list
[index
++].renderer_handle
);
124 EXPECT_EQ(kOldButPinned
, test_list
[index
++].renderer_handle
);
125 EXPECT_EQ(kApp
, test_list
[index
++].renderer_handle
);
126 EXPECT_EQ(kPlayingAudio
, test_list
[index
++].renderer_handle
);
127 EXPECT_EQ(kRecent
, test_list
[index
++].renderer_handle
);
128 EXPECT_EQ(kOld
, test_list
[index
++].renderer_handle
);
129 EXPECT_EQ(kReallyOld
, test_list
[index
++].renderer_handle
);
130 EXPECT_EQ(kReloadableUI
, test_list
[index
++].renderer_handle
);
133 EXPECT_EQ(kSelected
, test_list
[index
++].child_process_host_id
);
134 EXPECT_EQ(kPinned
, test_list
[index
++].child_process_host_id
);
135 EXPECT_EQ(kOldButPinned
, test_list
[index
++].child_process_host_id
);
136 EXPECT_EQ(kApp
, test_list
[index
++].child_process_host_id
);
137 EXPECT_EQ(kPlayingAudio
, test_list
[index
++].child_process_host_id
);
138 EXPECT_EQ(kRecent
, test_list
[index
++].child_process_host_id
);
139 EXPECT_EQ(kOld
, test_list
[index
++].child_process_host_id
);
140 EXPECT_EQ(kReallyOld
, test_list
[index
++].child_process_host_id
);
141 EXPECT_EQ(kReloadableUI
, test_list
[index
++].child_process_host_id
);
144 TEST_F(OomPriorityManagerTest
, IsReloadableUI
) {
145 EXPECT_TRUE(OomPriorityManager::IsReloadableUI(
146 GURL(chrome::kChromeUIDownloadsURL
)));
147 EXPECT_TRUE(OomPriorityManager::IsReloadableUI(
148 GURL(chrome::kChromeUIHistoryURL
)));
149 EXPECT_TRUE(OomPriorityManager::IsReloadableUI(
150 GURL(chrome::kChromeUINewTabURL
)));
151 EXPECT_TRUE(OomPriorityManager::IsReloadableUI(
152 GURL(chrome::kChromeUISettingsURL
)));
154 // Debugging URLs are not included.
155 EXPECT_FALSE(OomPriorityManager::IsReloadableUI(
156 GURL(chrome::kChromeUIDiscardsURL
)));
157 EXPECT_FALSE(OomPriorityManager::IsReloadableUI(
158 GURL(chrome::kChromeUINetInternalsURL
)));
160 // Prefix matches are included.
161 EXPECT_TRUE(OomPriorityManager::IsReloadableUI(
162 GURL("chrome://settings/fakeSetting")));
165 TEST_F(OomPriorityManagerTest
, GetProcessHandles
) {
166 OomPriorityManager::TabStats stats
;
167 std::vector
<OomPriorityManager::ProcessInfo
> process_id_pairs
;
169 // Empty stats list gives empty |process_id_pairs| list.
170 OomPriorityManager::TabStatsList empty_list
;
172 OomPriorityManager::GetChildProcessInfos(empty_list
);
173 EXPECT_EQ(0u, process_id_pairs
.size());
175 // Two tabs in two different processes generates two
176 // |child_process_host_id| out.
177 OomPriorityManager::TabStatsList two_list
;
178 stats
.child_process_host_id
= 100;
179 stats
.renderer_handle
= 101;
180 two_list
.push_back(stats
);
181 stats
.child_process_host_id
= 200;
182 stats
.renderer_handle
= 201;
183 two_list
.push_back(stats
);
184 process_id_pairs
= OomPriorityManager::GetChildProcessInfos(two_list
);
185 EXPECT_EQ(2u, process_id_pairs
.size());
186 EXPECT_EQ(100, process_id_pairs
[0].first
);
187 EXPECT_EQ(101, process_id_pairs
[0].second
);
188 EXPECT_EQ(200, process_id_pairs
[1].first
);
189 EXPECT_EQ(201, process_id_pairs
[1].second
);
191 // Zero handles are removed.
192 OomPriorityManager::TabStatsList zero_handle_list
;
193 stats
.child_process_host_id
= 100;
194 stats
.renderer_handle
= 0;
195 zero_handle_list
.push_back(stats
);
197 OomPriorityManager::GetChildProcessInfos(zero_handle_list
);
198 EXPECT_EQ(0u, process_id_pairs
.size());
200 // Two tabs in the same process generates one handle out. When a duplicate
201 // occurs the later instance is dropped.
202 OomPriorityManager::TabStatsList same_process_list
;
203 stats
.child_process_host_id
= 100;
204 stats
.renderer_handle
= 101;
205 same_process_list
.push_back(stats
);
206 stats
.child_process_host_id
= 200;
207 stats
.renderer_handle
= 201;
208 same_process_list
.push_back(stats
);
209 stats
.child_process_host_id
= 300;
210 stats
.renderer_handle
= 101; // Duplicate.
211 same_process_list
.push_back(stats
);
213 OomPriorityManager::GetChildProcessInfos(same_process_list
);
214 EXPECT_EQ(2u, process_id_pairs
.size());
215 EXPECT_EQ(100, process_id_pairs
[0].first
);
216 EXPECT_EQ(101, process_id_pairs
[0].second
);
217 EXPECT_EQ(200, process_id_pairs
[1].first
);
218 EXPECT_EQ(201, process_id_pairs
[1].second
);
221 } // namespace chromeos