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