1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/renderer_host/web_cache_manager.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::Time; 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::TimeDelta; 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebCache; 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebCacheManagerTest : public testing::Test { 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef WebCacheManager::StatsMap StatsMap; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef WebCacheManager::Allocation Allocation; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef WebCacheManager::AllocationStrategy AllocationStrategy; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kRendererID; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kRendererID2; 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const WebCache::UsageStats kStats; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const WebCache::UsageStats kStats2; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen WebCacheManagerTest() 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : ui_thread_(BrowserThread::UI, &message_loop_) { 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Thunks to access protected members of WebCacheManager 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static std::map<int, WebCacheManager::RendererInfo>& stats( 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCacheManager* h) { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return h->stats_; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void SimulateInactivity(WebCacheManager* h, int renderer_id) { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch stats(h)[renderer_id].access = Time::Now() - TimeDelta::FromMinutes( 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCacheManager::kRendererInactiveThresholdMinutes); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch h->FindInactiveRenderers(); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static std::set<int>& active_renderers(WebCacheManager* h) { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return h->active_renderers_; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static std::set<int>& inactive_renderers(WebCacheManager* h) { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return h->inactive_renderers_; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void GatherStats(WebCacheManager* h, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::set<int> renderers, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCache::UsageStats* stats) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch h->GatherStats(renderers, stats); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static size_t GetSize(int tactic, 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebCache::UsageStats& stats) { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return WebCacheManager::GetSize( 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<WebCacheManager::AllocationTactic>(tactic), stats); 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool AttemptTactic(WebCacheManager* h, 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int active_tactic, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebCache::UsageStats& active_stats, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int inactive_tactic, 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebCache::UsageStats& inactive_stats, 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::list< std::pair<int,size_t> >* strategy) { 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return h->AttemptTactic( 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<WebCacheManager::AllocationTactic>(active_tactic), 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch active_stats, 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<WebCacheManager::AllocationTactic>(inactive_tactic), 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch inactive_stats, 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch strategy); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void AddToStrategy(WebCacheManager* h, 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::set<int> renderers, 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tactic, 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t extra_bytes_to_allocate, 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::list< std::pair<int,size_t> >* strategy) { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch h->AddToStrategy(renderers, 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<WebCacheManager::AllocationTactic>(tactic), 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extra_bytes_to_allocate, 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch strategy); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum { 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DIVIDE_EVENLY = WebCacheManager::DIVIDE_EVENLY, 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_CURRENT_WITH_HEADROOM = WebCacheManager::KEEP_CURRENT_WITH_HEADROOM, 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_CURRENT = WebCacheManager::KEEP_CURRENT, 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_LIVE_WITH_HEADROOM = WebCacheManager::KEEP_LIVE_WITH_HEADROOM, 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_LIVE = WebCacheManager::KEEP_LIVE, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCacheManager* manager() { return &manager_; } 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCacheManager manager_; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop message_loop_; 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread ui_thread_; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int WebCacheManagerTest::kRendererID = 146; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int WebCacheManagerTest::kRendererID2 = 245; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst WebCache::UsageStats WebCacheManagerTest::kStats = { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1024 * 1024, 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1024 * 1024, 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256 * 1024, 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 512, 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst WebCache::UsageStats WebCacheManagerTest::kStats2 = { 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2 * 1024 * 1024, 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2 * 1024 * 1024, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2 * 256 * 1024, 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2 * 512, 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic bool operator==(const WebCache::UsageStats& lhs, 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebCache::UsageStats& rhs) { 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !::memcmp(&lhs, &rhs, sizeof(WebCache::UsageStats)); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, AddRemoveRendererTest) { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, active_renderers(manager()).size()); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, inactive_renderers(manager()).size()); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID)); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, active_renderers(manager()).size()); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, inactive_renderers(manager()).size()); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, ActiveInactiveTest) { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveActivity(kRendererID); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID)); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SimulateInactivity(manager(), kRendererID); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, active_renderers(manager()).count(kRendererID)); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, inactive_renderers(manager()).count(kRendererID)); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveActivity(kRendererID); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID)); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID)); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, ObserveStatsTest) { 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, stats(manager()).size()); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID, kStats); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, stats(manager()).size()); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(kStats == stats(manager())[kRendererID]); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, SetGlobalSizeLimitTest) { 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t limit = manager()->GetDefaultGlobalSizeLimit(); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->SetGlobalSizeLimit(limit); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(limit, manager()->global_size_limit()); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->SetGlobalSizeLimit(0); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, manager()->global_size_limit()); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, GatherStatsTest) { 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID2); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID, kStats); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID2, kStats2); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::set<int> renderer_set; 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_set.insert(kRendererID); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCache::UsageStats stats; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GatherStats(manager(), renderer_set, &stats); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(kStats == stats); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_set.insert(kRendererID2); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GatherStats(manager(), renderer_set, &stats); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCache::UsageStats expected_stats = kStats; 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_stats.minDeadCapacity += kStats2.minDeadCapacity; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_stats.maxDeadCapacity += kStats2.maxDeadCapacity; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_stats.capacity += kStats2.capacity; 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_stats.liveSize += kStats2.liveSize; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected_stats.deadSize += kStats2.deadSize; 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(expected_stats == stats); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID2); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, GetSizeTest) { 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, GetSize(DIVIDE_EVENLY, kStats)); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_LT(256 * 1024u + 512, GetSize(KEEP_CURRENT_WITH_HEADROOM, kStats)); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(256 * 1024u + 512, GetSize(KEEP_CURRENT, kStats)); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_LT(256 * 1024u, GetSize(KEEP_LIVE_WITH_HEADROOM, kStats)); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(256 * 1024u, GetSize(KEEP_LIVE, kStats)); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, AttemptTacticTest) { 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID2); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveActivity(kRendererID); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SimulateInactivity(manager(), kRendererID2); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID, kStats); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID2, kStats2); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->SetGlobalSizeLimit(kStats.liveSize + kStats.deadSize + 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats2.liveSize + kStats2.deadSize/2); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AllocationStrategy strategy; 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AttemptTactic(manager(), 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_CURRENT, 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats, 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_CURRENT, 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats2, 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &strategy)); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(strategy.empty()); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AttemptTactic(manager(), 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_CURRENT, 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats, 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_LIVE, 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats2, 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &strategy)); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, strategy.size()); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AllocationStrategy::iterator iter = strategy.begin(); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (iter != strategy.end()) { 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (iter->first == kRendererID) 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_LE(kStats.liveSize + kStats.deadSize, iter->second); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else if (iter->first == kRendererID2) 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_LE(kStats2.liveSize, iter->second); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE("Unexpected entry in strategy"); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++iter; 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID2); 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebCacheManagerTest, AddToStrategyTest) { 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Add(kRendererID2); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::set<int> renderer_set; 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_set.insert(kRendererID); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_set.insert(kRendererID2); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID, kStats); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->ObserveStats(kRendererID2, kStats2); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const size_t kExtraBytesToAllocate = 10 * 1024; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AllocationStrategy strategy; 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddToStrategy(manager(), 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_set, 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch KEEP_CURRENT, 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kExtraBytesToAllocate, 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &strategy); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, strategy.size()); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t total_bytes = 0; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AllocationStrategy::iterator iter = strategy.begin(); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (iter != strategy.end()) { 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch total_bytes += iter->second; 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (iter->first == kRendererID) 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_LE(kStats.liveSize + kStats.deadSize, iter->second); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else if (iter->first == kRendererID2) 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_LE(kStats2.liveSize + kStats2.deadSize, iter->second); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE("Unexpected entry in strategy"); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++iter; 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t expected_total_bytes = kExtraBytesToAllocate + 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats.liveSize + kStats.deadSize + 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStats2.liveSize + kStats2.deadSize; 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_GE(expected_total_bytes, total_bytes); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager()->Remove(kRendererID2); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 311