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