11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 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 <iostream>
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/history/history_service.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/history/history_service_factory.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetch_predictor.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_profile.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/browser/history_types.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_thread.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gmock/include/gmock/gmock.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing testing::ContainerEq;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing testing::Pointee;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing testing::SetArgPointee;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing testing::StrictMock;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace predictors {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef ResourcePrefetchPredictor::URLRequestSummary URLRequestSummary;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef ResourcePrefetchPredictorTables::ResourceRow ResourceRow;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef std::vector<ResourceRow> ResourceRows;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef ResourcePrefetchPredictorTables::PrefetchData PrefetchData;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// For printing failures nicely.
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintTo(const ResourceRow& row, ::std::ostream* os) {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *os << "[" << row.primary_key << "," << row.resource_url
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "," << row.resource_type << "," << row.number_of_hits
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "," << row.number_of_misses << "," << row.consecutive_misses
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "," << row.average_position << "," << row.score << "]";
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintTo(const PrefetchData& data, ::std::ostream* os) {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *os << "[" << data.key_type << "," << data.primary_key
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "," << data.last_visit.ToInternalValue() << "]\n";
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ResourceRows::const_iterator it = data.resources.begin();
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != data.resources.end(); ++it) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *os << "\t\t";
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrintTo(*it, os);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *os << "\n";
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MockResourcePrefetchPredictorTables
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public ResourcePrefetchPredictorTables {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockResourcePrefetchPredictorTables() { }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD2(GetAllData, void(PrefetchDataMap* url_data_map,
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                PrefetchDataMap* host_data_map));
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD2(UpdateData, void(const PrefetchData& url_data,
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                const PrefetchData& host_data));
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD2(DeleteData, void(const std::vector<std::string>& urls,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                const std::vector<std::string>& hosts));
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD2(DeleteSingleDataPoint, void(const std::string& key,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           PrefetchKeyType key_type));
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_METHOD0(DeleteAllData, void());
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ~MockResourcePrefetchPredictorTables() { }
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ResourcePrefetchPredictorTest : public testing::Test {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResourcePrefetchPredictorTest();
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ResourcePrefetchPredictorTest();
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUp() OVERRIDE;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void TearDown() OVERRIDE;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddUrlToHistory(const std::string& url, int visit_count) {
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    HistoryServiceFactory::GetForProfile(profile_.get(),
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         Profile::EXPLICIT_ACCESS)->
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        AddPageWithDetails(
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            GURL(url),
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::string16(),
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            visit_count,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            0,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::Time::Now(),
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            false,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            history::SOURCE_BROWSED);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_->BlockUntilHistoryProcessesPendingRequests();
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NavigationID CreateNavigationID(int process_id,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  int render_frame_id,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  const std::string& main_frame_url) {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NavigationID navigation_id;
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    navigation_id.render_process_id = process_id;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    navigation_id.render_frame_id = render_frame_id;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    navigation_id.main_frame_url = GURL(main_frame_url);
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    navigation_id.creation_time = base::TimeTicks::Now();
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return navigation_id;
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResourcePrefetchPredictor::URLRequestSummary CreateURLRequestSummary(
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int process_id,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int render_frame_id,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& main_frame_url,
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& resource_url,
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::ResourceType resource_type,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& mime_type,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool was_cached) {
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ResourcePrefetchPredictor::URLRequestSummary summary;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    summary.navigation_id = CreateNavigationID(process_id, render_frame_id,
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               main_frame_url);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    summary.resource_url = GURL(resource_url);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    summary.resource_type = resource_type;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    summary.mime_type = mime_type;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    summary.was_cached = was_cached;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return summary;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitializePredictor() {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    predictor_->StartInitialization();
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::RunLoop loop;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    loop.RunUntilIdle();  // Runs the DB lookup.
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_->BlockUntilHistoryProcessesPendingRequests();
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool URLRequestSummaryAreEqual(const URLRequestSummary& lhs,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 const URLRequestSummary& rhs) {
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return lhs.navigation_id == rhs.navigation_id &&
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        lhs.resource_url == rhs.resource_url &&
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        lhs.resource_type == rhs.resource_type &&
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        lhs.mime_type == rhs.mime_type &&
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        lhs.was_cached == rhs.was_cached;
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ResetPredictor() {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ResourcePrefetchPredictorConfig config;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.max_urls_to_track = 3;
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.max_hosts_to_track = 2;
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.min_url_visit_count = 2;
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.max_resources_per_entry = 4;
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.max_consecutive_misses = 2;
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(shishir): Enable the prefetching mode in the tests.
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.mode |= ResourcePrefetchPredictorConfig::URL_LEARNING;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    config.mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    predictor_.reset(new ResourcePrefetchPredictor(config, profile_.get()));
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    predictor_->set_mock_tables(mock_tables_);
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitializeSampleData();
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoop loop_;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserThread ui_thread_;
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserThread db_thread_;
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<TestingProfile> profile_;
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourcePrefetchPredictor> predictor_;
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<StrictMock<MockResourcePrefetchPredictorTables> > mock_tables_;
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchDataMap test_url_data_;
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchDataMap test_host_data_;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData empty_url_data_;
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData empty_host_data_;
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTest::ResourcePrefetchPredictorTest()
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : loop_(base::MessageLoop::TYPE_DEFAULT),
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui_thread_(content::BrowserThread::UI, &loop_),
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      db_thread_(content::BrowserThread::DB, &loop_),
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile_(new TestingProfile()),
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mock_tables_(new StrictMock<MockResourcePrefetchPredictorTables>()),
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      empty_url_data_(PREFETCH_KEY_TYPE_URL, std::string()),
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      empty_host_data_(PREFETCH_KEY_TYPE_HOST, std::string()) {}
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTest::~ResourcePrefetchPredictorTest() {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_.reset(NULL);
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  loop_.RunUntilIdle();
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTest::SetUp() {
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializeSampleData();
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(profile_->CreateHistoryService(true, false));
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_->BlockUntilHistoryProcessesPendingRequests();
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(HistoryServiceFactory::GetForProfile(profile_.get(),
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   Profile::EXPLICIT_ACCESS));
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Initialize the predictor with empty data.
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResetPredictor();
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(predictor_->initialization_state_,
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ResourcePrefetchPredictor::NOT_INITIALIZED);
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(),
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         Pointee(ContainerEq(PrefetchDataMap()))));
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializePredictor();
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.empty());
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(predictor_->initialization_state_,
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ResourcePrefetchPredictor::INITIALIZED);
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTest::TearDown() {
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_.reset(NULL);
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_->DestroyHistoryService();
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTest::InitializeSampleData() {
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {  // Url data.
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefetchData google(PREFETCH_KEY_TYPE_URL, "http://www.google.com/");
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    google.last_visit = base::Time::FromInternalValue(1);
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    google.resources.push_back(ResourceRow(std::string(),
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/style1.css",
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_STYLESHEET,
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           3,
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2,
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1.0));
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    google.resources.push_back(ResourceRow(std::string(),
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script3.js",
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           4,
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.1));
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    google.resources.push_back(ResourceRow(std::string(),
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script4.js",
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           11,
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.1));
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    google.resources.push_back(ResourceRow(std::string(),
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/image1.png",
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_IMAGE,
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           6,
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           3,
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.2));
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    google.resources.push_back(ResourceRow(std::string(),
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/a.font",
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_LAST_TYPE,
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2,
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           5.1));
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefetchData reddit(PREFETCH_KEY_TYPE_URL, "http://www.reddit.com/");
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    reddit.last_visit = base::Time::FromInternalValue(2);
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    reddit.resources
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .push_back(ResourceRow(std::string(),
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               "http://reddit-resource.com/script1.js",
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               content::RESOURCE_TYPE_SCRIPT,
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               4,
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1.0));
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    reddit.resources
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .push_back(ResourceRow(std::string(),
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               "http://reddit-resource.com/script2.js",
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               content::RESOURCE_TYPE_SCRIPT,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               2,
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               2.1));
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefetchData yahoo(PREFETCH_KEY_TYPE_URL, "http://www.yahoo.com/");
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    yahoo.last_visit = base::Time::FromInternalValue(3);
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    yahoo.resources.push_back(ResourceRow(std::string(),
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          "http://google.com/image.png",
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          content::RESOURCE_TYPE_IMAGE,
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          20,
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          1,
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          0,
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          10.0));
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_url_data_.clear();
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_url_data_.insert(std::make_pair("http://www.google.com/", google));
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_url_data_.insert(std::make_pair("http://www.reddit.com/", reddit));
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_url_data_.insert(std::make_pair("http://www.yahoo.com/", yahoo));
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {  // Host data.
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefetchData facebook(PREFETCH_KEY_TYPE_HOST, "www.facebook.com");
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    facebook.last_visit = base::Time::FromInternalValue(4);
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    facebook.resources
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .push_back(ResourceRow(std::string(),
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               "http://www.facebook.com/style.css",
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               content::RESOURCE_TYPE_STYLESHEET,
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               5,
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               2,
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1.1));
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    facebook.resources
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .push_back(ResourceRow(std::string(),
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               "http://www.facebook.com/script.js",
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               content::RESOURCE_TYPE_SCRIPT,
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               4,
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               2.1));
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    facebook.resources
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .push_back(ResourceRow(std::string(),
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               "http://www.facebook.com/image.png",
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               content::RESOURCE_TYPE_IMAGE,
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               6,
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               3,
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               2.2));
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    facebook.resources.push_back(ResourceRow(std::string(),
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             "http://www.facebook.com/a.font",
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             content::RESOURCE_TYPE_LAST_TYPE,
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             2,
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             0,
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             0,
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             5.1));
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    facebook.resources
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .push_back(ResourceRow(std::string(),
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               "http://www.resources.facebook.com/script.js",
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               content::RESOURCE_TYPE_SCRIPT,
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               11,
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               8.5));
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefetchData yahoo(PREFETCH_KEY_TYPE_HOST, "www.yahoo.com");
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    yahoo.last_visit = base::Time::FromInternalValue(5);
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    yahoo.resources.push_back(ResourceRow(std::string(),
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          "http://google.com/image.png",
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          content::RESOURCE_TYPE_IMAGE,
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          20,
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          1,
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          0,
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          10.0));
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_host_data_.clear();
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_host_data_.insert(std::make_pair("www.facebook.com", facebook));
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_host_data_.insert(std::make_pair("www.yahoo.com", yahoo));
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, LazilyInitializeEmpty) {
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Tests that the predictor initializes correctly without any data.
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->url_table_cache_->empty());
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->host_table_cache_->empty());
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Tests that the history and the db tables data are loaded correctly.
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddUrlToHistory("http://www.google.com/", 4);
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddUrlToHistory("http://www.yahoo.com/", 2);
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(),
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         Pointee(ContainerEq(PrefetchDataMap()))))
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      SetArgPointee<1>(test_host_data_)));
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResetPredictor();
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializePredictor();
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that the internal variables correctly initialized.
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(predictor_->initialization_state_,
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ResourcePrefetchPredictor::INITIALIZED);
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.empty());
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(test_url_data_, *predictor_->url_table_cache_);
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(test_host_data_, *predictor_->host_table_cache_);
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, NavigationNotRecorded) {
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Single navigation but history count is low, so should not record.
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddUrlToHistory("http://www.google.com", 1);
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary main_frame =
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLRequest(main_frame);
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Now add a few subresources.
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource1 = CreateURLRequestSummary(
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/style1.css",
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", false);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource1);
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource2 = CreateURLRequestSummary(
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script1.js",
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource2);
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource3 = CreateURLRequestSummary(
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script2.js",
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource3);
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com");
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/style1.css",
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_STYLESHEET,
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1.0));
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/script1.js",
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_SCRIPT,
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            2.0));
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/script2.js",
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_SCRIPT,
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            3.0));
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnNavigationComplete(main_frame.navigation_id);
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_->BlockUntilHistoryProcessesPendingRequests();
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) {
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Single navigation that will be recorded. Will check for duplicate
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // resources and also for number of resources saved.
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddUrlToHistory("http://www.google.com", 4);
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary main_frame =
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLRequest(main_frame);
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource1 = CreateURLRequestSummary(
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/style1.css",
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", false);
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource1);
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource2 = CreateURLRequestSummary(
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script1.js",
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource2);
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource3 = CreateURLRequestSummary(
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script2.js",
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource3);
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource4 = CreateURLRequestSummary(
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script1.js",
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", true);
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource4);
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource5 = CreateURLRequestSummary(
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/image1.png",
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_IMAGE, "image/png", false);
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource5);
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource6 = CreateURLRequestSummary(
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/image2.png",
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_IMAGE, "image/png", false);
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource6);
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource7 = CreateURLRequestSummary(
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/style2.css",
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", true);
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource7);
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.google.com/");
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/style1.css",
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_STYLESHEET,
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1.0));
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script1.js",
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.0));
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script2.js",
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           3.0));
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/style2.css",
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_STYLESHEET,
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           7.0));
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_));
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com");
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources = url_data.resources;
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnNavigationComplete(main_frame.navigation_id);
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_->BlockUntilHistoryProcessesPendingRequests();
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Tests that navigation is recorded correctly for URL already present in
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the database cache.
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddUrlToHistory("http://www.google.com", 4);
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(),
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         Pointee(ContainerEq(PrefetchDataMap()))))
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      SetArgPointee<1>(test_host_data_)));
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResetPredictor();
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializePredictor();
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(predictor_->url_table_cache_->size()));
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, static_cast<int>(predictor_->host_table_cache_->size()));
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary main_frame =
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLRequest(main_frame);
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource1 = CreateURLRequestSummary(
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/style1.css",
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", false);
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource1);
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource2 = CreateURLRequestSummary(
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script1.js",
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource2);
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource3 = CreateURLRequestSummary(
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script2.js",
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource3);
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource4 = CreateURLRequestSummary(
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script1.js",
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", true);
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource4);
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource5 = CreateURLRequestSummary(
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/image1.png",
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_IMAGE, "image/png", false);
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource5);
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource6 = CreateURLRequestSummary(
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/image2.png",
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_IMAGE, "image/png", false);
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource6);
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource7 = CreateURLRequestSummary(
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/style2.css",
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", true);
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource7);
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.google.com/");
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/style1.css",
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_STYLESHEET,
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           4,
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2,
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1.0));
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script1.js",
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.0));
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script4.js",
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           11,
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.1));
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://google.com/script2.js",
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_SCRIPT,
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           3.0));
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_));
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *mock_tables_.get(),
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST));
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com");
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/style1.css",
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_STYLESHEET,
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1.0));
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/script1.js",
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_SCRIPT,
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            2.0));
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/script2.js",
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_SCRIPT,
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            3.0));
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources.push_back(ResourceRow(std::string(),
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            "http://google.com/style2.css",
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            content::RESOURCE_TYPE_STYLESHEET,
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            1,
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            0,
6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            7.0));
6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnNavigationComplete(main_frame.navigation_id);
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_->BlockUntilHistoryProcessesPendingRequests();
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Tests that a URL is deleted before another is added if the cache is full.
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddUrlToHistory("http://www.nike.com/", 4);
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(),
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         Pointee(ContainerEq(PrefetchDataMap()))))
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      SetArgPointee<1>(test_host_data_)));
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResetPredictor();
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitializePredictor();
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(predictor_->url_table_cache_->size()));
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, static_cast<int>(predictor_->host_table_cache_->size()));
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary main_frame =
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.nike.com",
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.nike.com",
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLRequest(main_frame);
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource1 = CreateURLRequestSummary(
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.nike.com",  "http://nike.com/style1.css",
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", false);
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource1);
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource2 = CreateURLRequestSummary(
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.nike.com",  "http://nike.com/image2.png",
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_IMAGE, "image/png", false);
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->RecordURLResponse(resource2);
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *mock_tables_.get(),
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DeleteSingleDataPoint("http://www.google.com/", PREFETCH_KEY_TYPE_URL));
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *mock_tables_.get(),
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST));
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.nike.com/");
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://nike.com/style1.css",
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_STYLESHEET,
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1.0));
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url_data.resources.push_back(ResourceRow(std::string(),
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           "http://nike.com/image2.png",
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           content::RESOURCE_TYPE_IMAGE,
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           1,
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           0,
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           2.0));
6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_));
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.nike.com");
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  host_data.resources = url_data.resources;
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnNavigationComplete(main_frame.navigation_id);
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_->BlockUntilHistoryProcessesPendingRequests();
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, DeleteUrls) {
7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add some dummy entries to cache.
7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->url_table_cache_->insert(std::make_pair(
7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "http://www.google.com/page1.html",
7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_URL, "http://www.google.com/page1.html")));
7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->url_table_cache_->insert(std::make_pair(
7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "http://www.google.com/page2.html",
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_URL, "http://www.google.com/page2.html")));
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->url_table_cache_->insert(std::make_pair(
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "http://www.yahoo.com/",
7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_URL, "http://www.yahoo.com/")));
7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->url_table_cache_->insert(std::make_pair(
7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "http://www.apple.com/",
7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_URL, "http://www.apple.com/")));
7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->url_table_cache_->insert(std::make_pair(
7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "http://www.nike.com/",
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_URL, "http://www.nike.com/")));
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->host_table_cache_->insert(std::make_pair(
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "www.google.com",
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_HOST, "www.google.com")));
7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->host_table_cache_->insert(std::make_pair(
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "www.yahoo.com",
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_HOST, "www.yahoo.com")));
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->host_table_cache_->insert(std::make_pair(
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "www.apple.com",
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchData(PREFETCH_KEY_TYPE_HOST, "www.apple.com")));
7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  history::URLRows rows;
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rows.push_back(history::URLRow(GURL("http://www.google.com/page2.html")));
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rows.push_back(history::URLRow(GURL("http://www.apple.com")));
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rows.push_back(history::URLRow(GURL("http://www.nike.com")));
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> urls_to_delete, hosts_to_delete;
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  urls_to_delete.push_back("http://www.google.com/page2.html");
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  urls_to_delete.push_back("http://www.apple.com/");
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  urls_to_delete.push_back("http://www.nike.com/");
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hosts_to_delete.push_back("www.google.com");
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hosts_to_delete.push_back("www.apple.com");
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *mock_tables_.get(),
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DeleteData(ContainerEq(urls_to_delete), ContainerEq(hosts_to_delete)));
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->DeleteUrls(rows);
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, static_cast<int>(predictor_->url_table_cache_->size()));
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->host_table_cache_->size()));
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_tables_.get(), DeleteAllData());
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->DeleteAllUrls();
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->url_table_cache_->empty());
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->host_table_cache_->empty());
7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, OnMainFrameRequest) {
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary1 =
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary2 =
7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              2,
7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary3 =
7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(2,
7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.yahoo.com",
7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.yahoo.com",
7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary1);
7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary2);
7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, static_cast<int>(predictor_->inflight_navigations_.size()));
7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary3);
7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(predictor_->inflight_navigations_.size()));
7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Insert anther with same navigation id. It should replace.
7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary4 =
7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.nike.com",
7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.nike.com",
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary5 =
8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              2,
8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary4);
8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(predictor_->inflight_navigations_.size()));
8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Change this creation time so that it will go away on the next insert.
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  summary5.navigation_id.creation_time = base::TimeTicks::Now() -
8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeDelta::FromDays(1);
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary5);
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(predictor_->inflight_navigations_.size()));
8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary6 =
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(3,
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.shoes.com",
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.shoes.com",
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary6);
8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(predictor_->inflight_navigations_.size()));
8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.find(summary3.navigation_id) !=
8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              predictor_->inflight_navigations_.end());
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.find(summary4.navigation_id) !=
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              predictor_->inflight_navigations_.end());
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.find(summary6.navigation_id) !=
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              predictor_->inflight_navigations_.end());
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, OnMainFrameRedirect) {
8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary1 =
8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary2 =
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              2,
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary summary3 =
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(2,
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.yahoo.com",
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.yahoo.com",
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRedirect(summary1);
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.empty());
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary1);
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(summary2);
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, static_cast<int>(predictor_->inflight_navigations_.size()));
8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRedirect(summary3);
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, static_cast<int>(predictor_->inflight_navigations_.size()));
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRedirect(summary1);
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRedirect(summary2);
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.empty());
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ResourcePrefetchPredictorTest, OnSubresourceResponse) {
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If there is no inflight navigation, nothing happens.
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource1 = CreateURLRequestSummary(
8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/style1.css",
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_STYLESHEET, "text/css", false);
8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnSubresourceResponse(resource1);
8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(predictor_->inflight_navigations_.empty());
8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add an inflight navigation.
8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary main_frame1 =
8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreateURLRequestSummary(1,
8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              1,
8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              "http://www.google.com",
8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              content::RESOURCE_TYPE_MAIN_FRAME,
8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              std::string(),
8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              false);
8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnMainFrameRequest(main_frame1);
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Now add a few subresources.
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource2 = CreateURLRequestSummary(
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script1.js",
9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  URLRequestSummary resource3 = CreateURLRequestSummary(
9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1, 1, "http://www.google.com",  "http://google.com/script2.js",
9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::RESOURCE_TYPE_SCRIPT, "text/javascript", false);
9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnSubresourceResponse(resource1);
9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnSubresourceResponse(resource2);
9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  predictor_->OnSubresourceResponse(resource3);
9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, static_cast<int>(predictor_->inflight_navigations_.size()));
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, static_cast<int>(
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      predictor_->inflight_navigations_[main_frame1.navigation_id]->size()));
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(URLRequestSummaryAreEqual(
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource1,
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      predictor_->inflight_navigations_[main_frame1.navigation_id]->at(0)));
9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(URLRequestSummaryAreEqual(
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource2,
9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      predictor_->inflight_navigations_[main_frame1.navigation_id]->at(1)));
9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(URLRequestSummaryAreEqual(
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource3,
9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      predictor_->inflight_navigations_[main_frame1.navigation_id]->at(2)));
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace predictors
926