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