blob: 4eb3c92e9da76f7b7e0337131bd668ba30c8887e [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/offline_pages/core/prefetch/prefetch_request_test_base.h"
#include <memory>
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "base/test/bind_test_util.h"
#include "base/test/mock_entropy_provider.h"
#include "components/offline_pages/core/offline_page_feature.h"
#include "components/offline_pages/core/prefetch/prefetch_server_urls.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "services/network/test/test_utils.h"
namespace offline_pages {
const char PrefetchRequestTestBase::kExperimentValueSetInFieldTrial[] =
"Test Experiment";
PrefetchRequestTestBase::PrefetchRequestTestBase()
: task_runner_(new base::TestMockTimeTaskRunner),
test_shared_url_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)) {
message_loop_.SetTaskRunner(task_runner_);
}
PrefetchRequestTestBase::~PrefetchRequestTestBase() {}
void PrefetchRequestTestBase::SetUp() {
field_trial_list_ = std::make_unique<base::FieldTrialList>(
std::make_unique<base::MockEntropyProvider>());
test_url_loader_factory_.SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
last_resource_request_ = request;
}));
}
void PrefetchRequestTestBase::SetUpExperimentOption() {
const std::string kTrialName = "trial_name";
const std::string kGroupName = "group_name";
scoped_refptr<base::FieldTrial> trial =
base::FieldTrialList::CreateFieldTrial(kTrialName, kGroupName);
std::map<std::string, std::string> params;
params[kPrefetchingOfflinePagesExperimentsOption] =
kExperimentValueSetInFieldTrial;
base::AssociateFieldTrialParams(kTrialName, kGroupName, params);
std::unique_ptr<base::FeatureList> feature_list =
std::make_unique<base::FeatureList>();
feature_list->RegisterFieldTrialOverride(
kPrefetchingOfflinePagesFeature.name,
base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get());
scoped_feature_list_.InitWithFeatureList(std::move(feature_list));
}
void PrefetchRequestTestBase::RespondWithNetError(int net_error) {
int pending_requests_count = test_url_loader_factory_.NumPending();
DCHECK(pending_requests_count > 0);
network::URLLoaderCompletionStatus completion_status(net_error);
test_url_loader_factory_.SimulateResponseForPendingRequest(
GetPendingRequest(0)->request.url, completion_status,
network::ResourceResponseHead(), std::string());
}
void PrefetchRequestTestBase::RespondWithHttpError(
net::HttpStatusCode http_error) {
int pending_requests_count = test_url_loader_factory_.NumPending();
auto resource_response_head = network::CreateResourceResponseHead(http_error);
DCHECK(pending_requests_count > 0);
test_url_loader_factory_.SimulateResponseForPendingRequest(
GetPendingRequest(0)->request.url,
network::URLLoaderCompletionStatus(net::OK), resource_response_head,
std::string());
}
void PrefetchRequestTestBase::RespondWithData(const std::string& data) {
DCHECK(test_url_loader_factory_.pending_requests()->size() > 0);
test_url_loader_factory_.SimulateResponseForPendingRequest(
GetPendingRequest(0)->request.url.spec(), data);
}
network::TestURLLoaderFactory::PendingRequest*
PrefetchRequestTestBase::GetPendingRequest(size_t index) {
if (index >= test_url_loader_factory_.pending_requests()->size())
return nullptr;
network::TestURLLoaderFactory::PendingRequest* request =
&(*test_url_loader_factory_.pending_requests())[index];
DCHECK(request);
return request;
}
std::string PrefetchRequestTestBase::GetExperiementHeaderValue(
network::TestURLLoaderFactory::PendingRequest* pending_request) {
DCHECK(pending_request);
net::HttpRequestHeaders headers = pending_request->request.headers;
std::string experiment_header;
headers.GetHeader(kPrefetchExperimentHeaderName, &experiment_header);
return experiment_header;
}
void PrefetchRequestTestBase::RunUntilIdle() {
task_runner_->RunUntilIdle();
}
void PrefetchRequestTestBase::FastForwardUntilNoTasksRemain() {
task_runner_->FastForwardUntilNoTasksRemain();
}
} // namespace offline_pages