OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "components/web_cache/browser/web_cache_manager.h" | 10 #include "components/web_cache/browser/web_cache_manager.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 static std::set<int>& active_renderers(WebCacheManager* h) { | 47 static std::set<int>& active_renderers(WebCacheManager* h) { |
48 return h->active_renderers_; | 48 return h->active_renderers_; |
49 } | 49 } |
50 static std::set<int>& inactive_renderers(WebCacheManager* h) { | 50 static std::set<int>& inactive_renderers(WebCacheManager* h) { |
51 return h->inactive_renderers_; | 51 return h->inactive_renderers_; |
52 } | 52 } |
53 static void GatherStats(WebCacheManager* h, | 53 static void GatherStats(WebCacheManager* h, |
54 std::set<int> renderers, | 54 std::set<int> renderers, |
55 WebCacheManager::RendererInfo* stats) { | 55 WebCacheManager::RendererInfo* stats) { |
56 memset(stats, 0, sizeof(WebCacheManager::RendererInfo)); | 56 memset(stats, 0, sizeof(WebCacheManager::RendererInfo)); |
57 h->GatherStats(renderers, &stats->capacity, &stats->live_size, | 57 h->GatherStats(renderers, &stats->capacity, &stats->size); |
58 &stats->dead_size); | |
59 } | 58 } |
60 static uint64_t GetSize(int tactic, | 59 static uint64_t GetSize(int tactic, |
61 const WebCacheManager::RendererInfo& stats) { | 60 const WebCacheManager::RendererInfo& stats) { |
62 return WebCacheManager::GetSize( | 61 return WebCacheManager::GetSize( |
63 static_cast<WebCacheManager::AllocationTactic>(tactic), stats.live_size, | 62 static_cast<WebCacheManager::AllocationTactic>(tactic), stats.size); |
64 stats.dead_size); | |
65 } | 63 } |
66 static bool AttemptTactic(WebCacheManager* h, | 64 static bool AttemptTactic(WebCacheManager* h, |
67 int active_tactic, | 65 int active_tactic, |
68 const WebCacheManager::RendererInfo& active_stats, | 66 const WebCacheManager::RendererInfo& active_stats, |
69 int inactive_tactic, | 67 int inactive_tactic, |
70 const WebCacheManager::RendererInfo& inactive_stats, | 68 const WebCacheManager::RendererInfo& inactive_stats, |
71 std::list<std::pair<int, uint64_t>>* strategy) { | 69 std::list<std::pair<int, uint64_t>>* strategy) { |
72 return h->AttemptTactic( | 70 return h->AttemptTactic( |
73 static_cast<WebCacheManager::AllocationTactic>(active_tactic), | 71 static_cast<WebCacheManager::AllocationTactic>(active_tactic), |
74 active_stats.live_size, active_stats.dead_size, | 72 active_stats.size, |
75 static_cast<WebCacheManager::AllocationTactic>(inactive_tactic), | 73 static_cast<WebCacheManager::AllocationTactic>(inactive_tactic), |
76 inactive_stats.live_size, inactive_stats.dead_size, strategy); | 74 inactive_stats.size, strategy); |
77 } | 75 } |
78 static void AddToStrategy(WebCacheManager* h, | 76 static void AddToStrategy(WebCacheManager* h, |
79 std::set<int> renderers, | 77 std::set<int> renderers, |
80 int tactic, | 78 int tactic, |
81 uint64_t extra_bytes_to_allocate, | 79 uint64_t extra_bytes_to_allocate, |
82 std::list<std::pair<int, uint64_t>>* strategy) { | 80 std::list<std::pair<int, uint64_t>>* strategy) { |
83 h->AddToStrategy(renderers, | 81 h->AddToStrategy(renderers, |
84 static_cast<WebCacheManager::AllocationTactic>(tactic), | 82 static_cast<WebCacheManager::AllocationTactic>(tactic), |
85 extra_bytes_to_allocate, | 83 extra_bytes_to_allocate, |
86 strategy); | 84 strategy); |
87 } | 85 } |
88 | 86 |
89 static bool RendererInfoEqual(const WebCacheManager::RendererInfo& lhs, | 87 static bool RendererInfoEqual(const WebCacheManager::RendererInfo& lhs, |
90 const WebCacheManager::RendererInfo& rhs) { | 88 const WebCacheManager::RendererInfo& rhs) { |
91 return lhs.capacity == rhs.capacity && lhs.live_size == rhs.live_size && | 89 return lhs.capacity == rhs.capacity && lhs.size == rhs.size; |
92 lhs.dead_size == rhs.dead_size; | |
93 } | 90 } |
94 | 91 |
95 enum { | 92 enum { |
96 DIVIDE_EVENLY = WebCacheManager::DIVIDE_EVENLY, | 93 DIVIDE_EVENLY = WebCacheManager::DIVIDE_EVENLY, |
97 KEEP_CURRENT_WITH_HEADROOM = WebCacheManager::KEEP_CURRENT_WITH_HEADROOM, | 94 KEEP_CURRENT_WITH_HEADROOM = WebCacheManager::KEEP_CURRENT_WITH_HEADROOM, |
98 KEEP_CURRENT = WebCacheManager::KEEP_CURRENT, | 95 KEEP_CURRENT = WebCacheManager::KEEP_CURRENT, |
99 KEEP_LIVE_WITH_HEADROOM = WebCacheManager::KEEP_LIVE_WITH_HEADROOM, | |
100 KEEP_LIVE = WebCacheManager::KEEP_LIVE, | |
101 }; | 96 }; |
102 | 97 |
103 WebCacheManager* manager() { return &manager_; } | 98 WebCacheManager* manager() { return &manager_; } |
104 | 99 |
105 private: | 100 private: |
106 WebCacheManager manager_; | 101 WebCacheManager manager_; |
107 base::MessageLoop message_loop_; | 102 base::MessageLoop message_loop_; |
108 content::TestBrowserThread ui_thread_; | 103 content::TestBrowserThread ui_thread_; |
109 }; | 104 }; |
110 | 105 |
111 // static | 106 // static |
112 const int WebCacheManagerTest::kRendererID = 146; | 107 const int WebCacheManagerTest::kRendererID = 146; |
113 | 108 |
114 // static | 109 // static |
115 const int WebCacheManagerTest::kRendererID2 = 245; | 110 const int WebCacheManagerTest::kRendererID2 = 245; |
116 | 111 |
117 // static | 112 // static |
118 const WebCacheManager::RendererInfo WebCacheManagerTest::kStats = { | 113 const WebCacheManager::RendererInfo WebCacheManagerTest::kStats = { |
119 base::Time(), 0, 1024 * 1024, 1024 * 1024, 256 * 1024, 512, | 114 base::Time(), 1024 * 1024, 256 * 1024 + 512, |
120 }; | 115 }; |
121 | 116 |
122 // static | 117 // static |
123 const WebCacheManager::RendererInfo WebCacheManagerTest::kStats2 = { | 118 const WebCacheManager::RendererInfo WebCacheManagerTest::kStats2 = { |
124 base::Time(), 0, 2 * 1024 * 1024, 2 * 1024 * 1024, 2 * 256 * 1024, 2 * 512, | 119 base::Time(), 2 * 1024 * 1024, 2 * 256 * 1024 + 2 * 512, |
125 }; | 120 }; |
126 | 121 |
127 TEST_F(WebCacheManagerTest, AddRemoveRendererTest) { | 122 TEST_F(WebCacheManagerTest, AddRemoveRendererTest) { |
128 EXPECT_EQ(0U, active_renderers(manager()).size()); | 123 EXPECT_EQ(0U, active_renderers(manager()).size()); |
129 EXPECT_EQ(0U, inactive_renderers(manager()).size()); | 124 EXPECT_EQ(0U, inactive_renderers(manager()).size()); |
130 | 125 |
131 manager()->Add(kRendererID); | 126 manager()->Add(kRendererID); |
132 EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID)); | 127 EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID)); |
133 EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); | 128 EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); |
134 | 129 |
(...skipping 18 matching lines...) Expand all Loading... |
153 EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); | 148 EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); |
154 | 149 |
155 manager()->Remove(kRendererID); | 150 manager()->Remove(kRendererID); |
156 } | 151 } |
157 | 152 |
158 TEST_F(WebCacheManagerTest, ObserveStatsTest) { | 153 TEST_F(WebCacheManagerTest, ObserveStatsTest) { |
159 manager()->Add(kRendererID); | 154 manager()->Add(kRendererID); |
160 | 155 |
161 EXPECT_EQ(1U, stats(manager()).size()); | 156 EXPECT_EQ(1U, stats(manager()).size()); |
162 | 157 |
163 manager()->ObserveStats(kRendererID, kStats.min_dead_capacity, | 158 manager()->ObserveStats(kRendererID, kStats.capacity, kStats.size); |
164 kStats.max_dead_capacity, kStats.capacity, | |
165 kStats.live_size, kStats.dead_size); | |
166 | 159 |
167 EXPECT_EQ(1U, stats(manager()).size()); | 160 EXPECT_EQ(1U, stats(manager()).size()); |
168 EXPECT_TRUE(RendererInfoEqual(kStats, stats(manager())[kRendererID])); | 161 EXPECT_TRUE(RendererInfoEqual(kStats, stats(manager())[kRendererID])); |
169 | 162 |
170 manager()->Remove(kRendererID); | 163 manager()->Remove(kRendererID); |
171 } | 164 } |
172 | 165 |
173 TEST_F(WebCacheManagerTest, SetGlobalSizeLimitTest) { | 166 TEST_F(WebCacheManagerTest, SetGlobalSizeLimitTest) { |
174 uint64_t limit = manager()->GetDefaultGlobalSizeLimit(); | 167 uint64_t limit = manager()->GetDefaultGlobalSizeLimit(); |
175 manager()->SetGlobalSizeLimit(limit); | 168 manager()->SetGlobalSizeLimit(limit); |
176 EXPECT_EQ(limit, manager()->global_size_limit()); | 169 EXPECT_EQ(limit, manager()->global_size_limit()); |
177 | 170 |
178 manager()->SetGlobalSizeLimit(0); | 171 manager()->SetGlobalSizeLimit(0); |
179 EXPECT_EQ(0U, manager()->global_size_limit()); | 172 EXPECT_EQ(0U, manager()->global_size_limit()); |
180 } | 173 } |
181 | 174 |
182 TEST_F(WebCacheManagerTest, GatherStatsTest) { | 175 TEST_F(WebCacheManagerTest, GatherStatsTest) { |
183 manager()->Add(kRendererID); | 176 manager()->Add(kRendererID); |
184 manager()->Add(kRendererID2); | 177 manager()->Add(kRendererID2); |
185 | 178 |
186 manager()->ObserveStats(kRendererID, kStats.min_dead_capacity, | 179 manager()->ObserveStats(kRendererID, kStats.capacity, kStats.size); |
187 kStats.max_dead_capacity, kStats.capacity, | 180 manager()->ObserveStats(kRendererID2, kStats2.capacity, kStats2.size); |
188 kStats.live_size, kStats.dead_size); | |
189 manager()->ObserveStats(kRendererID2, kStats2.min_dead_capacity, | |
190 kStats2.max_dead_capacity, kStats2.capacity, | |
191 kStats2.live_size, kStats2.dead_size); | |
192 | 181 |
193 std::set<int> renderer_set; | 182 std::set<int> renderer_set; |
194 renderer_set.insert(kRendererID); | 183 renderer_set.insert(kRendererID); |
195 | 184 |
196 WebCacheManager::RendererInfo stats; | 185 WebCacheManager::RendererInfo stats; |
197 GatherStats(manager(), renderer_set, &stats); | 186 GatherStats(manager(), renderer_set, &stats); |
198 | 187 |
199 EXPECT_TRUE(RendererInfoEqual(kStats, stats)); | 188 EXPECT_TRUE(RendererInfoEqual(kStats, stats)); |
200 | 189 |
201 renderer_set.insert(kRendererID2); | 190 renderer_set.insert(kRendererID2); |
202 GatherStats(manager(), renderer_set, &stats); | 191 GatherStats(manager(), renderer_set, &stats); |
203 | 192 |
204 WebCacheManager::RendererInfo expected_stats = kStats; | 193 WebCacheManager::RendererInfo expected_stats = kStats; |
205 expected_stats.min_dead_capacity += kStats2.min_dead_capacity; | |
206 expected_stats.max_dead_capacity += kStats2.max_dead_capacity; | |
207 expected_stats.capacity += kStats2.capacity; | 194 expected_stats.capacity += kStats2.capacity; |
208 expected_stats.live_size += kStats2.live_size; | 195 expected_stats.size += kStats2.size; |
209 expected_stats.dead_size += kStats2.dead_size; | |
210 | 196 |
211 EXPECT_TRUE(RendererInfoEqual(expected_stats, stats)); | 197 EXPECT_TRUE(RendererInfoEqual(expected_stats, stats)); |
212 | 198 |
213 manager()->Remove(kRendererID); | 199 manager()->Remove(kRendererID); |
214 manager()->Remove(kRendererID2); | 200 manager()->Remove(kRendererID2); |
215 } | 201 } |
216 | 202 |
217 TEST_F(WebCacheManagerTest, GetSizeTest) { | 203 TEST_F(WebCacheManagerTest, GetSizeTest) { |
218 EXPECT_EQ(0U, GetSize(DIVIDE_EVENLY, kStats)); | 204 EXPECT_EQ(0U, GetSize(DIVIDE_EVENLY, kStats)); |
219 EXPECT_LT(256 * 1024u + 512, GetSize(KEEP_CURRENT_WITH_HEADROOM, kStats)); | 205 EXPECT_LT(256 * 1024u + 512, GetSize(KEEP_CURRENT_WITH_HEADROOM, kStats)); |
220 EXPECT_EQ(256 * 1024u + 512, GetSize(KEEP_CURRENT, kStats)); | 206 EXPECT_EQ(256 * 1024u + 512, GetSize(KEEP_CURRENT, kStats)); |
221 EXPECT_LT(256 * 1024u, GetSize(KEEP_LIVE_WITH_HEADROOM, kStats)); | |
222 EXPECT_EQ(256 * 1024u, GetSize(KEEP_LIVE, kStats)); | |
223 } | 207 } |
224 | 208 |
225 TEST_F(WebCacheManagerTest, AttemptTacticTest) { | 209 TEST_F(WebCacheManagerTest, AttemptTacticTest) { |
226 manager()->Add(kRendererID); | 210 manager()->Add(kRendererID); |
227 manager()->Add(kRendererID2); | 211 manager()->Add(kRendererID2); |
228 | 212 |
229 manager()->ObserveActivity(kRendererID); | 213 manager()->ObserveActivity(kRendererID); |
230 SimulateInactivity(manager(), kRendererID2); | 214 SimulateInactivity(manager(), kRendererID2); |
231 | 215 |
232 manager()->ObserveStats(kRendererID, kStats.min_dead_capacity, | 216 manager()->ObserveStats(kRendererID, kStats.capacity, kStats.size); |
233 kStats.max_dead_capacity, kStats.capacity, | 217 manager()->ObserveStats(kRendererID2, kStats2.capacity, kStats2.size); |
234 kStats.live_size, kStats.dead_size); | |
235 manager()->ObserveStats(kRendererID2, kStats2.min_dead_capacity, | |
236 kStats2.max_dead_capacity, kStats2.capacity, | |
237 kStats2.live_size, kStats2.dead_size); | |
238 | |
239 manager()->SetGlobalSizeLimit(kStats.live_size + kStats.dead_size + | |
240 kStats2.live_size + kStats2.dead_size / 2); | |
241 | 218 |
242 AllocationStrategy strategy; | 219 AllocationStrategy strategy; |
243 | 220 |
| 221 manager()->SetGlobalSizeLimit(kStats.size + kStats2.size - 1); |
244 EXPECT_FALSE(AttemptTactic(manager(), | 222 EXPECT_FALSE(AttemptTactic(manager(), |
245 KEEP_CURRENT, | 223 KEEP_CURRENT, |
246 kStats, | 224 kStats, |
247 KEEP_CURRENT, | 225 KEEP_CURRENT, |
248 kStats2, | 226 kStats2, |
249 &strategy)); | 227 &strategy)); |
250 EXPECT_TRUE(strategy.empty()); | 228 EXPECT_TRUE(strategy.empty()); |
251 | 229 |
252 EXPECT_TRUE(AttemptTactic(manager(), | 230 manager()->SetGlobalSizeLimit(kStats.size + kStats2.size); |
253 KEEP_CURRENT, | 231 EXPECT_TRUE(AttemptTactic(manager(), KEEP_CURRENT, kStats, KEEP_CURRENT, |
254 kStats, | 232 kStats2, &strategy)); |
255 KEEP_LIVE, | |
256 kStats2, | |
257 &strategy)); | |
258 EXPECT_EQ(2U, strategy.size()); | 233 EXPECT_EQ(2U, strategy.size()); |
259 | 234 |
260 AllocationStrategy::iterator iter = strategy.begin(); | 235 AllocationStrategy::iterator iter = strategy.begin(); |
261 while (iter != strategy.end()) { | 236 while (iter != strategy.end()) { |
262 if (iter->first == kRendererID) | 237 if (iter->first == kRendererID) |
263 EXPECT_LE(kStats.live_size + kStats.dead_size, iter->second); | 238 EXPECT_LE(kStats.size, iter->second); |
264 else if (iter->first == kRendererID2) | 239 else if (iter->first == kRendererID2) |
265 EXPECT_LE(kStats2.live_size, iter->second); | 240 EXPECT_LE(kStats2.size, iter->second); |
266 else | 241 else |
267 ADD_FAILURE(); // Unexpected entry in strategy. | 242 ADD_FAILURE(); // Unexpected entry in strategy. |
268 ++iter; | 243 ++iter; |
269 } | 244 } |
270 | 245 |
271 manager()->Remove(kRendererID); | 246 manager()->Remove(kRendererID); |
272 manager()->Remove(kRendererID2); | 247 manager()->Remove(kRendererID2); |
273 } | 248 } |
274 | 249 |
275 TEST_F(WebCacheManagerTest, AddToStrategyTest) { | 250 TEST_F(WebCacheManagerTest, AddToStrategyTest) { |
276 manager()->Add(kRendererID); | 251 manager()->Add(kRendererID); |
277 manager()->Add(kRendererID2); | 252 manager()->Add(kRendererID2); |
278 | 253 |
279 std::set<int> renderer_set; | 254 std::set<int> renderer_set; |
280 renderer_set.insert(kRendererID); | 255 renderer_set.insert(kRendererID); |
281 renderer_set.insert(kRendererID2); | 256 renderer_set.insert(kRendererID2); |
282 | 257 |
283 manager()->ObserveStats(kRendererID, kStats.min_dead_capacity, | 258 manager()->ObserveStats(kRendererID, kStats.capacity, kStats.size); |
284 kStats.max_dead_capacity, kStats.capacity, | 259 manager()->ObserveStats(kRendererID2, kStats2.capacity, kStats2.size); |
285 kStats.live_size, kStats.dead_size); | |
286 manager()->ObserveStats(kRendererID2, kStats2.min_dead_capacity, | |
287 kStats2.max_dead_capacity, kStats2.capacity, | |
288 kStats2.live_size, kStats2.dead_size); | |
289 | 260 |
290 const uint64_t kExtraBytesToAllocate = 10 * 1024; | 261 const uint64_t kExtraBytesToAllocate = 10 * 1024; |
291 | 262 |
292 AllocationStrategy strategy; | 263 AllocationStrategy strategy; |
293 AddToStrategy(manager(), | 264 AddToStrategy(manager(), |
294 renderer_set, | 265 renderer_set, |
295 KEEP_CURRENT, | 266 KEEP_CURRENT, |
296 kExtraBytesToAllocate, | 267 kExtraBytesToAllocate, |
297 &strategy); | 268 &strategy); |
298 | 269 |
299 EXPECT_EQ(2U, strategy.size()); | 270 EXPECT_EQ(2U, strategy.size()); |
300 | 271 |
301 uint64_t total_bytes = 0; | 272 uint64_t total_bytes = 0; |
302 AllocationStrategy::iterator iter = strategy.begin(); | 273 AllocationStrategy::iterator iter = strategy.begin(); |
303 while (iter != strategy.end()) { | 274 while (iter != strategy.end()) { |
304 total_bytes += iter->second; | 275 total_bytes += iter->second; |
305 | 276 |
306 if (iter->first == kRendererID) | 277 if (iter->first == kRendererID) |
307 EXPECT_LE(kStats.live_size + kStats.dead_size, iter->second); | 278 EXPECT_LE(kStats.size, iter->second); |
308 else if (iter->first == kRendererID2) | 279 else if (iter->first == kRendererID2) |
309 EXPECT_LE(kStats2.live_size + kStats2.dead_size, iter->second); | 280 EXPECT_LE(kStats2.size, iter->second); |
310 else | 281 else |
311 ADD_FAILURE(); // Unexpected entry in strategy. | 282 ADD_FAILURE(); // Unexpected entry in strategy. |
312 ++iter; | 283 ++iter; |
313 } | 284 } |
314 | 285 |
315 uint64_t expected_total_bytes = kExtraBytesToAllocate + kStats.live_size + | 286 uint64_t expected_total_bytes = |
316 kStats.dead_size + kStats2.live_size + | 287 kExtraBytesToAllocate + kStats.size + kStats2.size; |
317 kStats2.dead_size; | |
318 | 288 |
319 EXPECT_GE(expected_total_bytes, total_bytes); | 289 EXPECT_GE(expected_total_bytes, total_bytes); |
320 | 290 |
321 manager()->Remove(kRendererID); | 291 manager()->Remove(kRendererID); |
322 manager()->Remove(kRendererID2); | 292 manager()->Remove(kRendererID2); |
323 } | 293 } |
324 | 294 |
325 // Regression test for http://crbug.com/12362. | 295 // Regression test for http://crbug.com/12362. |
326 // There are three operations in the following order will cause the crash: | 296 // There are three operations in the following order will cause the crash: |
327 // Remove(kRendererID) -> ObserveActivity(kRendererID) -> Remove(kRendererID2) | 297 // Remove(kRendererID) -> ObserveActivity(kRendererID) -> Remove(kRendererID2) |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 manager()->ReviseAllocationStrategy(); | 437 manager()->ReviseAllocationStrategy(); |
468 | 438 |
469 manager()->Remove(kRendererID); | 439 manager()->Remove(kRendererID); |
470 manager()->ReviseAllocationStrategy(); | 440 manager()->ReviseAllocationStrategy(); |
471 | 441 |
472 manager()->ObserveActivity(kRendererID); | 442 manager()->ObserveActivity(kRendererID); |
473 manager()->ReviseAllocationStrategy(); | 443 manager()->ReviseAllocationStrategy(); |
474 } | 444 } |
475 | 445 |
476 } // namespace web_cache | 446 } // namespace web_cache |
OLD | NEW |