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

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

Issue 2237453002: predictors: Add tests to ResourcePrefetchPredictor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments. Created 4 years, 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698