1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/offline_pages/core/prefetch/prefetch_request_test_base.h"
6
7 #include <memory>
8
9 #include "base/feature_list.h"
10 #include "base/metrics/field_trial_params.h"
11 #include "base/test/bind.h"
12 #include "base/test/mock_entropy_provider.h"
13 #include "base/test/task_environment.h"
14 #include "components/offline_pages/core/offline_page_feature.h"
15 #include "components/offline_pages/core/prefetch/prefetch_server_urls.h"
16 #include "net/url_request/url_fetcher_delegate.h"
17 #include "services/network/test/test_utils.h"
18
19 namespace offline_pages {
20
21 const char PrefetchRequestTestBase::kExperimentValueSetInFieldTrial[] =
22 "Test Experiment";
23
PrefetchRequestTestBase()24 PrefetchRequestTestBase::PrefetchRequestTestBase()
25 : test_shared_url_loader_factory_(
26 base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
27 &test_url_loader_factory_)) {}
28
~PrefetchRequestTestBase()29 PrefetchRequestTestBase::~PrefetchRequestTestBase() {}
30
SetUp()31 void PrefetchRequestTestBase::SetUp() {
32 test_url_loader_factory_.SetInterceptor(
33 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
34 last_resource_request_ = request;
35 }));
36 }
37
SetUpExperimentOption()38 void PrefetchRequestTestBase::SetUpExperimentOption() {
39 std::map<std::string, std::string> params;
40 params[kPrefetchingOfflinePagesExperimentsOption] =
41 kExperimentValueSetInFieldTrial;
42 scoped_feature_list_.InitAndEnableFeatureWithParameters(
43 kPrefetchingOfflinePagesFeature, params);
44 }
45
RespondWithNetError(int net_error)46 void PrefetchRequestTestBase::RespondWithNetError(int net_error) {
47 int pending_requests_count = test_url_loader_factory_.NumPending();
48 DCHECK(pending_requests_count > 0);
49 network::URLLoaderCompletionStatus completion_status(net_error);
50 test_url_loader_factory_.SimulateResponseForPendingRequest(
51 GetPendingRequest(0)->request.url, completion_status,
52 network::mojom::URLResponseHead::New(), std::string());
53 }
54
RespondWithHttpError(net::HttpStatusCode http_error)55 void PrefetchRequestTestBase::RespondWithHttpError(
56 net::HttpStatusCode http_error) {
57 int pending_requests_count = test_url_loader_factory_.NumPending();
58 auto url_response_head = network::CreateURLResponseHead(http_error);
59 DCHECK(pending_requests_count > 0);
60 test_url_loader_factory_.SimulateResponseForPendingRequest(
61 GetPendingRequest(0)->request.url,
62 network::URLLoaderCompletionStatus(net::OK), std::move(url_response_head),
63 std::string());
64 }
65
RespondWithData(const std::string & data)66 void PrefetchRequestTestBase::RespondWithData(const std::string& data) {
67 DCHECK(test_url_loader_factory_.pending_requests()->size() > 0);
68 test_url_loader_factory_.SimulateResponseForPendingRequest(
69 GetPendingRequest(0)->request.url.spec(), data);
70 }
71
RespondWithHttpErrorAndData(net::HttpStatusCode http_error,const std::string & data)72 void PrefetchRequestTestBase::RespondWithHttpErrorAndData(
73 net::HttpStatusCode http_error,
74 const std::string& data) {
75 int pending_requests_count = test_url_loader_factory_.NumPending();
76 auto url_response_head = network::CreateURLResponseHead(http_error);
77 DCHECK(pending_requests_count > 0);
78 test_url_loader_factory_.SimulateResponseForPendingRequest(
79 GetPendingRequest(0)->request.url,
80 network::URLLoaderCompletionStatus(net::OK), std::move(url_response_head),
81 data);
82 }
83
84 network::TestURLLoaderFactory::PendingRequest*
GetPendingRequest(size_t index)85 PrefetchRequestTestBase::GetPendingRequest(size_t index) {
86 return test_url_loader_factory_.GetPendingRequest(index);
87 }
88
GetExperiementHeaderValue(network::TestURLLoaderFactory::PendingRequest * pending_request)89 std::string PrefetchRequestTestBase::GetExperiementHeaderValue(
90 network::TestURLLoaderFactory::PendingRequest* pending_request) {
91 DCHECK(pending_request);
92
93 net::HttpRequestHeaders headers = pending_request->request.headers;
94
95 std::string experiment_header;
96 headers.GetHeader(kPrefetchExperimentHeaderName, &experiment_header);
97 return experiment_header;
98 }
99
RunUntilIdle()100 void PrefetchRequestTestBase::RunUntilIdle() {
101 task_environment_.RunUntilIdle();
102 }
103
FastForwardBy(base::TimeDelta delta)104 void PrefetchRequestTestBase::FastForwardBy(base::TimeDelta delta) {
105 task_environment_.FastForwardBy(delta);
106 }
107
FastForwardUntilNoTasksRemain()108 void PrefetchRequestTestBase::FastForwardUntilNoTasksRemain() {
109 task_environment_.FastForwardUntilNoTasksRemain();
110 }
111
112 } // namespace offline_pages
113