| 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 91246aa664f39264202c0fb237eea752e0d85e8f..1baeb5526e5fd91ff03b764875752edae3d26f36 100644
|
| --- a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
|
| @@ -7,6 +7,7 @@
|
| #include <iostream>
|
| #include <memory>
|
|
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| @@ -16,7 +17,13 @@
|
| #include "chrome/test/base/testing_profile.h"
|
| #include "components/history/core/browser/history_service.h"
|
| #include "components/history/core/browser/history_types.h"
|
| +#include "content/public/browser/resource_request_info.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| +#include "net/http/http_response_headers.h"
|
| +#include "net/url_request/url_request_context.h"
|
| +#include "net/url_request/url_request_job.h"
|
| +#include "net/url_request/url_request_test_util.h"
|
| +#include "net/url_request/url_request_test_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -52,6 +59,83 @@ void PrintTo(const PrefetchData& data, ::std::ostream* os) {
|
| }
|
| }
|
|
|
| +class EmptyURLRequestDelegate : public net::URLRequest::Delegate {
|
| + void OnResponseStarted(net::URLRequest* request) override {}
|
| + void OnReadCompleted(net::URLRequest* request, int bytes_read) override {}
|
| +};
|
| +
|
| +class MockURLRequestJob : public net::URLRequestJob {
|
| + public:
|
| + MockURLRequestJob(net::URLRequest* request,
|
| + const net::HttpResponseInfo& response_info,
|
| + const std::string& mime_type)
|
| + : net::URLRequestJob(request, nullptr),
|
| + response_info_(response_info),
|
| + mime_type_(mime_type) {}
|
| +
|
| + bool GetMimeType(std::string* mime_type) const override {
|
| + *mime_type = mime_type_;
|
| + return true;
|
| + }
|
| +
|
| + protected:
|
| + void Start() override { NotifyHeadersComplete(); }
|
| + int GetResponseCode() const override { return 200; }
|
| + void GetResponseInfo(net::HttpResponseInfo* info) override {
|
| + *info = response_info_;
|
| + }
|
| +
|
| + private:
|
| + net::HttpResponseInfo response_info_;
|
| + std::string mime_type_;
|
| +};
|
| +
|
| +class MockURLRequestJobFactory : public net::URLRequestJobFactory {
|
| + public:
|
| + MockURLRequestJobFactory() {}
|
| + ~MockURLRequestJobFactory() override {}
|
| +
|
| + net::URLRequestJob* MaybeCreateJobWithProtocolHandler(
|
| + const std::string& scheme,
|
| + net::URLRequest* request,
|
| + net::NetworkDelegate* network_delegate) const override {
|
| + return new MockURLRequestJob(request, response_info_, mime_type_);
|
| + }
|
| +
|
| + net::URLRequestJob* MaybeInterceptRedirect(
|
| + net::URLRequest* request,
|
| + net::NetworkDelegate* network_delegate,
|
| + const GURL& location) const override {
|
| + return nullptr;
|
| + }
|
| +
|
| + net::URLRequestJob* MaybeInterceptResponse(
|
| + net::URLRequest* request,
|
| + net::NetworkDelegate* network_delegate) const override {
|
| + return nullptr;
|
| + }
|
| +
|
| + bool IsHandledProtocol(const std::string& scheme) const override {
|
| + return true;
|
| + }
|
| +
|
| + bool IsHandledURL(const GURL& url) const override { return true; }
|
| +
|
| + bool IsSafeRedirectTarget(const GURL& location) const override {
|
| + return true;
|
| + }
|
| +
|
| + void set_response_info(const net::HttpResponseInfo& response_info) {
|
| + response_info_ = response_info;
|
| + }
|
| +
|
| + void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; }
|
| +
|
| + private:
|
| + net::HttpResponseInfo response_info_;
|
| + std::string mime_type_;
|
| +};
|
| +
|
| class MockResourcePrefetchPredictorTables
|
| : public ResourcePrefetchPredictorTables {
|
| public:
|
| @@ -124,6 +208,24 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| return summary;
|
| }
|
|
|
| + std::unique_ptr<net::URLRequest> CreateURLRequest(
|
| + const GURL& url,
|
| + net::RequestPriority priority,
|
| + content::ResourceType resource_type,
|
| + int render_process_id,
|
| + int render_frame_id,
|
| + bool is_main_frame) {
|
| + std::unique_ptr<net::URLRequest> request =
|
| + url_request_context_.CreateRequest(url, priority,
|
| + &url_request_delegate_);
|
| + request->set_first_party_for_cookies(url);
|
| + content::ResourceRequestInfo::AllocateForTesting(
|
| + request.get(), resource_type, nullptr, render_process_id, -1,
|
| + render_frame_id, is_main_frame, false, false, true, false);
|
| + request->Start();
|
| + return request;
|
| + }
|
| +
|
| void InitializePredictor() {
|
| predictor_->StartInitialization();
|
| base::RunLoop loop;
|
| @@ -161,6 +263,7 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| content::TestBrowserThread ui_thread_;
|
| content::TestBrowserThread db_thread_;
|
| std::unique_ptr<TestingProfile> profile_;
|
| + net::TestURLRequestContext url_request_context_;
|
|
|
| std::unique_ptr<ResourcePrefetchPredictor> predictor_;
|
| scoped_refptr<StrictMock<MockResourcePrefetchPredictorTables> > mock_tables_;
|
| @@ -169,6 +272,9 @@ class ResourcePrefetchPredictorTest : public testing::Test {
|
| PrefetchDataMap test_host_data_;
|
| PrefetchData empty_url_data_;
|
| PrefetchData empty_host_data_;
|
| +
|
| + MockURLRequestJobFactory url_request_job_factory_;
|
| + EmptyURLRequestDelegate url_request_delegate_;
|
| };
|
|
|
| ResourcePrefetchPredictorTest::ResourcePrefetchPredictorTest()
|
| @@ -203,6 +309,8 @@ void ResourcePrefetchPredictorTest::SetUp() {
|
| EXPECT_TRUE(predictor_->inflight_navigations_.empty());
|
| EXPECT_EQ(predictor_->initialization_state_,
|
| ResourcePrefetchPredictor::INITIALIZED);
|
| +
|
| + url_request_context_.set_job_factory(&url_request_job_factory_);
|
| }
|
|
|
| void ResourcePrefetchPredictorTest::TearDown() {
|
| @@ -783,4 +891,146 @@ TEST_F(ResourcePrefetchPredictorTest, HandledResourceTypes) {
|
| content::RESOURCE_TYPE_PREFETCH, "font/woff2"));
|
| }
|
|
|
| +TEST_F(ResourcePrefetchPredictorTest, ShouldRecordRequestMainFrame) {
|
| + std::unique_ptr<net::URLRequest> http_request =
|
| + CreateURLRequest(GURL("http://www.google.com"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, true);
|
| + EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordRequest(
|
| + http_request.get(), content::RESOURCE_TYPE_MAIN_FRAME));
|
| +
|
| + std::unique_ptr<net::URLRequest> https_request =
|
| + CreateURLRequest(GURL("https://www.google.com"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, true);
|
| + EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordRequest(
|
| + https_request.get(), content::RESOURCE_TYPE_MAIN_FRAME));
|
| +
|
| + std::unique_ptr<net::URLRequest> file_request =
|
| + CreateURLRequest(GURL("file://www.google.com"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, true);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest(
|
| + file_request.get(), content::RESOURCE_TYPE_MAIN_FRAME));
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTest, ShouldRecordRequestSubResource) {
|
| + std::unique_ptr<net::URLRequest> http_request =
|
| + CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, false);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest(
|
| + http_request.get(), content::RESOURCE_TYPE_IMAGE));
|
| +
|
| + std::unique_ptr<net::URLRequest> https_request =
|
| + CreateURLRequest(GURL("https://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, false);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest(
|
| + https_request.get(), content::RESOURCE_TYPE_IMAGE));
|
| +
|
| + std::unique_ptr<net::URLRequest> file_request =
|
| + CreateURLRequest(GURL("file://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, false);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest(
|
| + file_request.get(), content::RESOURCE_TYPE_IMAGE));
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTest, ShouldRecordResponseMainFrame) {
|
| + net::HttpResponseInfo response_info;
|
| + response_info.headers =
|
| + scoped_refptr<net::HttpResponseHeaders>(new net::HttpResponseHeaders(""));
|
| + url_request_job_factory_.set_response_info(response_info);
|
| +
|
| + std::unique_ptr<net::URLRequest> http_request =
|
| + CreateURLRequest(GURL("http://www.google.com"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_MAIN_FRAME, 1, 1, true);
|
| + EXPECT_TRUE(
|
| + ResourcePrefetchPredictor::ShouldRecordResponse(http_request.get()));
|
| +
|
| + std::unique_ptr<net::URLRequest> https_request =
|
| + CreateURLRequest(GURL("https://www.google.com"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_MAIN_FRAME, 1, 1, true);
|
| + EXPECT_TRUE(
|
| + ResourcePrefetchPredictor::ShouldRecordResponse(https_request.get()));
|
| +
|
| + std::unique_ptr<net::URLRequest> file_request =
|
| + CreateURLRequest(GURL("file://www.google.com"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_MAIN_FRAME, 1, 1, true);
|
| + EXPECT_FALSE(
|
| + ResourcePrefetchPredictor::ShouldRecordResponse(file_request.get()));
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTest, ShouldRecordResponseSubresource) {
|
| + net::HttpResponseInfo response_info;
|
| + response_info.headers = scoped_refptr<net::HttpResponseHeaders>(
|
| + new net::HttpResponseHeaders("HTTP/1.1 200 OK\n\nSome: Headers\n"));
|
| + response_info.was_cached = true;
|
| + url_request_job_factory_.set_response_info(response_info);
|
| +
|
| + // Protocol
|
| + std::unique_ptr<net::URLRequest> http_image_request =
|
| + CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, true);
|
| + EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + http_image_request.get()));
|
| +
|
| + std::unique_ptr<net::URLRequest> https_image_request =
|
| + CreateURLRequest(GURL("https://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, true);
|
| + EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + https_image_request.get()));
|
| +
|
| + std::unique_ptr<net::URLRequest> file_image_request =
|
| + CreateURLRequest(GURL("file://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_IMAGE, 1, 1, true);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + file_image_request.get()));
|
| +
|
| + // ResourceType
|
| + std::unique_ptr<net::URLRequest> sub_frame_request =
|
| + CreateURLRequest(GURL("http://www.google.com/frame.html"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_SUB_FRAME, 1, 1, true);
|
| + EXPECT_FALSE(
|
| + ResourcePrefetchPredictor::ShouldRecordResponse(sub_frame_request.get()));
|
| +
|
| + std::unique_ptr<net::URLRequest> font_request = CreateURLRequest(
|
| + GURL("http://www.google.com/comic-sans-ms.woff"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_FONT_RESOURCE, 1, 1, true);
|
| + EXPECT_TRUE(
|
| + ResourcePrefetchPredictor::ShouldRecordResponse(font_request.get()));
|
| +
|
| + // From MIME Type.
|
| + url_request_job_factory_.set_mime_type("image/png");
|
| + std::unique_ptr<net::URLRequest> prefetch_image_request =
|
| + CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_PREFETCH, 1, 1, true);
|
| + EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + prefetch_image_request.get()));
|
| +
|
| + url_request_job_factory_.set_mime_type("image/my-wonderful-format");
|
| + std::unique_ptr<net::URLRequest> prefetch_unknown_image_request =
|
| + CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_PREFETCH, 1, 1, true);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + prefetch_unknown_image_request.get()));
|
| +
|
| + url_request_job_factory_.set_mime_type("font/woff");
|
| + std::unique_ptr<net::URLRequest> prefetch_font_request = CreateURLRequest(
|
| + GURL("http://www.google.com/comic-sans-ms.woff"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_PREFETCH, 1, 1, true);
|
| + EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + prefetch_font_request.get()));
|
| +
|
| + url_request_job_factory_.set_mime_type("font/woff-woff");
|
| + std::unique_ptr<net::URLRequest> prefetch_unknown_font_request =
|
| + CreateURLRequest(GURL("http://www.google.com/comic-sans-ms.woff"),
|
| + net::MEDIUM, content::RESOURCE_TYPE_PREFETCH, 1, 1,
|
| + true);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + prefetch_unknown_font_request.get()));
|
| +
|
| + // Not main frame
|
| + std::unique_ptr<net::URLRequest> font_request_sub_frame = CreateURLRequest(
|
| + GURL("http://www.google.com/comic-sans-ms.woff"), net::MEDIUM,
|
| + content::RESOURCE_TYPE_FONT_RESOURCE, 1, 1, false);
|
| + EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse(
|
| + font_request_sub_frame.get()));
|
| +}
|
| +
|
| } // namespace predictors
|
|
|