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