| 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 9f2a98bad54aee1e732bd8af694711539196b455..508e408680e31053fd21cb989d8f362622dd83ab 100644
|
| --- a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| @@ -42,6 +42,7 @@ using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary;
|
| using PrefetchDataMap = ResourcePrefetchPredictorTables::PrefetchDataMap;
|
| using RedirectDataMap = ResourcePrefetchPredictorTables::RedirectDataMap;
|
| using ManifestDataMap = ResourcePrefetchPredictorTables::ManifestDataMap;
|
| +using OriginDataMap = ResourcePrefetchPredictorTables::OriginDataMap;
|
|
|
| scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders(
|
| const char* headers) {
|
| @@ -129,12 +130,13 @@ class MockResourcePrefetchPredictorTables
|
| public:
|
| MockResourcePrefetchPredictorTables() { }
|
|
|
| - MOCK_METHOD5(GetAllData,
|
| + MOCK_METHOD6(GetAllData,
|
| void(PrefetchDataMap* url_data_map,
|
| PrefetchDataMap* host_data_map,
|
| RedirectDataMap* url_redirect_data_map,
|
| RedirectDataMap* host_redirect_data_map,
|
| - ManifestDataMap* manifest_data_map));
|
| + ManifestDataMap* manifest_data_map,
|
| + OriginDataMap* origin_data_map));
|
| MOCK_METHOD4(UpdateData,
|
| void(const PrefetchData& url_data,
|
| const PrefetchData& host_data,
|
| @@ -143,9 +145,11 @@ class MockResourcePrefetchPredictorTables
|
| MOCK_METHOD2(UpdateManifestData,
|
| void(const std::string& host,
|
| const precache::PrecacheManifest& manifest_data));
|
| + MOCK_METHOD1(UpdateOriginData, void(const OriginData& origin_data));
|
| MOCK_METHOD2(DeleteResourceData,
|
| void(const std::vector<std::string>& urls,
|
| const std::vector<std::string>& hosts));
|
| + MOCK_METHOD1(DeleteOriginData, void(const std::vector<std::string>& hosts));
|
| MOCK_METHOD2(DeleteSingleResourceDataPoint,
|
| void(const std::string& key, PrefetchKeyType key_type));
|
| MOCK_METHOD2(DeleteRedirectData,
|
| @@ -237,6 +241,7 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| config.min_resource_confidence_to_trigger_prefetch = 0.5;
|
| config.is_url_learning_enabled = true;
|
| config.is_manifests_enabled = true;
|
| + config.is_origin_prediction_enabled = true;
|
|
|
| config.mode |= ResourcePrefetchPredictorConfig::LEARNING;
|
| predictor_.reset(new ResourcePrefetchPredictor(config, profile_.get()));
|
| @@ -263,6 +268,7 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| RedirectDataMap test_url_redirect_data_;
|
| RedirectDataMap test_host_redirect_data_;
|
| ManifestDataMap test_manifest_data_;
|
| + OriginDataMap test_origin_data_;
|
| PrefetchData empty_resource_data_;
|
| RedirectData empty_redirect_data_;
|
|
|
| @@ -300,7 +306,8 @@ void ResourcePrefetchPredictorTest::SetUp() {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))));
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))));
|
| InitializePredictor();
|
| EXPECT_TRUE(predictor_->inflight_navigations_.empty());
|
| EXPECT_EQ(predictor_->initialization_state_,
|
| @@ -442,6 +449,22 @@ void ResourcePrefetchPredictorTest::InitializeSampleData() {
|
| test_manifest_data_.insert(std::make_pair("google.com", google));
|
| test_manifest_data_.insert(std::make_pair("facebook.com", facebook));
|
| }
|
| +
|
| + { // Origin data.
|
| + OriginData google = CreateOriginData("google.com", 12);
|
| + InitializeOriginStat(google.add_origins(), "https://static.google.com", 12,
|
| + 0, 0, 3., false, true);
|
| + InitializeOriginStat(google.add_origins(), "https://cats.google.com", 12, 0,
|
| + 0, 5., true, true);
|
| + test_origin_data_.insert({"google.com", google});
|
| +
|
| + OriginData twitter = CreateOriginData("twitter.com", 42);
|
| + InitializeOriginStat(twitter.add_origins(), "https://static.twitter.com",
|
| + 12, 0, 0, 3., false, true);
|
| + InitializeOriginStat(twitter.add_origins(), "https://random.140chars.com",
|
| + 12, 0, 0, 3., false, true);
|
| + test_origin_data_.insert({"twitter.com", twitter});
|
| + }
|
| }
|
|
|
| void ResourcePrefetchPredictorTest::TestRedirectStatusHistogram(
|
| @@ -472,6 +495,8 @@ void ResourcePrefetchPredictorTest::TestRedirectStatusHistogram(
|
| using testing::_;
|
| EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _))
|
| .Times(testing::AtLeast(1));
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_));
|
| +
|
| URLRequestSummary initial =
|
| CreateURLRequestSummary(1, navigation_initial_url);
|
| predictor_->RecordURLRequest(initial);
|
| @@ -513,6 +538,7 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeEmpty) {
|
| EXPECT_TRUE(predictor_->url_redirect_table_cache_->empty());
|
| EXPECT_TRUE(predictor_->host_redirect_table_cache_->empty());
|
| EXPECT_TRUE(predictor_->manifest_table_cache_->empty());
|
| + EXPECT_TRUE(predictor_->origin_table_cache_->empty());
|
| }
|
|
|
| // Tests that the history and the db tables data are loaded correctly.
|
| @@ -525,12 +551,14 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))))
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
|
| SetArgPointee<1>(test_host_data_),
|
| SetArgPointee<2>(test_url_redirect_data_),
|
| SetArgPointee<3>(test_host_redirect_data_),
|
| - SetArgPointee<4>(test_manifest_data_)));
|
| + SetArgPointee<4>(test_manifest_data_),
|
| + SetArgPointee<5>(test_origin_data_)));
|
|
|
| ResetPredictor();
|
| InitializePredictor();
|
| @@ -545,6 +573,7 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
|
| EXPECT_EQ(test_url_redirect_data_, *predictor_->url_redirect_table_cache_);
|
| EXPECT_EQ(test_host_redirect_data_, *predictor_->host_redirect_table_cache_);
|
| EXPECT_EQ(test_manifest_data_, *predictor_->manifest_table_cache_);
|
| + EXPECT_EQ(test_origin_data_, *predictor_->origin_table_cache_);
|
| }
|
|
|
| // Single navigation but history count is low, so should not record.
|
| @@ -600,6 +629,10 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationNotRecorded) {
|
| EXPECT_CALL(*mock_tables_.get(),
|
| UpdateData(empty_resource_data_, host_data, empty_redirect_data_,
|
| empty_redirect_data_));
|
| + OriginData origin_data = CreateOriginData("www.google.com");
|
| + InitializeOriginStat(origin_data.add_origins(), "https://google.com/", 1, 0,
|
| + 0, 1., false, true);
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data));
|
|
|
| predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| @@ -646,6 +679,25 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) {
|
| content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true));
|
| predictor_->RecordURLResponse(resources.back());
|
|
|
| + auto no_store = CreateURLRequestSummary(
|
| + 1, "http://www.google.com",
|
| + "http://static.google.com/style2-no-store.css",
|
| + content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true);
|
| + no_store.is_no_store = true;
|
| + predictor_->RecordURLResponse(no_store);
|
| +
|
| + auto redirected = CreateURLRequestSummary(
|
| + 1, "http://www.google.com", "http://reader.google.com/style.css",
|
| + content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true);
|
| + redirected.redirect_url = GURL("http://dev.null.google.com/style.css");
|
| +
|
| + predictor_->RecordURLRedirect(redirected);
|
| + redirected.is_no_store = true;
|
| + redirected.request_url = redirected.redirect_url;
|
| + redirected.redirect_url = GURL();
|
| +
|
| + predictor_->RecordURLResponse(redirected);
|
| +
|
| StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(
|
| predictor_.get());
|
| EXPECT_CALL(mock_observer,
|
| @@ -673,6 +725,17 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) {
|
| UpdateData(url_data, empty_resource_data_, empty_redirect_data_,
|
| empty_redirect_data_));
|
|
|
| + OriginData origin_data = CreateOriginData("www.google.com");
|
| + InitializeOriginStat(origin_data.add_origins(), "http://static.google.com/",
|
| + 1, 0, 0, 2., true, true);
|
| + InitializeOriginStat(origin_data.add_origins(), "http://dev.null.google.com/",
|
| + 1, 0, 0, 4., true, true);
|
| + InitializeOriginStat(origin_data.add_origins(), "http://google.com/", 1, 0, 0,
|
| + 1., false, true);
|
| + InitializeOriginStat(origin_data.add_origins(), "http://reader.google.com/",
|
| + 1, 0, 0, 3., false, true);
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data));
|
| +
|
| PrefetchData host_data = CreatePrefetchData("www.google.com");
|
| host_data.mutable_resources()->CopyFrom(url_data.resources());
|
| EXPECT_CALL(*mock_tables_.get(),
|
| @@ -694,7 +757,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))))
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
|
| SetArgPointee<1>(test_host_data_)));
|
| ResetPredictor();
|
| @@ -737,6 +801,12 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
|
| 1, "http://www.google.com", "http://google.com/style2.css",
|
| content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true));
|
| predictor_->RecordURLResponse(resources.back());
|
| + auto no_store = CreateURLRequestSummary(
|
| + 1, "http://www.google.com",
|
| + "http://static.google.com/style2-no-store.css",
|
| + content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true);
|
| + no_store.is_no_store = true;
|
| + predictor_->RecordURLResponse(no_store);
|
|
|
| StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(
|
| predictor_.get());
|
| @@ -786,6 +856,13 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
|
| UpdateData(empty_resource_data_, host_data, empty_redirect_data_,
|
| empty_redirect_data_));
|
|
|
| + OriginData origin_data = CreateOriginData("www.google.com");
|
| + InitializeOriginStat(origin_data.add_origins(), "http://static.google.com/",
|
| + 1, 0, 0, 2., true, true);
|
| + InitializeOriginStat(origin_data.add_origins(), "http://google.com/", 1, 0, 0,
|
| + 1., false, true);
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data));
|
| +
|
| predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| }
|
| @@ -800,13 +877,16 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))))
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
|
| - SetArgPointee<1>(test_host_data_)));
|
| + SetArgPointee<1>(test_host_data_),
|
| + SetArgPointee<5>(test_origin_data_)));
|
| ResetPredictor();
|
| InitializePredictor();
|
| EXPECT_EQ(3U, predictor_->url_table_cache_->size());
|
| EXPECT_EQ(2U, predictor_->host_table_cache_->size());
|
| + EXPECT_EQ(2U, predictor_->origin_table_cache_->size());
|
|
|
| URLRequestSummary main_frame = CreateURLRequestSummary(
|
| 1, "http://www.nike.com", "http://www.nike.com",
|
| @@ -837,6 +917,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
|
| EXPECT_CALL(*mock_tables_.get(),
|
| DeleteSingleResourceDataPoint("www.facebook.com",
|
| PREFETCH_KEY_TYPE_HOST));
|
| + EXPECT_CALL(*mock_tables_.get(),
|
| + DeleteOriginData(std::vector<std::string>({"google.com"})));
|
|
|
| PrefetchData url_data = CreatePrefetchData("http://www.nike.com/");
|
| InitializeResourceData(url_data.add_resources(), "http://nike.com/style1.css",
|
| @@ -855,6 +937,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
|
| UpdateData(empty_resource_data_, host_data, empty_redirect_data_,
|
| empty_redirect_data_));
|
|
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(testing::_));
|
| +
|
| predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id);
|
| profile_->BlockUntilHistoryProcessesPendingRequests();
|
| }
|
| @@ -921,7 +1005,8 @@ TEST_F(ResourcePrefetchPredictorTest, RedirectUrlInDB) {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))))
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))))
|
| .WillOnce(DoAll(SetArgPointee<2>(test_url_redirect_data_),
|
| SetArgPointee<3>(test_host_redirect_data_)));
|
| ResetPredictor();
|
| @@ -1000,7 +1085,8 @@ TEST_F(ResourcePrefetchPredictorTest, ManifestHostInDB) {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))))
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))))
|
| .WillOnce(SetArgPointee<4>(test_manifest_data_));
|
| ResetPredictor();
|
| InitializePredictor();
|
| @@ -1021,7 +1107,8 @@ TEST_F(ResourcePrefetchPredictorTest, ManifestHostNotInDBAndDBFull) {
|
| Pointee(ContainerEq(PrefetchDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| Pointee(ContainerEq(RedirectDataMap())),
|
| - Pointee(ContainerEq(ManifestDataMap()))))
|
| + Pointee(ContainerEq(ManifestDataMap())),
|
| + Pointee(ContainerEq(OriginDataMap()))))
|
| .WillOnce(SetArgPointee<4>(test_manifest_data_));
|
| ResetPredictor();
|
| InitializePredictor();
|
| @@ -1760,7 +1847,9 @@ TEST_F(ResourcePrefetchPredictorTest, GetPrefetchData) {
|
|
|
| TEST_F(ResourcePrefetchPredictorTest, TestPrecisionRecallHistograms) {
|
| using testing::_;
|
| - EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _));
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _))
|
| + .Times(testing::AtLeast(1));
|
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_));
|
|
|
| // Fill the database with 3 resources: 1 useful, 2 useless.
|
| const std::string main_frame_url = "http://google.com/?query=cats";
|
|
|