1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "services/proxy_resolver/mock_proxy_host_resolver.h"
7 #include "base/callback.h"
8 #include "base/check.h"
9 #include "base/location.h"
10 #include "base/memory/raw_ptr.h"
11 #include "base/memory/weak_ptr.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "net/base/completion_once_callback.h"
14 #include "net/base/net_errors.h"
15 #include "net/base/network_anonymization_key.h"
17 namespace proxy_resolver {
19 class MockProxyHostResolver::RequestImpl
21 public base::SupportsWeakPtr<RequestImpl> {
23 RequestImpl(std::vector<net::IPAddress> results, bool synchronous_mode)
24 : results_(std::move(results)), synchronous_mode_(synchronous_mode) {}
25 ~RequestImpl() override = default;
27 int Start(net::CompletionOnceCallback callback) override {
28 if (!synchronous_mode_) {
29 callback_ = std::move(callback);
30 base::ThreadTaskRunnerHandle::Get()->PostTask(
31 FROM_HERE, base::BindOnce(&RequestImpl::SendResults, AsWeakPtr()));
32 return net::ERR_IO_PENDING;
36 return net::ERR_NAME_NOT_RESOLVED;
41 const std::vector<net::IPAddress>& GetResults() const override {
49 std::move(callback_).Run(net::ERR_NAME_NOT_RESOLVED);
51 std::move(callback_).Run(net::OK);
54 const std::vector<net::IPAddress> results_;
55 const bool synchronous_mode_;
57 net::CompletionOnceCallback callback_;
60 MockProxyHostResolver::MockProxyHostResolver(bool synchronous_mode)
61 : num_resolve_(0), fail_all_(false), synchronous_mode_(synchronous_mode) {}
63 MockProxyHostResolver::~MockProxyHostResolver() = default;
65 std::unique_ptr<ProxyHostResolver::Request>
66 MockProxyHostResolver::CreateRequest(
67 const std::string& hostname,
68 net::ProxyResolveDnsOperation operation,
69 const net::NetworkAnonymizationKey& network_anonymization_key) {
73 return std::make_unique<RequestImpl>(std::vector<net::IPAddress>(),
76 auto match = results_.find({hostname, operation, network_anonymization_key});
77 if (match == results_.end())
78 return std::make_unique<RequestImpl>(
79 std::vector<net::IPAddress>({net::IPAddress(127, 0, 0, 1)}),
82 return std::make_unique<RequestImpl>(match->second, synchronous_mode_);
85 void MockProxyHostResolver::SetError(
86 const std::string& hostname,
87 net::ProxyResolveDnsOperation operation,
88 const net::NetworkAnonymizationKey& network_anonymization_key) {
90 results_[{hostname, operation, network_anonymization_key}].clear();
93 void MockProxyHostResolver::SetResult(
94 const std::string& hostname,
95 net::ProxyResolveDnsOperation operation,
96 const net::NetworkAnonymizationKey& network_anonymization_key,
97 std::vector<net::IPAddress> result) {
98 DCHECK(!result.empty());
100 results_[{hostname, operation, network_anonymization_key}] =
104 void MockProxyHostResolver::FailAll() {
109 class HangingProxyHostResolver::RequestImpl : public Request {
111 explicit RequestImpl(HangingProxyHostResolver* resolver)
112 : resolver_(resolver) {}
113 ~RequestImpl() override { ++resolver_->num_cancelled_requests_; }
115 int Start(net::CompletionOnceCallback callback) override {
116 if (resolver_->hang_callback_)
117 resolver_->hang_callback_.Run();
118 return net::ERR_IO_PENDING;
121 const std::vector<net::IPAddress>& GetResults() const override {
126 raw_ptr<HangingProxyHostResolver> resolver_;
129 HangingProxyHostResolver::HangingProxyHostResolver(
130 base::RepeatingClosure hang_callback)
131 : num_cancelled_requests_(0), hang_callback_(std::move(hang_callback)) {}
133 HangingProxyHostResolver::~HangingProxyHostResolver() = default;
135 std::unique_ptr<ProxyHostResolver::Request>
136 HangingProxyHostResolver::CreateRequest(
137 const std::string& hostname,
138 net::ProxyResolveDnsOperation operation,
139 const net::NetworkAnonymizationKey& network_anonymization_key) {
140 return std::make_unique<RequestImpl>(this);
143 } // namespace proxy_resolver