11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright (c) 2011 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/web_cache/browser/web_cache_manager.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_thread.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing base::Time;
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing base::TimeDelta;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::BrowserThread;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing blink::WebCache;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace web_cache {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebCacheManagerTest : public testing::Test {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef WebCacheManager::StatsMap StatsMap;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef WebCacheManager::Allocation Allocation;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef WebCacheManager::AllocationStrategy AllocationStrategy;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const int kRendererID;
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const int kRendererID2;
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const WebCache::UsageStats kStats;
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const WebCache::UsageStats kStats2;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebCacheManagerTest()
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : ui_thread_(BrowserThread::UI, &message_loop_) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Thunks to access protected members of WebCacheManager
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static std::map<int, WebCacheManager::RendererInfo>& stats(
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        WebCacheManager* h) {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return h->stats_;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void SimulateInactivity(WebCacheManager* h, int renderer_id) {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    stats(h)[renderer_id].access = Time::Now() - TimeDelta::FromMinutes(
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        WebCacheManager::kRendererInactiveThresholdMinutes);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    h->FindInactiveRenderers();
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static std::set<int>& active_renderers(WebCacheManager* h) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return h->active_renderers_;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static std::set<int>& inactive_renderers(WebCacheManager* h) {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return h->inactive_renderers_;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void GatherStats(WebCacheManager* h,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          std::set<int> renderers,
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          WebCache::UsageStats* stats) {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    h->GatherStats(renderers, stats);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static size_t GetSize(int tactic,
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const WebCache::UsageStats& stats) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return WebCacheManager::GetSize(
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        static_cast<WebCacheManager::AllocationTactic>(tactic), stats);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool AttemptTactic(WebCacheManager* h,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            int active_tactic,
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const WebCache::UsageStats& active_stats,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            int inactive_tactic,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const WebCache::UsageStats& inactive_stats,
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            std::list< std::pair<int,size_t> >* strategy) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return h->AttemptTactic(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        static_cast<WebCacheManager::AllocationTactic>(active_tactic),
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        active_stats,
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        static_cast<WebCacheManager::AllocationTactic>(inactive_tactic),
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        inactive_stats,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        strategy);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void AddToStrategy(WebCacheManager* h,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            std::set<int> renderers,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            int tactic,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            size_t extra_bytes_to_allocate,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            std::list< std::pair<int,size_t> >* strategy) {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    h->AddToStrategy(renderers,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     static_cast<WebCacheManager::AllocationTactic>(tactic),
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     extra_bytes_to_allocate,
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     strategy);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DIVIDE_EVENLY = WebCacheManager::DIVIDE_EVENLY,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    KEEP_CURRENT_WITH_HEADROOM = WebCacheManager::KEEP_CURRENT_WITH_HEADROOM,
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    KEEP_CURRENT = WebCacheManager::KEEP_CURRENT,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    KEEP_LIVE_WITH_HEADROOM = WebCacheManager::KEEP_LIVE_WITH_HEADROOM,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    KEEP_LIVE = WebCacheManager::KEEP_LIVE,
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebCacheManager* manager() { return &manager_; }
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebCacheManager manager_;
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoop message_loop_;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserThread ui_thread_;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int WebCacheManagerTest::kRendererID = 146;
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int WebCacheManagerTest::kRendererID2 = 245;
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst WebCache::UsageStats WebCacheManagerTest::kStats = {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    0,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    1024 * 1024,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    1024 * 1024,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    256 * 1024,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    512,
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst WebCache::UsageStats WebCacheManagerTest::kStats2 = {
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    0,
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    2 * 1024 * 1024,
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    2 * 1024 * 1024,
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    2 * 256 * 1024,
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    2 * 512,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic bool operator==(const WebCache::UsageStats& lhs,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const WebCache::UsageStats& rhs) {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !::memcmp(&lhs, &rhs, sizeof(WebCache::UsageStats));
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, AddRemoveRendererTest) {
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID));
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID));
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, ActiveInactiveTest) {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID));
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID));
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInactivity(manager(), kRendererID);
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).count(kRendererID));
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, inactive_renderers(manager()).count(kRendererID));
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, active_renderers(manager()).count(kRendererID));
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).count(kRendererID));
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, ObserveStatsTest) {
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, stats(manager()).size());
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID, kStats);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1U, stats(manager()).size());
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(kStats == stats(manager())[kRendererID]);
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, SetGlobalSizeLimitTest) {
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t limit = manager()->GetDefaultGlobalSizeLimit();
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->SetGlobalSizeLimit(limit);
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(limit, manager()->global_size_limit());
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->SetGlobalSizeLimit(0);
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, manager()->global_size_limit());
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, GatherStatsTest) {
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID, kStats);
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID2, kStats2);
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::set<int> renderer_set;
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  renderer_set.insert(kRendererID);
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebCache::UsageStats stats;
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GatherStats(manager(), renderer_set, &stats);
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(kStats == stats);
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  renderer_set.insert(kRendererID2);
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GatherStats(manager(), renderer_set, &stats);
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebCache::UsageStats expected_stats = kStats;
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_stats.minDeadCapacity += kStats2.minDeadCapacity;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_stats.maxDeadCapacity += kStats2.maxDeadCapacity;
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_stats.capacity += kStats2.capacity;
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_stats.liveSize += kStats2.liveSize;
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_stats.deadSize += kStats2.deadSize;
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(expected_stats == stats);
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, GetSizeTest) {
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, GetSize(DIVIDE_EVENLY, kStats));
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LT(256 * 1024u + 512, GetSize(KEEP_CURRENT_WITH_HEADROOM, kStats));
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(256 * 1024u + 512, GetSize(KEEP_CURRENT, kStats));
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LT(256 * 1024u, GetSize(KEEP_LIVE_WITH_HEADROOM, kStats));
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(256 * 1024u, GetSize(KEEP_LIVE, kStats));
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, AttemptTacticTest) {
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInactivity(manager(), kRendererID2);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID, kStats);
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID2, kStats2);
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->SetGlobalSizeLimit(kStats.liveSize + kStats.deadSize +
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        kStats2.liveSize + kStats2.deadSize/2);
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AllocationStrategy strategy;
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(AttemptTactic(manager(),
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             KEEP_CURRENT,
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             kStats,
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             KEEP_CURRENT,
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             kStats2,
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             &strategy));
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(strategy.empty());
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(AttemptTactic(manager(),
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            KEEP_CURRENT,
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            kStats,
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            KEEP_LIVE,
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            kStats2,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            &strategy));
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2U, strategy.size());
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AllocationStrategy::iterator iter = strategy.begin();
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (iter != strategy.end()) {
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (iter->first == kRendererID)
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_LE(kStats.liveSize + kStats.deadSize, iter->second);
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (iter->first == kRendererID2)
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_LE(kStats2.liveSize, iter->second);
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ADD_FAILURE();   // Unexpected entry in strategy.
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++iter;
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest, AddToStrategyTest) {
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::set<int> renderer_set;
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  renderer_set.insert(kRendererID);
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  renderer_set.insert(kRendererID2);
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID, kStats);
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveStats(kRendererID2, kStats2);
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const size_t kExtraBytesToAllocate = 10 * 1024;
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AllocationStrategy strategy;
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddToStrategy(manager(),
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                renderer_set,
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                KEEP_CURRENT,
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                kExtraBytesToAllocate,
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                &strategy);
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2U, strategy.size());
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t total_bytes = 0;
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AllocationStrategy::iterator iter = strategy.begin();
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (iter != strategy.end()) {
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    total_bytes += iter->second;
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (iter->first == kRendererID)
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_LE(kStats.liveSize + kStats.deadSize, iter->second);
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (iter->first == kRendererID2)
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_LE(kStats2.liveSize + kStats2.deadSize, iter->second);
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ADD_FAILURE();  // Unexpected entry in strategy.
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++iter;
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t expected_total_bytes = kExtraBytesToAllocate +
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                kStats.liveSize + kStats.deadSize +
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                kStats2.liveSize + kStats2.deadSize;
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_GE(expected_total_bytes, total_bytes);
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Regression test for http://crbug.com/12362.
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// There are three operations in the following order will cause the crash:
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Remove(kRendererID) -> ObserveActivity(kRendererID) -> Remove(kRendererID2)
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// To prevent similar failures in the future, 6 tests are added in total to
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// cover all the possible orderings of these three operations.
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest,
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       CallRemoveRendererAndObserveActivityInAnyOrderShouldNotCrashTest_1) {
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add, Remove, and ObserveActivity trigger deferred
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls to ReviseAllocationStrategy and that we call it directly after each
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation to sidestep the need to wait for an unobservable background
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation.
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The following order will cause a crash in http://crbug.com/12362.
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest,
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       CallRemoveRendererAndObserveActivityInAnyOrderShouldNotCrashTest_2) {
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add, Remove, and ObserveActivity trigger deferred
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls to ReviseAllocationStrategy and that we call it directly after each
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation to sidestep the need to wait for an unobservable background
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation.
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest,
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       CallRemoveRendererAndObserveActivityInAnyOrderShouldNotCrashTest_3) {
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add, Remove, and ObserveActivity trigger deferred
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls to ReviseAllocationStrategy and that we call it directly after each
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation to sidestep the need to wait for an unobservable background
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation.
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest,
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       CallRemoveRendererAndObserveActivityInAnyOrderShouldNotCrashTest_4) {
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add, Remove, and ObserveActivity trigger deferred
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls to ReviseAllocationStrategy and that we call it directly after each
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation to sidestep the need to wait for an unobservable background
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation.
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest,
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       CallRemoveRendererAndObserveActivityInAnyOrderShouldNotCrashTest_5) {
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add, Remove, and ObserveActivity trigger deferred
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls to ReviseAllocationStrategy and that we call it directly after each
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation to sidestep the need to wait for an unobservable background
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation.
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WebCacheManagerTest,
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       CallRemoveRendererAndObserveActivityInAnyOrderShouldNotCrashTest_6) {
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, active_renderers(manager()).size());
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0U, inactive_renderers(manager()).size());
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add, Remove, and ObserveActivity trigger deferred
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls to ReviseAllocationStrategy and that we call it directly after each
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation to sidestep the need to wait for an unobservable background
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // operation.
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID);
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Add(kRendererID2);
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID2);
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->Remove(kRendererID);
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ObserveActivity(kRendererID);
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  manager()->ReviseAllocationStrategy();
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace web_cache
467