1eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// Use of this source code is governed by a BSD-style license that can be
3eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// found in the LICENSE file.
4eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
5eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#ifndef NET_PROXY_MOCK_PROXY_RESOLVER_H_
6eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#define NET_PROXY_MOCK_PROXY_RESOLVER_H_
7eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
8eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include <vector>
9eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
10eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "base/memory/scoped_ptr.h"
11eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "net/base/net_errors.h"
12eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "net/proxy/proxy_resolver.h"
13eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "url/gurl.h"
14eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
15eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivinamespace base {
16eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Triviclass MessageLoop;
17eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}
18eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
19eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivinamespace net {
20eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
21e7bfcdc183454ec959ff51342f0973cabba219b2Jean-Michel Trivi// Asynchronous mock proxy resolver. All requests complete asynchronously,
22581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi// user must call Request::CompleteNow() on a pending request to signal it.
23581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviclass MockAsyncProxyResolverBase : public ProxyResolver {
24581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi public:
25581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi  class Request : public base::RefCounted<Request> {
26581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi   public:
27581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    Request(MockAsyncProxyResolverBase* resolver,
28581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            const GURL& url,
29581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            ProxyInfo* results,
30581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi            const net::CompletionCallback& callback);
31581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
32581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    const GURL& url() const { return url_; }
33581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    ProxyInfo* results() const { return results_; }
3468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    const net::CompletionCallback& callback() const { return callback_; }
35581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
36581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    void CompleteNow(int rv);
37581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
38581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi   private:
39581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    friend class base::RefCounted<Request>;
40581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
41581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    virtual ~Request();
42581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
43581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    MockAsyncProxyResolverBase* resolver_;
44581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    const GURL url_;
45581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    ProxyInfo* results_;
46581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    net::CompletionCallback callback_;
47581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi    base::MessageLoop* origin_loop_;
48581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi  };
49581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi
50eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi  class SetPacScriptRequest {
51eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi   public:
52d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    SetPacScriptRequest(
53d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        MockAsyncProxyResolverBase* resolver,
54d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        const scoped_refptr<ProxyResolverScriptData>& script_data,
55d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi        const net::CompletionCallback& callback);
56d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    ~SetPacScriptRequest();
57d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
58d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const ProxyResolverScriptData* script_data() const {
59d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi      return script_data_.get();
60d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    }
61d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
62d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    void CompleteNow(int rv);
63d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
64d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi   private:
65d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    MockAsyncProxyResolverBase* resolver_;
66d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    const scoped_refptr<ProxyResolverScriptData> script_data_;
67d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    net::CompletionCallback callback_;
68d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    base::MessageLoop* origin_loop_;
69d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  };
70d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
71d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  typedef std::vector<scoped_refptr<Request> > RequestsList;
72d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
73d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  virtual ~MockAsyncProxyResolverBase();
74d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
75d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  // ProxyResolver implementation.
76d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  virtual int GetProxyForURL(const GURL& url,
77d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                             ProxyInfo* results,
78d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                             const net::CompletionCallback& callback,
79d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                             RequestHandle* request_handle,
80d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi                             const BoundNetLog& /*net_log*/) OVERRIDE;
81d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  virtual void CancelRequest(RequestHandle request_handle) OVERRIDE;
82d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  virtual LoadState GetLoadState(RequestHandle request_handle) const OVERRIDE;
83d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  virtual int SetPacScript(
84d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi      const scoped_refptr<ProxyResolverScriptData>& script_data,
85d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi      const net::CompletionCallback& callback) OVERRIDE;
86d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  virtual void CancelSetPacScript() OVERRIDE;
87d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
88d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  const RequestsList& pending_requests() const {
89d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    return pending_requests_;
90d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  }
91d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
92d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  const RequestsList& cancelled_requests() const {
93d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    return cancelled_requests_;
94d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  }
95d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
96d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  SetPacScriptRequest* pending_set_pac_script_request() const;
97d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
98d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  bool has_pending_set_pac_script_request() const {
99d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi    return pending_set_pac_script_request_.get() != NULL;
100d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  }
101d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
102d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  void RemovePendingRequest(Request* request);
103d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
104d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  void RemovePendingSetPacScriptRequest(SetPacScriptRequest* request);
105d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
106d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi protected:
107d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  explicit MockAsyncProxyResolverBase(bool expects_pac_bytes);
108d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi
109d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi private:
110d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  RequestsList pending_requests_;
111d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi  RequestsList cancelled_requests_;
112eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi  scoped_ptr<SetPacScriptRequest> pending_set_pac_script_request_;
113eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi};
114eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
115eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Triviclass MockAsyncProxyResolver : public MockAsyncProxyResolverBase {
116eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi public:
117eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi  MockAsyncProxyResolver()
118eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi      : MockAsyncProxyResolverBase(false /*expects_pac_bytes*/) {}
119eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi};
120eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
121eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Triviclass MockAsyncProxyResolverExpectsBytes : public MockAsyncProxyResolverBase {
122eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi public:
12397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi  MockAsyncProxyResolverExpectsBytes()
124eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi      : MockAsyncProxyResolverBase(true /*expects_pac_bytes*/) {}
12597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi};
126f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi
127f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi}  // namespace net
128eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi
129f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi#endif  // NET_PROXY_MOCK_PROXY_RESOLVER_H_
13097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi