| Index: chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| diff --git a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| index c2bd4a4bc23e88322694cb25c3a7e5b74294dde2..66835543dd141f9e3a07bc61af9cb8902d888c60 100644
|
| --- a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| @@ -36,9 +36,11 @@ namespace predictors {
|
|
|
| typedef ResourcePrefetchPredictor::URLRequestSummary URLRequestSummary;
|
| typedef ResourcePrefetchPredictorTables::ResourceRow ResourceRow;
|
| -typedef std::vector<ResourceRow> ResourceRows;
|
| +typedef ResourcePrefetchPredictorTables::RedirectRow RedirectRow;
|
| typedef ResourcePrefetchPredictorTables::PrefetchData PrefetchData;
|
| typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap;
|
| +typedef ResourcePrefetchPredictorTables::RedirectData RedirectData;
|
| +typedef ResourcePrefetchPredictorTables::RedirectDataMap RedirectDataMap;
|
|
|
| // For printing failures nicely.
|
| void PrintTo(const ResourceRow& row, ::std::ostream* os) {
|
| @@ -52,10 +54,9 @@ void PrintTo(const ResourceRow& row, ::std::ostream* os) {
|
| void PrintTo(const PrefetchData& data, ::std::ostream* os) {
|
| *os << "[" << data.key_type << "," << data.primary_key
|
| << "," << data.last_visit.ToInternalValue() << "]\n";
|
| - for (ResourceRows::const_iterator it = data.resources.begin();
|
| - it != data.resources.end(); ++it) {
|
| + for (const ResourceRow& resource : data.resources) {
|
| *os << "\t\t";
|
| - PrintTo(*it, os);
|
| + PrintTo(resource, os);
|
| *os << "\n";
|
| }
|
| }
|
| @@ -148,14 +149,26 @@ class MockResourcePrefetchPredictorTables
|
| public:
|
| MockResourcePrefetchPredictorTables() { }
|
|
|
| - MOCK_METHOD2(GetAllData, void(PrefetchDataMap* url_data_map,
|
| - PrefetchDataMap* host_data_map));
|
| - MOCK_METHOD2(UpdateData, void(const PrefetchData& url_data,
|
| - const PrefetchData& host_data));
|
| - MOCK_METHOD2(DeleteData, void(const std::vector<std::string>& urls,
|
| - const std::vector<std::string>& hosts));
|
| - MOCK_METHOD2(DeleteSingleDataPoint, void(const std::string& key,
|
| - PrefetchKeyType key_type));
|
| + MOCK_METHOD4(GetAllData,
|
| + void(PrefetchDataMap* url_data_map,
|
| + PrefetchDataMap* host_data_map,
|
| + RedirectDataMap* url_redirect_data_map,
|
| + RedirectDataMap* host_redirect_data_map));
|
| + MOCK_METHOD4(UpdateData,
|
| + void(const PrefetchData& url_data,
|
| + const PrefetchData& host_data,
|
| + const RedirectData& url_redirect_data,
|
| + const RedirectData& host_redirect_data));
|
| + MOCK_METHOD2(DeleteResourceData,
|
| + void(const std::vector<std::string>& urls,
|
| + const std::vector<std::string>& hosts));
|
| + MOCK_METHOD2(DeleteSingleResourceDataPoint,
|
| + void(const std::string& key, PrefetchKeyType key_type));
|
| + MOCK_METHOD2(DeleteRedirectData,
|
| + void(const std::vector<std::string>& urls,
|
| + const std::vector<std::string>& hosts));
|
| + MOCK_METHOD2(DeleteSingleRedirectDataPoint,
|
| + void(const std::string& key, PrefetchKeyType key_type));
|
| MOCK_METHOD0(DeleteAllData, void());
|
|
|
| protected:
|
| @@ -193,19 +206,20 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| return navigation_id;
|
| }
|
|
|
| - ResourcePrefetchPredictor::URLRequestSummary CreateURLRequestSummary(
|
| + URLRequestSummary CreateURLRequestSummary(
|
| int process_id,
|
| int render_frame_id,
|
| const std::string& main_frame_url,
|
| - const std::string& resource_url,
|
| - content::ResourceType resource_type,
|
| - net::RequestPriority priority,
|
| - const std::string& mime_type,
|
| - bool was_cached) {
|
| - ResourcePrefetchPredictor::URLRequestSummary summary;
|
| + const std::string& resource_url = std::string(),
|
| + content::ResourceType resource_type = content::RESOURCE_TYPE_MAIN_FRAME,
|
| + net::RequestPriority priority = net::MEDIUM,
|
| + const std::string& mime_type = std::string(),
|
| + bool was_cached = false) {
|
| + URLRequestSummary summary;
|
| summary.navigation_id = CreateNavigationID(process_id, render_frame_id,
|
| main_frame_url);
|
| - summary.resource_url = GURL(resource_url);
|
| + summary.resource_url =
|
| + resource_url.empty() ? GURL(main_frame_url) : GURL(resource_url);
|
| summary.resource_type = resource_type;
|
| summary.priority = priority;
|
| summary.mime_type = mime_type;
|
| @@ -213,6 +227,17 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| return summary;
|
| }
|
|
|
| + URLRequestSummary CreateRedirectRequestSummary(
|
| + int process_id,
|
| + int render_frame_id,
|
| + const std::string& main_frame_url,
|
| + const std::string& redirect_url) {
|
| + URLRequestSummary summary =
|
| + CreateURLRequestSummary(process_id, render_frame_id, main_frame_url);
|
| + summary.redirect_url = GURL(redirect_url);
|
| + return summary;
|
| + }
|
| +
|
| std::unique_ptr<net::URLRequest> CreateURLRequest(
|
| const GURL& url,
|
| net::RequestPriority priority,
|
| @@ -253,6 +278,7 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| config.max_hosts_to_track = 2;
|
| config.min_url_visit_count = 2;
|
| config.max_resources_per_entry = 4;
|
| + config.max_redirects_per_entry = 3;
|
| config.max_consecutive_misses = 2;
|
|
|
| // TODO(shishir): Enable the prefetching mode in the tests.
|
| @@ -275,8 +301,12 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
|
|
| PrefetchDataMap test_url_data_;
|
| PrefetchDataMap test_host_data_;
|
| + RedirectDataMap test_url_redirect_data_;
|
| + RedirectDataMap test_host_redirect_data_;
|
| PrefetchData empty_url_data_;
|
| PrefetchData empty_host_data_;
|
| + RedirectData empty_url_redirect_data_;
|
| + RedirectData empty_host_redirect_data_;
|
|
|
| MockURLRequestJobFactory url_request_job_factory_;
|
| EmptyURLRequestDelegate url_request_delegate_;
|
| @@ -289,7 +319,9 @@ ResourcePrefetchPredictorTest::ResourcePrefetchPredictorTest()
|
| profile_(new TestingProfile()),
|
| mock_tables_(new StrictMock<MockResourcePrefetchPredictorTables>()),
|
| empty_url_data_(PREFETCH_KEY_TYPE_URL, std::string()),
|
| - empty_host_data_(PREFETCH_KEY_TYPE_HOST, std::string()) {}
|
| + empty_host_data_(PREFETCH_KEY_TYPE_HOST, std::string()),
|
| + empty_url_redirect_data_(PREFETCH_KEY_TYPE_URL, std::string()),
|
| + empty_host_redirect_data_(PREFETCH_KEY_TYPE_HOST, std::string()) {}
|
|
|
| ResourcePrefetchPredictorTest::~ResourcePrefetchPredictorTest() {
|
| profile_.reset(NULL);
|
| @@ -309,7 +341,9 @@ void ResourcePrefetchPredictorTest::SetUp() {
|
| ResourcePrefetchPredictor::NOT_INITIALIZED);
|
| EXPECT_CALL(*mock_tables_.get(),
|
| GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
|
| - Pointee(ContainerEq(PrefetchDataMap()))));
|
| + Pointee(ContainerEq(PrefetchDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap()))));
|
| InitializePredictor();
|
| EXPECT_TRUE(predictor_->inflight_navigations_.empty());
|
| EXPECT_EQ(predictor_->initialization_state_,
|
| @@ -394,12 +428,55 @@ void ResourcePrefetchPredictorTest::InitializeSampleData() {
|
| test_host_data_.insert(std::make_pair("www.facebook.com", facebook));
|
| test_host_data_.insert(std::make_pair("www.yahoo.com", yahoo));
|
| }
|
| +
|
| + { // Url redirect data.
|
| + RedirectData facebook(PREFETCH_KEY_TYPE_URL, "http://fb.com/google");
|
| + facebook.last_visit = base::Time::FromInternalValue(6);
|
| + facebook.redirects.push_back(
|
| + RedirectRow("https://facebook.com/google", 5, 1, 0));
|
| + facebook.redirects.push_back(
|
| + RedirectRow("https://facebook.com/login", 3, 5, 1));
|
| +
|
| + RedirectData nytimes(PREFETCH_KEY_TYPE_URL, "http://nyt.com");
|
| + nytimes.last_visit = base::Time::FromInternalValue(7);
|
| + nytimes.redirects.push_back(RedirectRow("https://nytimes.com", 2, 0, 0));
|
| +
|
| + RedirectData google(PREFETCH_KEY_TYPE_URL, "http://google.com");
|
| + google.last_visit = base::Time::FromInternalValue(8);
|
| + google.redirects.push_back(RedirectRow("https://google.com", 3, 0, 0));
|
| +
|
| + test_url_redirect_data_.clear();
|
| + test_url_redirect_data_.insert(
|
| + std::make_pair(facebook.primary_key, facebook));
|
| + test_url_redirect_data_.insert(
|
| + std::make_pair(nytimes.primary_key, nytimes));
|
| + test_url_redirect_data_.insert(std::make_pair(google.primary_key, google));
|
| + }
|
| +
|
| + { // Host redirect data.
|
| + RedirectData bbc(PREFETCH_KEY_TYPE_HOST, "bbc.com");
|
| + bbc.last_visit = base::Time::FromInternalValue(9);
|
| + bbc.redirects.push_back(RedirectRow("www.bbc.com", 8, 4, 1));
|
| + bbc.redirects.push_back(RedirectRow("m.bbc.com", 5, 8, 0));
|
| + bbc.redirects.push_back(RedirectRow("bbc.co.uk", 1, 3, 0));
|
| +
|
| + RedirectData microsoft(PREFETCH_KEY_TYPE_HOST, "microsoft.com");
|
| + microsoft.last_visit = base::Time::FromInternalValue(10);
|
| + microsoft.redirects.push_back(RedirectRow("www.microsoft.com", 10, 0, 0));
|
| +
|
| + test_host_redirect_data_.clear();
|
| + test_host_redirect_data_.insert(std::make_pair(bbc.primary_key, bbc));
|
| + test_host_redirect_data_.insert(
|
| + std::make_pair(microsoft.primary_key, microsoft));
|
| + }
|
| }
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeEmpty) {
|
| // Tests that the predictor initializes correctly without any data.
|
| EXPECT_TRUE(predictor_->url_table_cache_->empty());
|
| EXPECT_TRUE(predictor_->host_table_cache_->empty());
|
| + EXPECT_TRUE(predictor_->url_redirect_table_cache_->empty());
|
| + EXPECT_TRUE(predictor_->host_redirect_table_cache_->empty());
|
| }
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
|
| @@ -409,9 +486,13 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
|
|
|
| EXPECT_CALL(*mock_tables_.get(),
|
| GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
|
| - Pointee(ContainerEq(PrefetchDataMap()))))
|
| + Pointee(ContainerEq(PrefetchDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
|
| - SetArgPointee<1>(test_host_data_)));
|
| + SetArgPointee<1>(test_host_data_),
|
| + SetArgPointee<2>(test_url_redirect_data_),
|
| + SetArgPointee<3>(test_host_redirect_data_)));
|
|
|
| ResetPredictor();
|
| InitializePredictor();
|
| @@ -423,45 +504,54 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
|
|
|
| EXPECT_EQ(test_url_data_, *predictor_->url_table_cache_);
|
| EXPECT_EQ(test_host_data_, *predictor_->host_table_cache_);
|
| + EXPECT_EQ(test_url_redirect_data_, *predictor_->url_redirect_table_cache_);
|
| + EXPECT_EQ(test_host_redirect_data_, *predictor_->host_redirect_table_cache_);
|
| }
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, NavigationNotRecorded) {
|
| // Single navigation but history count is low, so should not record.
|
| AddUrlToHistory("http://www.google.com", 1);
|
|
|
| - URLRequestSummary main_frame = CreateURLRequestSummary(
|
| - 1, 1, "http://www.google.com", "http://www.google.com",
|
| - content::RESOURCE_TYPE_MAIN_FRAME, net::MEDIUM, std::string(), false);
|
| + URLRequestSummary main_frame =
|
| + CreateURLRequestSummary(1, 1, "http://www.google.com");
|
| predictor_->RecordURLRequest(main_frame);
|
| EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
|
|
| + URLRequestSummary main_frame_redirect = CreateRedirectRequestSummary(
|
| + 1, 1, "http://www.google.com", "https://www.google.com");
|
| + predictor_->RecordURLRedirect(main_frame_redirect);
|
| + EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| + main_frame = CreateURLRequestSummary(1, 1, "https://www.google.com");
|
| +
|
| // Now add a few subresources.
|
| URLRequestSummary resource1 = CreateURLRequestSummary(
|
| - 1, 1, "http://www.google.com", "http://google.com/style1.css",
|
| + 1, 1, "https://www.google.com", "https://google.com/style1.css",
|
| content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false);
|
| predictor_->RecordURLResponse(resource1);
|
| URLRequestSummary resource2 = CreateURLRequestSummary(
|
| - 1, 1, "http://www.google.com", "http://google.com/script1.js",
|
| + 1, 1, "https://www.google.com", "https://google.com/script1.js",
|
| content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false);
|
| predictor_->RecordURLResponse(resource2);
|
| URLRequestSummary resource3 = CreateURLRequestSummary(
|
| - 1, 1, "http://www.google.com", "http://google.com/script2.js",
|
| + 1, 1, "https://www.google.com", "https://google.com/script2.js",
|
| content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false);
|
| predictor_->RecordURLResponse(resource3);
|
|
|
| PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com");
|
| host_data.resources.push_back(ResourceRow(
|
| - "http://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0,
|
| + "https://google.com/style1.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0,
|
| 0, 1.0, net::MEDIUM, false, false));
|
| - host_data.resources.push_back(ResourceRow("http://google.com/script1.js",
|
| + host_data.resources.push_back(ResourceRow("https://google.com/script1.js",
|
| content::RESOURCE_TYPE_SCRIPT, 1, 0,
|
| 0, 2.0, net::MEDIUM, false, false));
|
| - host_data.resources.push_back(ResourceRow("http://google.com/script2.js",
|
| + host_data.resources.push_back(ResourceRow("https://google.com/script2.js",
|
| content::RESOURCE_TYPE_SCRIPT, 1, 0,
|
| 0, 3.0, net::MEDIUM, false, false));
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, host_data, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| - predictor_->OnNavigationComplete(main_frame.navigation_id);
|
| + predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| }
|
|
|
| @@ -470,9 +560,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) {
|
| // resources and also for number of resources saved.
|
| AddUrlToHistory("http://www.google.com", 4);
|
|
|
| - URLRequestSummary main_frame = CreateURLRequestSummary(
|
| - 1, 1, "http://www.google.com", "http://www.google.com",
|
| - content::RESOURCE_TYPE_MAIN_FRAME, net::MEDIUM, std::string(), false);
|
| + URLRequestSummary main_frame =
|
| + CreateURLRequestSummary(1, 1, "http://www.google.com");
|
| predictor_->RecordURLRequest(main_frame);
|
| EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
|
|
| @@ -518,11 +607,15 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) {
|
| url_data.resources.push_back(ResourceRow(
|
| "http://google.com/style2.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0,
|
| 0, 7.0, net::MEDIUM, false, false));
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(url_data, empty_host_data_, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com");
|
| host_data.resources = url_data.resources;
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, host_data, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| predictor_->OnNavigationComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| @@ -535,7 +628,9 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
|
|
|
| EXPECT_CALL(*mock_tables_.get(),
|
| GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
|
| - Pointee(ContainerEq(PrefetchDataMap()))))
|
| + Pointee(ContainerEq(PrefetchDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
|
| SetArgPointee<1>(test_host_data_)));
|
| ResetPredictor();
|
| @@ -591,11 +686,13 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
|
| url_data.resources.push_back(ResourceRow("http://google.com/script2.js",
|
| content::RESOURCE_TYPE_SCRIPT, 1, 0,
|
| 0, 3.0, net::MEDIUM, false, false));
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(url_data, empty_host_data_, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| - EXPECT_CALL(
|
| - *mock_tables_.get(),
|
| - DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteSingleResourceDataPoint("www.facebook.com",
|
| + PREFETCH_KEY_TYPE_HOST));
|
|
|
| PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.google.com");
|
| host_data.resources.push_back(ResourceRow(
|
| @@ -610,7 +707,9 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
|
| host_data.resources.push_back(ResourceRow(
|
| "http://google.com/style2.css", content::RESOURCE_TYPE_STYLESHEET, 1, 0,
|
| 0, 7.0, net::MEDIUM, false, false));
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, host_data, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| predictor_->OnNavigationComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| @@ -622,7 +721,9 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
|
|
|
| EXPECT_CALL(*mock_tables_.get(),
|
| GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
|
| - Pointee(ContainerEq(PrefetchDataMap()))))
|
| + Pointee(ContainerEq(PrefetchDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
|
| SetArgPointee<1>(test_host_data_)));
|
| ResetPredictor();
|
| @@ -645,12 +746,12 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
|
| content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false);
|
| predictor_->RecordURLResponse(resource2);
|
|
|
| - EXPECT_CALL(
|
| - *mock_tables_.get(),
|
| - DeleteSingleDataPoint("http://www.google.com/", PREFETCH_KEY_TYPE_URL));
|
| - EXPECT_CALL(
|
| - *mock_tables_.get(),
|
| - DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteSingleResourceDataPoint("http://www.google.com/",
|
| + PREFETCH_KEY_TYPE_URL));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteSingleResourceDataPoint("www.facebook.com",
|
| + PREFETCH_KEY_TYPE_HOST));
|
|
|
| PrefetchData url_data(PREFETCH_KEY_TYPE_URL, "http://www.nike.com/");
|
| url_data.resources.push_back(ResourceRow(
|
| @@ -659,16 +760,120 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
|
| url_data.resources.push_back(ResourceRow("http://nike.com/image2.png",
|
| content::RESOURCE_TYPE_IMAGE, 1, 0,
|
| 0, 2.0, net::MEDIUM, false, false));
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(url_data, empty_host_data_));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(url_data, empty_host_data_, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| PrefetchData host_data(PREFETCH_KEY_TYPE_HOST, "www.nike.com");
|
| host_data.resources = url_data.resources;
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(empty_url_data_, host_data));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, host_data, empty_url_redirect_data_,
|
| + empty_host_redirect_data_));
|
|
|
| predictor_->OnNavigationComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| }
|
|
|
| +TEST_F(ResourcePrefetchPredictorTest, RedirectUrlNotInDB) {
|
| + AddUrlToHistory("https://facebook.com/google", 4);
|
| +
|
| + URLRequestSummary fb1 = CreateURLRequestSummary(1, 1, "http://fb.com/google");
|
| + predictor_->RecordURLRequest(fb1);
|
| + EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| +
|
| + URLRequestSummary fb2 = CreateRedirectRequestSummary(
|
| + 1, 1, "http://fb.com/google", "http://facebook.com/google");
|
| + predictor_->RecordURLRedirect(fb2);
|
| + URLRequestSummary fb3 = CreateRedirectRequestSummary(
|
| + 1, 1, "http://facebook.com/google", "https://facebook.com/google");
|
| + predictor_->RecordURLRedirect(fb3);
|
| + NavigationID fb_end = CreateNavigationID(1, 1, "https://facebook.com/google");
|
| +
|
| + // Since the navigation hasn't resources, corresponding entry
|
| + // in resource table will be deleted
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteSingleResourceDataPoint("https://facebook.com/google",
|
| + PREFETCH_KEY_TYPE_URL));
|
| + EXPECT_CALL(*mock_tables_.get(), DeleteSingleResourceDataPoint(
|
| + "facebook.com", PREFETCH_KEY_TYPE_HOST));
|
| +
|
| + RedirectData url_redirect_data(PREFETCH_KEY_TYPE_URL, "http://fb.com/google");
|
| + url_redirect_data.redirects.push_back(
|
| + RedirectRow("https://facebook.com/google", 1, 0, 0));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, empty_host_data_, url_redirect_data,
|
| + empty_host_redirect_data_));
|
| +
|
| + RedirectData host_redirect_data(PREFETCH_KEY_TYPE_HOST, "fb.com");
|
| + host_redirect_data.redirects.push_back(RedirectRow("facebook.com", 1, 0, 0));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, empty_host_data_,
|
| + empty_url_redirect_data_, host_redirect_data));
|
| +
|
| + predictor_->RecordMainFrameLoadComplete(fb_end);
|
| + profile_->BlockUntilHistoryProcessesPendingRequests();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTest, RedirectUrlInDB) {
|
| + // Tests that redirect is recorded correctly for URL already present in
|
| + // the database cache.
|
| + AddUrlToHistory("https://facebook.com/google", 4);
|
| +
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
|
| + Pointee(ContainerEq(PrefetchDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap())),
|
| + Pointee(ContainerEq(RedirectDataMap()))))
|
| + .WillOnce(DoAll(SetArgPointee<2>(test_url_redirect_data_),
|
| + SetArgPointee<3>(test_host_redirect_data_)));
|
| + ResetPredictor();
|
| + InitializePredictor();
|
| + EXPECT_EQ(3U, predictor_->url_redirect_table_cache_->size());
|
| + EXPECT_EQ(2U, predictor_->host_redirect_table_cache_->size());
|
| +
|
| + URLRequestSummary fb1 = CreateURLRequestSummary(1, 1, "http://fb.com/google");
|
| + predictor_->RecordURLRequest(fb1);
|
| + EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| +
|
| + URLRequestSummary fb2 = CreateRedirectRequestSummary(
|
| + 1, 1, "http://fb.com/google", "http://facebook.com/google");
|
| + predictor_->RecordURLRedirect(fb2);
|
| + URLRequestSummary fb3 = CreateRedirectRequestSummary(
|
| + 1, 1, "http://facebook.com/google", "https://facebook.com/google");
|
| + predictor_->RecordURLRedirect(fb3);
|
| + NavigationID fb_end = CreateNavigationID(1, 1, "https://facebook.com/google");
|
| +
|
| + // Oldest entries in tables will be superseded and deleted
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteSingleRedirectDataPoint("bbc.com", PREFETCH_KEY_TYPE_HOST));
|
| +
|
| + // Since the navigation hasn't resources, corresponding entry
|
| + // in resource table will be deleted
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteSingleResourceDataPoint("https://facebook.com/google",
|
| + PREFETCH_KEY_TYPE_URL));
|
| + EXPECT_CALL(*mock_tables_.get(), DeleteSingleResourceDataPoint(
|
| + "facebook.com", PREFETCH_KEY_TYPE_HOST));
|
| +
|
| + RedirectData url_redirect_data(PREFETCH_KEY_TYPE_URL, "http://fb.com/google");
|
| + url_redirect_data.redirects.push_back(
|
| + RedirectRow("https://facebook.com/google", 6, 1, 0));
|
| + // Exising redirect to https://facebook.com/login will be deleted because of
|
| + // too many consecutive misses.
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, empty_host_data_, url_redirect_data,
|
| + empty_host_redirect_data_));
|
| +
|
| + RedirectData host_redirect_data(PREFETCH_KEY_TYPE_HOST, "fb.com");
|
| + host_redirect_data.redirects.push_back(RedirectRow("facebook.com", 1, 0, 0));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + UpdateData(empty_url_data_, empty_host_data_,
|
| + empty_url_redirect_data_, host_redirect_data));
|
| +
|
| + predictor_->RecordMainFrameLoadComplete(fb_end);
|
| + profile_->BlockUntilHistoryProcessesPendingRequests();
|
| +}
|
| +
|
| TEST_F(ResourcePrefetchPredictorTest, DeleteUrls) {
|
| // Add some dummy entries to cache.
|
| predictor_->url_table_cache_->insert(std::make_pair(
|
| @@ -709,9 +914,9 @@ TEST_F(ResourcePrefetchPredictorTest, DeleteUrls) {
|
| hosts_to_delete.push_back("www.google.com");
|
| hosts_to_delete.push_back("www.apple.com");
|
|
|
| - EXPECT_CALL(
|
| - *mock_tables_.get(),
|
| - DeleteData(ContainerEq(urls_to_delete), ContainerEq(hosts_to_delete)));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteResourceData(ContainerEq(urls_to_delete),
|
| + ContainerEq(hosts_to_delete)));
|
|
|
| predictor_->DeleteUrls(rows);
|
| EXPECT_EQ(2U, predictor_->url_table_cache_->size());
|
| @@ -742,7 +947,7 @@ TEST_F(ResourcePrefetchPredictorTest, OnMainFrameRequest) {
|
| predictor_->OnMainFrameRequest(summary3);
|
| EXPECT_EQ(3U, predictor_->inflight_navigations_.size());
|
|
|
| - // Insert anther with same navigation id. It should replace.
|
| + // Insert another with same navigation id. It should replace.
|
| URLRequestSummary summary4 = CreateURLRequestSummary(
|
| 1, 1, "http://www.nike.com", "http://www.nike.com",
|
| content::RESOURCE_TYPE_MAIN_FRAME, net::MEDIUM, std::string(), false);
|
| @@ -774,30 +979,78 @@ TEST_F(ResourcePrefetchPredictorTest, OnMainFrameRequest) {
|
| }
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, OnMainFrameRedirect) {
|
| - URLRequestSummary summary1 = CreateURLRequestSummary(
|
| - 1, 1, "http://www.google.com", "http://www.google.com",
|
| - content::RESOURCE_TYPE_MAIN_FRAME, net::MEDIUM, std::string(), false);
|
| - URLRequestSummary summary2 = CreateURLRequestSummary(
|
| - 1, 2, "http://www.google.com", "http://www.google.com",
|
| - content::RESOURCE_TYPE_MAIN_FRAME, net::MEDIUM, std::string(), false);
|
| - URLRequestSummary summary3 = CreateURLRequestSummary(
|
| - 2, 1, "http://www.yahoo.com", "http://www.yahoo.com",
|
| - content::RESOURCE_TYPE_MAIN_FRAME, net::MEDIUM, std::string(), false);
|
| -
|
| - predictor_->OnMainFrameRedirect(summary1);
|
| + URLRequestSummary yahoo = CreateURLRequestSummary(1, 1, "http://yahoo.com");
|
| +
|
| + URLRequestSummary bbc1 = CreateURLRequestSummary(2, 2, "http://bbc.com");
|
| + URLRequestSummary bbc2 = CreateRedirectRequestSummary(2, 2, "http://bbc.com",
|
| + "https://www.bbc.com");
|
| + NavigationID bbc_end = CreateNavigationID(2, 2, "https://www.bbc.com");
|
| +
|
| + URLRequestSummary youtube1 =
|
| + CreateURLRequestSummary(1, 2, "http://youtube.com");
|
| + URLRequestSummary youtube2 = CreateRedirectRequestSummary(
|
| + 1, 2, "http://youtube.com", "https://youtube.com");
|
| + NavigationID youtube_end = CreateNavigationID(1, 2, "https://youtube.com");
|
| +
|
| + URLRequestSummary nyt1 = CreateURLRequestSummary(2, 1, "http://nyt.com");
|
| + URLRequestSummary nyt2 = CreateRedirectRequestSummary(2, 1, "http://nyt.com",
|
| + "http://nytimes.com");
|
| + URLRequestSummary nyt3 = CreateRedirectRequestSummary(
|
| + 2, 1, "http://nytimes.com", "http://m.nytimes.com");
|
| + NavigationID nyt_end = CreateNavigationID(2, 1, "http://m.nytimes.com");
|
| +
|
| + URLRequestSummary fb1 = CreateURLRequestSummary(1, 3, "http://fb.com");
|
| + URLRequestSummary fb2 = CreateRedirectRequestSummary(1, 3, "http://fb.com",
|
| + "http://facebook.com");
|
| + URLRequestSummary fb3 = CreateRedirectRequestSummary(
|
| + 1, 3, "http://facebook.com", "https://facebook.com");
|
| + URLRequestSummary fb4 = CreateRedirectRequestSummary(
|
| + 1, 3, "https://facebook.com",
|
| + "https://m.facebook.com/?refsrc=https%3A%2F%2Fwww.facebook.com%2F&_rdr");
|
| + NavigationID fb_end = CreateNavigationID(
|
| + 1, 3,
|
| + "https://m.facebook.com/?refsrc=https%3A%2F%2Fwww.facebook.com%2F&_rdr");
|
| +
|
| + // Redirect with empty redirect_url will be deleted
|
| + predictor_->OnMainFrameRequest(yahoo);
|
| + EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| + predictor_->OnMainFrameRedirect(yahoo);
|
| EXPECT_TRUE(predictor_->inflight_navigations_.empty());
|
|
|
| - predictor_->OnMainFrameRequest(summary1);
|
| + // Redirect without previous request works fine
|
| + // predictor_->OnMainFrameRequest(bbc1) missing
|
| + predictor_->OnMainFrameRedirect(bbc2);
|
| EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| - predictor_->OnMainFrameRequest(summary2);
|
| - EXPECT_EQ(2U, predictor_->inflight_navigations_.size());
|
| + EXPECT_EQ(bbc1.navigation_id.main_frame_url,
|
| + predictor_->inflight_navigations_[bbc_end]->initial_url);
|
|
|
| - predictor_->OnMainFrameRedirect(summary3);
|
| + // http://youtube.com -> https://youtube.com
|
| + predictor_->OnMainFrameRequest(youtube1);
|
| EXPECT_EQ(2U, predictor_->inflight_navigations_.size());
|
| - predictor_->OnMainFrameRedirect(summary1);
|
| - EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| - predictor_->OnMainFrameRedirect(summary2);
|
| - EXPECT_TRUE(predictor_->inflight_navigations_.empty());
|
| + predictor_->OnMainFrameRedirect(youtube2);
|
| + EXPECT_EQ(2U, predictor_->inflight_navigations_.size());
|
| + EXPECT_EQ(youtube1.navigation_id.main_frame_url,
|
| + predictor_->inflight_navigations_[youtube_end]->initial_url);
|
| +
|
| + // http://nyt.com -> http://nytimes.com -> http://m.nytimes.com
|
| + predictor_->OnMainFrameRequest(nyt1);
|
| + EXPECT_EQ(3U, predictor_->inflight_navigations_.size());
|
| + predictor_->OnMainFrameRedirect(nyt2);
|
| + predictor_->OnMainFrameRedirect(nyt3);
|
| + EXPECT_EQ(3U, predictor_->inflight_navigations_.size());
|
| + EXPECT_EQ(nyt1.navigation_id.main_frame_url,
|
| + predictor_->inflight_navigations_[nyt_end]->initial_url);
|
| +
|
| + // http://fb.com -> http://facebook.com -> https://facebook.com ->
|
| + // https://m.facebook.com/?refsrc=https%3A%2F%2Fwww.facebook.com%2F&_rdr
|
| + predictor_->OnMainFrameRequest(fb1);
|
| + EXPECT_EQ(4U, predictor_->inflight_navigations_.size());
|
| + predictor_->OnMainFrameRedirect(fb2);
|
| + predictor_->OnMainFrameRedirect(fb3);
|
| + predictor_->OnMainFrameRedirect(fb4);
|
| + EXPECT_EQ(4U, predictor_->inflight_navigations_.size());
|
| + EXPECT_EQ(fb1.navigation_id.main_frame_url,
|
| + predictor_->inflight_navigations_[fb_end]->initial_url);
|
| }
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, OnSubresourceResponse) {
|
| @@ -827,17 +1080,17 @@ TEST_F(ResourcePrefetchPredictorTest, OnSubresourceResponse) {
|
| predictor_->OnSubresourceResponse(resource3);
|
|
|
| EXPECT_EQ(1U, predictor_->inflight_navigations_.size());
|
| - EXPECT_EQ(3U,
|
| - predictor_->inflight_navigations_[main_frame1.navigation_id]->size());
|
| + EXPECT_EQ(3U, predictor_->inflight_navigations_[main_frame1.navigation_id]
|
| + ->requests.size());
|
| EXPECT_TRUE(URLRequestSummaryAreEqual(
|
| - resource1,
|
| - predictor_->inflight_navigations_[main_frame1.navigation_id]->at(0)));
|
| + resource1, predictor_->inflight_navigations_[main_frame1.navigation_id]
|
| + ->requests[0]));
|
| EXPECT_TRUE(URLRequestSummaryAreEqual(
|
| - resource2,
|
| - predictor_->inflight_navigations_[main_frame1.navigation_id]->at(1)));
|
| + resource2, predictor_->inflight_navigations_[main_frame1.navigation_id]
|
| + ->requests[1]));
|
| EXPECT_TRUE(URLRequestSummaryAreEqual(
|
| - resource3,
|
| - predictor_->inflight_navigations_[main_frame1.navigation_id]->at(2)));
|
| + resource3, predictor_->inflight_navigations_[main_frame1.navigation_id]
|
| + ->requests[2]));
|
| }
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, HandledResourceTypes) {
|
|
|