| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" | 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" |
| 6 | 6 |
| 7 #include <iostream> | 7 #include <iostream> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 public: | 130 public: |
| 131 MockResourcePrefetchPredictorTables() { } | 131 MockResourcePrefetchPredictorTables() { } |
| 132 | 132 |
| 133 MOCK_METHOD6(GetAllData, | 133 MOCK_METHOD6(GetAllData, |
| 134 void(PrefetchDataMap* url_data_map, | 134 void(PrefetchDataMap* url_data_map, |
| 135 PrefetchDataMap* host_data_map, | 135 PrefetchDataMap* host_data_map, |
| 136 RedirectDataMap* url_redirect_data_map, | 136 RedirectDataMap* url_redirect_data_map, |
| 137 RedirectDataMap* host_redirect_data_map, | 137 RedirectDataMap* host_redirect_data_map, |
| 138 ManifestDataMap* manifest_data_map, | 138 ManifestDataMap* manifest_data_map, |
| 139 OriginDataMap* origin_data_map)); | 139 OriginDataMap* origin_data_map)); |
| 140 MOCK_METHOD4(UpdateData, | 140 MOCK_METHOD2(UpdateResourceData, |
| 141 void(const PrefetchData& url_data, | 141 void(const PrefetchData& data, PrefetchKeyType key_type)); |
| 142 const PrefetchData& host_data, | 142 MOCK_METHOD2(UpdateRedirectData, |
| 143 const RedirectData& url_redirect_data, | 143 void(const RedirectData& data, PrefetchKeyType key_type)); |
| 144 const RedirectData& host_redirect_data)); | |
| 145 MOCK_METHOD2(UpdateManifestData, | 144 MOCK_METHOD2(UpdateManifestData, |
| 146 void(const std::string& host, | 145 void(const std::string& host, |
| 147 const precache::PrecacheManifest& manifest_data)); | 146 const precache::PrecacheManifest& manifest_data)); |
| 148 MOCK_METHOD1(UpdateOriginData, void(const OriginData& origin_data)); | 147 MOCK_METHOD1(UpdateOriginData, void(const OriginData& origin_data)); |
| 149 MOCK_METHOD2(DeleteResourceData, | 148 MOCK_METHOD2(DeleteResourceData, |
| 150 void(const std::vector<std::string>& urls, | 149 void(const std::vector<std::string>& urls, |
| 151 const std::vector<std::string>& hosts)); | 150 const std::vector<std::string>& hosts)); |
| 152 MOCK_METHOD1(DeleteOriginData, void(const std::vector<std::string>& hosts)); | 151 MOCK_METHOD1(DeleteOriginData, void(const std::vector<std::string>& hosts)); |
| 153 MOCK_METHOD2(DeleteSingleResourceDataPoint, | 152 MOCK_METHOD2(DeleteSingleResourceDataPoint, |
| 154 void(const std::string& key, PrefetchKeyType key_type)); | 153 void(const std::string& key, PrefetchKeyType key_type)); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 | 262 |
| 264 std::unique_ptr<ResourcePrefetchPredictor> predictor_; | 263 std::unique_ptr<ResourcePrefetchPredictor> predictor_; |
| 265 scoped_refptr<StrictMock<MockResourcePrefetchPredictorTables>> mock_tables_; | 264 scoped_refptr<StrictMock<MockResourcePrefetchPredictorTables>> mock_tables_; |
| 266 | 265 |
| 267 PrefetchDataMap test_url_data_; | 266 PrefetchDataMap test_url_data_; |
| 268 PrefetchDataMap test_host_data_; | 267 PrefetchDataMap test_host_data_; |
| 269 RedirectDataMap test_url_redirect_data_; | 268 RedirectDataMap test_url_redirect_data_; |
| 270 RedirectDataMap test_host_redirect_data_; | 269 RedirectDataMap test_host_redirect_data_; |
| 271 ManifestDataMap test_manifest_data_; | 270 ManifestDataMap test_manifest_data_; |
| 272 OriginDataMap test_origin_data_; | 271 OriginDataMap test_origin_data_; |
| 273 PrefetchData empty_resource_data_; | |
| 274 RedirectData empty_redirect_data_; | |
| 275 | 272 |
| 276 MockURLRequestJobFactory url_request_job_factory_; | 273 MockURLRequestJobFactory url_request_job_factory_; |
| 277 EmptyURLRequestDelegate url_request_delegate_; | 274 EmptyURLRequestDelegate url_request_delegate_; |
| 278 | 275 |
| 279 std::unique_ptr<base::HistogramTester> histogram_tester_; | 276 std::unique_ptr<base::HistogramTester> histogram_tester_; |
| 280 }; | 277 }; |
| 281 | 278 |
| 282 ResourcePrefetchPredictorTest::ResourcePrefetchPredictorTest() | 279 ResourcePrefetchPredictorTest::ResourcePrefetchPredictorTest() |
| 283 : thread_bundle_(), | 280 : thread_bundle_(), |
| 284 profile_(new TestingProfile()), | 281 profile_(new TestingProfile()), |
| 285 mock_tables_(new StrictMock<MockResourcePrefetchPredictorTables>()), | 282 mock_tables_(new StrictMock<MockResourcePrefetchPredictorTables>()) {} |
| 286 empty_resource_data_(), | |
| 287 empty_redirect_data_() {} | |
| 288 | 283 |
| 289 ResourcePrefetchPredictorTest::~ResourcePrefetchPredictorTest() { | 284 ResourcePrefetchPredictorTest::~ResourcePrefetchPredictorTest() { |
| 290 profile_.reset(NULL); | 285 profile_.reset(NULL); |
| 291 base::RunLoop().RunUntilIdle(); | 286 base::RunLoop().RunUntilIdle(); |
| 292 } | 287 } |
| 293 | 288 |
| 294 void ResourcePrefetchPredictorTest::SetUp() { | 289 void ResourcePrefetchPredictorTest::SetUp() { |
| 295 InitializeSampleData(); | 290 InitializeSampleData(); |
| 296 | 291 |
| 297 ASSERT_TRUE(profile_->CreateHistoryService(true, false)); | 292 ASSERT_TRUE(profile_->CreateHistoryService(true, false)); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 if (predictor_initial_key != predictor_key) { | 482 if (predictor_initial_key != predictor_key) { |
| 488 RedirectData redirect = CreateRedirectData(predictor_initial_key, 1); | 483 RedirectData redirect = CreateRedirectData(predictor_initial_key, 1); |
| 489 InitializeRedirectStat(redirect.add_redirect_endpoints(), predictor_key, 10, | 484 InitializeRedirectStat(redirect.add_redirect_endpoints(), predictor_key, 10, |
| 490 0, 0); | 485 0, 0); |
| 491 predictor_->host_redirect_table_cache_->insert( | 486 predictor_->host_redirect_table_cache_->insert( |
| 492 std::make_pair(redirect.primary_key(), redirect)); | 487 std::make_pair(redirect.primary_key(), redirect)); |
| 493 } | 488 } |
| 494 | 489 |
| 495 // Navigation simulation. | 490 // Navigation simulation. |
| 496 using testing::_; | 491 using testing::_; |
| 497 EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _)) | 492 EXPECT_CALL(*mock_tables_.get(), UpdateResourceData(_, _)); |
| 498 .Times(testing::AtLeast(1)); | 493 EXPECT_CALL(*mock_tables_.get(), UpdateRedirectData(_, _)); |
| 499 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); | 494 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); |
| 500 | |
| 501 URLRequestSummary initial = | 495 URLRequestSummary initial = |
| 502 CreateURLRequestSummary(1, navigation_initial_url); | 496 CreateURLRequestSummary(1, navigation_initial_url); |
| 503 predictor_->RecordURLRequest(initial); | 497 predictor_->RecordURLRequest(initial); |
| 504 | 498 |
| 505 if (navigation_initial_url != navigation_url) { | 499 if (navigation_initial_url != navigation_url) { |
| 506 URLRequestSummary redirect = | 500 URLRequestSummary redirect = |
| 507 CreateRedirectRequestSummary(1, navigation_initial_url, navigation_url); | 501 CreateRedirectRequestSummary(1, navigation_initial_url, navigation_url); |
| 508 predictor_->RecordURLRedirect(redirect); | 502 predictor_->RecordURLRedirect(redirect); |
| 509 } | 503 } |
| 510 NavigationID navigation_id = CreateNavigationID(1, navigation_url); | 504 NavigationID navigation_id = CreateNavigationID(1, navigation_url); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 "https://google.com/style1.css", | 615 "https://google.com/style1.css", |
| 622 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, | 616 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, |
| 623 net::MEDIUM, false, false); | 617 net::MEDIUM, false, false); |
| 624 InitializeResourceData( | 618 InitializeResourceData( |
| 625 host_data.add_resources(), "https://google.com/script1.js", | 619 host_data.add_resources(), "https://google.com/script1.js", |
| 626 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); | 620 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); |
| 627 InitializeResourceData( | 621 InitializeResourceData( |
| 628 host_data.add_resources(), "https://google.com/script2.js", | 622 host_data.add_resources(), "https://google.com/script2.js", |
| 629 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); | 623 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); |
| 630 EXPECT_CALL(*mock_tables_.get(), | 624 EXPECT_CALL(*mock_tables_.get(), |
| 631 UpdateData(empty_resource_data_, host_data, empty_redirect_data_, | 625 UpdateResourceData(host_data, PREFETCH_KEY_TYPE_HOST)); |
| 632 empty_redirect_data_)); | 626 |
| 633 OriginData origin_data = CreateOriginData("www.google.com"); | 627 OriginData origin_data = CreateOriginData("www.google.com"); |
| 634 InitializeOriginStat(origin_data.add_origins(), "https://google.com/", 1, 0, | 628 InitializeOriginStat(origin_data.add_origins(), "https://google.com/", 1, 0, |
| 635 0, 1., false, true); | 629 0, 1., false, true); |
| 636 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data)); | 630 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data)); |
| 637 | 631 |
| 638 RedirectData host_redirect_data = CreateRedirectData("www.google.com"); | 632 RedirectData host_redirect_data = CreateRedirectData("www.google.com"); |
| 639 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), | 633 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), |
| 640 "www.google.com", 1, 0, 0); | 634 "www.google.com", 1, 0, 0); |
| 641 EXPECT_CALL(*mock_tables_.get(), | 635 EXPECT_CALL(*mock_tables_.get(), |
| 642 UpdateData(empty_resource_data_, empty_resource_data_, | 636 UpdateRedirectData(host_redirect_data, PREFETCH_KEY_TYPE_HOST)); |
| 643 empty_redirect_data_, host_redirect_data)); | |
| 644 | 637 |
| 645 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 638 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 646 profile_->BlockUntilHistoryProcessesPendingRequests(); | 639 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 647 } | 640 } |
| 648 | 641 |
| 649 // Single navigation that will be recorded. Will check for duplicate | 642 // Single navigation that will be recorded. Will check for duplicate |
| 650 // resources and also for number of resources saved. | 643 // resources and also for number of resources saved. |
| 651 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) { | 644 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDB) { |
| 652 const int kVisitCount = 4; | 645 const int kVisitCount = 4; |
| 653 AddUrlToHistory("http://www.google.com", kVisitCount); | 646 AddUrlToHistory("http://www.google.com", kVisitCount); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 url_data.add_resources(), "http://google.com/script1.js", | 716 url_data.add_resources(), "http://google.com/script1.js", |
| 724 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); | 717 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); |
| 725 InitializeResourceData( | 718 InitializeResourceData( |
| 726 url_data.add_resources(), "http://google.com/script2.js", | 719 url_data.add_resources(), "http://google.com/script2.js", |
| 727 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); | 720 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); |
| 728 InitializeResourceData(url_data.add_resources(), | 721 InitializeResourceData(url_data.add_resources(), |
| 729 "http://google.com/style2.css", | 722 "http://google.com/style2.css", |
| 730 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 7.0, | 723 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 7.0, |
| 731 net::MEDIUM, false, false); | 724 net::MEDIUM, false, false); |
| 732 EXPECT_CALL(*mock_tables_.get(), | 725 EXPECT_CALL(*mock_tables_.get(), |
| 733 UpdateData(url_data, empty_resource_data_, empty_redirect_data_, | 726 UpdateResourceData(url_data, PREFETCH_KEY_TYPE_URL)); |
| 734 empty_redirect_data_)); | |
| 735 | 727 |
| 736 OriginData origin_data = CreateOriginData("www.google.com"); | 728 OriginData origin_data = CreateOriginData("www.google.com"); |
| 737 InitializeOriginStat(origin_data.add_origins(), "http://static.google.com/", | 729 InitializeOriginStat(origin_data.add_origins(), "http://static.google.com/", |
| 738 1, 0, 0, 2., true, true); | 730 1, 0, 0, 2., true, true); |
| 739 InitializeOriginStat(origin_data.add_origins(), "http://dev.null.google.com/", | 731 InitializeOriginStat(origin_data.add_origins(), "http://dev.null.google.com/", |
| 740 1, 0, 0, 4., true, true); | 732 1, 0, 0, 4., true, true); |
| 741 InitializeOriginStat(origin_data.add_origins(), "http://google.com/", 1, 0, 0, | 733 InitializeOriginStat(origin_data.add_origins(), "http://google.com/", 1, 0, 0, |
| 742 1., false, true); | 734 1., false, true); |
| 743 InitializeOriginStat(origin_data.add_origins(), "http://reader.google.com/", | 735 InitializeOriginStat(origin_data.add_origins(), "http://reader.google.com/", |
| 744 1, 0, 0, 3., false, true); | 736 1, 0, 0, 3., false, true); |
| 745 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data)); | 737 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data)); |
| 746 | 738 |
| 747 PrefetchData host_data = CreatePrefetchData("www.google.com"); | 739 PrefetchData host_data = CreatePrefetchData("www.google.com"); |
| 748 host_data.mutable_resources()->CopyFrom(url_data.resources()); | 740 host_data.mutable_resources()->CopyFrom(url_data.resources()); |
| 749 EXPECT_CALL(*mock_tables_.get(), | 741 EXPECT_CALL(*mock_tables_.get(), |
| 750 UpdateData(empty_resource_data_, host_data, empty_redirect_data_, | 742 UpdateResourceData(host_data, PREFETCH_KEY_TYPE_HOST)); |
| 751 empty_redirect_data_)); | |
| 752 | 743 |
| 753 RedirectData url_redirect_data = CreateRedirectData("http://www.google.com/"); | 744 RedirectData url_redirect_data = CreateRedirectData("http://www.google.com/"); |
| 754 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), | 745 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), |
| 755 "http://www.google.com/", 1, 0, 0); | 746 "http://www.google.com/", 1, 0, 0); |
| 756 EXPECT_CALL(*mock_tables_.get(), | 747 EXPECT_CALL(*mock_tables_.get(), |
| 757 UpdateData(empty_resource_data_, empty_resource_data_, | 748 UpdateRedirectData(url_redirect_data, PREFETCH_KEY_TYPE_URL)); |
| 758 url_redirect_data, empty_redirect_data_)); | |
| 759 | 749 |
| 760 RedirectData host_redirect_data = CreateRedirectData("www.google.com"); | 750 RedirectData host_redirect_data = CreateRedirectData("www.google.com"); |
| 761 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), | 751 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), |
| 762 "www.google.com", 1, 0, 0); | 752 "www.google.com", 1, 0, 0); |
| 763 EXPECT_CALL(*mock_tables_.get(), | 753 EXPECT_CALL(*mock_tables_.get(), |
| 764 UpdateData(empty_resource_data_, empty_resource_data_, | 754 UpdateRedirectData(host_redirect_data, PREFETCH_KEY_TYPE_HOST)); |
| 765 empty_redirect_data_, host_redirect_data)); | |
| 766 | 755 |
| 767 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 756 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 768 profile_->BlockUntilHistoryProcessesPendingRequests(); | 757 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 769 } | 758 } |
| 770 | 759 |
| 771 // Tests that navigation is recorded correctly for URL already present in | 760 // Tests that navigation is recorded correctly for URL already present in |
| 772 // the database cache. | 761 // the database cache. |
| 773 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) { | 762 TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) { |
| 774 const int kVisitCount = 4; | 763 const int kVisitCount = 4; |
| 775 AddUrlToHistory("http://www.google.com", kVisitCount); | 764 AddUrlToHistory("http://www.google.com", kVisitCount); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 InitializeResourceData( | 835 InitializeResourceData( |
| 847 url_data.add_resources(), "http://google.com/script1.js", | 836 url_data.add_resources(), "http://google.com/script1.js", |
| 848 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); | 837 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); |
| 849 InitializeResourceData( | 838 InitializeResourceData( |
| 850 url_data.add_resources(), "http://google.com/script4.js", | 839 url_data.add_resources(), "http://google.com/script4.js", |
| 851 content::RESOURCE_TYPE_SCRIPT, 11, 1, 1, 2.1, net::MEDIUM, false, false); | 840 content::RESOURCE_TYPE_SCRIPT, 11, 1, 1, 2.1, net::MEDIUM, false, false); |
| 852 InitializeResourceData( | 841 InitializeResourceData( |
| 853 url_data.add_resources(), "http://google.com/script2.js", | 842 url_data.add_resources(), "http://google.com/script2.js", |
| 854 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); | 843 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); |
| 855 EXPECT_CALL(*mock_tables_.get(), | 844 EXPECT_CALL(*mock_tables_.get(), |
| 856 UpdateData(url_data, empty_resource_data_, empty_redirect_data_, | 845 UpdateResourceData(url_data, PREFETCH_KEY_TYPE_URL)); |
| 857 empty_redirect_data_)); | |
| 858 EXPECT_CALL(*mock_tables_.get(), | 846 EXPECT_CALL(*mock_tables_.get(), |
| 859 DeleteSingleResourceDataPoint("www.facebook.com", | 847 DeleteSingleResourceDataPoint("www.facebook.com", |
| 860 PREFETCH_KEY_TYPE_HOST)); | 848 PREFETCH_KEY_TYPE_HOST)); |
| 861 | 849 |
| 862 PrefetchData host_data = CreatePrefetchData("www.google.com"); | 850 PrefetchData host_data = CreatePrefetchData("www.google.com"); |
| 863 InitializeResourceData(host_data.add_resources(), | 851 InitializeResourceData(host_data.add_resources(), |
| 864 "http://google.com/style1.css", | 852 "http://google.com/style1.css", |
| 865 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, | 853 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, |
| 866 net::MEDIUM, false, false); | 854 net::MEDIUM, false, false); |
| 867 InitializeResourceData( | 855 InitializeResourceData( |
| 868 host_data.add_resources(), "http://google.com/script1.js", | 856 host_data.add_resources(), "http://google.com/script1.js", |
| 869 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); | 857 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 2.0, net::MEDIUM, false, false); |
| 870 InitializeResourceData( | 858 InitializeResourceData( |
| 871 host_data.add_resources(), "http://google.com/script2.js", | 859 host_data.add_resources(), "http://google.com/script2.js", |
| 872 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); | 860 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, net::MEDIUM, false, false); |
| 873 InitializeResourceData(host_data.add_resources(), | 861 InitializeResourceData(host_data.add_resources(), |
| 874 "http://google.com/style2.css", | 862 "http://google.com/style2.css", |
| 875 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 7.0, | 863 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 7.0, |
| 876 net::MEDIUM, false, false); | 864 net::MEDIUM, false, false); |
| 877 EXPECT_CALL(*mock_tables_.get(), | 865 EXPECT_CALL(*mock_tables_.get(), |
| 878 UpdateData(empty_resource_data_, host_data, empty_redirect_data_, | 866 UpdateResourceData(host_data, PREFETCH_KEY_TYPE_HOST)); |
| 879 empty_redirect_data_)); | |
| 880 | 867 |
| 881 RedirectData url_redirect_data = CreateRedirectData("http://www.google.com/"); | 868 RedirectData url_redirect_data = CreateRedirectData("http://www.google.com/"); |
| 882 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), | 869 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), |
| 883 "http://www.google.com/", 1, 0, 0); | 870 "http://www.google.com/", 1, 0, 0); |
| 884 EXPECT_CALL(*mock_tables_.get(), | 871 EXPECT_CALL(*mock_tables_.get(), |
| 885 UpdateData(empty_resource_data_, empty_resource_data_, | 872 UpdateRedirectData(url_redirect_data, PREFETCH_KEY_TYPE_URL)); |
| 886 url_redirect_data, empty_redirect_data_)); | |
| 887 | 873 |
| 888 RedirectData host_redirect_data = CreateRedirectData("www.google.com"); | 874 RedirectData host_redirect_data = CreateRedirectData("www.google.com"); |
| 889 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), | 875 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), |
| 890 "www.google.com", 1, 0, 0); | 876 "www.google.com", 1, 0, 0); |
| 891 EXPECT_CALL(*mock_tables_.get(), | 877 EXPECT_CALL(*mock_tables_.get(), |
| 892 UpdateData(empty_resource_data_, empty_resource_data_, | 878 UpdateRedirectData(host_redirect_data, PREFETCH_KEY_TYPE_HOST)); |
| 893 empty_redirect_data_, host_redirect_data)); | |
| 894 | 879 |
| 895 OriginData origin_data = CreateOriginData("www.google.com"); | 880 OriginData origin_data = CreateOriginData("www.google.com"); |
| 896 InitializeOriginStat(origin_data.add_origins(), "http://static.google.com/", | 881 InitializeOriginStat(origin_data.add_origins(), "http://static.google.com/", |
| 897 1, 0, 0, 2., true, true); | 882 1, 0, 0, 2., true, true); |
| 898 InitializeOriginStat(origin_data.add_origins(), "http://google.com/", 1, 0, 0, | 883 InitializeOriginStat(origin_data.add_origins(), "http://google.com/", 1, 0, 0, |
| 899 1., false, true); | 884 1., false, true); |
| 900 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data)); | 885 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(origin_data)); |
| 901 | 886 |
| 902 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 887 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 903 profile_->BlockUntilHistoryProcessesPendingRequests(); | 888 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 DeleteOriginData(std::vector<std::string>({"google.com"}))); | 942 DeleteOriginData(std::vector<std::string>({"google.com"}))); |
| 958 | 943 |
| 959 PrefetchData url_data = CreatePrefetchData("http://www.nike.com/"); | 944 PrefetchData url_data = CreatePrefetchData("http://www.nike.com/"); |
| 960 InitializeResourceData(url_data.add_resources(), "http://nike.com/style1.css", | 945 InitializeResourceData(url_data.add_resources(), "http://nike.com/style1.css", |
| 961 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, | 946 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, |
| 962 net::MEDIUM, false, false); | 947 net::MEDIUM, false, false); |
| 963 InitializeResourceData(url_data.add_resources(), "http://nike.com/image2.png", | 948 InitializeResourceData(url_data.add_resources(), "http://nike.com/image2.png", |
| 964 content::RESOURCE_TYPE_IMAGE, 1, 0, 0, 2.0, | 949 content::RESOURCE_TYPE_IMAGE, 1, 0, 0, 2.0, |
| 965 net::MEDIUM, false, false); | 950 net::MEDIUM, false, false); |
| 966 EXPECT_CALL(*mock_tables_.get(), | 951 EXPECT_CALL(*mock_tables_.get(), |
| 967 UpdateData(url_data, empty_resource_data_, empty_redirect_data_, | 952 UpdateResourceData(url_data, PREFETCH_KEY_TYPE_URL)); |
| 968 empty_redirect_data_)); | |
| 969 | 953 |
| 970 PrefetchData host_data = CreatePrefetchData("www.nike.com"); | 954 PrefetchData host_data = CreatePrefetchData("www.nike.com"); |
| 971 host_data.mutable_resources()->CopyFrom(url_data.resources()); | 955 host_data.mutable_resources()->CopyFrom(url_data.resources()); |
| 972 EXPECT_CALL(*mock_tables_.get(), | 956 EXPECT_CALL(*mock_tables_.get(), |
| 973 UpdateData(empty_resource_data_, host_data, empty_redirect_data_, | 957 UpdateResourceData(host_data, PREFETCH_KEY_TYPE_HOST)); |
| 974 empty_redirect_data_)); | |
| 975 | 958 |
| 976 RedirectData url_redirect_data = CreateRedirectData("http://www.nike.com/"); | 959 RedirectData url_redirect_data = CreateRedirectData("http://www.nike.com/"); |
| 977 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), | 960 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), |
| 978 "http://www.nike.com/", 1, 0, 0); | 961 "http://www.nike.com/", 1, 0, 0); |
| 979 EXPECT_CALL(*mock_tables_.get(), | 962 EXPECT_CALL(*mock_tables_.get(), |
| 980 UpdateData(empty_resource_data_, empty_resource_data_, | 963 UpdateRedirectData(url_redirect_data, PREFETCH_KEY_TYPE_URL)); |
| 981 url_redirect_data, empty_redirect_data_)); | |
| 982 | 964 |
| 983 RedirectData host_redirect_data = CreateRedirectData("www.nike.com"); | 965 RedirectData host_redirect_data = CreateRedirectData("www.nike.com"); |
| 984 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), | 966 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), |
| 985 "www.nike.com", 1, 0, 0); | 967 "www.nike.com", 1, 0, 0); |
| 986 EXPECT_CALL(*mock_tables_.get(), | 968 EXPECT_CALL(*mock_tables_.get(), |
| 987 UpdateData(empty_resource_data_, empty_resource_data_, | 969 UpdateRedirectData(host_redirect_data, PREFETCH_KEY_TYPE_HOST)); |
| 988 empty_redirect_data_, host_redirect_data)); | |
| 989 | 970 |
| 990 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(testing::_)); | 971 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(testing::_)); |
| 991 | 972 |
| 992 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 973 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 993 profile_->BlockUntilHistoryProcessesPendingRequests(); | 974 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 994 } | 975 } |
| 995 | 976 |
| 996 TEST_F(ResourcePrefetchPredictorTest, RedirectUrlNotInDB) { | 977 TEST_F(ResourcePrefetchPredictorTest, RedirectUrlNotInDB) { |
| 997 const int kVisitCount = 4; | 978 const int kVisitCount = 4; |
| 998 AddUrlToHistory("https://facebook.com/google", kVisitCount); | 979 AddUrlToHistory("https://facebook.com/google", kVisitCount); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1023 EXPECT_CALL(*mock_tables_.get(), | 1004 EXPECT_CALL(*mock_tables_.get(), |
| 1024 DeleteSingleResourceDataPoint("https://facebook.com/google", | 1005 DeleteSingleResourceDataPoint("https://facebook.com/google", |
| 1025 PREFETCH_KEY_TYPE_URL)); | 1006 PREFETCH_KEY_TYPE_URL)); |
| 1026 EXPECT_CALL(*mock_tables_.get(), DeleteSingleResourceDataPoint( | 1007 EXPECT_CALL(*mock_tables_.get(), DeleteSingleResourceDataPoint( |
| 1027 "facebook.com", PREFETCH_KEY_TYPE_HOST)); | 1008 "facebook.com", PREFETCH_KEY_TYPE_HOST)); |
| 1028 | 1009 |
| 1029 RedirectData url_redirect_data = CreateRedirectData("http://fb.com/google"); | 1010 RedirectData url_redirect_data = CreateRedirectData("http://fb.com/google"); |
| 1030 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), | 1011 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), |
| 1031 "https://facebook.com/google", 1, 0, 0); | 1012 "https://facebook.com/google", 1, 0, 0); |
| 1032 EXPECT_CALL(*mock_tables_.get(), | 1013 EXPECT_CALL(*mock_tables_.get(), |
| 1033 UpdateData(empty_resource_data_, empty_resource_data_, | 1014 UpdateRedirectData(url_redirect_data, PREFETCH_KEY_TYPE_URL)); |
| 1034 url_redirect_data, empty_redirect_data_)); | |
| 1035 | 1015 |
| 1036 RedirectData host_redirect_data = CreateRedirectData("fb.com"); | 1016 RedirectData host_redirect_data = CreateRedirectData("fb.com"); |
| 1037 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), | 1017 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), |
| 1038 "facebook.com", 1, 0, 0); | 1018 "facebook.com", 1, 0, 0); |
| 1039 EXPECT_CALL(*mock_tables_.get(), | 1019 EXPECT_CALL(*mock_tables_.get(), |
| 1040 UpdateData(empty_resource_data_, empty_resource_data_, | 1020 UpdateRedirectData(host_redirect_data, PREFETCH_KEY_TYPE_HOST)); |
| 1041 empty_redirect_data_, host_redirect_data)); | |
| 1042 | 1021 |
| 1043 predictor_->RecordMainFrameLoadComplete(fb_end); | 1022 predictor_->RecordMainFrameLoadComplete(fb_end); |
| 1044 profile_->BlockUntilHistoryProcessesPendingRequests(); | 1023 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 1045 } | 1024 } |
| 1046 | 1025 |
| 1047 // Tests that redirect is recorded correctly for URL already present in | 1026 // Tests that redirect is recorded correctly for URL already present in |
| 1048 // the database cache. | 1027 // the database cache. |
| 1049 TEST_F(ResourcePrefetchPredictorTest, RedirectUrlInDB) { | 1028 TEST_F(ResourcePrefetchPredictorTest, RedirectUrlInDB) { |
| 1050 const int kVisitCount = 7; | 1029 const int kVisitCount = 7; |
| 1051 AddUrlToHistory("https://facebook.com/google", kVisitCount); | 1030 AddUrlToHistory("https://facebook.com/google", kVisitCount); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1096 PREFETCH_KEY_TYPE_URL)); | 1075 PREFETCH_KEY_TYPE_URL)); |
| 1097 EXPECT_CALL(*mock_tables_.get(), DeleteSingleResourceDataPoint( | 1076 EXPECT_CALL(*mock_tables_.get(), DeleteSingleResourceDataPoint( |
| 1098 "facebook.com", PREFETCH_KEY_TYPE_HOST)); | 1077 "facebook.com", PREFETCH_KEY_TYPE_HOST)); |
| 1099 | 1078 |
| 1100 RedirectData url_redirect_data = CreateRedirectData("http://fb.com/google"); | 1079 RedirectData url_redirect_data = CreateRedirectData("http://fb.com/google"); |
| 1101 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), | 1080 InitializeRedirectStat(url_redirect_data.add_redirect_endpoints(), |
| 1102 "https://facebook.com/google", 6, 1, 0); | 1081 "https://facebook.com/google", 6, 1, 0); |
| 1103 // Existing redirect to https://facebook.com/login will be deleted because of | 1082 // Existing redirect to https://facebook.com/login will be deleted because of |
| 1104 // too many consecutive misses. | 1083 // too many consecutive misses. |
| 1105 EXPECT_CALL(*mock_tables_.get(), | 1084 EXPECT_CALL(*mock_tables_.get(), |
| 1106 UpdateData(empty_resource_data_, empty_resource_data_, | 1085 UpdateRedirectData(url_redirect_data, PREFETCH_KEY_TYPE_URL)); |
| 1107 url_redirect_data, empty_redirect_data_)); | |
| 1108 | 1086 |
| 1109 RedirectData host_redirect_data = CreateRedirectData("fb.com"); | 1087 RedirectData host_redirect_data = CreateRedirectData("fb.com"); |
| 1110 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), | 1088 InitializeRedirectStat(host_redirect_data.add_redirect_endpoints(), |
| 1111 "facebook.com", 1, 0, 0); | 1089 "facebook.com", 1, 0, 0); |
| 1112 EXPECT_CALL(*mock_tables_.get(), | 1090 EXPECT_CALL(*mock_tables_.get(), |
| 1113 UpdateData(empty_resource_data_, empty_resource_data_, | 1091 UpdateRedirectData(host_redirect_data, PREFETCH_KEY_TYPE_HOST)); |
| 1114 empty_redirect_data_, host_redirect_data)); | |
| 1115 | 1092 |
| 1116 predictor_->RecordMainFrameLoadComplete(fb_end); | 1093 predictor_->RecordMainFrameLoadComplete(fb_end); |
| 1117 profile_->BlockUntilHistoryProcessesPendingRequests(); | 1094 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 1118 } | 1095 } |
| 1119 | 1096 |
| 1120 TEST_F(ResourcePrefetchPredictorTest, ManifestHostNotInDB) { | 1097 TEST_F(ResourcePrefetchPredictorTest, ManifestHostNotInDB) { |
| 1121 precache::PrecacheManifest manifest = CreateManifestData(1); | 1098 precache::PrecacheManifest manifest = CreateManifestData(1); |
| 1122 InitializePrecacheResource(manifest.add_resource(), | 1099 InitializePrecacheResource(manifest.add_resource(), |
| 1123 "http://cdn.google.com/script.js", 0.9); | 1100 "http://cdn.google.com/script.js", 0.9); |
| 1124 InitializePrecacheResource(manifest.add_resource(), | 1101 InitializePrecacheResource(manifest.add_resource(), |
| (...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1899 predictor_->url_table_cache_->insert( | 1876 predictor_->url_table_cache_->insert( |
| 1900 std::make_pair(www_google_url.primary_key(), www_google_url)); | 1877 std::make_pair(www_google_url.primary_key(), www_google_url)); |
| 1901 | 1878 |
| 1902 urls.clear(); | 1879 urls.clear(); |
| 1903 EXPECT_TRUE(predictor_->GetPrefetchData(main_frame_url, &prediction)); | 1880 EXPECT_TRUE(predictor_->GetPrefetchData(main_frame_url, &prediction)); |
| 1904 EXPECT_THAT(urls, UnorderedElementsAre(GURL(font_url))); | 1881 EXPECT_THAT(urls, UnorderedElementsAre(GURL(font_url))); |
| 1905 } | 1882 } |
| 1906 | 1883 |
| 1907 TEST_F(ResourcePrefetchPredictorTest, TestPrecisionRecallHistograms) { | 1884 TEST_F(ResourcePrefetchPredictorTest, TestPrecisionRecallHistograms) { |
| 1908 using testing::_; | 1885 using testing::_; |
| 1909 EXPECT_CALL(*mock_tables_.get(), UpdateData(_, _, _, _)).Times(2); | 1886 EXPECT_CALL(*mock_tables_.get(), UpdateResourceData(_, _)); |
| 1887 EXPECT_CALL(*mock_tables_.get(), UpdateRedirectData(_, _)); |
| 1910 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); | 1888 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); |
| 1911 | 1889 |
| 1912 // Fill the database with 3 resources: 1 useful, 2 useless. | 1890 // Fill the database with 3 resources: 1 useful, 2 useless. |
| 1913 const std::string main_frame_url = "http://google.com/?query=cats"; | 1891 const std::string main_frame_url = "http://google.com/?query=cats"; |
| 1914 PrefetchData google = CreatePrefetchData("google.com", 1); | 1892 PrefetchData google = CreatePrefetchData("google.com", 1); |
| 1915 | 1893 |
| 1916 const std::string script_url = "https://cdn.google.com/script.js"; | 1894 const std::string script_url = "https://cdn.google.com/script.js"; |
| 1917 InitializeResourceData(google.add_resources(), script_url, | 1895 InitializeResourceData(google.add_resources(), script_url, |
| 1918 content::RESOURCE_TYPE_SCRIPT, 10, 0, 1, 2.1, | 1896 content::RESOURCE_TYPE_SCRIPT, 10, 0, 1, 2.1, |
| 1919 net::MEDIUM, false, false); | 1897 net::MEDIUM, false, false); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2007 predictor_->host_table_cache_->insert( | 1985 predictor_->host_table_cache_->insert( |
| 2008 std::make_pair(google.primary_key(), google)); | 1986 std::make_pair(google.primary_key(), google)); |
| 2009 | 1987 |
| 2010 predictor_->StartPrefetching(GURL(main_frame_url), PrefetchOrigin::EXTERNAL); | 1988 predictor_->StartPrefetching(GURL(main_frame_url), PrefetchOrigin::EXTERNAL); |
| 2011 predictor_->StopPrefetching(GURL(main_frame_url)); | 1989 predictor_->StopPrefetching(GURL(main_frame_url)); |
| 2012 histogram_tester_->ExpectTotalCount( | 1990 histogram_tester_->ExpectTotalCount( |
| 2013 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram, 1); | 1991 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram, 1); |
| 2014 } | 1992 } |
| 2015 | 1993 |
| 2016 } // namespace predictors | 1994 } // namespace predictors |
| OLD | NEW |