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#include "net/proxy/mock_proxy_resolver.h"
6
7#include "base/logging.h"
8#include "base/message_loop/message_loop.h"
9
10namespace net {
11
12MockAsyncProxyResolverBase::Request::Request(
13    MockAsyncProxyResolverBase* resolver,
14    const GURL& url,
15    ProxyInfo* results,
16    const CompletionCallback& callback)
17    : resolver_(resolver),
18      url_(url),
19      results_(results),
20      callback_(callback),
21      origin_loop_(base::MessageLoop::current()) {}
22
23    void MockAsyncProxyResolverBase::Request::CompleteNow(int rv) {
24      CompletionCallback callback = callback_;
25
26      // May delete |this|.
27      resolver_->RemovePendingRequest(this);
28
29      callback.Run(rv);
30    }
31
32MockAsyncProxyResolverBase::Request::~Request() {}
33
34MockAsyncProxyResolverBase::SetPacScriptRequest::SetPacScriptRequest(
35    MockAsyncProxyResolverBase* resolver,
36    const scoped_refptr<ProxyResolverScriptData>& script_data,
37    const CompletionCallback& callback)
38    : resolver_(resolver),
39      script_data_(script_data),
40      callback_(callback),
41      origin_loop_(base::MessageLoop::current()) {}
42
43MockAsyncProxyResolverBase::SetPacScriptRequest::~SetPacScriptRequest() {}
44
45    void MockAsyncProxyResolverBase::SetPacScriptRequest::CompleteNow(int rv) {
46       CompletionCallback callback = callback_;
47
48      // Will delete |this|.
49      resolver_->RemovePendingSetPacScriptRequest(this);
50
51      callback.Run(rv);
52    }
53
54MockAsyncProxyResolverBase::~MockAsyncProxyResolverBase() {}
55
56int MockAsyncProxyResolverBase::GetProxyForURL(
57    const GURL& url, ProxyInfo* results, const CompletionCallback& callback,
58    RequestHandle* request_handle, const BoundNetLog& /*net_log*/) {
59  scoped_refptr<Request> request = new Request(this, url, results, callback);
60  pending_requests_.push_back(request);
61
62  if (request_handle)
63    *request_handle = reinterpret_cast<RequestHandle>(request.get());
64
65  // Test code completes the request by calling request->CompleteNow().
66  return ERR_IO_PENDING;
67}
68
69void MockAsyncProxyResolverBase::CancelRequest(RequestHandle request_handle) {
70  scoped_refptr<Request> request = reinterpret_cast<Request*>(request_handle);
71  cancelled_requests_.push_back(request);
72  RemovePendingRequest(request.get());
73}
74
75LoadState MockAsyncProxyResolverBase::GetLoadState(
76    RequestHandle request_handle) const {
77  return LOAD_STATE_RESOLVING_PROXY_FOR_URL;
78}
79
80int MockAsyncProxyResolverBase::SetPacScript(
81    const scoped_refptr<ProxyResolverScriptData>& script_data,
82    const CompletionCallback& callback) {
83  DCHECK(!pending_set_pac_script_request_.get());
84  pending_set_pac_script_request_.reset(
85      new SetPacScriptRequest(this, script_data, callback));
86  // Finished when user calls SetPacScriptRequest::CompleteNow().
87  return ERR_IO_PENDING;
88}
89
90void MockAsyncProxyResolverBase::CancelSetPacScript() {
91  // Do nothing (caller was responsible for completing the request).
92}
93
94MockAsyncProxyResolverBase::SetPacScriptRequest*
95MockAsyncProxyResolverBase::pending_set_pac_script_request() const {
96  return pending_set_pac_script_request_.get();
97}
98
99void MockAsyncProxyResolverBase::RemovePendingRequest(Request* request) {
100  RequestsList::iterator it = std::find(
101      pending_requests_.begin(), pending_requests_.end(), request);
102  DCHECK(it != pending_requests_.end());
103  pending_requests_.erase(it);
104}
105
106void MockAsyncProxyResolverBase::RemovePendingSetPacScriptRequest(
107    SetPacScriptRequest* request) {
108  DCHECK_EQ(request, pending_set_pac_script_request());
109  pending_set_pac_script_request_.reset();
110}
111
112MockAsyncProxyResolverBase::MockAsyncProxyResolverBase(bool expects_pac_bytes)
113    : ProxyResolver(expects_pac_bytes) {}
114
115}  // namespace net
116