• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 #ifndef NET_PROXY_MOCK_PROXY_RESOLVER_H_
6 #define NET_PROXY_MOCK_PROXY_RESOLVER_H_
7 
8 #include <vector>
9 
10 #include "base/memory/scoped_ptr.h"
11 #include "net/base/net_errors.h"
12 #include "net/proxy/proxy_resolver.h"
13 #include "url/gurl.h"
14 
15 namespace base {
16 class MessageLoop;
17 }
18 
19 namespace net {
20 
21 // Asynchronous mock proxy resolver. All requests complete asynchronously,
22 // user must call Request::CompleteNow() on a pending request to signal it.
23 class MockAsyncProxyResolverBase : public ProxyResolver {
24  public:
25   class Request : public base::RefCounted<Request> {
26    public:
27     Request(MockAsyncProxyResolverBase* resolver,
28             const GURL& url,
29             ProxyInfo* results,
30             const net::CompletionCallback& callback);
31 
url()32     const GURL& url() const { return url_; }
results()33     ProxyInfo* results() const { return results_; }
callback()34     const net::CompletionCallback& callback() const { return callback_; }
35 
36     void CompleteNow(int rv);
37 
38    private:
39     friend class base::RefCounted<Request>;
40 
41     virtual ~Request();
42 
43     MockAsyncProxyResolverBase* resolver_;
44     const GURL url_;
45     ProxyInfo* results_;
46     net::CompletionCallback callback_;
47     base::MessageLoop* origin_loop_;
48   };
49 
50   class SetPacScriptRequest {
51    public:
52     SetPacScriptRequest(
53         MockAsyncProxyResolverBase* resolver,
54         const scoped_refptr<ProxyResolverScriptData>& script_data,
55         const net::CompletionCallback& callback);
56     ~SetPacScriptRequest();
57 
script_data()58     const ProxyResolverScriptData* script_data() const {
59       return script_data_.get();
60     }
61 
62     void CompleteNow(int rv);
63 
64    private:
65     MockAsyncProxyResolverBase* resolver_;
66     const scoped_refptr<ProxyResolverScriptData> script_data_;
67     net::CompletionCallback callback_;
68     base::MessageLoop* origin_loop_;
69   };
70 
71   typedef std::vector<scoped_refptr<Request> > RequestsList;
72 
73   virtual ~MockAsyncProxyResolverBase();
74 
75   // ProxyResolver implementation.
76   virtual int GetProxyForURL(const GURL& url,
77                              ProxyInfo* results,
78                              const net::CompletionCallback& callback,
79                              RequestHandle* request_handle,
80                              const BoundNetLog& /*net_log*/) OVERRIDE;
81   virtual void CancelRequest(RequestHandle request_handle) OVERRIDE;
82   virtual LoadState GetLoadState(RequestHandle request_handle) const OVERRIDE;
83   virtual int SetPacScript(
84       const scoped_refptr<ProxyResolverScriptData>& script_data,
85       const net::CompletionCallback& callback) OVERRIDE;
86   virtual void CancelSetPacScript() OVERRIDE;
87 
pending_requests()88   const RequestsList& pending_requests() const {
89     return pending_requests_;
90   }
91 
cancelled_requests()92   const RequestsList& cancelled_requests() const {
93     return cancelled_requests_;
94   }
95 
96   SetPacScriptRequest* pending_set_pac_script_request() const;
97 
has_pending_set_pac_script_request()98   bool has_pending_set_pac_script_request() const {
99     return pending_set_pac_script_request_.get() != NULL;
100   }
101 
102   void RemovePendingRequest(Request* request);
103 
104   void RemovePendingSetPacScriptRequest(SetPacScriptRequest* request);
105 
106  protected:
107   explicit MockAsyncProxyResolverBase(bool expects_pac_bytes);
108 
109  private:
110   RequestsList pending_requests_;
111   RequestsList cancelled_requests_;
112   scoped_ptr<SetPacScriptRequest> pending_set_pac_script_request_;
113 };
114 
115 class MockAsyncProxyResolver : public MockAsyncProxyResolverBase {
116  public:
MockAsyncProxyResolver()117   MockAsyncProxyResolver()
118       : MockAsyncProxyResolverBase(false /*expects_pac_bytes*/) {}
119 };
120 
121 class MockAsyncProxyResolverExpectsBytes : public MockAsyncProxyResolverBase {
122  public:
MockAsyncProxyResolverExpectsBytes()123   MockAsyncProxyResolverExpectsBytes()
124       : MockAsyncProxyResolverBase(true /*expects_pac_bytes*/) {}
125 };
126 
127 }  // namespace net
128 
129 #endif  // NET_PROXY_MOCK_PROXY_RESOLVER_H_
130