Chromium Code Reviews| 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 a1b2f98b86e682e108f8b418e862123195624e6e..649fb78faa794d1628e38badd760c7d03a3dbbb0 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) { |
| @@ -131,12 +132,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, |
| @@ -145,9 +147,12 @@ class MockResourcePrefetchPredictorTables |
| MOCK_METHOD2(UpdateManifestData, |
| void(const std::string& host, |
| const precache::PrecacheManifest& manifest_data)); |
| + MOCK_METHOD2(UpdateOriginData, |
| + void(const std::string& host, 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, |
| @@ -238,6 +243,7 @@ class ResourcePrefetchPredictorTest : public testing::Test { |
| config.max_consecutive_misses = 2; |
| config.min_resource_confidence_to_trigger_prefetch = 0.5; |
| config.is_url_learning_enabled = true; |
| + config.is_origin_prediction_enabled = true; |
| config.mode |= ResourcePrefetchPredictorConfig::LEARNING; |
| predictor_.reset(new ResourcePrefetchPredictor(config, profile_.get())); |
| @@ -264,6 +270,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_; |
| @@ -301,7 +308,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_, |
| @@ -443,6 +451,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( |
| @@ -473,6 +497,9 @@ void ResourcePrefetchPredictorTest::TestRedirectStatusHistogram( |
| using testing::_; |
| EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _)) |
| .Times(testing::AtLeast(1)); |
| + EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_, _)) |
| + .Times(testing::AtLeast(1)); |
|
alexilin
2017/04/10 14:58:28
nit:
I suppose it should be called exactly once. G
Benoit L
2017/04/11 09:04:05
Done.
|
| + |
| URLRequestSummary initial = |
| CreateURLRequestSummary(1, navigation_initial_url); |
| predictor_->RecordURLRequest(initial); |
| @@ -514,6 +541,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. |
| @@ -526,12 +554,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(); |
| @@ -546,6 +576,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. |
| @@ -601,6 +632,11 @@ 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("www.google.com", origin_data)); |
| predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| profile_->BlockUntilHistoryProcessesPendingRequests(); |
| @@ -645,6 +681,14 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) { |
| resources.push_back(CreateURLRequestSummary( |
| 1, "http://www.google.com", "http://google.com/style2.css", |
| content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true)); |
| + |
| + 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); |
| + |
| predictor_->RecordURLResponse(resources.back()); |
| StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( |
| @@ -674,6 +718,14 @@ 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://google.com/", 1, 0, 0, |
| + 1., false, true); |
| + EXPECT_CALL(*mock_tables_.get(), |
| + UpdateOriginData("www.google.com", origin_data)); |
| + |
| PrefetchData host_data = CreatePrefetchData("www.google.com"); |
| host_data.mutable_resources()->CopyFrom(url_data.resources()); |
| EXPECT_CALL(*mock_tables_.get(), |
| @@ -695,7 +747,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(); |
| @@ -738,6 +791,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()); |
| @@ -787,6 +846,14 @@ 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("www.google.com", origin_data)); |
| + |
| predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| profile_->BlockUntilHistoryProcessesPendingRequests(); |
| } |
| @@ -801,13 +868,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", |
| @@ -838,6 +908,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", |
| @@ -856,6 +928,9 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) { |
| UpdateData(empty_resource_data_, host_data, empty_redirect_data_, |
| empty_redirect_data_)); |
| + EXPECT_CALL(*mock_tables_.get(), |
| + UpdateOriginData("www.nike.com", testing::_)); |
| + |
| predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| profile_->BlockUntilHistoryProcessesPendingRequests(); |
| } |
| @@ -922,7 +997,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(); |
| @@ -1001,7 +1077,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(); |
| @@ -1022,7 +1099,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(); |
| @@ -1735,6 +1813,7 @@ TEST_F(ResourcePrefetchPredictorTest, GetPrefetchData) { |
| TEST_F(ResourcePrefetchPredictorTest, TestPrecisionRecallHistograms) { |
| using testing::_; |
| EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _)); |
| + 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"; |