Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8058)

Unified Diff: chrome/browser/predictors/resource_prefetch_predictor_unittest.cc

Issue 2321343002: Redirect handling in resource prefetch predictor (Closed)
Patch Set: Redirects database schema changed Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698