| // Copyright (c) 2012 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. |
| |
| #ifndef NET_PROXY_RESOLUTION_MOCK_PROXY_RESOLVER_H_ |
| #define NET_PROXY_RESOLUTION_MOCK_PROXY_RESOLVER_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "net/base/completion_once_callback.h" |
| #include "net/base/net_errors.h" |
| #include "net/proxy_resolution/proxy_resolver.h" |
| #include "net/proxy_resolution/proxy_resolver_factory.h" |
| #include "url/gurl.h" |
| |
| namespace net { |
| |
| // Asynchronous mock proxy resolver. All requests complete asynchronously, |
| // user must call Job::CompleteNow() on a pending request to signal it. |
| class MockAsyncProxyResolver : public ProxyResolver { |
| public: |
| class Job { |
| public: |
| Job(MockAsyncProxyResolver* resolver, |
| const GURL& url, |
| ProxyInfo* results, |
| CompletionOnceCallback callback); |
| |
| const GURL& url() const { return url_; } |
| ProxyInfo* results() const { return results_; } |
| MockAsyncProxyResolver* Resolver() const { return resolver_; }; |
| |
| void CompleteNow(int rv); |
| |
| ~Job(); |
| |
| private: |
| MockAsyncProxyResolver* resolver_; |
| const GURL url_; |
| ProxyInfo* results_; |
| CompletionOnceCallback callback_; |
| }; |
| |
| class RequestImpl : public ProxyResolver::Request { |
| public: |
| explicit RequestImpl(std::unique_ptr<Job> job); |
| |
| ~RequestImpl() override; |
| |
| LoadState GetLoadState() override; |
| |
| private: |
| std::unique_ptr<Job> job_; |
| }; |
| |
| MockAsyncProxyResolver(); |
| ~MockAsyncProxyResolver() override; |
| |
| // ProxyResolver implementation. |
| int GetProxyForURL(const GURL& url, |
| ProxyInfo* results, |
| CompletionOnceCallback callback, |
| std::unique_ptr<Request>* request, |
| const NetLogWithSource& /*net_log*/) override; |
| const std::vector<Job*>& pending_jobs() const { return pending_jobs_; } |
| |
| const std::vector<std::unique_ptr<Job>>& cancelled_jobs() const { |
| return cancelled_jobs_; |
| } |
| |
| void AddCancelledJob(std::unique_ptr<Job> job); |
| void RemovePendingJob(Job* job); |
| |
| private: |
| std::vector<Job*> pending_jobs_; |
| std::vector<std::unique_ptr<Job>> cancelled_jobs_; |
| }; |
| |
| // Asynchronous mock proxy resolver factory . All requests complete |
| // asynchronously; the user must call Request::CompleteNow() on a pending |
| // request to signal it. |
| class MockAsyncProxyResolverFactory : public ProxyResolverFactory { |
| public: |
| class Request; |
| using RequestsList = std::vector<scoped_refptr<Request>>; |
| |
| explicit MockAsyncProxyResolverFactory(bool resolvers_expect_pac_bytes); |
| ~MockAsyncProxyResolverFactory() override; |
| |
| int CreateProxyResolver( |
| const scoped_refptr<PacFileData>& pac_script, |
| std::unique_ptr<ProxyResolver>* resolver, |
| CompletionOnceCallback callback, |
| std::unique_ptr<ProxyResolverFactory::Request>* request) override; |
| |
| const RequestsList& pending_requests() const { return pending_requests_; } |
| |
| const RequestsList& cancelled_requests() const { return cancelled_requests_; } |
| |
| void RemovePendingRequest(Request* request); |
| |
| private: |
| class Job; |
| RequestsList pending_requests_; |
| RequestsList cancelled_requests_; |
| }; |
| |
| class MockAsyncProxyResolverFactory::Request |
| : public base::RefCounted<Request> { |
| public: |
| Request(MockAsyncProxyResolverFactory* factory, |
| const scoped_refptr<PacFileData>& script_data, |
| std::unique_ptr<ProxyResolver>* resolver, |
| CompletionOnceCallback callback); |
| |
| const scoped_refptr<PacFileData>& script_data() const { return script_data_; } |
| |
| // Completes this request. A ForwardingProxyResolver that forwards to |
| // |resolver| will be returned to the requester. |resolver| must not be |
| // null and must remain as long as the resolver returned by this request |
| // remains in use. |
| void CompleteNowWithForwarder(int rv, ProxyResolver* resolver); |
| |
| void CompleteNow(int rv, std::unique_ptr<ProxyResolver> resolver); |
| |
| private: |
| friend class base::RefCounted<Request>; |
| friend class MockAsyncProxyResolverFactory; |
| friend class MockAsyncProxyResolverFactory::Job; |
| |
| ~Request(); |
| |
| void FactoryDestroyed(); |
| |
| MockAsyncProxyResolverFactory* factory_; |
| const scoped_refptr<PacFileData> script_data_; |
| std::unique_ptr<ProxyResolver>* resolver_; |
| CompletionOnceCallback callback_; |
| }; |
| |
| // ForwardingProxyResolver forwards all requests to |impl|. |impl| must remain |
| // so long as this remains in use. |
| class ForwardingProxyResolver : public ProxyResolver { |
| public: |
| explicit ForwardingProxyResolver(ProxyResolver* impl); |
| |
| // ProxyResolver overrides. |
| int GetProxyForURL(const GURL& query_url, |
| ProxyInfo* results, |
| CompletionOnceCallback callback, |
| std::unique_ptr<Request>* request, |
| const NetLogWithSource& net_log) override; |
| |
| private: |
| ProxyResolver* impl_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ForwardingProxyResolver); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_PROXY_RESOLUTION_MOCK_PROXY_RESOLVER_H_ |