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 9f2a98bad54aee1e732bd8af694711539196b455..2d3be0e4614134d35aaefed0a4cda81ddbb02d70 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(); |
| @@ -644,6 +677,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( |
|
alexilin
2017/04/11 09:42:19
I'd test subresource redirect case as well to be s
Benoit L
2017/04/11 14:20:13
Thank you, turns out that it was incorrect!
|
| + 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( |
| @@ -673,6 +714,13 @@ 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(origin_data)); |
| + |
| PrefetchData host_data = CreatePrefetchData("www.google.com"); |
| host_data.mutable_resources()->CopyFrom(url_data.resources()); |
| EXPECT_CALL(*mock_tables_.get(), |
| @@ -694,7 +742,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 +786,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 +841,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 +862,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 +902,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 +922,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 +990,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 +1070,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 +1092,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 +1832,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"; |