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

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

Issue 2796783004: predictors: Add origin learning. (Closed)
Patch Set: Advancing our amazing database version number. Created 3 years, 8 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 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";

Powered by Google App Engine
This is Rietveld 408576698