OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/socket/transport_client_socket_pool.h" | 5 #include "net/socket/transport_client_socket_pool.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 IPAddressNumber number; | 82 IPAddressNumber number; |
83 CHECK(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number)); | 83 CHECK(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number)); |
84 *address = IPEndPoint(number, 80); | 84 *address = IPEndPoint(number, 80); |
85 } | 85 } |
86 | 86 |
87 class MockClientSocket : public StreamSocket { | 87 class MockClientSocket : public StreamSocket { |
88 public: | 88 public: |
89 MockClientSocket(const AddressList& addrlist, net::NetLog* net_log) | 89 MockClientSocket(const AddressList& addrlist, net::NetLog* net_log) |
90 : connected_(false), | 90 : connected_(false), |
91 addrlist_(addrlist), | 91 addrlist_(addrlist), |
92 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) { | 92 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) {} |
93 } | |
94 | 93 |
95 // StreamSocket implementation. | 94 // StreamSocket implementation. |
96 virtual int Connect(const CompletionCallback& callback) OVERRIDE { | 95 virtual int Connect(const CompletionCallback& callback) OVERRIDE { |
97 connected_ = true; | 96 connected_ = true; |
98 return OK; | 97 return OK; |
99 } | 98 } |
100 virtual void Disconnect() OVERRIDE { | 99 virtual void Disconnect() OVERRIDE { connected_ = false; } |
101 connected_ = false; | 100 virtual bool IsConnected() const OVERRIDE { return connected_; } |
102 } | 101 virtual bool IsConnectedAndIdle() const OVERRIDE { return connected_; } |
103 virtual bool IsConnected() const OVERRIDE { | |
104 return connected_; | |
105 } | |
106 virtual bool IsConnectedAndIdle() const OVERRIDE { | |
107 return connected_; | |
108 } | |
109 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { | 102 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { |
110 return ERR_UNEXPECTED; | 103 return ERR_UNEXPECTED; |
111 } | 104 } |
112 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { | 105 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { |
113 if (!connected_) | 106 if (!connected_) |
114 return ERR_SOCKET_NOT_CONNECTED; | 107 return ERR_SOCKET_NOT_CONNECTED; |
115 if (addrlist_.front().GetFamily() == ADDRESS_FAMILY_IPV4) | 108 if (addrlist_.front().GetFamily() == ADDRESS_FAMILY_IPV4) |
116 SetIPv4Address(address); | 109 SetIPv4Address(address); |
117 else | 110 else |
118 SetIPv6Address(address); | 111 SetIPv6Address(address); |
119 return OK; | 112 return OK; |
120 } | 113 } |
121 virtual const BoundNetLog& NetLog() const OVERRIDE { | 114 virtual const BoundNetLog& NetLog() const OVERRIDE { return net_log_; } |
122 return net_log_; | |
123 } | |
124 | 115 |
125 virtual void SetSubresourceSpeculation() OVERRIDE {} | 116 virtual void SetSubresourceSpeculation() OVERRIDE {} |
126 virtual void SetOmniboxSpeculation() OVERRIDE {} | 117 virtual void SetOmniboxSpeculation() OVERRIDE {} |
127 virtual bool WasEverUsed() const OVERRIDE { return false; } | 118 virtual bool WasEverUsed() const OVERRIDE { return false; } |
128 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } | 119 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } |
129 virtual bool WasNpnNegotiated() const OVERRIDE { | 120 virtual bool WasNpnNegotiated() const OVERRIDE { return false; } |
130 return false; | |
131 } | |
132 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { | 121 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { |
133 return kProtoUnknown; | 122 return kProtoUnknown; |
134 } | 123 } |
135 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 124 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { return false; } |
136 return false; | |
137 } | |
138 | 125 |
139 // Socket implementation. | 126 // Socket implementation. |
140 virtual int Read(IOBuffer* buf, int buf_len, | 127 virtual int Read(IOBuffer* buf, |
| 128 int buf_len, |
141 const CompletionCallback& callback) OVERRIDE { | 129 const CompletionCallback& callback) OVERRIDE { |
142 return ERR_FAILED; | 130 return ERR_FAILED; |
143 } | 131 } |
144 virtual int Write(IOBuffer* buf, int buf_len, | 132 virtual int Write(IOBuffer* buf, |
| 133 int buf_len, |
145 const CompletionCallback& callback) OVERRIDE { | 134 const CompletionCallback& callback) OVERRIDE { |
146 return ERR_FAILED; | 135 return ERR_FAILED; |
147 } | 136 } |
148 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } | 137 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } |
149 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } | 138 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } |
150 | 139 |
151 private: | 140 private: |
152 bool connected_; | 141 bool connected_; |
153 const AddressList addrlist_; | 142 const AddressList addrlist_; |
154 BoundNetLog net_log_; | 143 BoundNetLog net_log_; |
155 | 144 |
156 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); | 145 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); |
157 }; | 146 }; |
158 | 147 |
159 class MockFailingClientSocket : public StreamSocket { | 148 class MockFailingClientSocket : public StreamSocket { |
160 public: | 149 public: |
161 MockFailingClientSocket(const AddressList& addrlist, net::NetLog* net_log) | 150 MockFailingClientSocket(const AddressList& addrlist, net::NetLog* net_log) |
162 : addrlist_(addrlist), | 151 : addrlist_(addrlist), |
163 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) { | 152 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) {} |
164 } | |
165 | 153 |
166 // StreamSocket implementation. | 154 // StreamSocket implementation. |
167 virtual int Connect(const CompletionCallback& callback) OVERRIDE { | 155 virtual int Connect(const CompletionCallback& callback) OVERRIDE { |
168 return ERR_CONNECTION_FAILED; | 156 return ERR_CONNECTION_FAILED; |
169 } | 157 } |
170 | 158 |
171 virtual void Disconnect() OVERRIDE {} | 159 virtual void Disconnect() OVERRIDE {} |
172 | 160 |
173 virtual bool IsConnected() const OVERRIDE { | 161 virtual bool IsConnected() const OVERRIDE { return false; } |
174 return false; | 162 virtual bool IsConnectedAndIdle() const OVERRIDE { return false; } |
175 } | |
176 virtual bool IsConnectedAndIdle() const OVERRIDE { | |
177 return false; | |
178 } | |
179 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { | 163 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { |
180 return ERR_UNEXPECTED; | 164 return ERR_UNEXPECTED; |
181 } | 165 } |
182 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { | 166 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { |
183 return ERR_UNEXPECTED; | 167 return ERR_UNEXPECTED; |
184 } | 168 } |
185 virtual const BoundNetLog& NetLog() const OVERRIDE { | 169 virtual const BoundNetLog& NetLog() const OVERRIDE { return net_log_; } |
186 return net_log_; | |
187 } | |
188 | 170 |
189 virtual void SetSubresourceSpeculation() OVERRIDE {} | 171 virtual void SetSubresourceSpeculation() OVERRIDE {} |
190 virtual void SetOmniboxSpeculation() OVERRIDE {} | 172 virtual void SetOmniboxSpeculation() OVERRIDE {} |
191 virtual bool WasEverUsed() const OVERRIDE { return false; } | 173 virtual bool WasEverUsed() const OVERRIDE { return false; } |
192 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } | 174 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } |
193 virtual bool WasNpnNegotiated() const OVERRIDE { | 175 virtual bool WasNpnNegotiated() const OVERRIDE { return false; } |
194 return false; | |
195 } | |
196 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { | 176 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { |
197 return kProtoUnknown; | 177 return kProtoUnknown; |
198 } | 178 } |
199 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 179 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { return false; } |
200 return false; | |
201 } | |
202 | 180 |
203 // Socket implementation. | 181 // Socket implementation. |
204 virtual int Read(IOBuffer* buf, int buf_len, | 182 virtual int Read(IOBuffer* buf, |
| 183 int buf_len, |
205 const CompletionCallback& callback) OVERRIDE { | 184 const CompletionCallback& callback) OVERRIDE { |
206 return ERR_FAILED; | 185 return ERR_FAILED; |
207 } | 186 } |
208 | 187 |
209 virtual int Write(IOBuffer* buf, int buf_len, | 188 virtual int Write(IOBuffer* buf, |
| 189 int buf_len, |
210 const CompletionCallback& callback) OVERRIDE { | 190 const CompletionCallback& callback) OVERRIDE { |
211 return ERR_FAILED; | 191 return ERR_FAILED; |
212 } | 192 } |
213 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } | 193 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } |
214 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } | 194 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } |
215 | 195 |
216 private: | 196 private: |
217 const AddressList addrlist_; | 197 const AddressList addrlist_; |
218 BoundNetLog net_log_; | 198 BoundNetLog net_log_; |
219 | 199 |
220 DISALLOW_COPY_AND_ASSIGN(MockFailingClientSocket); | 200 DISALLOW_COPY_AND_ASSIGN(MockFailingClientSocket); |
221 }; | 201 }; |
222 | 202 |
223 class MockPendingClientSocket : public StreamSocket { | 203 class MockPendingClientSocket : public StreamSocket { |
224 public: | 204 public: |
225 // |should_connect| indicates whether the socket should successfully complete | 205 // |should_connect| indicates whether the socket should successfully complete |
226 // or fail. | 206 // or fail. |
227 // |should_stall| indicates that this socket should never connect. | 207 // |should_stall| indicates that this socket should never connect. |
228 // |delay_ms| is the delay, in milliseconds, before simulating a connect. | 208 // |delay_ms| is the delay, in milliseconds, before simulating a connect. |
229 MockPendingClientSocket( | 209 MockPendingClientSocket(const AddressList& addrlist, |
230 const AddressList& addrlist, | 210 bool should_connect, |
231 bool should_connect, | 211 bool should_stall, |
232 bool should_stall, | 212 base::TimeDelta delay, |
233 base::TimeDelta delay, | 213 net::NetLog* net_log) |
234 net::NetLog* net_log) | |
235 : should_connect_(should_connect), | 214 : should_connect_(should_connect), |
236 should_stall_(should_stall), | 215 should_stall_(should_stall), |
237 delay_(delay), | 216 delay_(delay), |
238 is_connected_(false), | 217 is_connected_(false), |
239 addrlist_(addrlist), | 218 addrlist_(addrlist), |
240 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)), | 219 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)), |
241 weak_factory_(this) { | 220 weak_factory_(this) {} |
242 } | |
243 | 221 |
244 // StreamSocket implementation. | 222 // StreamSocket implementation. |
245 virtual int Connect(const CompletionCallback& callback) OVERRIDE { | 223 virtual int Connect(const CompletionCallback& callback) OVERRIDE { |
246 base::MessageLoop::current()->PostDelayedTask( | 224 base::MessageLoop::current()->PostDelayedTask( |
247 FROM_HERE, | 225 FROM_HERE, |
248 base::Bind(&MockPendingClientSocket::DoCallback, | 226 base::Bind(&MockPendingClientSocket::DoCallback, |
249 weak_factory_.GetWeakPtr(), callback), | 227 weak_factory_.GetWeakPtr(), |
| 228 callback), |
250 delay_); | 229 delay_); |
251 return ERR_IO_PENDING; | 230 return ERR_IO_PENDING; |
252 } | 231 } |
253 | 232 |
254 virtual void Disconnect() OVERRIDE {} | 233 virtual void Disconnect() OVERRIDE {} |
255 | 234 |
256 virtual bool IsConnected() const OVERRIDE { | 235 virtual bool IsConnected() const OVERRIDE { return is_connected_; } |
257 return is_connected_; | 236 virtual bool IsConnectedAndIdle() const OVERRIDE { return is_connected_; } |
258 } | |
259 virtual bool IsConnectedAndIdle() const OVERRIDE { | |
260 return is_connected_; | |
261 } | |
262 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { | 237 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { |
263 return ERR_UNEXPECTED; | 238 return ERR_UNEXPECTED; |
264 } | 239 } |
265 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { | 240 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { |
266 if (!is_connected_) | 241 if (!is_connected_) |
267 return ERR_SOCKET_NOT_CONNECTED; | 242 return ERR_SOCKET_NOT_CONNECTED; |
268 if (addrlist_.front().GetFamily() == ADDRESS_FAMILY_IPV4) | 243 if (addrlist_.front().GetFamily() == ADDRESS_FAMILY_IPV4) |
269 SetIPv4Address(address); | 244 SetIPv4Address(address); |
270 else | 245 else |
271 SetIPv6Address(address); | 246 SetIPv6Address(address); |
272 return OK; | 247 return OK; |
273 } | 248 } |
274 virtual const BoundNetLog& NetLog() const OVERRIDE { | 249 virtual const BoundNetLog& NetLog() const OVERRIDE { return net_log_; } |
275 return net_log_; | |
276 } | |
277 | 250 |
278 virtual void SetSubresourceSpeculation() OVERRIDE {} | 251 virtual void SetSubresourceSpeculation() OVERRIDE {} |
279 virtual void SetOmniboxSpeculation() OVERRIDE {} | 252 virtual void SetOmniboxSpeculation() OVERRIDE {} |
280 virtual bool WasEverUsed() const OVERRIDE { return false; } | 253 virtual bool WasEverUsed() const OVERRIDE { return false; } |
281 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } | 254 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } |
282 virtual bool WasNpnNegotiated() const OVERRIDE { | 255 virtual bool WasNpnNegotiated() const OVERRIDE { return false; } |
283 return false; | |
284 } | |
285 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { | 256 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { |
286 return kProtoUnknown; | 257 return kProtoUnknown; |
287 } | 258 } |
288 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 259 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { return false; } |
289 return false; | |
290 } | |
291 | 260 |
292 // Socket implementation. | 261 // Socket implementation. |
293 virtual int Read(IOBuffer* buf, int buf_len, | 262 virtual int Read(IOBuffer* buf, |
| 263 int buf_len, |
294 const CompletionCallback& callback) OVERRIDE { | 264 const CompletionCallback& callback) OVERRIDE { |
295 return ERR_FAILED; | 265 return ERR_FAILED; |
296 } | 266 } |
297 | 267 |
298 virtual int Write(IOBuffer* buf, int buf_len, | 268 virtual int Write(IOBuffer* buf, |
| 269 int buf_len, |
299 const CompletionCallback& callback) OVERRIDE { | 270 const CompletionCallback& callback) OVERRIDE { |
300 return ERR_FAILED; | 271 return ERR_FAILED; |
301 } | 272 } |
302 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } | 273 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } |
303 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } | 274 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } |
304 | 275 |
305 private: | 276 private: |
306 void DoCallback(const CompletionCallback& callback) { | 277 void DoCallback(const CompletionCallback& callback) { |
307 if (should_stall_) | 278 if (should_stall_) |
308 return; | 279 return; |
(...skipping 26 matching lines...) Expand all Loading... |
335 MOCK_FAILING_CLIENT_SOCKET, | 306 MOCK_FAILING_CLIENT_SOCKET, |
336 MOCK_PENDING_CLIENT_SOCKET, | 307 MOCK_PENDING_CLIENT_SOCKET, |
337 MOCK_PENDING_FAILING_CLIENT_SOCKET, | 308 MOCK_PENDING_FAILING_CLIENT_SOCKET, |
338 // A delayed socket will pause before connecting through the message loop. | 309 // A delayed socket will pause before connecting through the message loop. |
339 MOCK_DELAYED_CLIENT_SOCKET, | 310 MOCK_DELAYED_CLIENT_SOCKET, |
340 // A stalled socket that never connects at all. | 311 // A stalled socket that never connects at all. |
341 MOCK_STALLED_CLIENT_SOCKET, | 312 MOCK_STALLED_CLIENT_SOCKET, |
342 }; | 313 }; |
343 | 314 |
344 explicit MockClientSocketFactory(NetLog* net_log) | 315 explicit MockClientSocketFactory(NetLog* net_log) |
345 : net_log_(net_log), allocation_count_(0), | 316 : net_log_(net_log), |
346 client_socket_type_(MOCK_CLIENT_SOCKET), client_socket_types_(NULL), | 317 allocation_count_(0), |
347 client_socket_index_(0), client_socket_index_max_(0), | 318 client_socket_type_(MOCK_CLIENT_SOCKET), |
| 319 client_socket_types_(NULL), |
| 320 client_socket_index_(0), |
| 321 client_socket_index_max_(0), |
348 delay_(base::TimeDelta::FromMilliseconds( | 322 delay_(base::TimeDelta::FromMilliseconds( |
349 ClientSocketPool::kMaxConnectRetryIntervalMs)) {} | 323 ClientSocketPool::kMaxConnectRetryIntervalMs)) {} |
350 | 324 |
351 virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket( | 325 virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket( |
352 DatagramSocket::BindType bind_type, | 326 DatagramSocket::BindType bind_type, |
353 const RandIntCallback& rand_int_cb, | 327 const RandIntCallback& rand_int_cb, |
354 NetLog* net_log, | 328 NetLog* net_log, |
355 const NetLog::Source& source) OVERRIDE { | 329 const NetLog::Source& source) OVERRIDE { |
356 NOTREACHED(); | 330 NOTREACHED(); |
357 return scoped_ptr<DatagramClientSocket>(); | 331 return scoped_ptr<DatagramClientSocket>(); |
(...skipping 12 matching lines...) Expand all Loading... |
370 } | 344 } |
371 | 345 |
372 switch (type) { | 346 switch (type) { |
373 case MOCK_CLIENT_SOCKET: | 347 case MOCK_CLIENT_SOCKET: |
374 return scoped_ptr<StreamSocket>( | 348 return scoped_ptr<StreamSocket>( |
375 new MockClientSocket(addresses, net_log_)); | 349 new MockClientSocket(addresses, net_log_)); |
376 case MOCK_FAILING_CLIENT_SOCKET: | 350 case MOCK_FAILING_CLIENT_SOCKET: |
377 return scoped_ptr<StreamSocket>( | 351 return scoped_ptr<StreamSocket>( |
378 new MockFailingClientSocket(addresses, net_log_)); | 352 new MockFailingClientSocket(addresses, net_log_)); |
379 case MOCK_PENDING_CLIENT_SOCKET: | 353 case MOCK_PENDING_CLIENT_SOCKET: |
380 return scoped_ptr<StreamSocket>( | 354 return scoped_ptr<StreamSocket>(new MockPendingClientSocket( |
381 new MockPendingClientSocket( | 355 addresses, true, false, base::TimeDelta(), net_log_)); |
382 addresses, true, false, base::TimeDelta(), net_log_)); | |
383 case MOCK_PENDING_FAILING_CLIENT_SOCKET: | 356 case MOCK_PENDING_FAILING_CLIENT_SOCKET: |
384 return scoped_ptr<StreamSocket>( | 357 return scoped_ptr<StreamSocket>(new MockPendingClientSocket( |
385 new MockPendingClientSocket( | 358 addresses, false, false, base::TimeDelta(), net_log_)); |
386 addresses, false, false, base::TimeDelta(), net_log_)); | |
387 case MOCK_DELAYED_CLIENT_SOCKET: | 359 case MOCK_DELAYED_CLIENT_SOCKET: |
388 return scoped_ptr<StreamSocket>( | 360 return scoped_ptr<StreamSocket>(new MockPendingClientSocket( |
389 new MockPendingClientSocket( | 361 addresses, true, false, delay_, net_log_)); |
390 addresses, true, false, delay_, net_log_)); | |
391 case MOCK_STALLED_CLIENT_SOCKET: | 362 case MOCK_STALLED_CLIENT_SOCKET: |
392 return scoped_ptr<StreamSocket>( | 363 return scoped_ptr<StreamSocket>(new MockPendingClientSocket( |
393 new MockPendingClientSocket( | 364 addresses, true, true, base::TimeDelta(), net_log_)); |
394 addresses, true, true, base::TimeDelta(), net_log_)); | |
395 default: | 365 default: |
396 NOTREACHED(); | 366 NOTREACHED(); |
397 return scoped_ptr<StreamSocket>( | 367 return scoped_ptr<StreamSocket>( |
398 new MockClientSocket(addresses, net_log_)); | 368 new MockClientSocket(addresses, net_log_)); |
399 } | 369 } |
400 } | 370 } |
401 | 371 |
402 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket( | 372 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket( |
403 scoped_ptr<ClientSocketHandle> transport_socket, | 373 scoped_ptr<ClientSocketHandle> transport_socket, |
404 const HostPortPair& host_and_port, | 374 const HostPortPair& host_and_port, |
405 const SSLConfig& ssl_config, | 375 const SSLConfig& ssl_config, |
406 const SSLClientSocketContext& context) OVERRIDE { | 376 const SSLClientSocketContext& context) OVERRIDE { |
407 NOTIMPLEMENTED(); | 377 NOTIMPLEMENTED(); |
408 return scoped_ptr<SSLClientSocket>(); | 378 return scoped_ptr<SSLClientSocket>(); |
409 } | 379 } |
410 | 380 |
411 virtual void ClearSSLSessionCache() OVERRIDE { | 381 virtual void ClearSSLSessionCache() OVERRIDE { NOTIMPLEMENTED(); } |
412 NOTIMPLEMENTED(); | |
413 } | |
414 | 382 |
415 int allocation_count() const { return allocation_count_; } | 383 int allocation_count() const { return allocation_count_; } |
416 | 384 |
417 // Set the default ClientSocketType. | 385 // Set the default ClientSocketType. |
418 void set_client_socket_type(ClientSocketType type) { | 386 void set_client_socket_type(ClientSocketType type) { |
419 client_socket_type_ = type; | 387 client_socket_type_ = type; |
420 } | 388 } |
421 | 389 |
422 // Set a list of ClientSocketTypes to be used. | 390 // Set a list of ClientSocketTypes to be used. |
423 void set_client_socket_types(ClientSocketType* type_list, int num_types) { | 391 void set_client_socket_types(ClientSocketType* type_list, int num_types) { |
(...skipping 15 matching lines...) Expand all Loading... |
439 base::TimeDelta delay_; | 407 base::TimeDelta delay_; |
440 | 408 |
441 DISALLOW_COPY_AND_ASSIGN(MockClientSocketFactory); | 409 DISALLOW_COPY_AND_ASSIGN(MockClientSocketFactory); |
442 }; | 410 }; |
443 | 411 |
444 class TransportClientSocketPoolTest : public testing::Test { | 412 class TransportClientSocketPoolTest : public testing::Test { |
445 protected: | 413 protected: |
446 TransportClientSocketPoolTest() | 414 TransportClientSocketPoolTest() |
447 : connect_backup_jobs_enabled_( | 415 : connect_backup_jobs_enabled_( |
448 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true)), | 416 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true)), |
449 params_( | 417 params_(new TransportSocketParams(HostPortPair("www.google.com", 80), |
450 new TransportSocketParams(HostPortPair("www.google.com", 80), | 418 false, |
451 false, false, | 419 false, |
452 OnHostResolutionCallback())), | 420 OnHostResolutionCallback())), |
453 histograms_(new ClientSocketPoolHistograms("TCPUnitTest")), | 421 histograms_(new ClientSocketPoolHistograms("TCPUnitTest")), |
454 host_resolver_(new MockHostResolver), | 422 host_resolver_(new MockHostResolver), |
455 client_socket_factory_(&net_log_), | 423 client_socket_factory_(&net_log_), |
456 pool_(kMaxSockets, | 424 pool_(kMaxSockets, |
457 kMaxSocketsPerGroup, | 425 kMaxSocketsPerGroup, |
458 histograms_.get(), | 426 histograms_.get(), |
459 host_resolver_.get(), | 427 host_resolver_.get(), |
460 &client_socket_factory_, | 428 &client_socket_factory_, |
461 NULL) { | 429 NULL) {} |
462 } | |
463 | 430 |
464 virtual ~TransportClientSocketPoolTest() { | 431 virtual ~TransportClientSocketPoolTest() { |
465 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( | 432 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( |
466 connect_backup_jobs_enabled_); | 433 connect_backup_jobs_enabled_); |
467 } | 434 } |
468 | 435 |
469 int StartRequest(const std::string& group_name, RequestPriority priority) { | 436 int StartRequest(const std::string& group_name, RequestPriority priority) { |
470 scoped_refptr<TransportSocketParams> params(new TransportSocketParams( | 437 scoped_refptr<TransportSocketParams> params( |
471 HostPortPair("www.google.com", 80), false, false, | 438 new TransportSocketParams(HostPortPair("www.google.com", 80), |
472 OnHostResolutionCallback())); | 439 false, |
| 440 false, |
| 441 OnHostResolutionCallback())); |
473 return test_base_.StartRequestUsingPool( | 442 return test_base_.StartRequestUsingPool( |
474 &pool_, group_name, priority, params); | 443 &pool_, group_name, priority, params); |
475 } | 444 } |
476 | 445 |
477 int GetOrderOfRequest(size_t index) { | 446 int GetOrderOfRequest(size_t index) { |
478 return test_base_.GetOrderOfRequest(index); | 447 return test_base_.GetOrderOfRequest(index); |
479 } | 448 } |
480 | 449 |
481 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { | 450 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { |
482 return test_base_.ReleaseOneConnection(keep_alive); | 451 return test_base_.ReleaseOneConnection(keep_alive); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 ASSERT_EQ(4u, addrlist.size()); | 537 ASSERT_EQ(4u, addrlist.size()); |
569 EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily()); | 538 EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily()); |
570 EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily()); | 539 EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily()); |
571 EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[2].GetFamily()); | 540 EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[2].GetFamily()); |
572 EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily()); | 541 EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily()); |
573 } | 542 } |
574 | 543 |
575 TEST_F(TransportClientSocketPoolTest, Basic) { | 544 TEST_F(TransportClientSocketPoolTest, Basic) { |
576 TestCompletionCallback callback; | 545 TestCompletionCallback callback; |
577 ClientSocketHandle handle; | 546 ClientSocketHandle handle; |
578 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, | 547 int rv = handle.Init( |
579 BoundNetLog()); | 548 "a", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
580 EXPECT_EQ(ERR_IO_PENDING, rv); | 549 EXPECT_EQ(ERR_IO_PENDING, rv); |
581 EXPECT_FALSE(handle.is_initialized()); | 550 EXPECT_FALSE(handle.is_initialized()); |
582 EXPECT_FALSE(handle.socket()); | 551 EXPECT_FALSE(handle.socket()); |
583 | 552 |
584 EXPECT_EQ(OK, callback.WaitForResult()); | 553 EXPECT_EQ(OK, callback.WaitForResult()); |
585 EXPECT_TRUE(handle.is_initialized()); | 554 EXPECT_TRUE(handle.is_initialized()); |
586 EXPECT_TRUE(handle.socket()); | 555 EXPECT_TRUE(handle.socket()); |
587 TestLoadTimingInfoConnectedNotReused(handle); | 556 TestLoadTimingInfoConnectedNotReused(handle); |
588 } | 557 } |
589 | 558 |
590 // Make sure that TransportConnectJob passes on its priority to its | 559 // Make sure that TransportConnectJob passes on its priority to its |
591 // HostResolver request on Init. | 560 // HostResolver request on Init. |
592 TEST_F(TransportClientSocketPoolTest, SetResolvePriorityOnInit) { | 561 TEST_F(TransportClientSocketPoolTest, SetResolvePriorityOnInit) { |
593 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | 562 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
594 RequestPriority priority = static_cast<RequestPriority>(i); | 563 RequestPriority priority = static_cast<RequestPriority>(i); |
595 TestCompletionCallback callback; | 564 TestCompletionCallback callback; |
596 ClientSocketHandle handle; | 565 ClientSocketHandle handle; |
597 EXPECT_EQ(ERR_IO_PENDING, | 566 EXPECT_EQ(ERR_IO_PENDING, |
598 handle.Init("a", params_, priority, callback.callback(), &pool_, | 567 handle.Init("a", |
| 568 params_, |
| 569 priority, |
| 570 callback.callback(), |
| 571 &pool_, |
599 BoundNetLog())); | 572 BoundNetLog())); |
600 EXPECT_EQ(priority, host_resolver_->last_request_priority()); | 573 EXPECT_EQ(priority, host_resolver_->last_request_priority()); |
601 } | 574 } |
602 } | 575 } |
603 | 576 |
604 TEST_F(TransportClientSocketPoolTest, InitHostResolutionFailure) { | 577 TEST_F(TransportClientSocketPoolTest, InitHostResolutionFailure) { |
605 host_resolver_->rules()->AddSimulatedFailure("unresolvable.host.name"); | 578 host_resolver_->rules()->AddSimulatedFailure("unresolvable.host.name"); |
606 TestCompletionCallback callback; | 579 TestCompletionCallback callback; |
607 ClientSocketHandle handle; | 580 ClientSocketHandle handle; |
608 HostPortPair host_port_pair("unresolvable.host.name", 80); | 581 HostPortPair host_port_pair("unresolvable.host.name", 80); |
609 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( | 582 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( |
610 host_port_pair, false, false, | 583 host_port_pair, false, false, OnHostResolutionCallback())); |
611 OnHostResolutionCallback())); | |
612 EXPECT_EQ(ERR_IO_PENDING, | 584 EXPECT_EQ(ERR_IO_PENDING, |
613 handle.Init("a", dest, kDefaultPriority, callback.callback(), | 585 handle.Init("a", |
614 &pool_, BoundNetLog())); | 586 dest, |
| 587 kDefaultPriority, |
| 588 callback.callback(), |
| 589 &pool_, |
| 590 BoundNetLog())); |
615 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback.WaitForResult()); | 591 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback.WaitForResult()); |
616 } | 592 } |
617 | 593 |
618 TEST_F(TransportClientSocketPoolTest, InitConnectionFailure) { | 594 TEST_F(TransportClientSocketPoolTest, InitConnectionFailure) { |
619 client_socket_factory_.set_client_socket_type( | 595 client_socket_factory_.set_client_socket_type( |
620 MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET); | 596 MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET); |
621 TestCompletionCallback callback; | 597 TestCompletionCallback callback; |
622 ClientSocketHandle handle; | 598 ClientSocketHandle handle; |
623 EXPECT_EQ(ERR_IO_PENDING, | 599 EXPECT_EQ(ERR_IO_PENDING, |
624 handle.Init("a", params_, kDefaultPriority, callback.callback(), | 600 handle.Init("a", |
625 &pool_, BoundNetLog())); | 601 params_, |
| 602 kDefaultPriority, |
| 603 callback.callback(), |
| 604 &pool_, |
| 605 BoundNetLog())); |
626 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 606 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
627 | 607 |
628 // Make the host resolutions complete synchronously this time. | 608 // Make the host resolutions complete synchronously this time. |
629 host_resolver_->set_synchronous_mode(true); | 609 host_resolver_->set_synchronous_mode(true); |
630 EXPECT_EQ(ERR_CONNECTION_FAILED, | 610 EXPECT_EQ(ERR_CONNECTION_FAILED, |
631 handle.Init("a", params_, kDefaultPriority, callback.callback(), | 611 handle.Init("a", |
632 &pool_, BoundNetLog())); | 612 params_, |
| 613 kDefaultPriority, |
| 614 callback.callback(), |
| 615 &pool_, |
| 616 BoundNetLog())); |
633 } | 617 } |
634 | 618 |
635 TEST_F(TransportClientSocketPoolTest, PendingRequests) { | 619 TEST_F(TransportClientSocketPoolTest, PendingRequests) { |
636 // First request finishes asynchronously. | 620 // First request finishes asynchronously. |
637 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 621 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
638 EXPECT_EQ(OK, (*requests())[0]->WaitForResult()); | 622 EXPECT_EQ(OK, (*requests())[0]->WaitForResult()); |
639 | 623 |
640 // Make all subsequent host resolutions complete synchronously. | 624 // Make all subsequent host resolutions complete synchronously. |
641 host_resolver_->set_synchronous_mode(true); | 625 host_resolver_->set_synchronous_mode(true); |
642 | 626 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 EXPECT_EQ(6U, completion_count()); | 712 EXPECT_EQ(6U, completion_count()); |
729 } | 713 } |
730 | 714 |
731 // This test will start up a RequestSocket() and then immediately Cancel() it. | 715 // This test will start up a RequestSocket() and then immediately Cancel() it. |
732 // The pending host resolution will eventually complete, and destroy the | 716 // The pending host resolution will eventually complete, and destroy the |
733 // ClientSocketPool which will crash if the group was not cleared properly. | 717 // ClientSocketPool which will crash if the group was not cleared properly. |
734 TEST_F(TransportClientSocketPoolTest, CancelRequestClearGroup) { | 718 TEST_F(TransportClientSocketPoolTest, CancelRequestClearGroup) { |
735 TestCompletionCallback callback; | 719 TestCompletionCallback callback; |
736 ClientSocketHandle handle; | 720 ClientSocketHandle handle; |
737 EXPECT_EQ(ERR_IO_PENDING, | 721 EXPECT_EQ(ERR_IO_PENDING, |
738 handle.Init("a", params_, kDefaultPriority, callback.callback(), | 722 handle.Init("a", |
739 &pool_, BoundNetLog())); | 723 params_, |
| 724 kDefaultPriority, |
| 725 callback.callback(), |
| 726 &pool_, |
| 727 BoundNetLog())); |
740 handle.Reset(); | 728 handle.Reset(); |
741 } | 729 } |
742 | 730 |
743 TEST_F(TransportClientSocketPoolTest, TwoRequestsCancelOne) { | 731 TEST_F(TransportClientSocketPoolTest, TwoRequestsCancelOne) { |
744 ClientSocketHandle handle; | 732 ClientSocketHandle handle; |
745 TestCompletionCallback callback; | 733 TestCompletionCallback callback; |
746 ClientSocketHandle handle2; | 734 ClientSocketHandle handle2; |
747 TestCompletionCallback callback2; | 735 TestCompletionCallback callback2; |
748 | 736 |
749 EXPECT_EQ(ERR_IO_PENDING, | 737 EXPECT_EQ(ERR_IO_PENDING, |
750 handle.Init("a", params_, kDefaultPriority, callback.callback(), | 738 handle.Init("a", |
751 &pool_, BoundNetLog())); | 739 params_, |
| 740 kDefaultPriority, |
| 741 callback.callback(), |
| 742 &pool_, |
| 743 BoundNetLog())); |
752 EXPECT_EQ(ERR_IO_PENDING, | 744 EXPECT_EQ(ERR_IO_PENDING, |
753 handle2.Init("a", params_, kDefaultPriority, callback2.callback(), | 745 handle2.Init("a", |
754 &pool_, BoundNetLog())); | 746 params_, |
| 747 kDefaultPriority, |
| 748 callback2.callback(), |
| 749 &pool_, |
| 750 BoundNetLog())); |
755 | 751 |
756 handle.Reset(); | 752 handle.Reset(); |
757 | 753 |
758 EXPECT_EQ(OK, callback2.WaitForResult()); | 754 EXPECT_EQ(OK, callback2.WaitForResult()); |
759 handle2.Reset(); | 755 handle2.Reset(); |
760 } | 756 } |
761 | 757 |
762 TEST_F(TransportClientSocketPoolTest, ConnectCancelConnect) { | 758 TEST_F(TransportClientSocketPoolTest, ConnectCancelConnect) { |
763 client_socket_factory_.set_client_socket_type( | 759 client_socket_factory_.set_client_socket_type( |
764 MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET); | 760 MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET); |
765 ClientSocketHandle handle; | 761 ClientSocketHandle handle; |
766 TestCompletionCallback callback; | 762 TestCompletionCallback callback; |
767 EXPECT_EQ(ERR_IO_PENDING, | 763 EXPECT_EQ(ERR_IO_PENDING, |
768 handle.Init("a", params_, kDefaultPriority, callback.callback(), | 764 handle.Init("a", |
769 &pool_, BoundNetLog())); | 765 params_, |
| 766 kDefaultPriority, |
| 767 callback.callback(), |
| 768 &pool_, |
| 769 BoundNetLog())); |
770 | 770 |
771 handle.Reset(); | 771 handle.Reset(); |
772 | 772 |
773 TestCompletionCallback callback2; | 773 TestCompletionCallback callback2; |
774 EXPECT_EQ(ERR_IO_PENDING, | 774 EXPECT_EQ(ERR_IO_PENDING, |
775 handle.Init("a", params_, kDefaultPriority, callback2.callback(), | 775 handle.Init("a", |
776 &pool_, BoundNetLog())); | 776 params_, |
| 777 kDefaultPriority, |
| 778 callback2.callback(), |
| 779 &pool_, |
| 780 BoundNetLog())); |
777 | 781 |
778 host_resolver_->set_synchronous_mode(true); | 782 host_resolver_->set_synchronous_mode(true); |
779 // At this point, handle has two ConnectingSockets out for it. Due to the | 783 // At this point, handle has two ConnectingSockets out for it. Due to the |
780 // setting the mock resolver into synchronous mode, the host resolution for | 784 // setting the mock resolver into synchronous mode, the host resolution for |
781 // both will return in the same loop of the MessageLoop. The client socket | 785 // both will return in the same loop of the MessageLoop. The client socket |
782 // is a pending socket, so the Connect() will asynchronously complete on the | 786 // is a pending socket, so the Connect() will asynchronously complete on the |
783 // next loop of the MessageLoop. That means that the first | 787 // next loop of the MessageLoop. That means that the first |
784 // ConnectingSocket will enter OnIOComplete, and then the second one will. | 788 // ConnectingSocket will enter OnIOComplete, and then the second one will. |
785 // If the first one is not cancelled, it will advance the load state, and | 789 // If the first one is not cancelled, it will advance the load state, and |
786 // then the second one will crash. | 790 // then the second one will crash. |
(...skipping 30 matching lines...) Expand all Loading... |
817 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 821 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); |
818 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 822 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); |
819 | 823 |
820 // Cancel a request. | 824 // Cancel a request. |
821 size_t index_to_cancel = kMaxSocketsPerGroup + 2; | 825 size_t index_to_cancel = kMaxSocketsPerGroup + 2; |
822 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); | 826 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); |
823 (*requests())[index_to_cancel]->handle()->Reset(); | 827 (*requests())[index_to_cancel]->handle()->Reset(); |
824 | 828 |
825 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); | 829 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); |
826 | 830 |
827 EXPECT_EQ(kMaxSocketsPerGroup, | 831 EXPECT_EQ(kMaxSocketsPerGroup, client_socket_factory_.allocation_count()); |
828 client_socket_factory_.allocation_count()); | |
829 EXPECT_EQ(requests()->size() - kMaxSocketsPerGroup, completion_count()); | 832 EXPECT_EQ(requests()->size() - kMaxSocketsPerGroup, completion_count()); |
830 | 833 |
831 EXPECT_EQ(1, GetOrderOfRequest(1)); | 834 EXPECT_EQ(1, GetOrderOfRequest(1)); |
832 EXPECT_EQ(2, GetOrderOfRequest(2)); | 835 EXPECT_EQ(2, GetOrderOfRequest(2)); |
833 EXPECT_EQ(3, GetOrderOfRequest(3)); | 836 EXPECT_EQ(3, GetOrderOfRequest(3)); |
834 EXPECT_EQ(4, GetOrderOfRequest(4)); | 837 EXPECT_EQ(4, GetOrderOfRequest(4)); |
835 EXPECT_EQ(5, GetOrderOfRequest(5)); | 838 EXPECT_EQ(5, GetOrderOfRequest(5)); |
836 EXPECT_EQ(6, GetOrderOfRequest(6)); | 839 EXPECT_EQ(6, GetOrderOfRequest(6)); |
837 EXPECT_EQ(14, GetOrderOfRequest(7)); | 840 EXPECT_EQ(14, GetOrderOfRequest(7)); |
838 EXPECT_EQ(7, GetOrderOfRequest(8)); | 841 EXPECT_EQ(7, GetOrderOfRequest(8)); |
(...skipping 12 matching lines...) Expand all Loading... |
851 } | 854 } |
852 | 855 |
853 class RequestSocketCallback : public TestCompletionCallbackBase { | 856 class RequestSocketCallback : public TestCompletionCallbackBase { |
854 public: | 857 public: |
855 RequestSocketCallback(ClientSocketHandle* handle, | 858 RequestSocketCallback(ClientSocketHandle* handle, |
856 TransportClientSocketPool* pool) | 859 TransportClientSocketPool* pool) |
857 : handle_(handle), | 860 : handle_(handle), |
858 pool_(pool), | 861 pool_(pool), |
859 within_callback_(false), | 862 within_callback_(false), |
860 callback_(base::Bind(&RequestSocketCallback::OnComplete, | 863 callback_(base::Bind(&RequestSocketCallback::OnComplete, |
861 base::Unretained(this))) { | 864 base::Unretained(this))) {} |
862 } | |
863 | 865 |
864 virtual ~RequestSocketCallback() {} | 866 virtual ~RequestSocketCallback() {} |
865 | 867 |
866 const CompletionCallback& callback() const { return callback_; } | 868 const CompletionCallback& callback() const { return callback_; } |
867 | 869 |
868 private: | 870 private: |
869 void OnComplete(int result) { | 871 void OnComplete(int result) { |
870 SetResult(result); | 872 SetResult(result); |
871 ASSERT_EQ(OK, result); | 873 ASSERT_EQ(OK, result); |
872 | 874 |
873 if (!within_callback_) { | 875 if (!within_callback_) { |
874 // Don't allow reuse of the socket. Disconnect it and then release it and | 876 // Don't allow reuse of the socket. Disconnect it and then release it and |
875 // run through the MessageLoop once to get it completely released. | 877 // run through the MessageLoop once to get it completely released. |
876 handle_->socket()->Disconnect(); | 878 handle_->socket()->Disconnect(); |
877 handle_->Reset(); | 879 handle_->Reset(); |
878 { | 880 { |
879 base::MessageLoop::ScopedNestableTaskAllower allow( | 881 base::MessageLoop::ScopedNestableTaskAllower allow( |
880 base::MessageLoop::current()); | 882 base::MessageLoop::current()); |
881 base::MessageLoop::current()->RunUntilIdle(); | 883 base::MessageLoop::current()->RunUntilIdle(); |
882 } | 884 } |
883 within_callback_ = true; | 885 within_callback_ = true; |
884 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( | 886 scoped_refptr<TransportSocketParams> dest( |
885 HostPortPair("www.google.com", 80), false, false, | 887 new TransportSocketParams(HostPortPair("www.google.com", 80), |
886 OnHostResolutionCallback())); | 888 false, |
887 int rv = handle_->Init("a", dest, LOWEST, callback(), pool_, | 889 false, |
888 BoundNetLog()); | 890 OnHostResolutionCallback())); |
| 891 int rv = |
| 892 handle_->Init("a", dest, LOWEST, callback(), pool_, BoundNetLog()); |
889 EXPECT_EQ(OK, rv); | 893 EXPECT_EQ(OK, rv); |
890 } | 894 } |
891 } | 895 } |
892 | 896 |
893 ClientSocketHandle* const handle_; | 897 ClientSocketHandle* const handle_; |
894 TransportClientSocketPool* const pool_; | 898 TransportClientSocketPool* const pool_; |
895 bool within_callback_; | 899 bool within_callback_; |
896 CompletionCallback callback_; | 900 CompletionCallback callback_; |
897 | 901 |
898 DISALLOW_COPY_AND_ASSIGN(RequestSocketCallback); | 902 DISALLOW_COPY_AND_ASSIGN(RequestSocketCallback); |
899 }; | 903 }; |
900 | 904 |
901 TEST_F(TransportClientSocketPoolTest, RequestTwice) { | 905 TEST_F(TransportClientSocketPoolTest, RequestTwice) { |
902 ClientSocketHandle handle; | 906 ClientSocketHandle handle; |
903 RequestSocketCallback callback(&handle, &pool_); | 907 RequestSocketCallback callback(&handle, &pool_); |
904 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( | 908 scoped_refptr<TransportSocketParams> dest( |
905 HostPortPair("www.google.com", 80), false, false, | 909 new TransportSocketParams(HostPortPair("www.google.com", 80), |
906 OnHostResolutionCallback())); | 910 false, |
907 int rv = handle.Init("a", dest, LOWEST, callback.callback(), &pool_, | 911 false, |
908 BoundNetLog()); | 912 OnHostResolutionCallback())); |
| 913 int rv = handle.Init( |
| 914 "a", dest, LOWEST, callback.callback(), &pool_, BoundNetLog()); |
909 ASSERT_EQ(ERR_IO_PENDING, rv); | 915 ASSERT_EQ(ERR_IO_PENDING, rv); |
910 | 916 |
911 // The callback is going to request "www.google.com". We want it to complete | 917 // The callback is going to request "www.google.com". We want it to complete |
912 // synchronously this time. | 918 // synchronously this time. |
913 host_resolver_->set_synchronous_mode(true); | 919 host_resolver_->set_synchronous_mode(true); |
914 | 920 |
915 EXPECT_EQ(OK, callback.WaitForResult()); | 921 EXPECT_EQ(OK, callback.WaitForResult()); |
916 | 922 |
917 handle.Reset(); | 923 handle.Reset(); |
918 } | 924 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 for (int i = 0; i < kNumRequests; i++) | 966 for (int i = 0; i < kNumRequests; i++) |
961 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 967 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
962 | 968 |
963 for (int i = 0; i < kNumRequests; i++) | 969 for (int i = 0; i < kNumRequests; i++) |
964 EXPECT_EQ(ERR_CONNECTION_FAILED, (*requests())[i]->WaitForResult()); | 970 EXPECT_EQ(ERR_CONNECTION_FAILED, (*requests())[i]->WaitForResult()); |
965 } | 971 } |
966 | 972 |
967 TEST_F(TransportClientSocketPoolTest, IdleSocketLoadTiming) { | 973 TEST_F(TransportClientSocketPoolTest, IdleSocketLoadTiming) { |
968 TestCompletionCallback callback; | 974 TestCompletionCallback callback; |
969 ClientSocketHandle handle; | 975 ClientSocketHandle handle; |
970 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, | 976 int rv = handle.Init( |
971 BoundNetLog()); | 977 "a", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
972 EXPECT_EQ(ERR_IO_PENDING, rv); | 978 EXPECT_EQ(ERR_IO_PENDING, rv); |
973 EXPECT_FALSE(handle.is_initialized()); | 979 EXPECT_FALSE(handle.is_initialized()); |
974 EXPECT_FALSE(handle.socket()); | 980 EXPECT_FALSE(handle.socket()); |
975 | 981 |
976 EXPECT_EQ(OK, callback.WaitForResult()); | 982 EXPECT_EQ(OK, callback.WaitForResult()); |
977 EXPECT_TRUE(handle.is_initialized()); | 983 EXPECT_TRUE(handle.is_initialized()); |
978 EXPECT_TRUE(handle.socket()); | 984 EXPECT_TRUE(handle.socket()); |
979 TestLoadTimingInfoConnectedNotReused(handle); | 985 TestLoadTimingInfoConnectedNotReused(handle); |
980 | 986 |
981 handle.Reset(); | 987 handle.Reset(); |
982 // Need to run all pending to release the socket back to the pool. | 988 // Need to run all pending to release the socket back to the pool. |
983 base::MessageLoop::current()->RunUntilIdle(); | 989 base::MessageLoop::current()->RunUntilIdle(); |
984 | 990 |
985 // Now we should have 1 idle socket. | 991 // Now we should have 1 idle socket. |
986 EXPECT_EQ(1, pool_.IdleSocketCount()); | 992 EXPECT_EQ(1, pool_.IdleSocketCount()); |
987 | 993 |
988 rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, | 994 rv = handle.Init( |
989 BoundNetLog()); | 995 "a", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
990 EXPECT_EQ(OK, rv); | 996 EXPECT_EQ(OK, rv); |
991 EXPECT_EQ(0, pool_.IdleSocketCount()); | 997 EXPECT_EQ(0, pool_.IdleSocketCount()); |
992 TestLoadTimingInfoConnectedReused(handle); | 998 TestLoadTimingInfoConnectedReused(handle); |
993 } | 999 } |
994 | 1000 |
995 TEST_F(TransportClientSocketPoolTest, ResetIdleSocketsOnIPAddressChange) { | 1001 TEST_F(TransportClientSocketPoolTest, ResetIdleSocketsOnIPAddressChange) { |
996 TestCompletionCallback callback; | 1002 TestCompletionCallback callback; |
997 ClientSocketHandle handle; | 1003 ClientSocketHandle handle; |
998 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, | 1004 int rv = handle.Init( |
999 BoundNetLog()); | 1005 "a", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
1000 EXPECT_EQ(ERR_IO_PENDING, rv); | 1006 EXPECT_EQ(ERR_IO_PENDING, rv); |
1001 EXPECT_FALSE(handle.is_initialized()); | 1007 EXPECT_FALSE(handle.is_initialized()); |
1002 EXPECT_FALSE(handle.socket()); | 1008 EXPECT_FALSE(handle.socket()); |
1003 | 1009 |
1004 EXPECT_EQ(OK, callback.WaitForResult()); | 1010 EXPECT_EQ(OK, callback.WaitForResult()); |
1005 EXPECT_TRUE(handle.is_initialized()); | 1011 EXPECT_TRUE(handle.is_initialized()); |
1006 EXPECT_TRUE(handle.socket()); | 1012 EXPECT_TRUE(handle.socket()); |
1007 | 1013 |
1008 handle.Reset(); | 1014 handle.Reset(); |
1009 | 1015 |
1010 // Need to run all pending to release the socket back to the pool. | 1016 // Need to run all pending to release the socket back to the pool. |
1011 base::MessageLoop::current()->RunUntilIdle(); | 1017 base::MessageLoop::current()->RunUntilIdle(); |
1012 | 1018 |
1013 // Now we should have 1 idle socket. | 1019 // Now we should have 1 idle socket. |
1014 EXPECT_EQ(1, pool_.IdleSocketCount()); | 1020 EXPECT_EQ(1, pool_.IdleSocketCount()); |
1015 | 1021 |
1016 // After an IP address change, we should have 0 idle sockets. | 1022 // After an IP address change, we should have 0 idle sockets. |
1017 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 1023 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
1018 base::MessageLoop::current()->RunUntilIdle(); // Notification happens async. | 1024 base::MessageLoop::current()->RunUntilIdle(); // Notification happens async. |
1019 | 1025 |
1020 EXPECT_EQ(0, pool_.IdleSocketCount()); | 1026 EXPECT_EQ(0, pool_.IdleSocketCount()); |
1021 } | 1027 } |
1022 | 1028 |
1023 TEST_F(TransportClientSocketPoolTest, BackupSocketConnect) { | 1029 TEST_F(TransportClientSocketPoolTest, BackupSocketConnect) { |
1024 // Case 1 tests the first socket stalling, and the backup connecting. | 1030 // Case 1 tests the first socket stalling, and the backup connecting. |
1025 MockClientSocketFactory::ClientSocketType case1_types[] = { | 1031 MockClientSocketFactory::ClientSocketType case1_types[] = { |
1026 // The first socket will not connect. | 1032 // The first socket will not connect. |
1027 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, | 1033 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, |
1028 // The second socket will connect more quickly. | 1034 // The second socket will connect more quickly. |
1029 MockClientSocketFactory::MOCK_CLIENT_SOCKET | 1035 MockClientSocketFactory::MOCK_CLIENT_SOCKET}; |
1030 }; | |
1031 | 1036 |
1032 // Case 2 tests the first socket being slow, so that we start the | 1037 // Case 2 tests the first socket being slow, so that we start the |
1033 // second connect, but the second connect stalls, and we still | 1038 // second connect, but the second connect stalls, and we still |
1034 // complete the first. | 1039 // complete the first. |
1035 MockClientSocketFactory::ClientSocketType case2_types[] = { | 1040 MockClientSocketFactory::ClientSocketType case2_types[] = { |
1036 // The first socket will connect, although delayed. | 1041 // The first socket will connect, although delayed. |
1037 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, | 1042 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, |
1038 // The second socket will not connect. | 1043 // The second socket will not connect. |
1039 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET | 1044 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET}; |
1040 }; | |
1041 | 1045 |
1042 MockClientSocketFactory::ClientSocketType* cases[2] = { | 1046 MockClientSocketFactory::ClientSocketType* cases[2] = {case1_types, |
1043 case1_types, | 1047 case2_types}; |
1044 case2_types | |
1045 }; | |
1046 | 1048 |
1047 for (size_t index = 0; index < arraysize(cases); ++index) { | 1049 for (size_t index = 0; index < arraysize(cases); ++index) { |
1048 client_socket_factory_.set_client_socket_types(cases[index], 2); | 1050 client_socket_factory_.set_client_socket_types(cases[index], 2); |
1049 | 1051 |
1050 EXPECT_EQ(0, pool_.IdleSocketCount()); | 1052 EXPECT_EQ(0, pool_.IdleSocketCount()); |
1051 | 1053 |
1052 TestCompletionCallback callback; | 1054 TestCompletionCallback callback; |
1053 ClientSocketHandle handle; | 1055 ClientSocketHandle handle; |
1054 int rv = handle.Init("b", params_, LOW, callback.callback(), &pool_, | 1056 int rv = handle.Init( |
1055 BoundNetLog()); | 1057 "b", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
1056 EXPECT_EQ(ERR_IO_PENDING, rv); | 1058 EXPECT_EQ(ERR_IO_PENDING, rv); |
1057 EXPECT_FALSE(handle.is_initialized()); | 1059 EXPECT_FALSE(handle.is_initialized()); |
1058 EXPECT_FALSE(handle.socket()); | 1060 EXPECT_FALSE(handle.socket()); |
1059 | 1061 |
1060 // Create the first socket, set the timer. | 1062 // Create the first socket, set the timer. |
1061 base::MessageLoop::current()->RunUntilIdle(); | 1063 base::MessageLoop::current()->RunUntilIdle(); |
1062 | 1064 |
1063 // Wait for the backup socket timer to fire. | 1065 // Wait for the backup socket timer to fire. |
1064 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 1066 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
1065 ClientSocketPool::kMaxConnectRetryIntervalMs + 50)); | 1067 ClientSocketPool::kMaxConnectRetryIntervalMs + 50)); |
(...skipping 20 matching lines...) Expand all Loading... |
1086 client_socket_factory_.set_client_socket_type( | 1088 client_socket_factory_.set_client_socket_type( |
1087 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET); | 1089 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET); |
1088 | 1090 |
1089 enum { CANCEL_BEFORE_WAIT, CANCEL_AFTER_WAIT }; | 1091 enum { CANCEL_BEFORE_WAIT, CANCEL_AFTER_WAIT }; |
1090 | 1092 |
1091 for (int index = CANCEL_BEFORE_WAIT; index < CANCEL_AFTER_WAIT; ++index) { | 1093 for (int index = CANCEL_BEFORE_WAIT; index < CANCEL_AFTER_WAIT; ++index) { |
1092 EXPECT_EQ(0, pool_.IdleSocketCount()); | 1094 EXPECT_EQ(0, pool_.IdleSocketCount()); |
1093 | 1095 |
1094 TestCompletionCallback callback; | 1096 TestCompletionCallback callback; |
1095 ClientSocketHandle handle; | 1097 ClientSocketHandle handle; |
1096 int rv = handle.Init("c", params_, LOW, callback.callback(), &pool_, | 1098 int rv = handle.Init( |
1097 BoundNetLog()); | 1099 "c", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
1098 EXPECT_EQ(ERR_IO_PENDING, rv); | 1100 EXPECT_EQ(ERR_IO_PENDING, rv); |
1099 EXPECT_FALSE(handle.is_initialized()); | 1101 EXPECT_FALSE(handle.is_initialized()); |
1100 EXPECT_FALSE(handle.socket()); | 1102 EXPECT_FALSE(handle.socket()); |
1101 | 1103 |
1102 // Create the first socket, set the timer. | 1104 // Create the first socket, set the timer. |
1103 base::MessageLoop::current()->RunUntilIdle(); | 1105 base::MessageLoop::current()->RunUntilIdle(); |
1104 | 1106 |
1105 if (index == CANCEL_AFTER_WAIT) { | 1107 if (index == CANCEL_AFTER_WAIT) { |
1106 // Wait for the backup socket timer to fire. | 1108 // Wait for the backup socket timer to fire. |
1107 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 1109 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
(...skipping 12 matching lines...) Expand all Loading... |
1120 // One socket is stalled, the other is active. | 1122 // One socket is stalled, the other is active. |
1121 EXPECT_EQ(0, pool_.IdleSocketCount()); | 1123 EXPECT_EQ(0, pool_.IdleSocketCount()); |
1122 } | 1124 } |
1123 } | 1125 } |
1124 | 1126 |
1125 // Test the case where a socket took long enough to start the creation | 1127 // Test the case where a socket took long enough to start the creation |
1126 // of the backup socket and never completes, and then the backup | 1128 // of the backup socket and never completes, and then the backup |
1127 // connection fails. | 1129 // connection fails. |
1128 TEST_F(TransportClientSocketPoolTest, BackupSocketFailAfterStall) { | 1130 TEST_F(TransportClientSocketPoolTest, BackupSocketFailAfterStall) { |
1129 MockClientSocketFactory::ClientSocketType case_types[] = { | 1131 MockClientSocketFactory::ClientSocketType case_types[] = { |
1130 // The first socket will not connect. | 1132 // The first socket will not connect. |
1131 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, | 1133 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, |
1132 // The second socket will fail immediately. | 1134 // The second socket will fail immediately. |
1133 MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET | 1135 MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET}; |
1134 }; | |
1135 | 1136 |
1136 client_socket_factory_.set_client_socket_types(case_types, 2); | 1137 client_socket_factory_.set_client_socket_types(case_types, 2); |
1137 | 1138 |
1138 EXPECT_EQ(0, pool_.IdleSocketCount()); | 1139 EXPECT_EQ(0, pool_.IdleSocketCount()); |
1139 | 1140 |
1140 TestCompletionCallback callback; | 1141 TestCompletionCallback callback; |
1141 ClientSocketHandle handle; | 1142 ClientSocketHandle handle; |
1142 int rv = handle.Init("b", params_, LOW, callback.callback(), &pool_, | 1143 int rv = handle.Init( |
1143 BoundNetLog()); | 1144 "b", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
1144 EXPECT_EQ(ERR_IO_PENDING, rv); | 1145 EXPECT_EQ(ERR_IO_PENDING, rv); |
1145 EXPECT_FALSE(handle.is_initialized()); | 1146 EXPECT_FALSE(handle.is_initialized()); |
1146 EXPECT_FALSE(handle.socket()); | 1147 EXPECT_FALSE(handle.socket()); |
1147 | 1148 |
1148 // Create the first socket, set the timer. | 1149 // Create the first socket, set the timer. |
1149 base::MessageLoop::current()->RunUntilIdle(); | 1150 base::MessageLoop::current()->RunUntilIdle(); |
1150 | 1151 |
1151 // Wait for the backup socket timer to fire. | 1152 // Wait for the backup socket timer to fire. |
1152 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 1153 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
1153 ClientSocketPool::kMaxConnectRetryIntervalMs)); | 1154 ClientSocketPool::kMaxConnectRetryIntervalMs)); |
(...skipping 13 matching lines...) Expand all Loading... |
1167 | 1168 |
1168 // Reset for the next case. | 1169 // Reset for the next case. |
1169 host_resolver_->set_synchronous_mode(false); | 1170 host_resolver_->set_synchronous_mode(false); |
1170 } | 1171 } |
1171 | 1172 |
1172 // Test the case where a socket took long enough to start the creation | 1173 // Test the case where a socket took long enough to start the creation |
1173 // of the backup socket and eventually completes, but the backup socket | 1174 // of the backup socket and eventually completes, but the backup socket |
1174 // fails. | 1175 // fails. |
1175 TEST_F(TransportClientSocketPoolTest, BackupSocketFailAfterDelay) { | 1176 TEST_F(TransportClientSocketPoolTest, BackupSocketFailAfterDelay) { |
1176 MockClientSocketFactory::ClientSocketType case_types[] = { | 1177 MockClientSocketFactory::ClientSocketType case_types[] = { |
1177 // The first socket will connect, although delayed. | 1178 // The first socket will connect, although delayed. |
1178 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, | 1179 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, |
1179 // The second socket will not connect. | 1180 // The second socket will not connect. |
1180 MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET | 1181 MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET}; |
1181 }; | |
1182 | 1182 |
1183 client_socket_factory_.set_client_socket_types(case_types, 2); | 1183 client_socket_factory_.set_client_socket_types(case_types, 2); |
1184 client_socket_factory_.set_delay(base::TimeDelta::FromSeconds(5)); | 1184 client_socket_factory_.set_delay(base::TimeDelta::FromSeconds(5)); |
1185 | 1185 |
1186 EXPECT_EQ(0, pool_.IdleSocketCount()); | 1186 EXPECT_EQ(0, pool_.IdleSocketCount()); |
1187 | 1187 |
1188 TestCompletionCallback callback; | 1188 TestCompletionCallback callback; |
1189 ClientSocketHandle handle; | 1189 ClientSocketHandle handle; |
1190 int rv = handle.Init("b", params_, LOW, callback.callback(), &pool_, | 1190 int rv = handle.Init( |
1191 BoundNetLog()); | 1191 "b", params_, LOW, callback.callback(), &pool_, BoundNetLog()); |
1192 EXPECT_EQ(ERR_IO_PENDING, rv); | 1192 EXPECT_EQ(ERR_IO_PENDING, rv); |
1193 EXPECT_FALSE(handle.is_initialized()); | 1193 EXPECT_FALSE(handle.is_initialized()); |
1194 EXPECT_FALSE(handle.socket()); | 1194 EXPECT_FALSE(handle.socket()); |
1195 | 1195 |
1196 // Create the first socket, set the timer. | 1196 // Create the first socket, set the timer. |
1197 base::MessageLoop::current()->RunUntilIdle(); | 1197 base::MessageLoop::current()->RunUntilIdle(); |
1198 | 1198 |
1199 // Wait for the backup socket timer to fire. | 1199 // Wait for the backup socket timer to fire. |
1200 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 1200 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
1201 ClientSocketPool::kMaxConnectRetryIntervalMs)); | 1201 ClientSocketPool::kMaxConnectRetryIntervalMs)); |
(...skipping 20 matching lines...) Expand all Loading... |
1222 // Create a pool without backup jobs. | 1222 // Create a pool without backup jobs. |
1223 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 1223 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
1224 TransportClientSocketPool pool(kMaxSockets, | 1224 TransportClientSocketPool pool(kMaxSockets, |
1225 kMaxSocketsPerGroup, | 1225 kMaxSocketsPerGroup, |
1226 histograms_.get(), | 1226 histograms_.get(), |
1227 host_resolver_.get(), | 1227 host_resolver_.get(), |
1228 &client_socket_factory_, | 1228 &client_socket_factory_, |
1229 NULL); | 1229 NULL); |
1230 | 1230 |
1231 MockClientSocketFactory::ClientSocketType case_types[] = { | 1231 MockClientSocketFactory::ClientSocketType case_types[] = { |
1232 // This is the IPv6 socket. | 1232 // This is the IPv6 socket. |
1233 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, | 1233 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, |
1234 // This is the IPv4 socket. | 1234 // This is the IPv4 socket. |
1235 MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET | 1235 MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET}; |
1236 }; | |
1237 | 1236 |
1238 client_socket_factory_.set_client_socket_types(case_types, 2); | 1237 client_socket_factory_.set_client_socket_types(case_types, 2); |
1239 | 1238 |
1240 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. | 1239 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. |
1241 host_resolver_->rules() | 1240 host_resolver_->rules()->AddIPLiteralRule( |
1242 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); | 1241 "*", "2:abcd::3:4:ff,2.2.2.2", std::string()); |
1243 | 1242 |
1244 TestCompletionCallback callback; | 1243 TestCompletionCallback callback; |
1245 ClientSocketHandle handle; | 1244 ClientSocketHandle handle; |
1246 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, | 1245 int rv = |
1247 BoundNetLog()); | 1246 handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); |
1248 EXPECT_EQ(ERR_IO_PENDING, rv); | 1247 EXPECT_EQ(ERR_IO_PENDING, rv); |
1249 EXPECT_FALSE(handle.is_initialized()); | 1248 EXPECT_FALSE(handle.is_initialized()); |
1250 EXPECT_FALSE(handle.socket()); | 1249 EXPECT_FALSE(handle.socket()); |
1251 | 1250 |
1252 EXPECT_EQ(OK, callback.WaitForResult()); | 1251 EXPECT_EQ(OK, callback.WaitForResult()); |
1253 EXPECT_TRUE(handle.is_initialized()); | 1252 EXPECT_TRUE(handle.is_initialized()); |
1254 EXPECT_TRUE(handle.socket()); | 1253 EXPECT_TRUE(handle.socket()); |
1255 IPEndPoint endpoint; | 1254 IPEndPoint endpoint; |
1256 handle.socket()->GetLocalAddress(&endpoint); | 1255 handle.socket()->GetLocalAddress(&endpoint); |
1257 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); | 1256 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); |
1258 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 1257 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
1259 } | 1258 } |
1260 | 1259 |
1261 // Test the case of the IPv6 address being slow, thus falling back to trying to | 1260 // Test the case of the IPv6 address being slow, thus falling back to trying to |
1262 // connect to the IPv4 address, but having the connect to the IPv6 address | 1261 // connect to the IPv4 address, but having the connect to the IPv6 address |
1263 // finish first. | 1262 // finish first. |
1264 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv6FinishesFirst) { | 1263 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv6FinishesFirst) { |
1265 // Create a pool without backup jobs. | 1264 // Create a pool without backup jobs. |
1266 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 1265 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
1267 TransportClientSocketPool pool(kMaxSockets, | 1266 TransportClientSocketPool pool(kMaxSockets, |
1268 kMaxSocketsPerGroup, | 1267 kMaxSocketsPerGroup, |
1269 histograms_.get(), | 1268 histograms_.get(), |
1270 host_resolver_.get(), | 1269 host_resolver_.get(), |
1271 &client_socket_factory_, | 1270 &client_socket_factory_, |
1272 NULL); | 1271 NULL); |
1273 | 1272 |
1274 MockClientSocketFactory::ClientSocketType case_types[] = { | 1273 MockClientSocketFactory::ClientSocketType case_types[] = { |
1275 // This is the IPv6 socket. | 1274 // This is the IPv6 socket. |
1276 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, | 1275 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, |
1277 // This is the IPv4 socket. | 1276 // This is the IPv4 socket. |
1278 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET | 1277 MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET}; |
1279 }; | |
1280 | 1278 |
1281 client_socket_factory_.set_client_socket_types(case_types, 2); | 1279 client_socket_factory_.set_client_socket_types(case_types, 2); |
1282 client_socket_factory_.set_delay(base::TimeDelta::FromMilliseconds( | 1280 client_socket_factory_.set_delay(base::TimeDelta::FromMilliseconds( |
1283 TransportConnectJob::kIPv6FallbackTimerInMs + 50)); | 1281 TransportConnectJob::kIPv6FallbackTimerInMs + 50)); |
1284 | 1282 |
1285 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. | 1283 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. |
1286 host_resolver_->rules() | 1284 host_resolver_->rules()->AddIPLiteralRule( |
1287 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); | 1285 "*", "2:abcd::3:4:ff,2.2.2.2", std::string()); |
1288 | 1286 |
1289 TestCompletionCallback callback; | 1287 TestCompletionCallback callback; |
1290 ClientSocketHandle handle; | 1288 ClientSocketHandle handle; |
1291 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, | 1289 int rv = |
1292 BoundNetLog()); | 1290 handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); |
1293 EXPECT_EQ(ERR_IO_PENDING, rv); | 1291 EXPECT_EQ(ERR_IO_PENDING, rv); |
1294 EXPECT_FALSE(handle.is_initialized()); | 1292 EXPECT_FALSE(handle.is_initialized()); |
1295 EXPECT_FALSE(handle.socket()); | 1293 EXPECT_FALSE(handle.socket()); |
1296 | 1294 |
1297 EXPECT_EQ(OK, callback.WaitForResult()); | 1295 EXPECT_EQ(OK, callback.WaitForResult()); |
1298 EXPECT_TRUE(handle.is_initialized()); | 1296 EXPECT_TRUE(handle.is_initialized()); |
1299 EXPECT_TRUE(handle.socket()); | 1297 EXPECT_TRUE(handle.socket()); |
1300 IPEndPoint endpoint; | 1298 IPEndPoint endpoint; |
1301 handle.socket()->GetLocalAddress(&endpoint); | 1299 handle.socket()->GetLocalAddress(&endpoint); |
1302 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); | 1300 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); |
1303 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 1301 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
1304 } | 1302 } |
1305 | 1303 |
1306 TEST_F(TransportClientSocketPoolTest, IPv6NoIPv4AddressesToFallbackTo) { | 1304 TEST_F(TransportClientSocketPoolTest, IPv6NoIPv4AddressesToFallbackTo) { |
1307 // Create a pool without backup jobs. | 1305 // Create a pool without backup jobs. |
1308 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 1306 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
1309 TransportClientSocketPool pool(kMaxSockets, | 1307 TransportClientSocketPool pool(kMaxSockets, |
1310 kMaxSocketsPerGroup, | 1308 kMaxSocketsPerGroup, |
1311 histograms_.get(), | 1309 histograms_.get(), |
1312 host_resolver_.get(), | 1310 host_resolver_.get(), |
1313 &client_socket_factory_, | 1311 &client_socket_factory_, |
1314 NULL); | 1312 NULL); |
1315 | 1313 |
1316 client_socket_factory_.set_client_socket_type( | 1314 client_socket_factory_.set_client_socket_type( |
1317 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); | 1315 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); |
1318 | 1316 |
1319 // Resolve an AddressList with only IPv6 addresses. | 1317 // Resolve an AddressList with only IPv6 addresses. |
1320 host_resolver_->rules() | 1318 host_resolver_->rules()->AddIPLiteralRule( |
1321 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,3:abcd::3:4:ff", std::string()); | 1319 "*", "2:abcd::3:4:ff,3:abcd::3:4:ff", std::string()); |
1322 | 1320 |
1323 TestCompletionCallback callback; | 1321 TestCompletionCallback callback; |
1324 ClientSocketHandle handle; | 1322 ClientSocketHandle handle; |
1325 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, | 1323 int rv = |
1326 BoundNetLog()); | 1324 handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); |
1327 EXPECT_EQ(ERR_IO_PENDING, rv); | 1325 EXPECT_EQ(ERR_IO_PENDING, rv); |
1328 EXPECT_FALSE(handle.is_initialized()); | 1326 EXPECT_FALSE(handle.is_initialized()); |
1329 EXPECT_FALSE(handle.socket()); | 1327 EXPECT_FALSE(handle.socket()); |
1330 | 1328 |
1331 EXPECT_EQ(OK, callback.WaitForResult()); | 1329 EXPECT_EQ(OK, callback.WaitForResult()); |
1332 EXPECT_TRUE(handle.is_initialized()); | 1330 EXPECT_TRUE(handle.is_initialized()); |
1333 EXPECT_TRUE(handle.socket()); | 1331 EXPECT_TRUE(handle.socket()); |
1334 IPEndPoint endpoint; | 1332 IPEndPoint endpoint; |
1335 handle.socket()->GetLocalAddress(&endpoint); | 1333 handle.socket()->GetLocalAddress(&endpoint); |
1336 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); | 1334 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); |
(...skipping 11 matching lines...) Expand all Loading... |
1348 NULL); | 1346 NULL); |
1349 | 1347 |
1350 client_socket_factory_.set_client_socket_type( | 1348 client_socket_factory_.set_client_socket_type( |
1351 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); | 1349 MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); |
1352 | 1350 |
1353 // Resolve an AddressList with only IPv4 addresses. | 1351 // Resolve an AddressList with only IPv4 addresses. |
1354 host_resolver_->rules()->AddIPLiteralRule("*", "1.1.1.1", std::string()); | 1352 host_resolver_->rules()->AddIPLiteralRule("*", "1.1.1.1", std::string()); |
1355 | 1353 |
1356 TestCompletionCallback callback; | 1354 TestCompletionCallback callback; |
1357 ClientSocketHandle handle; | 1355 ClientSocketHandle handle; |
1358 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, | 1356 int rv = |
1359 BoundNetLog()); | 1357 handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); |
1360 EXPECT_EQ(ERR_IO_PENDING, rv); | 1358 EXPECT_EQ(ERR_IO_PENDING, rv); |
1361 EXPECT_FALSE(handle.is_initialized()); | 1359 EXPECT_FALSE(handle.is_initialized()); |
1362 EXPECT_FALSE(handle.socket()); | 1360 EXPECT_FALSE(handle.socket()); |
1363 | 1361 |
1364 EXPECT_EQ(OK, callback.WaitForResult()); | 1362 EXPECT_EQ(OK, callback.WaitForResult()); |
1365 EXPECT_TRUE(handle.is_initialized()); | 1363 EXPECT_TRUE(handle.is_initialized()); |
1366 EXPECT_TRUE(handle.socket()); | 1364 EXPECT_TRUE(handle.socket()); |
1367 IPEndPoint endpoint; | 1365 IPEndPoint endpoint; |
1368 handle.socket()->GetLocalAddress(&endpoint); | 1366 handle.socket()->GetLocalAddress(&endpoint); |
1369 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); | 1367 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); |
1370 EXPECT_EQ(1, client_socket_factory_.allocation_count()); | 1368 EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
1371 } | 1369 } |
1372 | 1370 |
1373 } // namespace | 1371 } // namespace |
1374 | 1372 |
1375 } // namespace net | 1373 } // namespace net |
OLD | NEW |