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

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor_browsertest.cc

Issue 2688633002: predictors: Add prefetching hit/miss histograms. (Closed)
Patch Set: Remove duplicated duplicated comment comment. Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/strings/string_util.h" 11 #include "base/strings/string_util.h"
12 #include "base/test/histogram_tester.h"
12 #include "chrome/browser/browsing_data/browsing_data_helper.h" 13 #include "chrome/browser/browsing_data/browsing_data_helper.h"
13 #include "chrome/browser/browsing_data/browsing_data_remover.h" 14 #include "chrome/browser/browsing_data/browsing_data_remover.h"
14 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" 15 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
15 #include "chrome/browser/predictors/resource_prefetch_predictor.h" 16 #include "chrome/browser/predictors/resource_prefetch_predictor.h"
16 #include "chrome/browser/predictors/resource_prefetch_predictor_factory.h" 17 #include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
17 #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h" 18 #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h"
18 #include "chrome/browser/profiles/profile.h" 19 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/ui/browser.h" 20 #include "chrome/browser/ui/browser.h"
20 #include "chrome/browser/ui/tabs/tab_strip_model.h" 21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
21 #include "chrome/common/chrome_switches.h" 22 #include "chrome/common/chrome_switches.h"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 70
70 struct ResourceSummary { 71 struct ResourceSummary {
71 ResourceSummary() 72 ResourceSummary()
72 : version(0), 73 : version(0),
73 is_no_store(false), 74 is_no_store(false),
74 is_external(false), 75 is_external(false),
75 is_observable(true), 76 is_observable(true),
76 is_prohibited(false) {} 77 is_prohibited(false) {}
77 78
78 ResourcePrefetchPredictor::URLRequestSummary request; 79 ResourcePrefetchPredictor::URLRequestSummary request;
79 std::string content;
80 // Allows to update HTTP ETag. 80 // Allows to update HTTP ETag.
81 size_t version; 81 size_t version;
82 // True iff "Cache-control: no-store" header is present. 82 // True iff "Cache-control: no-store" header is present.
83 bool is_no_store; 83 bool is_no_store;
84 // True iff a request for this resource must be ignored by the custom handler. 84 // True iff a request for this resource must be ignored by the custom handler.
85 bool is_external; 85 bool is_external;
86 // True iff the LearningObserver must observe this resource. 86 // True iff the LearningObserver must observe this resource.
87 bool is_observable; 87 bool is_observable;
88 // A request with |is_prohibited| set to true makes the test that originates 88 // A request with |is_prohibited| set to true makes the test that originates
89 // the request fail. 89 // the request fail.
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleResourceRequest, 310 base::Bind(&ResourcePrefetchPredictorBrowserTest::HandleResourceRequest,
311 base::Unretained(this))); 311 base::Unretained(this)));
312 embedded_test_server()->RegisterRequestMonitor(base::Bind( 312 embedded_test_server()->RegisterRequestMonitor(base::Bind(
313 &ResourcePrefetchPredictorBrowserTest::MonitorResourceRequest, 313 &ResourcePrefetchPredictorBrowserTest::MonitorResourceRequest,
314 base::Unretained(this))); 314 base::Unretained(this)));
315 ASSERT_TRUE(embedded_test_server()->Start()); 315 ASSERT_TRUE(embedded_test_server()->Start());
316 predictor_ = 316 predictor_ =
317 ResourcePrefetchPredictorFactory::GetForProfile(browser()->profile()); 317 ResourcePrefetchPredictorFactory::GetForProfile(browser()->profile());
318 ASSERT_TRUE(predictor_); 318 ASSERT_TRUE(predictor_);
319 EnsurePredictorInitialized(); 319 EnsurePredictorInitialized();
320 histogram_tester_.reset(new base::HistogramTester());
320 } 321 }
321 322
322 void TestLearningAndPrefetching(const GURL& main_frame_url) { 323 void TestLearningAndPrefetching(const GURL& main_frame_url) {
323 // Navigate to |main_frame_url| and check all the expectations. 324 // Navigate to |main_frame_url| and check all the expectations.
324 NavigateToURLAndCheckSubresources(main_frame_url); 325 NavigateToURLAndCheckSubresources(main_frame_url);
325 ClearCache(); 326 ClearCache();
326 // It is needed to have at least two resource hits to trigger prefetch. 327 // It is needed to have at least two resource hits to trigger prefetch.
327 NavigateToURLAndCheckSubresources(main_frame_url); 328 NavigateToURLAndCheckSubresources(main_frame_url);
328 ClearCache(); 329 ClearCache();
329 // Prefetch all needed resources and change expectations so that all 330 // Prefetch all needed resources and change expectations so that all
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 const net::EmbeddedTestServer* https_server() const { 481 const net::EmbeddedTestServer* https_server() const {
481 return https_server_.get(); 482 return https_server_.get();
482 } 483 }
483 484
484 net::EmbeddedTestServer* https_server() { return https_server_.get(); } 485 net::EmbeddedTestServer* https_server() { return https_server_.get(); }
485 486
486 size_t navigation_ids_history_size() const { 487 size_t navigation_ids_history_size() const {
487 return navigation_id_history_.size(); 488 return navigation_id_history_.size();
488 } 489 }
489 490
491 std::unique_ptr<base::HistogramTester> histogram_tester_;
492
490 private: 493 private:
491 // ResourcePrefetchPredictor needs to be initialized before the navigation 494 // ResourcePrefetchPredictor needs to be initialized before the navigation
492 // happens otherwise this navigation will be ignored by predictor. 495 // happens otherwise this navigation will be ignored by predictor.
493 void EnsurePredictorInitialized() { 496 void EnsurePredictorInitialized() {
494 if (predictor_->initialization_state_ == 497 if (predictor_->initialization_state_ ==
495 ResourcePrefetchPredictor::INITIALIZED) { 498 ResourcePrefetchPredictor::INITIALIZED) {
496 return; 499 return;
497 } 500 }
498 501
499 InitializationObserver observer(predictor_); 502 InitializationObserver observer(predictor_);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 if (request.headers.find("If-None-Match") != request.headers.end() && 582 if (request.headers.find("If-None-Match") != request.headers.end() &&
580 request.headers.at("If-None-Match") == 583 request.headers.at("If-None-Match") ==
581 CreateVersionedETag(summary.version, request.relative_url)) { 584 CreateVersionedETag(summary.version, request.relative_url)) {
582 http_response->set_code(net::HTTP_NOT_MODIFIED); 585 http_response->set_code(net::HTTP_NOT_MODIFIED);
583 } else { 586 } else {
584 http_response->set_code(net::HTTP_OK); 587 http_response->set_code(net::HTTP_OK);
585 } 588 }
586 589
587 if (!summary.request.mime_type.empty()) 590 if (!summary.request.mime_type.empty())
588 http_response->set_content_type(summary.request.mime_type); 591 http_response->set_content_type(summary.request.mime_type);
589 if (!summary.content.empty())
590 http_response->set_content(summary.content);
591 if (summary.is_no_store) 592 if (summary.is_no_store)
592 http_response->AddCustomHeader("Cache-Control", "no-store"); 593 http_response->AddCustomHeader("Cache-Control", "no-store");
593 if (summary.request.has_validators) { 594 if (summary.request.has_validators) {
594 http_response->AddCustomHeader( 595 http_response->AddCustomHeader(
595 "ETag", CreateVersionedETag(summary.version, request.relative_url)); 596 "ETag", CreateVersionedETag(summary.version, request.relative_url));
596 } 597 }
597 if (summary.request.always_revalidate) 598 if (summary.request.always_revalidate)
598 http_response->AddCustomHeader("Cache-Control", "no-cache"); 599 http_response->AddCustomHeader("Cache-Control", "no-cache");
599 else 600 else
600 http_response->AddCustomHeader("Cache-Control", "max-age=2147483648"); 601 http_response->AddCustomHeader("Cache-Control", "max-age=2147483648");
601 602
603 // Add some content, otherwise the prefetch size histogram rounds down to
604 // 0kB.
605 http_response->set_content(std::string(1024, ' '));
606
602 return std::move(http_response); 607 return std::move(http_response);
603 } 608 }
604 609
605 // The custom handler for redirect requests from the browser to an 610 // The custom handler for redirect requests from the browser to an
606 // EmbeddedTestServer. Running on the EmbeddedTestServer IO thread. 611 // EmbeddedTestServer. Running on the EmbeddedTestServer IO thread.
607 // Finds the data to serve requests in |redirects_| map keyed by a request 612 // Finds the data to serve requests in |redirects_| map keyed by a request
608 // URL. 613 // URL.
609 std::unique_ptr<net::test_server::HttpResponse> HandleRedirectRequest( 614 std::unique_ptr<net::test_server::HttpResponse> HandleRedirectRequest(
610 const net::test_server::HttpRequest& request) const { 615 const net::test_server::HttpRequest& request) const {
611 std::map<GURL, RedirectEdge>::const_iterator redirect_it = 616 std::map<GURL, RedirectEdge>::const_iterator redirect_it =
(...skipping 23 matching lines...) Expand all
635 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, Simple) { 640 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, Simple) {
636 // These resources have default priorities that correspond to 641 // These resources have default priorities that correspond to
637 // blink::typeToPriority function. 642 // blink::typeToPriority function.
638 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST); 643 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST);
639 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET, 644 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET,
640 net::HIGHEST); 645 net::HIGHEST);
641 AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); 646 AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
642 AddResource(GetURL(kFontPath), content::RESOURCE_TYPE_FONT_RESOURCE, 647 AddResource(GetURL(kFontPath), content::RESOURCE_TYPE_FONT_RESOURCE,
643 net::HIGHEST); 648 net::HIGHEST);
644 TestLearningAndPrefetching(GetURL(kHtmlSubresourcesPath)); 649 TestLearningAndPrefetching(GetURL(kHtmlSubresourcesPath));
650
651 // The local cache is cleared.
652 histogram_tester_->ExpectBucketCount(
653 internal::kResourcePrefetchPredictorPrefetchMissesCountCached, 0, 1);
654 histogram_tester_->ExpectBucketCount(
655 internal::kResourcePrefetchPredictorPrefetchMissesCountNotCached, 0, 1);
656 histogram_tester_->ExpectBucketCount(
657 internal::kResourcePrefetchPredictorPrefetchHitsCountCached, 0, 1);
658 histogram_tester_->ExpectBucketCount(
659 internal::kResourcePrefetchPredictorPrefetchHitsCountNotCached, 4, 1);
660
661 histogram_tester_->ExpectBucketCount(
662 internal::kResourcePrefetchPredictorPrefetchMissesSize, 0, 1);
663 // Each request is ~1k, see HandleResourceRequest() above.
664 histogram_tester_->ExpectBucketCount(
665 internal::kResourcePrefetchPredictorPrefetchHitsSize, 4, 1);
645 } 666 }
646 667
647 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, Redirect) { 668 IN_PROC_BROWSER_TEST_F(ResourcePrefetchPredictorBrowserTest, Redirect) {
648 GURL initial_url = embedded_test_server()->GetURL(kFooHost, kRedirectPath); 669 GURL initial_url = embedded_test_server()->GetURL(kFooHost, kRedirectPath);
649 AddRedirectChain(initial_url, {{net::HTTP_MOVED_PERMANENTLY, 670 AddRedirectChain(initial_url, {{net::HTTP_MOVED_PERMANENTLY,
650 GetURL(kHtmlSubresourcesPath)}}); 671 GetURL(kHtmlSubresourcesPath)}});
651 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST); 672 AddResource(GetURL(kImagePath), content::RESOURCE_TYPE_IMAGE, net::LOWEST);
652 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET, 673 AddResource(GetURL(kStylePath), content::RESOURCE_TYPE_STYLESHEET,
653 net::HIGHEST); 674 net::HIGHEST);
654 AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM); 675 AddResource(GetURL(kScriptPath), content::RESOURCE_TYPE_SCRIPT, net::MEDIUM);
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 TryToPrefetchURL(initial_url); 893 TryToPrefetchURL(initial_url);
873 NavigateToURLAndCheckSubresources(initial_url); 894 NavigateToURLAndCheckSubresources(initial_url);
874 ClearCache(); 895 ClearCache();
875 // But the predictor database contains all subresources for the endpoint url 896 // But the predictor database contains all subresources for the endpoint url
876 // so this prefetch works. 897 // so this prefetch works.
877 PrefetchURL(GetURL(kHtmlSubresourcesPath)); 898 PrefetchURL(GetURL(kHtmlSubresourcesPath));
878 NavigateToURLAndCheckSubresourcesAllCached(GetURL(kHtmlSubresourcesPath)); 899 NavigateToURLAndCheckSubresourcesAllCached(GetURL(kHtmlSubresourcesPath));
879 } 900 }
880 901
881 } // namespace predictors 902 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698