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/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 const bool ignore_limits_; | 111 const bool ignore_limits_; |
112 }; | 112 }; |
113 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; | 113 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; |
114 | 114 |
115 class MockClientSocket : public StreamSocket { | 115 class MockClientSocket : public StreamSocket { |
116 public: | 116 public: |
117 explicit MockClientSocket(net::NetLog* net_log) | 117 explicit MockClientSocket(net::NetLog* net_log) |
118 : connected_(false), | 118 : connected_(false), |
119 has_unread_data_(false), | 119 has_unread_data_(false), |
120 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)), | 120 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)), |
121 was_used_to_convey_data_(false) { | 121 was_used_to_convey_data_(false) {} |
122 } | |
123 | 122 |
124 // Sets whether the socket has unread data. If true, the next call to Read() | 123 // Sets whether the socket has unread data. If true, the next call to Read() |
125 // will return 1 byte and IsConnectedAndIdle() will return false. | 124 // will return 1 byte and IsConnectedAndIdle() will return false. |
126 void set_has_unread_data(bool has_unread_data) { | 125 void set_has_unread_data(bool has_unread_data) { |
127 has_unread_data_ = has_unread_data; | 126 has_unread_data_ = has_unread_data; |
128 } | 127 } |
129 | 128 |
130 // Socket implementation. | 129 // Socket implementation. |
131 virtual int Read( | 130 virtual int Read(IOBuffer* /* buf */, |
132 IOBuffer* /* buf */, int len, | 131 int len, |
133 const CompletionCallback& /* callback */) OVERRIDE { | 132 const CompletionCallback& /* callback */) OVERRIDE { |
134 if (has_unread_data_ && len > 0) { | 133 if (has_unread_data_ && len > 0) { |
135 has_unread_data_ = false; | 134 has_unread_data_ = false; |
136 was_used_to_convey_data_ = true; | 135 was_used_to_convey_data_ = true; |
137 return 1; | 136 return 1; |
138 } | 137 } |
139 return ERR_UNEXPECTED; | 138 return ERR_UNEXPECTED; |
140 } | 139 } |
141 | 140 |
142 virtual int Write( | 141 virtual int Write(IOBuffer* /* buf */, |
143 IOBuffer* /* buf */, int len, | 142 int len, |
144 const CompletionCallback& /* callback */) OVERRIDE { | 143 const CompletionCallback& /* callback */) OVERRIDE { |
145 was_used_to_convey_data_ = true; | 144 was_used_to_convey_data_ = true; |
146 return len; | 145 return len; |
147 } | 146 } |
148 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } | 147 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } |
149 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } | 148 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } |
150 | 149 |
151 // StreamSocket implementation. | 150 // StreamSocket implementation. |
152 virtual int Connect(const CompletionCallback& callback) OVERRIDE { | 151 virtual int Connect(const CompletionCallback& callback) OVERRIDE { |
153 connected_ = true; | 152 connected_ = true; |
154 return OK; | 153 return OK; |
155 } | 154 } |
156 | 155 |
157 virtual void Disconnect() OVERRIDE { connected_ = false; } | 156 virtual void Disconnect() OVERRIDE { connected_ = false; } |
158 virtual bool IsConnected() const OVERRIDE { return connected_; } | 157 virtual bool IsConnected() const OVERRIDE { return connected_; } |
159 virtual bool IsConnectedAndIdle() const OVERRIDE { | 158 virtual bool IsConnectedAndIdle() const OVERRIDE { |
160 return connected_ && !has_unread_data_; | 159 return connected_ && !has_unread_data_; |
161 } | 160 } |
162 | 161 |
163 virtual int GetPeerAddress(IPEndPoint* /* address */) const OVERRIDE { | 162 virtual int GetPeerAddress(IPEndPoint* /* address */) const OVERRIDE { |
164 return ERR_UNEXPECTED; | 163 return ERR_UNEXPECTED; |
165 } | 164 } |
166 | 165 |
167 virtual int GetLocalAddress(IPEndPoint* /* address */) const OVERRIDE { | 166 virtual int GetLocalAddress(IPEndPoint* /* address */) const OVERRIDE { |
168 return ERR_UNEXPECTED; | 167 return ERR_UNEXPECTED; |
169 } | 168 } |
170 | 169 |
171 virtual const BoundNetLog& NetLog() const OVERRIDE { | 170 virtual const BoundNetLog& NetLog() const OVERRIDE { return net_log_; } |
172 return net_log_; | |
173 } | |
174 | 171 |
175 virtual void SetSubresourceSpeculation() OVERRIDE {} | 172 virtual void SetSubresourceSpeculation() OVERRIDE {} |
176 virtual void SetOmniboxSpeculation() OVERRIDE {} | 173 virtual void SetOmniboxSpeculation() OVERRIDE {} |
177 virtual bool WasEverUsed() const OVERRIDE { | 174 virtual bool WasEverUsed() const OVERRIDE { return was_used_to_convey_data_; } |
178 return was_used_to_convey_data_; | |
179 } | |
180 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } | 175 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } |
181 virtual bool WasNpnNegotiated() const OVERRIDE { | 176 virtual bool WasNpnNegotiated() const OVERRIDE { return false; } |
182 return false; | |
183 } | |
184 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { | 177 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { |
185 return kProtoUnknown; | 178 return kProtoUnknown; |
186 } | 179 } |
187 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 180 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { return false; } |
188 return false; | |
189 } | |
190 | 181 |
191 private: | 182 private: |
192 bool connected_; | 183 bool connected_; |
193 bool has_unread_data_; | 184 bool has_unread_data_; |
194 BoundNetLog net_log_; | 185 BoundNetLog net_log_; |
195 bool was_used_to_convey_data_; | 186 bool was_used_to_convey_data_; |
196 | 187 |
197 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); | 188 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); |
198 }; | 189 }; |
199 | 190 |
(...skipping 22 matching lines...) Expand all Loading... |
222 | 213 |
223 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket( | 214 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket( |
224 scoped_ptr<ClientSocketHandle> transport_socket, | 215 scoped_ptr<ClientSocketHandle> transport_socket, |
225 const HostPortPair& host_and_port, | 216 const HostPortPair& host_and_port, |
226 const SSLConfig& ssl_config, | 217 const SSLConfig& ssl_config, |
227 const SSLClientSocketContext& context) OVERRIDE { | 218 const SSLClientSocketContext& context) OVERRIDE { |
228 NOTIMPLEMENTED(); | 219 NOTIMPLEMENTED(); |
229 return scoped_ptr<SSLClientSocket>(); | 220 return scoped_ptr<SSLClientSocket>(); |
230 } | 221 } |
231 | 222 |
232 virtual void ClearSSLSessionCache() OVERRIDE { | 223 virtual void ClearSSLSessionCache() OVERRIDE { NOTIMPLEMENTED(); } |
233 NOTIMPLEMENTED(); | |
234 } | |
235 | 224 |
236 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } | 225 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } |
237 | 226 |
238 void SignalJobs(); | 227 void SignalJobs(); |
239 | 228 |
240 void SignalJob(size_t job); | 229 void SignalJob(size_t job); |
241 | 230 |
242 void SetJobLoadState(size_t job, LoadState load_state); | 231 void SetJobLoadState(size_t job, LoadState load_state); |
243 | 232 |
244 int allocation_count() const { return allocation_count_; } | 233 int allocation_count() const { return allocation_count_; } |
(...skipping 22 matching lines...) Expand all Loading... |
267 // to complete. | 256 // to complete. |
268 static const int kPendingConnectDelay = 2; | 257 static const int kPendingConnectDelay = 2; |
269 | 258 |
270 TestConnectJob(JobType job_type, | 259 TestConnectJob(JobType job_type, |
271 const std::string& group_name, | 260 const std::string& group_name, |
272 const TestClientSocketPoolBase::Request& request, | 261 const TestClientSocketPoolBase::Request& request, |
273 base::TimeDelta timeout_duration, | 262 base::TimeDelta timeout_duration, |
274 ConnectJob::Delegate* delegate, | 263 ConnectJob::Delegate* delegate, |
275 MockClientSocketFactory* client_socket_factory, | 264 MockClientSocketFactory* client_socket_factory, |
276 NetLog* net_log) | 265 NetLog* net_log) |
277 : ConnectJob(group_name, timeout_duration, request.priority(), delegate, | 266 : ConnectJob(group_name, |
| 267 timeout_duration, |
| 268 request.priority(), |
| 269 delegate, |
278 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), | 270 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), |
279 job_type_(job_type), | 271 job_type_(job_type), |
280 client_socket_factory_(client_socket_factory), | 272 client_socket_factory_(client_socket_factory), |
281 load_state_(LOAD_STATE_IDLE), | 273 load_state_(LOAD_STATE_IDLE), |
282 store_additional_error_state_(false), | 274 store_additional_error_state_(false), |
283 weak_factory_(this) { | 275 weak_factory_(this) {} |
284 } | |
285 | 276 |
286 void Signal() { | 277 void Signal() { |
287 DoConnect(waiting_success_, true /* async */, false /* recoverable */); | 278 DoConnect(waiting_success_, true /* async */, false /* recoverable */); |
288 } | 279 } |
289 | 280 |
290 void set_load_state(LoadState load_state) { load_state_ = load_state; } | 281 void set_load_state(LoadState load_state) { load_state_ = load_state; } |
291 | 282 |
292 // From ConnectJob: | 283 // From ConnectJob: |
293 | 284 |
294 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; } | 285 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; } |
(...skipping 12 matching lines...) Expand all Loading... |
307 // From ConnectJob: | 298 // From ConnectJob: |
308 | 299 |
309 virtual int ConnectInternal() OVERRIDE { | 300 virtual int ConnectInternal() OVERRIDE { |
310 AddressList ignored; | 301 AddressList ignored; |
311 client_socket_factory_->CreateTransportClientSocket( | 302 client_socket_factory_->CreateTransportClientSocket( |
312 ignored, NULL, net::NetLog::Source()); | 303 ignored, NULL, net::NetLog::Source()); |
313 SetSocket( | 304 SetSocket( |
314 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log()))); | 305 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log()))); |
315 switch (job_type_) { | 306 switch (job_type_) { |
316 case kMockJob: | 307 case kMockJob: |
317 return DoConnect(true /* successful */, false /* sync */, | 308 return DoConnect( |
318 false /* recoverable */); | 309 true /* successful */, false /* sync */, false /* recoverable */); |
319 case kMockFailingJob: | 310 case kMockFailingJob: |
320 return DoConnect(false /* error */, false /* sync */, | 311 return DoConnect( |
321 false /* recoverable */); | 312 false /* error */, false /* sync */, false /* recoverable */); |
322 case kMockPendingJob: | 313 case kMockPendingJob: |
323 set_load_state(LOAD_STATE_CONNECTING); | 314 set_load_state(LOAD_STATE_CONNECTING); |
324 | 315 |
325 // Depending on execution timings, posting a delayed task can result | 316 // Depending on execution timings, posting a delayed task can result |
326 // in the task getting executed the at the earliest possible | 317 // in the task getting executed the at the earliest possible |
327 // opportunity or only after returning once from the message loop and | 318 // opportunity or only after returning once from the message loop and |
328 // then a second call into the message loop. In order to make behavior | 319 // then a second call into the message loop. In order to make behavior |
329 // more deterministic, we change the default delay to 2ms. This should | 320 // more deterministic, we change the default delay to 2ms. This should |
330 // always require us to wait for the second call into the message loop. | 321 // always require us to wait for the second call into the message loop. |
331 // | 322 // |
(...skipping 10 matching lines...) Expand all Loading... |
342 false /* recoverable */), | 333 false /* recoverable */), |
343 base::TimeDelta::FromMilliseconds(kPendingConnectDelay)); | 334 base::TimeDelta::FromMilliseconds(kPendingConnectDelay)); |
344 return ERR_IO_PENDING; | 335 return ERR_IO_PENDING; |
345 case kMockPendingFailingJob: | 336 case kMockPendingFailingJob: |
346 set_load_state(LOAD_STATE_CONNECTING); | 337 set_load_state(LOAD_STATE_CONNECTING); |
347 base::MessageLoop::current()->PostDelayedTask( | 338 base::MessageLoop::current()->PostDelayedTask( |
348 FROM_HERE, | 339 FROM_HERE, |
349 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), | 340 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), |
350 weak_factory_.GetWeakPtr(), | 341 weak_factory_.GetWeakPtr(), |
351 false /* error */, | 342 false /* error */, |
352 true /* async */, | 343 true /* async */, |
353 false /* recoverable */), | 344 false /* recoverable */), |
354 base::TimeDelta::FromMilliseconds(2)); | 345 base::TimeDelta::FromMilliseconds(2)); |
355 return ERR_IO_PENDING; | 346 return ERR_IO_PENDING; |
356 case kMockWaitingJob: | 347 case kMockWaitingJob: |
357 set_load_state(LOAD_STATE_CONNECTING); | 348 set_load_state(LOAD_STATE_CONNECTING); |
358 client_socket_factory_->WaitForSignal(this); | 349 client_socket_factory_->WaitForSignal(this); |
359 waiting_success_ = true; | 350 waiting_success_ = true; |
360 return ERR_IO_PENDING; | 351 return ERR_IO_PENDING; |
361 case kMockRecoverableJob: | 352 case kMockRecoverableJob: |
362 return DoConnect(false /* error */, false /* sync */, | 353 return DoConnect( |
363 true /* recoverable */); | 354 false /* error */, false /* sync */, true /* recoverable */); |
364 case kMockPendingRecoverableJob: | 355 case kMockPendingRecoverableJob: |
365 set_load_state(LOAD_STATE_CONNECTING); | 356 set_load_state(LOAD_STATE_CONNECTING); |
366 base::MessageLoop::current()->PostDelayedTask( | 357 base::MessageLoop::current()->PostDelayedTask( |
367 FROM_HERE, | 358 FROM_HERE, |
368 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), | 359 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), |
369 weak_factory_.GetWeakPtr(), | 360 weak_factory_.GetWeakPtr(), |
370 false /* error */, | 361 false /* error */, |
371 true /* async */, | 362 true /* async */, |
372 true /* recoverable */), | 363 true /* recoverable */), |
373 base::TimeDelta::FromMilliseconds(2)); | 364 base::TimeDelta::FromMilliseconds(2)); |
374 return ERR_IO_PENDING; | 365 return ERR_IO_PENDING; |
375 case kMockAdditionalErrorStateJob: | 366 case kMockAdditionalErrorStateJob: |
376 store_additional_error_state_ = true; | 367 store_additional_error_state_ = true; |
377 return DoConnect(false /* error */, false /* sync */, | 368 return DoConnect( |
378 false /* recoverable */); | 369 false /* error */, false /* sync */, false /* recoverable */); |
379 case kMockPendingAdditionalErrorStateJob: | 370 case kMockPendingAdditionalErrorStateJob: |
380 set_load_state(LOAD_STATE_CONNECTING); | 371 set_load_state(LOAD_STATE_CONNECTING); |
381 store_additional_error_state_ = true; | 372 store_additional_error_state_ = true; |
382 base::MessageLoop::current()->PostDelayedTask( | 373 base::MessageLoop::current()->PostDelayedTask( |
383 FROM_HERE, | 374 FROM_HERE, |
384 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), | 375 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), |
385 weak_factory_.GetWeakPtr(), | 376 weak_factory_.GetWeakPtr(), |
386 false /* error */, | 377 false /* error */, |
387 true /* async */, | 378 true /* async */, |
388 false /* recoverable */), | 379 false /* recoverable */), |
389 base::TimeDelta::FromMilliseconds(2)); | 380 base::TimeDelta::FromMilliseconds(2)); |
390 return ERR_IO_PENDING; | 381 return ERR_IO_PENDING; |
391 case kMockUnreadDataJob: { | 382 case kMockUnreadDataJob: { |
392 int ret = DoConnect(true /* successful */, false /* sync */, | 383 int ret = DoConnect( |
393 false /* recoverable */); | 384 true /* successful */, false /* sync */, false /* recoverable */); |
394 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true); | 385 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true); |
395 return ret; | 386 return ret; |
396 } | 387 } |
397 default: | 388 default: |
398 NOTREACHED(); | 389 NOTREACHED(); |
399 SetSocket(scoped_ptr<StreamSocket>()); | 390 SetSocket(scoped_ptr<StreamSocket>()); |
400 return ERR_FAILED; | 391 return ERR_FAILED; |
401 } | 392 } |
402 } | 393 } |
403 | 394 |
(...skipping 25 matching lines...) Expand all Loading... |
429 }; | 420 }; |
430 | 421 |
431 class TestConnectJobFactory | 422 class TestConnectJobFactory |
432 : public TestClientSocketPoolBase::ConnectJobFactory { | 423 : public TestClientSocketPoolBase::ConnectJobFactory { |
433 public: | 424 public: |
434 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory, | 425 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory, |
435 NetLog* net_log) | 426 NetLog* net_log) |
436 : job_type_(TestConnectJob::kMockJob), | 427 : job_type_(TestConnectJob::kMockJob), |
437 job_types_(NULL), | 428 job_types_(NULL), |
438 client_socket_factory_(client_socket_factory), | 429 client_socket_factory_(client_socket_factory), |
439 net_log_(net_log) { | 430 net_log_(net_log) {} |
440 } | |
441 | 431 |
442 virtual ~TestConnectJobFactory() {} | 432 virtual ~TestConnectJobFactory() {} |
443 | 433 |
444 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } | 434 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } |
445 | 435 |
446 void set_job_types(std::list<TestConnectJob::JobType>* job_types) { | 436 void set_job_types(std::list<TestConnectJob::JobType>* job_types) { |
447 job_types_ = job_types; | 437 job_types_ = job_types; |
448 CHECK(!job_types_->empty()); | 438 CHECK(!job_types_->empty()); |
449 } | 439 } |
450 | 440 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 public: | 481 public: |
492 typedef TestSocketParams SocketParams; | 482 typedef TestSocketParams SocketParams; |
493 | 483 |
494 TestClientSocketPool( | 484 TestClientSocketPool( |
495 int max_sockets, | 485 int max_sockets, |
496 int max_sockets_per_group, | 486 int max_sockets_per_group, |
497 ClientSocketPoolHistograms* histograms, | 487 ClientSocketPoolHistograms* histograms, |
498 base::TimeDelta unused_idle_socket_timeout, | 488 base::TimeDelta unused_idle_socket_timeout, |
499 base::TimeDelta used_idle_socket_timeout, | 489 base::TimeDelta used_idle_socket_timeout, |
500 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) | 490 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) |
501 : base_(NULL, max_sockets, max_sockets_per_group, histograms, | 491 : base_(NULL, |
502 unused_idle_socket_timeout, used_idle_socket_timeout, | 492 max_sockets, |
| 493 max_sockets_per_group, |
| 494 histograms, |
| 495 unused_idle_socket_timeout, |
| 496 used_idle_socket_timeout, |
503 connect_job_factory) {} | 497 connect_job_factory) {} |
504 | 498 |
505 virtual ~TestClientSocketPool() {} | 499 virtual ~TestClientSocketPool() {} |
506 | 500 |
507 virtual int RequestSocket( | 501 virtual int RequestSocket(const std::string& group_name, |
508 const std::string& group_name, | 502 const void* params, |
509 const void* params, | 503 net::RequestPriority priority, |
510 net::RequestPriority priority, | 504 ClientSocketHandle* handle, |
511 ClientSocketHandle* handle, | 505 const CompletionCallback& callback, |
512 const CompletionCallback& callback, | 506 const BoundNetLog& net_log) OVERRIDE { |
513 const BoundNetLog& net_log) OVERRIDE { | |
514 const scoped_refptr<TestSocketParams>* casted_socket_params = | 507 const scoped_refptr<TestSocketParams>* casted_socket_params = |
515 static_cast<const scoped_refptr<TestSocketParams>*>(params); | 508 static_cast<const scoped_refptr<TestSocketParams>*>(params); |
516 return base_.RequestSocket(group_name, *casted_socket_params, priority, | 509 return base_.RequestSocket( |
517 handle, callback, net_log); | 510 group_name, *casted_socket_params, priority, handle, callback, net_log); |
518 } | 511 } |
519 | 512 |
520 virtual void RequestSockets(const std::string& group_name, | 513 virtual void RequestSockets(const std::string& group_name, |
521 const void* params, | 514 const void* params, |
522 int num_sockets, | 515 int num_sockets, |
523 const BoundNetLog& net_log) OVERRIDE { | 516 const BoundNetLog& net_log) OVERRIDE { |
524 const scoped_refptr<TestSocketParams>* casted_params = | 517 const scoped_refptr<TestSocketParams>* casted_params = |
525 static_cast<const scoped_refptr<TestSocketParams>*>(params); | 518 static_cast<const scoped_refptr<TestSocketParams>*>(params); |
526 | 519 |
527 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); | 520 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); |
528 } | 521 } |
529 | 522 |
530 virtual void CancelRequest( | 523 virtual void CancelRequest(const std::string& group_name, |
531 const std::string& group_name, | 524 ClientSocketHandle* handle) OVERRIDE { |
532 ClientSocketHandle* handle) OVERRIDE { | |
533 base_.CancelRequest(group_name, handle); | 525 base_.CancelRequest(group_name, handle); |
534 } | 526 } |
535 | 527 |
536 virtual void ReleaseSocket( | 528 virtual void ReleaseSocket(const std::string& group_name, |
537 const std::string& group_name, | 529 scoped_ptr<StreamSocket> socket, |
538 scoped_ptr<StreamSocket> socket, | 530 int id) OVERRIDE { |
539 int id) OVERRIDE { | |
540 base_.ReleaseSocket(group_name, socket.Pass(), id); | 531 base_.ReleaseSocket(group_name, socket.Pass(), id); |
541 } | 532 } |
542 | 533 |
543 virtual void FlushWithError(int error) OVERRIDE { | 534 virtual void FlushWithError(int error) OVERRIDE { |
544 base_.FlushWithError(error); | 535 base_.FlushWithError(error); |
545 } | 536 } |
546 | 537 |
547 virtual bool IsStalled() const OVERRIDE { | 538 virtual bool IsStalled() const OVERRIDE { return base_.IsStalled(); } |
548 return base_.IsStalled(); | |
549 } | |
550 | 539 |
551 virtual void CloseIdleSockets() OVERRIDE { | 540 virtual void CloseIdleSockets() OVERRIDE { base_.CloseIdleSockets(); } |
552 base_.CloseIdleSockets(); | |
553 } | |
554 | 541 |
555 virtual int IdleSocketCount() const OVERRIDE { | 542 virtual int IdleSocketCount() const OVERRIDE { |
556 return base_.idle_socket_count(); | 543 return base_.idle_socket_count(); |
557 } | 544 } |
558 | 545 |
559 virtual int IdleSocketCountInGroup( | 546 virtual int IdleSocketCountInGroup( |
560 const std::string& group_name) const OVERRIDE { | 547 const std::string& group_name) const OVERRIDE { |
561 return base_.IdleSocketCountInGroup(group_name); | 548 return base_.IdleSocketCountInGroup(group_name); |
562 } | 549 } |
563 | 550 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 | 609 |
623 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); | 610 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); |
624 }; | 611 }; |
625 | 612 |
626 } // namespace | 613 } // namespace |
627 | 614 |
628 namespace { | 615 namespace { |
629 | 616 |
630 void MockClientSocketFactory::SignalJobs() { | 617 void MockClientSocketFactory::SignalJobs() { |
631 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); | 618 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); |
632 it != waiting_jobs_.end(); ++it) { | 619 it != waiting_jobs_.end(); |
| 620 ++it) { |
633 (*it)->Signal(); | 621 (*it)->Signal(); |
634 } | 622 } |
635 waiting_jobs_.clear(); | 623 waiting_jobs_.clear(); |
636 } | 624 } |
637 | 625 |
638 void MockClientSocketFactory::SignalJob(size_t job) { | 626 void MockClientSocketFactory::SignalJob(size_t job) { |
639 ASSERT_LT(job, waiting_jobs_.size()); | 627 ASSERT_LT(job, waiting_jobs_.size()); |
640 waiting_jobs_[job]->Signal(); | 628 waiting_jobs_[job]->Signal(); |
641 waiting_jobs_.erase(waiting_jobs_.begin() + job); | 629 waiting_jobs_.erase(waiting_jobs_.begin() + job); |
642 } | 630 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 } | 682 } |
695 | 683 |
696 virtual ~ClientSocketPoolBaseTest() { | 684 virtual ~ClientSocketPoolBaseTest() { |
697 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( | 685 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( |
698 connect_backup_jobs_enabled_); | 686 connect_backup_jobs_enabled_); |
699 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled( | 687 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled( |
700 cleanup_timer_enabled_); | 688 cleanup_timer_enabled_); |
701 } | 689 } |
702 | 690 |
703 void CreatePool(int max_sockets, int max_sockets_per_group) { | 691 void CreatePool(int max_sockets, int max_sockets_per_group) { |
704 CreatePoolWithIdleTimeouts( | 692 CreatePoolWithIdleTimeouts(max_sockets, |
705 max_sockets, | 693 max_sockets_per_group, |
706 max_sockets_per_group, | 694 ClientSocketPool::unused_idle_socket_timeout(), |
707 ClientSocketPool::unused_idle_socket_timeout(), | 695 ClientSocketPool::used_idle_socket_timeout()); |
708 ClientSocketPool::used_idle_socket_timeout()); | |
709 } | 696 } |
710 | 697 |
711 void CreatePoolWithIdleTimeouts( | 698 void CreatePoolWithIdleTimeouts(int max_sockets, |
712 int max_sockets, int max_sockets_per_group, | 699 int max_sockets_per_group, |
713 base::TimeDelta unused_idle_socket_timeout, | 700 base::TimeDelta unused_idle_socket_timeout, |
714 base::TimeDelta used_idle_socket_timeout) { | 701 base::TimeDelta used_idle_socket_timeout) { |
715 DCHECK(!pool_.get()); | 702 DCHECK(!pool_.get()); |
716 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, | 703 connect_job_factory_ = |
717 &net_log_); | 704 new TestConnectJobFactory(&client_socket_factory_, &net_log_); |
718 pool_.reset(new TestClientSocketPool(max_sockets, | 705 pool_.reset(new TestClientSocketPool(max_sockets, |
719 max_sockets_per_group, | 706 max_sockets_per_group, |
720 &histograms_, | 707 &histograms_, |
721 unused_idle_socket_timeout, | 708 unused_idle_socket_timeout, |
722 used_idle_socket_timeout, | 709 used_idle_socket_timeout, |
723 connect_job_factory_)); | 710 connect_job_factory_)); |
724 } | 711 } |
725 | 712 |
726 int StartRequestWithParams( | 713 int StartRequestWithParams(const std::string& group_name, |
727 const std::string& group_name, | 714 RequestPriority priority, |
728 RequestPriority priority, | 715 const scoped_refptr<TestSocketParams>& params) { |
729 const scoped_refptr<TestSocketParams>& params) { | |
730 return test_base_.StartRequestUsingPool( | 716 return test_base_.StartRequestUsingPool( |
731 pool_.get(), group_name, priority, params); | 717 pool_.get(), group_name, priority, params); |
732 } | 718 } |
733 | 719 |
734 int StartRequest(const std::string& group_name, RequestPriority priority) { | 720 int StartRequest(const std::string& group_name, RequestPriority priority) { |
735 return StartRequestWithParams(group_name, priority, params_); | 721 return StartRequestWithParams(group_name, priority, params_); |
736 } | 722 } |
737 | 723 |
738 int GetOrderOfRequest(size_t index) const { | 724 int GetOrderOfRequest(size_t index) const { |
739 return test_base_.GetOrderOfRequest(index); | 725 return test_base_.GetOrderOfRequest(index); |
(...skipping 22 matching lines...) Expand all Loading... |
762 scoped_ptr<TestClientSocketPool> pool_; | 748 scoped_ptr<TestClientSocketPool> pool_; |
763 ClientSocketPoolTest test_base_; | 749 ClientSocketPoolTest test_base_; |
764 }; | 750 }; |
765 | 751 |
766 // Even though a timeout is specified, it doesn't time out on a synchronous | 752 // Even though a timeout is specified, it doesn't time out on a synchronous |
767 // completion. | 753 // completion. |
768 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { | 754 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { |
769 TestConnectJobDelegate delegate; | 755 TestConnectJobDelegate delegate; |
770 ClientSocketHandle ignored; | 756 ClientSocketHandle ignored; |
771 TestClientSocketPoolBase::Request request( | 757 TestClientSocketPoolBase::Request request( |
772 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 758 &ignored, |
| 759 CompletionCallback(), |
| 760 DEFAULT_PRIORITY, |
773 internal::ClientSocketPoolBaseHelper::NORMAL, | 761 internal::ClientSocketPoolBaseHelper::NORMAL, |
774 false, params_, BoundNetLog()); | 762 false, |
| 763 params_, |
| 764 BoundNetLog()); |
775 scoped_ptr<TestConnectJob> job( | 765 scoped_ptr<TestConnectJob> job( |
776 new TestConnectJob(TestConnectJob::kMockJob, | 766 new TestConnectJob(TestConnectJob::kMockJob, |
777 "a", | 767 "a", |
778 request, | 768 request, |
779 base::TimeDelta::FromMicroseconds(1), | 769 base::TimeDelta::FromMicroseconds(1), |
780 &delegate, | 770 &delegate, |
781 &client_socket_factory_, | 771 &client_socket_factory_, |
782 NULL)); | 772 NULL)); |
783 EXPECT_EQ(OK, job->Connect()); | 773 EXPECT_EQ(OK, job->Connect()); |
784 } | 774 } |
785 | 775 |
786 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { | 776 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { |
787 TestConnectJobDelegate delegate; | 777 TestConnectJobDelegate delegate; |
788 ClientSocketHandle ignored; | 778 ClientSocketHandle ignored; |
789 CapturingNetLog log; | 779 CapturingNetLog log; |
790 | 780 |
791 TestClientSocketPoolBase::Request request( | 781 TestClientSocketPoolBase::Request request( |
792 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 782 &ignored, |
| 783 CompletionCallback(), |
| 784 DEFAULT_PRIORITY, |
793 internal::ClientSocketPoolBaseHelper::NORMAL, | 785 internal::ClientSocketPoolBaseHelper::NORMAL, |
794 false, params_, BoundNetLog()); | 786 false, |
| 787 params_, |
| 788 BoundNetLog()); |
795 // Deleted by TestConnectJobDelegate. | 789 // Deleted by TestConnectJobDelegate. |
796 TestConnectJob* job = | 790 TestConnectJob* job = new TestConnectJob(TestConnectJob::kMockPendingJob, |
797 new TestConnectJob(TestConnectJob::kMockPendingJob, | 791 "a", |
798 "a", | 792 request, |
799 request, | 793 base::TimeDelta::FromMicroseconds(1), |
800 base::TimeDelta::FromMicroseconds(1), | 794 &delegate, |
801 &delegate, | 795 &client_socket_factory_, |
802 &client_socket_factory_, | 796 &log); |
803 &log); | |
804 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); | 797 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); |
805 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); | 798 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); |
806 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); | 799 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); |
807 | 800 |
808 CapturingNetLog::CapturedEntryList entries; | 801 CapturingNetLog::CapturedEntryList entries; |
809 log.GetEntries(&entries); | 802 log.GetEntries(&entries); |
810 | 803 |
811 EXPECT_EQ(6u, entries.size()); | 804 EXPECT_EQ(6u, entries.size()); |
812 EXPECT_TRUE(LogContainsBeginEvent( | 805 EXPECT_TRUE( |
813 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); | 806 LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); |
814 EXPECT_TRUE(LogContainsBeginEvent( | 807 EXPECT_TRUE(LogContainsBeginEvent( |
815 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); | 808 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); |
816 EXPECT_TRUE(LogContainsEvent( | 809 EXPECT_TRUE(LogContainsEvent( |
817 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, | 810 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, NetLog::PHASE_NONE)); |
818 NetLog::PHASE_NONE)); | 811 EXPECT_TRUE(LogContainsEvent(entries, |
819 EXPECT_TRUE(LogContainsEvent( | 812 3, |
820 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, | 813 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, |
821 NetLog::PHASE_NONE)); | 814 NetLog::PHASE_NONE)); |
822 EXPECT_TRUE(LogContainsEndEvent( | 815 EXPECT_TRUE(LogContainsEndEvent( |
823 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); | 816 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); |
824 EXPECT_TRUE(LogContainsEndEvent( | 817 EXPECT_TRUE( |
825 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); | 818 LogContainsEndEvent(entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); |
826 } | 819 } |
827 | 820 |
828 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { | 821 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { |
829 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 822 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
830 | 823 |
831 TestCompletionCallback callback; | 824 TestCompletionCallback callback; |
832 ClientSocketHandle handle; | 825 ClientSocketHandle handle; |
833 CapturingBoundNetLog log; | 826 CapturingBoundNetLog log; |
834 TestLoadTimingInfoNotConnected(handle); | 827 TestLoadTimingInfoNotConnected(handle); |
835 | 828 |
836 EXPECT_EQ(OK, | 829 EXPECT_EQ(OK, |
837 handle.Init("a", | 830 handle.Init("a", |
838 params_, | 831 params_, |
839 DEFAULT_PRIORITY, | 832 DEFAULT_PRIORITY, |
840 callback.callback(), | 833 callback.callback(), |
841 pool_.get(), | 834 pool_.get(), |
842 log.bound())); | 835 log.bound())); |
843 EXPECT_TRUE(handle.is_initialized()); | 836 EXPECT_TRUE(handle.is_initialized()); |
844 EXPECT_TRUE(handle.socket()); | 837 EXPECT_TRUE(handle.socket()); |
845 TestLoadTimingInfoConnectedNotReused(handle); | 838 TestLoadTimingInfoConnectedNotReused(handle); |
846 | 839 |
847 handle.Reset(); | 840 handle.Reset(); |
848 TestLoadTimingInfoNotConnected(handle); | 841 TestLoadTimingInfoNotConnected(handle); |
849 | 842 |
850 CapturingNetLog::CapturedEntryList entries; | 843 CapturingNetLog::CapturedEntryList entries; |
851 log.GetEntries(&entries); | 844 log.GetEntries(&entries); |
852 | 845 |
853 EXPECT_EQ(4u, entries.size()); | 846 EXPECT_EQ(4u, entries.size()); |
854 EXPECT_TRUE(LogContainsBeginEvent( | 847 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL)); |
855 entries, 0, NetLog::TYPE_SOCKET_POOL)); | 848 EXPECT_TRUE(LogContainsEvent(entries, |
856 EXPECT_TRUE(LogContainsEvent( | 849 1, |
857 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 850 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
858 NetLog::PHASE_NONE)); | 851 NetLog::PHASE_NONE)); |
859 EXPECT_TRUE(LogContainsEvent( | 852 EXPECT_TRUE(LogContainsEvent(entries, |
860 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 853 2, |
861 NetLog::PHASE_NONE)); | 854 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
862 EXPECT_TRUE(LogContainsEndEvent( | 855 NetLog::PHASE_NONE)); |
863 entries, 3, NetLog::TYPE_SOCKET_POOL)); | 856 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLog::TYPE_SOCKET_POOL)); |
864 } | 857 } |
865 | 858 |
866 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { | 859 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { |
867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 860 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
868 | 861 |
869 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 862 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
870 CapturingBoundNetLog log; | 863 CapturingBoundNetLog log; |
871 | 864 |
872 ClientSocketHandle handle; | 865 ClientSocketHandle handle; |
873 TestCompletionCallback callback; | 866 TestCompletionCallback callback; |
(...skipping 11 matching lines...) Expand all Loading... |
885 log.bound())); | 878 log.bound())); |
886 EXPECT_FALSE(handle.socket()); | 879 EXPECT_FALSE(handle.socket()); |
887 EXPECT_FALSE(handle.is_ssl_error()); | 880 EXPECT_FALSE(handle.is_ssl_error()); |
888 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 881 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
889 TestLoadTimingInfoNotConnected(handle); | 882 TestLoadTimingInfoNotConnected(handle); |
890 | 883 |
891 CapturingNetLog::CapturedEntryList entries; | 884 CapturingNetLog::CapturedEntryList entries; |
892 log.GetEntries(&entries); | 885 log.GetEntries(&entries); |
893 | 886 |
894 EXPECT_EQ(3u, entries.size()); | 887 EXPECT_EQ(3u, entries.size()); |
895 EXPECT_TRUE(LogContainsBeginEvent( | 888 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL)); |
896 entries, 0, NetLog::TYPE_SOCKET_POOL)); | 889 EXPECT_TRUE(LogContainsEvent(entries, |
897 EXPECT_TRUE(LogContainsEvent( | 890 1, |
898 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 891 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
899 NetLog::PHASE_NONE)); | 892 NetLog::PHASE_NONE)); |
900 EXPECT_TRUE(LogContainsEndEvent( | 893 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLog::TYPE_SOCKET_POOL)); |
901 entries, 2, NetLog::TYPE_SOCKET_POOL)); | |
902 } | 894 } |
903 | 895 |
904 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { | 896 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { |
905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 897 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
906 | 898 |
907 // TODO(eroman): Check that the NetLog contains this event. | 899 // TODO(eroman): Check that the NetLog contains this event. |
908 | 900 |
909 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 901 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
910 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 902 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); |
911 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); | 903 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1144 } | 1136 } |
1145 | 1137 |
1146 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { | 1138 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { |
1147 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1148 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1140 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
1149 | 1141 |
1150 { | 1142 { |
1151 ClientSocketHandle handles[kDefaultMaxSockets]; | 1143 ClientSocketHandle handles[kDefaultMaxSockets]; |
1152 TestCompletionCallback callbacks[kDefaultMaxSockets]; | 1144 TestCompletionCallback callbacks[kDefaultMaxSockets]; |
1153 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1145 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
1154 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), | 1146 EXPECT_EQ(OK, |
1155 params_, | 1147 handles[i].Init(base::IntToString(i), |
1156 DEFAULT_PRIORITY, | 1148 params_, |
1157 callbacks[i].callback(), | 1149 DEFAULT_PRIORITY, |
1158 pool_.get(), | 1150 callbacks[i].callback(), |
1159 BoundNetLog())); | 1151 pool_.get(), |
| 1152 BoundNetLog())); |
1160 } | 1153 } |
1161 | 1154 |
1162 // Force a stalled group. | 1155 // Force a stalled group. |
1163 ClientSocketHandle stalled_handle; | 1156 ClientSocketHandle stalled_handle; |
1164 TestCompletionCallback callback; | 1157 TestCompletionCallback callback; |
1165 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", | 1158 EXPECT_EQ(ERR_IO_PENDING, |
1166 params_, | 1159 stalled_handle.Init("foo", |
1167 DEFAULT_PRIORITY, | 1160 params_, |
1168 callback.callback(), | 1161 DEFAULT_PRIORITY, |
1169 pool_.get(), | 1162 callback.callback(), |
1170 BoundNetLog())); | 1163 pool_.get(), |
| 1164 BoundNetLog())); |
1171 | 1165 |
1172 // Cancel the stalled request. | 1166 // Cancel the stalled request. |
1173 stalled_handle.Reset(); | 1167 stalled_handle.Reset(); |
1174 | 1168 |
1175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1169 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
1176 EXPECT_EQ(0, pool_->IdleSocketCount()); | 1170 EXPECT_EQ(0, pool_->IdleSocketCount()); |
1177 | 1171 |
1178 // Dropping out of scope will close all handles and return them to idle. | 1172 // Dropping out of scope will close all handles and return them to idle. |
1179 } | 1173 } |
1180 | 1174 |
1181 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
1182 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); | 1176 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); |
1183 } | 1177 } |
1184 | 1178 |
1185 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { | 1179 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { |
1186 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1180 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1187 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1181 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
1188 | 1182 |
1189 { | 1183 { |
1190 ClientSocketHandle handles[kDefaultMaxSockets]; | 1184 ClientSocketHandle handles[kDefaultMaxSockets]; |
1191 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1185 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
1192 TestCompletionCallback callback; | 1186 TestCompletionCallback callback; |
1193 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), | 1187 EXPECT_EQ(ERR_IO_PENDING, |
1194 params_, | 1188 handles[i].Init(base::IntToString(i), |
1195 DEFAULT_PRIORITY, | 1189 params_, |
1196 callback.callback(), | 1190 DEFAULT_PRIORITY, |
1197 pool_.get(), | 1191 callback.callback(), |
1198 BoundNetLog())); | 1192 pool_.get(), |
| 1193 BoundNetLog())); |
1199 } | 1194 } |
1200 | 1195 |
1201 // Force a stalled group. | 1196 // Force a stalled group. |
1202 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1197 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1203 ClientSocketHandle stalled_handle; | 1198 ClientSocketHandle stalled_handle; |
1204 TestCompletionCallback callback; | 1199 TestCompletionCallback callback; |
1205 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", | 1200 EXPECT_EQ(ERR_IO_PENDING, |
1206 params_, | 1201 stalled_handle.Init("foo", |
1207 DEFAULT_PRIORITY, | 1202 params_, |
1208 callback.callback(), | 1203 DEFAULT_PRIORITY, |
1209 pool_.get(), | 1204 callback.callback(), |
1210 BoundNetLog())); | 1205 pool_.get(), |
| 1206 BoundNetLog())); |
1211 | 1207 |
1212 // Since it is stalled, it should have no connect jobs. | 1208 // Since it is stalled, it should have no connect jobs. |
1213 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); | 1209 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); |
1214 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); | 1210 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); |
1215 | 1211 |
1216 // Cancel the stalled request. | 1212 // Cancel the stalled request. |
1217 handles[0].Reset(); | 1213 handles[0].Reset(); |
1218 | 1214 |
1219 // Now we should have a connect job. | 1215 // Now we should have a connect job. |
1220 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); | 1216 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); |
(...skipping 18 matching lines...) Expand all Loading... |
1239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1235 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1240 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1236 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
1241 | 1237 |
1242 ClientSocketHandle stalled_handle; | 1238 ClientSocketHandle stalled_handle; |
1243 TestCompletionCallback callback; | 1239 TestCompletionCallback callback; |
1244 { | 1240 { |
1245 EXPECT_FALSE(pool_->IsStalled()); | 1241 EXPECT_FALSE(pool_->IsStalled()); |
1246 ClientSocketHandle handles[kDefaultMaxSockets]; | 1242 ClientSocketHandle handles[kDefaultMaxSockets]; |
1247 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1243 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
1248 TestCompletionCallback callback; | 1244 TestCompletionCallback callback; |
1249 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf( | 1245 EXPECT_EQ(OK, |
1250 "Take 2: %d", i), | 1246 handles[i].Init(base::StringPrintf("Take 2: %d", i), |
1251 params_, | 1247 params_, |
1252 DEFAULT_PRIORITY, | 1248 DEFAULT_PRIORITY, |
1253 callback.callback(), | 1249 callback.callback(), |
1254 pool_.get(), | 1250 pool_.get(), |
1255 BoundNetLog())); | 1251 BoundNetLog())); |
1256 } | 1252 } |
1257 | 1253 |
1258 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1254 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
1259 EXPECT_EQ(0, pool_->IdleSocketCount()); | 1255 EXPECT_EQ(0, pool_->IdleSocketCount()); |
1260 EXPECT_FALSE(pool_->IsStalled()); | 1256 EXPECT_FALSE(pool_->IsStalled()); |
1261 | 1257 |
1262 // Now we will hit the socket limit. | 1258 // Now we will hit the socket limit. |
1263 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", | 1259 EXPECT_EQ(ERR_IO_PENDING, |
1264 params_, | 1260 stalled_handle.Init("foo", |
1265 DEFAULT_PRIORITY, | 1261 params_, |
1266 callback.callback(), | 1262 DEFAULT_PRIORITY, |
1267 pool_.get(), | 1263 callback.callback(), |
1268 BoundNetLog())); | 1264 pool_.get(), |
| 1265 BoundNetLog())); |
1269 EXPECT_TRUE(pool_->IsStalled()); | 1266 EXPECT_TRUE(pool_->IsStalled()); |
1270 | 1267 |
1271 // Dropping out of scope will close all handles and return them to idle. | 1268 // Dropping out of scope will close all handles and return them to idle. |
1272 } | 1269 } |
1273 | 1270 |
1274 // But if we wait for it, the released idle sockets will be closed in | 1271 // But if we wait for it, the released idle sockets will be closed in |
1275 // preference of the waiting request. | 1272 // preference of the waiting request. |
1276 EXPECT_EQ(OK, callback.WaitForResult()); | 1273 EXPECT_EQ(OK, callback.WaitForResult()); |
1277 | 1274 |
1278 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); | 1275 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); |
1279 EXPECT_EQ(3, pool_->IdleSocketCount()); | 1276 EXPECT_EQ(3, pool_->IdleSocketCount()); |
1280 } | 1277 } |
1281 | 1278 |
1282 // Regression test for http://crbug.com/40952. | 1279 // Regression test for http://crbug.com/40952. |
1283 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { | 1280 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { |
1284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1281 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1285 pool_->EnableConnectBackupJobs(); | 1282 pool_->EnableConnectBackupJobs(); |
1286 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1283 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
1287 | 1284 |
1288 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1285 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
1289 ClientSocketHandle handle; | 1286 ClientSocketHandle handle; |
1290 TestCompletionCallback callback; | 1287 TestCompletionCallback callback; |
1291 EXPECT_EQ(OK, handle.Init(base::IntToString(i), | 1288 EXPECT_EQ(OK, |
1292 params_, | 1289 handle.Init(base::IntToString(i), |
1293 DEFAULT_PRIORITY, | 1290 params_, |
1294 callback.callback(), | 1291 DEFAULT_PRIORITY, |
1295 pool_.get(), | 1292 callback.callback(), |
1296 BoundNetLog())); | 1293 pool_.get(), |
| 1294 BoundNetLog())); |
1297 } | 1295 } |
1298 | 1296 |
1299 // Flush all the DoReleaseSocket tasks. | 1297 // Flush all the DoReleaseSocket tasks. |
1300 base::MessageLoop::current()->RunUntilIdle(); | 1298 base::MessageLoop::current()->RunUntilIdle(); |
1301 | 1299 |
1302 // Stall a group. Set a pending job so it'll trigger a backup job if we don't | 1300 // Stall a group. Set a pending job so it'll trigger a backup job if we don't |
1303 // reuse a socket. | 1301 // reuse a socket. |
1304 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1302 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1305 ClientSocketHandle handle; | 1303 ClientSocketHandle handle; |
1306 TestCompletionCallback callback; | 1304 TestCompletionCallback callback; |
1307 | 1305 |
1308 // "0" is special here, since it should be the first entry in the sorted map, | 1306 // "0" is special here, since it should be the first entry in the sorted map, |
1309 // which is the one which we would close an idle socket for. We shouldn't | 1307 // which is the one which we would close an idle socket for. We shouldn't |
1310 // close an idle socket though, since we should reuse the idle socket. | 1308 // close an idle socket though, since we should reuse the idle socket. |
1311 EXPECT_EQ(OK, handle.Init("0", | 1309 EXPECT_EQ(OK, |
1312 params_, | 1310 handle.Init("0", |
1313 DEFAULT_PRIORITY, | 1311 params_, |
1314 callback.callback(), | 1312 DEFAULT_PRIORITY, |
1315 pool_.get(), | 1313 callback.callback(), |
1316 BoundNetLog())); | 1314 pool_.get(), |
| 1315 BoundNetLog())); |
1317 | 1316 |
1318 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1317 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
1319 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); | 1318 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); |
1320 } | 1319 } |
1321 | 1320 |
1322 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { | 1321 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { |
1323 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1322 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1324 | 1323 |
1325 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1324 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
1326 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1325 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
1327 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); | 1326 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); |
1328 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1327 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); |
1329 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); | 1328 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); |
1330 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); | 1329 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); |
1331 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 1330 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); |
1332 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1331 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); |
1333 | 1332 |
1334 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); | 1333 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); |
1335 | 1334 |
1336 EXPECT_EQ(kDefaultMaxSocketsPerGroup, | 1335 EXPECT_EQ(kDefaultMaxSocketsPerGroup, |
1337 client_socket_factory_.allocation_count()); | 1336 client_socket_factory_.allocation_count()); |
1338 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, | 1337 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, completion_count()); |
1339 completion_count()); | |
1340 | 1338 |
1341 EXPECT_EQ(1, GetOrderOfRequest(1)); | 1339 EXPECT_EQ(1, GetOrderOfRequest(1)); |
1342 EXPECT_EQ(2, GetOrderOfRequest(2)); | 1340 EXPECT_EQ(2, GetOrderOfRequest(2)); |
1343 EXPECT_EQ(8, GetOrderOfRequest(3)); | 1341 EXPECT_EQ(8, GetOrderOfRequest(3)); |
1344 EXPECT_EQ(6, GetOrderOfRequest(4)); | 1342 EXPECT_EQ(6, GetOrderOfRequest(4)); |
1345 EXPECT_EQ(4, GetOrderOfRequest(5)); | 1343 EXPECT_EQ(4, GetOrderOfRequest(5)); |
1346 EXPECT_EQ(3, GetOrderOfRequest(6)); | 1344 EXPECT_EQ(3, GetOrderOfRequest(6)); |
1347 EXPECT_EQ(5, GetOrderOfRequest(7)); | 1345 EXPECT_EQ(5, GetOrderOfRequest(7)); |
1348 EXPECT_EQ(7, GetOrderOfRequest(8)); | 1346 EXPECT_EQ(7, GetOrderOfRequest(8)); |
1349 | 1347 |
(...skipping 12 matching lines...) Expand all Loading... |
1362 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 1360 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); |
1363 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1361 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); |
1364 | 1362 |
1365 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 1363 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
1366 | 1364 |
1367 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) | 1365 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) |
1368 EXPECT_EQ(OK, request(i)->WaitForResult()); | 1366 EXPECT_EQ(OK, request(i)->WaitForResult()); |
1369 | 1367 |
1370 EXPECT_EQ(static_cast<int>(requests_size()), | 1368 EXPECT_EQ(static_cast<int>(requests_size()), |
1371 client_socket_factory_.allocation_count()); | 1369 client_socket_factory_.allocation_count()); |
1372 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, | 1370 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, completion_count()); |
1373 completion_count()); | |
1374 } | 1371 } |
1375 | 1372 |
1376 // This test will start up a RequestSocket() and then immediately Cancel() it. | 1373 // This test will start up a RequestSocket() and then immediately Cancel() it. |
1377 // The pending connect job will be cancelled and should not call back into | 1374 // The pending connect job will be cancelled and should not call back into |
1378 // ClientSocketPoolBase. | 1375 // ClientSocketPoolBase. |
1379 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { | 1376 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { |
1380 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1377 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1381 | 1378 |
1382 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1379 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1383 ClientSocketHandle handle; | 1380 ClientSocketHandle handle; |
1384 TestCompletionCallback callback; | 1381 TestCompletionCallback callback; |
1385 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1382 EXPECT_EQ(ERR_IO_PENDING, |
1386 params_, | 1383 handle.Init("a", |
1387 DEFAULT_PRIORITY, | 1384 params_, |
1388 callback.callback(), | 1385 DEFAULT_PRIORITY, |
1389 pool_.get(), | 1386 callback.callback(), |
1390 BoundNetLog())); | 1387 pool_.get(), |
| 1388 BoundNetLog())); |
1391 handle.Reset(); | 1389 handle.Reset(); |
1392 } | 1390 } |
1393 | 1391 |
1394 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { | 1392 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { |
1395 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1393 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1396 | 1394 |
1397 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1395 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1398 ClientSocketHandle handle; | 1396 ClientSocketHandle handle; |
1399 TestCompletionCallback callback; | 1397 TestCompletionCallback callback; |
1400 | 1398 |
1401 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1399 EXPECT_EQ(ERR_IO_PENDING, |
1402 params_, | 1400 handle.Init("a", |
1403 DEFAULT_PRIORITY, | 1401 params_, |
1404 callback.callback(), | 1402 DEFAULT_PRIORITY, |
1405 pool_.get(), | 1403 callback.callback(), |
1406 BoundNetLog())); | 1404 pool_.get(), |
| 1405 BoundNetLog())); |
1407 | 1406 |
1408 handle.Reset(); | 1407 handle.Reset(); |
1409 | 1408 |
1410 TestCompletionCallback callback2; | 1409 TestCompletionCallback callback2; |
1411 EXPECT_EQ(ERR_IO_PENDING, | 1410 EXPECT_EQ(ERR_IO_PENDING, |
1412 handle.Init("a", | 1411 handle.Init("a", |
1413 params_, | 1412 params_, |
1414 DEFAULT_PRIORITY, | 1413 DEFAULT_PRIORITY, |
1415 callback2.callback(), | 1414 callback2.callback(), |
1416 pool_.get(), | 1415 pool_.get(), |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1463 RequestSocketCallback(ClientSocketHandle* handle, | 1462 RequestSocketCallback(ClientSocketHandle* handle, |
1464 TestClientSocketPool* pool, | 1463 TestClientSocketPool* pool, |
1465 TestConnectJobFactory* test_connect_job_factory, | 1464 TestConnectJobFactory* test_connect_job_factory, |
1466 TestConnectJob::JobType next_job_type) | 1465 TestConnectJob::JobType next_job_type) |
1467 : handle_(handle), | 1466 : handle_(handle), |
1468 pool_(pool), | 1467 pool_(pool), |
1469 within_callback_(false), | 1468 within_callback_(false), |
1470 test_connect_job_factory_(test_connect_job_factory), | 1469 test_connect_job_factory_(test_connect_job_factory), |
1471 next_job_type_(next_job_type), | 1470 next_job_type_(next_job_type), |
1472 callback_(base::Bind(&RequestSocketCallback::OnComplete, | 1471 callback_(base::Bind(&RequestSocketCallback::OnComplete, |
1473 base::Unretained(this))) { | 1472 base::Unretained(this))) {} |
1474 } | |
1475 | 1473 |
1476 virtual ~RequestSocketCallback() {} | 1474 virtual ~RequestSocketCallback() {} |
1477 | 1475 |
1478 const CompletionCallback& callback() const { return callback_; } | 1476 const CompletionCallback& callback() const { return callback_; } |
1479 | 1477 |
1480 private: | 1478 private: |
1481 void OnComplete(int result) { | 1479 void OnComplete(int result) { |
1482 SetResult(result); | 1480 SetResult(result); |
1483 ASSERT_EQ(OK, result); | 1481 ASSERT_EQ(OK, result); |
1484 | 1482 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 TestConnectJobFactory* const test_connect_job_factory_; | 1538 TestConnectJobFactory* const test_connect_job_factory_; |
1541 TestConnectJob::JobType next_job_type_; | 1539 TestConnectJob::JobType next_job_type_; |
1542 CompletionCallback callback_; | 1540 CompletionCallback callback_; |
1543 }; | 1541 }; |
1544 | 1542 |
1545 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { | 1543 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { |
1546 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1544 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1547 | 1545 |
1548 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1546 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1549 ClientSocketHandle handle; | 1547 ClientSocketHandle handle; |
1550 RequestSocketCallback callback( | 1548 RequestSocketCallback callback(&handle, |
1551 &handle, pool_.get(), connect_job_factory_, | 1549 pool_.get(), |
1552 TestConnectJob::kMockPendingJob); | 1550 connect_job_factory_, |
| 1551 TestConnectJob::kMockPendingJob); |
1553 int rv = handle.Init("a", | 1552 int rv = handle.Init("a", |
1554 params_, | 1553 params_, |
1555 DEFAULT_PRIORITY, | 1554 DEFAULT_PRIORITY, |
1556 callback.callback(), | 1555 callback.callback(), |
1557 pool_.get(), | 1556 pool_.get(), |
1558 BoundNetLog()); | 1557 BoundNetLog()); |
1559 ASSERT_EQ(ERR_IO_PENDING, rv); | 1558 ASSERT_EQ(ERR_IO_PENDING, rv); |
1560 | 1559 |
1561 EXPECT_EQ(OK, callback.WaitForResult()); | 1560 EXPECT_EQ(OK, callback.WaitForResult()); |
1562 } | 1561 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 ASSERT_FALSE(request(i)->handle()->is_initialized()); | 1599 ASSERT_FALSE(request(i)->handle()->is_initialized()); |
1601 request(i)->handle()->Reset(); | 1600 request(i)->handle()->Reset(); |
1602 } | 1601 } |
1603 | 1602 |
1604 // Let's wait for the rest to complete now. | 1603 // Let's wait for the rest to complete now. |
1605 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { | 1604 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { |
1606 EXPECT_EQ(OK, request(i)->WaitForResult()); | 1605 EXPECT_EQ(OK, request(i)->WaitForResult()); |
1607 request(i)->handle()->Reset(); | 1606 request(i)->handle()->Reset(); |
1608 } | 1607 } |
1609 | 1608 |
1610 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, | 1609 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, completion_count()); |
1611 completion_count()); | |
1612 } | 1610 } |
1613 | 1611 |
1614 // Make sure that pending requests get serviced after active requests fail. | 1612 // Make sure that pending requests get serviced after active requests fail. |
1615 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { | 1613 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { |
1616 const size_t kMaxSockets = 5; | 1614 const size_t kMaxSockets = 5; |
1617 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); | 1615 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); |
1618 | 1616 |
1619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1617 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
1620 | 1618 |
1621 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; | 1619 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1698 base::MessageLoop::current()->RunUntilIdle(); | 1696 base::MessageLoop::current()->RunUntilIdle(); |
1699 } | 1697 } |
1700 | 1698 |
1701 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { | 1699 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { |
1702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1700 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1703 | 1701 |
1704 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1702 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1705 ClientSocketHandle handle; | 1703 ClientSocketHandle handle; |
1706 TestCompletionCallback callback; | 1704 TestCompletionCallback callback; |
1707 CapturingBoundNetLog log; | 1705 CapturingBoundNetLog log; |
1708 int rv = handle.Init("a", | 1706 int rv = handle.Init( |
1709 params_, | 1707 "a", params_, LOWEST, callback.callback(), pool_.get(), log.bound()); |
1710 LOWEST, | |
1711 callback.callback(), | |
1712 pool_.get(), | |
1713 log.bound()); | |
1714 EXPECT_EQ(ERR_IO_PENDING, rv); | 1708 EXPECT_EQ(ERR_IO_PENDING, rv); |
1715 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1709 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
1716 TestLoadTimingInfoNotConnected(handle); | 1710 TestLoadTimingInfoNotConnected(handle); |
1717 | 1711 |
1718 EXPECT_EQ(OK, callback.WaitForResult()); | 1712 EXPECT_EQ(OK, callback.WaitForResult()); |
1719 EXPECT_TRUE(handle.is_initialized()); | 1713 EXPECT_TRUE(handle.is_initialized()); |
1720 EXPECT_TRUE(handle.socket()); | 1714 EXPECT_TRUE(handle.socket()); |
1721 TestLoadTimingInfoConnectedNotReused(handle); | 1715 TestLoadTimingInfoConnectedNotReused(handle); |
1722 | 1716 |
1723 handle.Reset(); | 1717 handle.Reset(); |
1724 TestLoadTimingInfoNotConnected(handle); | 1718 TestLoadTimingInfoNotConnected(handle); |
1725 | 1719 |
1726 CapturingNetLog::CapturedEntryList entries; | 1720 CapturingNetLog::CapturedEntryList entries; |
1727 log.GetEntries(&entries); | 1721 log.GetEntries(&entries); |
1728 | 1722 |
1729 EXPECT_EQ(4u, entries.size()); | 1723 EXPECT_EQ(4u, entries.size()); |
1730 EXPECT_TRUE(LogContainsBeginEvent( | 1724 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL)); |
1731 entries, 0, NetLog::TYPE_SOCKET_POOL)); | 1725 EXPECT_TRUE(LogContainsEvent(entries, |
1732 EXPECT_TRUE(LogContainsEvent( | 1726 1, |
1733 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 1727 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
1734 NetLog::PHASE_NONE)); | 1728 NetLog::PHASE_NONE)); |
1735 EXPECT_TRUE(LogContainsEvent( | 1729 EXPECT_TRUE(LogContainsEvent(entries, |
1736 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 1730 2, |
1737 NetLog::PHASE_NONE)); | 1731 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
1738 EXPECT_TRUE(LogContainsEndEvent( | 1732 NetLog::PHASE_NONE)); |
1739 entries, 3, NetLog::TYPE_SOCKET_POOL)); | 1733 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLog::TYPE_SOCKET_POOL)); |
1740 } | 1734 } |
1741 | 1735 |
1742 TEST_F(ClientSocketPoolBaseTest, | 1736 TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) { |
1743 InitConnectionAsynchronousFailure) { | |
1744 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1737 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1745 | 1738 |
1746 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1739 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
1747 ClientSocketHandle handle; | 1740 ClientSocketHandle handle; |
1748 TestCompletionCallback callback; | 1741 TestCompletionCallback callback; |
1749 CapturingBoundNetLog log; | 1742 CapturingBoundNetLog log; |
1750 // Set the additional error state members to ensure that they get cleared. | 1743 // Set the additional error state members to ensure that they get cleared. |
1751 handle.set_is_ssl_error(true); | 1744 handle.set_is_ssl_error(true); |
1752 HttpResponseInfo info; | 1745 HttpResponseInfo info; |
1753 info.headers = new HttpResponseHeaders(std::string()); | 1746 info.headers = new HttpResponseHeaders(std::string()); |
1754 handle.set_ssl_error_response_info(info); | 1747 handle.set_ssl_error_response_info(info); |
1755 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1748 EXPECT_EQ(ERR_IO_PENDING, |
1756 params_, | 1749 handle.Init("a", |
1757 DEFAULT_PRIORITY, | 1750 params_, |
1758 callback.callback(), | 1751 DEFAULT_PRIORITY, |
1759 pool_.get(), | 1752 callback.callback(), |
1760 log.bound())); | 1753 pool_.get(), |
| 1754 log.bound())); |
1761 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1755 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
1762 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 1756 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
1763 EXPECT_FALSE(handle.is_ssl_error()); | 1757 EXPECT_FALSE(handle.is_ssl_error()); |
1764 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 1758 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
1765 | 1759 |
1766 CapturingNetLog::CapturedEntryList entries; | 1760 CapturingNetLog::CapturedEntryList entries; |
1767 log.GetEntries(&entries); | 1761 log.GetEntries(&entries); |
1768 | 1762 |
1769 EXPECT_EQ(3u, entries.size()); | 1763 EXPECT_EQ(3u, entries.size()); |
1770 EXPECT_TRUE(LogContainsBeginEvent( | 1764 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL)); |
1771 entries, 0, NetLog::TYPE_SOCKET_POOL)); | 1765 EXPECT_TRUE(LogContainsEvent(entries, |
1772 EXPECT_TRUE(LogContainsEvent( | 1766 1, |
1773 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 1767 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
1774 NetLog::PHASE_NONE)); | 1768 NetLog::PHASE_NONE)); |
1775 EXPECT_TRUE(LogContainsEndEvent( | 1769 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLog::TYPE_SOCKET_POOL)); |
1776 entries, 2, NetLog::TYPE_SOCKET_POOL)); | |
1777 } | 1770 } |
1778 | 1771 |
1779 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { | 1772 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { |
1780 // TODO(eroman): Add back the log expectations! Removed them because the | 1773 // TODO(eroman): Add back the log expectations! Removed them because the |
1781 // ordering is difficult, and some may fire during destructor. | 1774 // ordering is difficult, and some may fire during destructor. |
1782 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1775 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1783 | 1776 |
1784 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1777 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1785 ClientSocketHandle handle; | 1778 ClientSocketHandle handle; |
1786 TestCompletionCallback callback; | 1779 TestCompletionCallback callback; |
(...skipping 11 matching lines...) Expand all Loading... |
1798 EXPECT_EQ(ERR_IO_PENDING, | 1791 EXPECT_EQ(ERR_IO_PENDING, |
1799 handle2.Init("a", | 1792 handle2.Init("a", |
1800 params_, | 1793 params_, |
1801 DEFAULT_PRIORITY, | 1794 DEFAULT_PRIORITY, |
1802 callback2.callback(), | 1795 callback2.callback(), |
1803 pool_.get(), | 1796 pool_.get(), |
1804 BoundNetLog())); | 1797 BoundNetLog())); |
1805 | 1798 |
1806 handle.Reset(); | 1799 handle.Reset(); |
1807 | 1800 |
1808 | |
1809 // At this point, request 2 is just waiting for the connect job to finish. | 1801 // At this point, request 2 is just waiting for the connect job to finish. |
1810 | 1802 |
1811 EXPECT_EQ(OK, callback2.WaitForResult()); | 1803 EXPECT_EQ(OK, callback2.WaitForResult()); |
1812 handle2.Reset(); | 1804 handle2.Reset(); |
1813 | 1805 |
1814 // Now request 2 has actually finished. | 1806 // Now request 2 has actually finished. |
1815 // TODO(eroman): Add back log expectations. | 1807 // TODO(eroman): Add back log expectations. |
1816 } | 1808 } |
1817 | 1809 |
1818 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { | 1810 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { |
(...skipping 25 matching lines...) Expand all Loading... |
1844 | 1836 |
1845 // Start job 1 (async OK) | 1837 // Start job 1 (async OK) |
1846 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1838 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1847 | 1839 |
1848 std::vector<TestSocketRequest*> request_order; | 1840 std::vector<TestSocketRequest*> request_order; |
1849 size_t completion_count; // unused | 1841 size_t completion_count; // unused |
1850 TestSocketRequest req1(&request_order, &completion_count); | 1842 TestSocketRequest req1(&request_order, &completion_count); |
1851 int rv = req1.handle()->Init("a", | 1843 int rv = req1.handle()->Init("a", |
1852 params_, | 1844 params_, |
1853 DEFAULT_PRIORITY, | 1845 DEFAULT_PRIORITY, |
1854 req1.callback(), pool_.get(), | 1846 req1.callback(), |
| 1847 pool_.get(), |
1855 BoundNetLog()); | 1848 BoundNetLog()); |
1856 EXPECT_EQ(ERR_IO_PENDING, rv); | 1849 EXPECT_EQ(ERR_IO_PENDING, rv); |
1857 EXPECT_EQ(OK, req1.WaitForResult()); | 1850 EXPECT_EQ(OK, req1.WaitForResult()); |
1858 | 1851 |
1859 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending | 1852 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending |
1860 // without a job. | 1853 // without a job. |
1861 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1854 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
1862 | 1855 |
1863 TestSocketRequest req2(&request_order, &completion_count); | 1856 TestSocketRequest req2(&request_order, &completion_count); |
1864 rv = req2.handle()->Init("a", | 1857 rv = req2.handle()->Init("a", |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2015 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 2008 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
2016 } | 2009 } |
2017 | 2010 |
2018 // Test GetLoadState in the case the per-group limit is reached. | 2011 // Test GetLoadState in the case the per-group limit is reached. |
2019 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { | 2012 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { |
2020 CreatePool(2, 1); | 2013 CreatePool(2, 1); |
2021 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2014 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
2022 | 2015 |
2023 ClientSocketHandle handle; | 2016 ClientSocketHandle handle; |
2024 TestCompletionCallback callback; | 2017 TestCompletionCallback callback; |
2025 int rv = handle.Init("a", | 2018 int rv = handle.Init( |
2026 params_, | 2019 "a", params_, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
2027 MEDIUM, | |
2028 callback.callback(), | |
2029 pool_.get(), | |
2030 BoundNetLog()); | |
2031 EXPECT_EQ(ERR_IO_PENDING, rv); | 2020 EXPECT_EQ(ERR_IO_PENDING, rv); |
2032 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 2021 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
2033 | 2022 |
2034 // Request another socket from the same pool, buth with a higher priority. | 2023 // Request another socket from the same pool, buth with a higher priority. |
2035 // The first request should now be stalled at the socket group limit. | 2024 // The first request should now be stalled at the socket group limit. |
2036 ClientSocketHandle handle2; | 2025 ClientSocketHandle handle2; |
2037 TestCompletionCallback callback2; | 2026 TestCompletionCallback callback2; |
2038 rv = handle2.Init("a", | 2027 rv = handle2.Init( |
2039 params_, | 2028 "a", params_, HIGHEST, callback2.callback(), pool_.get(), BoundNetLog()); |
2040 HIGHEST, | |
2041 callback2.callback(), | |
2042 pool_.get(), | |
2043 BoundNetLog()); | |
2044 EXPECT_EQ(ERR_IO_PENDING, rv); | 2029 EXPECT_EQ(ERR_IO_PENDING, rv); |
2045 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 2030 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
2046 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 2031 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
2047 | 2032 |
2048 // The first handle should remain stalled as the other socket goes through | 2033 // The first handle should remain stalled as the other socket goes through |
2049 // the connect process. | 2034 // the connect process. |
2050 | 2035 |
2051 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 2036 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
2052 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 2037 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
2053 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); | 2038 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2122 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); | 2107 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); |
2123 } | 2108 } |
2124 | 2109 |
2125 TEST_F(ClientSocketPoolBaseTest, Recoverable) { | 2110 TEST_F(ClientSocketPoolBaseTest, Recoverable) { |
2126 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
2127 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); | 2112 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); |
2128 | 2113 |
2129 ClientSocketHandle handle; | 2114 ClientSocketHandle handle; |
2130 TestCompletionCallback callback; | 2115 TestCompletionCallback callback; |
2131 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, | 2116 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, |
2132 handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), | 2117 handle.Init("a", |
2133 pool_.get(), BoundNetLog())); | 2118 params_, |
| 2119 DEFAULT_PRIORITY, |
| 2120 callback.callback(), |
| 2121 pool_.get(), |
| 2122 BoundNetLog())); |
2134 EXPECT_TRUE(handle.is_initialized()); | 2123 EXPECT_TRUE(handle.is_initialized()); |
2135 EXPECT_TRUE(handle.socket()); | 2124 EXPECT_TRUE(handle.socket()); |
2136 } | 2125 } |
2137 | 2126 |
2138 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { | 2127 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { |
2139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2128 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
2140 | 2129 |
2141 connect_job_factory_->set_job_type( | 2130 connect_job_factory_->set_job_type( |
2142 TestConnectJob::kMockPendingRecoverableJob); | 2131 TestConnectJob::kMockPendingRecoverableJob); |
2143 ClientSocketHandle handle; | 2132 ClientSocketHandle handle; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2196 EXPECT_TRUE(handle.is_ssl_error()); | 2185 EXPECT_TRUE(handle.is_ssl_error()); |
2197 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); | 2186 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); |
2198 } | 2187 } |
2199 | 2188 |
2200 // Make sure we can reuse sockets when the cleanup timer is disabled. | 2189 // Make sure we can reuse sockets when the cleanup timer is disabled. |
2201 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) { | 2190 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) { |
2202 // Disable cleanup timer. | 2191 // Disable cleanup timer. |
2203 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); | 2192 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); |
2204 | 2193 |
2205 CreatePoolWithIdleTimeouts( | 2194 CreatePoolWithIdleTimeouts( |
2206 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2195 kDefaultMaxSockets, |
2207 base::TimeDelta(), // Time out unused sockets immediately. | 2196 kDefaultMaxSocketsPerGroup, |
| 2197 base::TimeDelta(), // Time out unused sockets immediately. |
2208 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2198 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
2209 | 2199 |
2210 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2200 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
2211 | 2201 |
2212 ClientSocketHandle handle; | 2202 ClientSocketHandle handle; |
2213 TestCompletionCallback callback; | 2203 TestCompletionCallback callback; |
2214 int rv = handle.Init("a", | 2204 int rv = handle.Init( |
2215 params_, | 2205 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog()); |
2216 LOWEST, | |
2217 callback.callback(), | |
2218 pool_.get(), | |
2219 BoundNetLog()); | |
2220 ASSERT_EQ(ERR_IO_PENDING, rv); | 2206 ASSERT_EQ(ERR_IO_PENDING, rv); |
2221 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2207 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
2222 ASSERT_EQ(OK, callback.WaitForResult()); | 2208 ASSERT_EQ(OK, callback.WaitForResult()); |
2223 | 2209 |
2224 // Use and release the socket. | 2210 // Use and release the socket. |
2225 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); | 2211 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); |
2226 TestLoadTimingInfoConnectedNotReused(handle); | 2212 TestLoadTimingInfoConnectedNotReused(handle); |
2227 handle.Reset(); | 2213 handle.Reset(); |
2228 | 2214 |
2229 // Should now have one idle socket. | 2215 // Should now have one idle socket. |
2230 ASSERT_EQ(1, pool_->IdleSocketCount()); | 2216 ASSERT_EQ(1, pool_->IdleSocketCount()); |
2231 | 2217 |
2232 // Request a new socket. This should reuse the old socket and complete | 2218 // Request a new socket. This should reuse the old socket and complete |
2233 // synchronously. | 2219 // synchronously. |
2234 CapturingBoundNetLog log; | 2220 CapturingBoundNetLog log; |
2235 rv = handle.Init("a", | 2221 rv = handle.Init( |
2236 params_, | 2222 "a", params_, LOWEST, CompletionCallback(), pool_.get(), log.bound()); |
2237 LOWEST, | |
2238 CompletionCallback(), | |
2239 pool_.get(), | |
2240 log.bound()); | |
2241 ASSERT_EQ(OK, rv); | 2223 ASSERT_EQ(OK, rv); |
2242 EXPECT_TRUE(handle.is_reused()); | 2224 EXPECT_TRUE(handle.is_reused()); |
2243 TestLoadTimingInfoConnectedReused(handle); | 2225 TestLoadTimingInfoConnectedReused(handle); |
2244 | 2226 |
2245 ASSERT_TRUE(pool_->HasGroup("a")); | 2227 ASSERT_TRUE(pool_->HasGroup("a")); |
2246 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2228 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
2247 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 2229 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
2248 | 2230 |
2249 CapturingNetLog::CapturedEntryList entries; | 2231 CapturingNetLog::CapturedEntryList entries; |
2250 log.GetEntries(&entries); | 2232 log.GetEntries(&entries); |
2251 EXPECT_TRUE(LogContainsEntryWithType( | 2233 EXPECT_TRUE(LogContainsEntryWithType( |
2252 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); | 2234 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); |
2253 } | 2235 } |
2254 | 2236 |
2255 // Make sure we cleanup old unused sockets when the cleanup timer is disabled. | 2237 // Make sure we cleanup old unused sockets when the cleanup timer is disabled. |
2256 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerNoReuse) { | 2238 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerNoReuse) { |
2257 // Disable cleanup timer. | 2239 // Disable cleanup timer. |
2258 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); | 2240 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); |
2259 | 2241 |
2260 CreatePoolWithIdleTimeouts( | 2242 CreatePoolWithIdleTimeouts( |
2261 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2243 kDefaultMaxSockets, |
2262 base::TimeDelta(), // Time out unused sockets immediately | 2244 kDefaultMaxSocketsPerGroup, |
| 2245 base::TimeDelta(), // Time out unused sockets immediately |
2263 base::TimeDelta()); // Time out used sockets immediately | 2246 base::TimeDelta()); // Time out used sockets immediately |
2264 | 2247 |
2265 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2248 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
2266 | 2249 |
2267 // Startup two mock pending connect jobs, which will sit in the MessageLoop. | 2250 // Startup two mock pending connect jobs, which will sit in the MessageLoop. |
2268 | 2251 |
2269 ClientSocketHandle handle; | 2252 ClientSocketHandle handle; |
2270 TestCompletionCallback callback; | 2253 TestCompletionCallback callback; |
2271 int rv = handle.Init("a", | 2254 int rv = handle.Init( |
2272 params_, | 2255 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog()); |
2273 LOWEST, | |
2274 callback.callback(), | |
2275 pool_.get(), | |
2276 BoundNetLog()); | |
2277 ASSERT_EQ(ERR_IO_PENDING, rv); | 2256 ASSERT_EQ(ERR_IO_PENDING, rv); |
2278 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2257 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
2279 | 2258 |
2280 ClientSocketHandle handle2; | 2259 ClientSocketHandle handle2; |
2281 TestCompletionCallback callback2; | 2260 TestCompletionCallback callback2; |
2282 rv = handle2.Init("a", | 2261 rv = handle2.Init( |
2283 params_, | 2262 "a", params_, LOWEST, callback2.callback(), pool_.get(), BoundNetLog()); |
2284 LOWEST, | |
2285 callback2.callback(), | |
2286 pool_.get(), | |
2287 BoundNetLog()); | |
2288 ASSERT_EQ(ERR_IO_PENDING, rv); | 2263 ASSERT_EQ(ERR_IO_PENDING, rv); |
2289 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); | 2264 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); |
2290 | 2265 |
2291 // Cancel one of the requests. Wait for the other, which will get the first | 2266 // Cancel one of the requests. Wait for the other, which will get the first |
2292 // job. Release the socket. Run the loop again to make sure the second | 2267 // job. Release the socket. Run the loop again to make sure the second |
2293 // socket is sitting idle and the first one is released (since ReleaseSocket() | 2268 // socket is sitting idle and the first one is released (since ReleaseSocket() |
2294 // just posts a DoReleaseSocket() task). | 2269 // just posts a DoReleaseSocket() task). |
2295 | 2270 |
2296 handle.Reset(); | 2271 handle.Reset(); |
2297 ASSERT_EQ(OK, callback2.WaitForResult()); | 2272 ASSERT_EQ(OK, callback2.WaitForResult()); |
2298 // Use the socket. | 2273 // Use the socket. |
2299 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); | 2274 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); |
2300 handle2.Reset(); | 2275 handle2.Reset(); |
2301 | 2276 |
2302 // We post all of our delayed tasks with a 2ms delay. I.e. they don't | 2277 // We post all of our delayed tasks with a 2ms delay. I.e. they don't |
2303 // actually become pending until 2ms after they have been created. In order | 2278 // actually become pending until 2ms after they have been created. In order |
2304 // to flush all tasks, we need to wait so that we know there are no | 2279 // to flush all tasks, we need to wait so that we know there are no |
2305 // soon-to-be-pending tasks waiting. | 2280 // soon-to-be-pending tasks waiting. |
2306 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 2281 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
2307 base::MessageLoop::current()->RunUntilIdle(); | 2282 base::MessageLoop::current()->RunUntilIdle(); |
2308 | 2283 |
2309 // Both sockets should now be idle. | 2284 // Both sockets should now be idle. |
2310 ASSERT_EQ(2, pool_->IdleSocketCount()); | 2285 ASSERT_EQ(2, pool_->IdleSocketCount()); |
2311 | 2286 |
2312 // Request a new socket. This should cleanup the unused and timed out ones. | 2287 // Request a new socket. This should cleanup the unused and timed out ones. |
2313 // A new socket will be created rather than reusing the idle one. | 2288 // A new socket will be created rather than reusing the idle one. |
2314 CapturingBoundNetLog log; | 2289 CapturingBoundNetLog log; |
2315 TestCompletionCallback callback3; | 2290 TestCompletionCallback callback3; |
2316 rv = handle.Init("a", | 2291 rv = handle.Init( |
2317 params_, | 2292 "a", params_, LOWEST, callback3.callback(), pool_.get(), log.bound()); |
2318 LOWEST, | |
2319 callback3.callback(), | |
2320 pool_.get(), | |
2321 log.bound()); | |
2322 ASSERT_EQ(ERR_IO_PENDING, rv); | 2293 ASSERT_EQ(ERR_IO_PENDING, rv); |
2323 ASSERT_EQ(OK, callback3.WaitForResult()); | 2294 ASSERT_EQ(OK, callback3.WaitForResult()); |
2324 EXPECT_FALSE(handle.is_reused()); | 2295 EXPECT_FALSE(handle.is_reused()); |
2325 | 2296 |
2326 // Make sure the idle socket is closed. | 2297 // Make sure the idle socket is closed. |
2327 ASSERT_TRUE(pool_->HasGroup("a")); | 2298 ASSERT_TRUE(pool_->HasGroup("a")); |
2328 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2299 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
2329 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 2300 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
2330 | 2301 |
2331 CapturingNetLog::CapturedEntryList entries; | 2302 CapturingNetLog::CapturedEntryList entries; |
2332 log.GetEntries(&entries); | 2303 log.GetEntries(&entries); |
2333 EXPECT_FALSE(LogContainsEntryWithType( | 2304 EXPECT_FALSE(LogContainsEntryWithType( |
2334 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); | 2305 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); |
2335 } | 2306 } |
2336 | 2307 |
2337 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { | 2308 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { |
2338 CreatePoolWithIdleTimeouts( | 2309 CreatePoolWithIdleTimeouts( |
2339 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2310 kDefaultMaxSockets, |
2340 base::TimeDelta(), // Time out unused sockets immediately. | 2311 kDefaultMaxSocketsPerGroup, |
| 2312 base::TimeDelta(), // Time out unused sockets immediately. |
2341 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2313 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
2342 | 2314 |
2343 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2315 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
2344 | 2316 |
2345 // Startup two mock pending connect jobs, which will sit in the MessageLoop. | 2317 // Startup two mock pending connect jobs, which will sit in the MessageLoop. |
2346 | 2318 |
2347 ClientSocketHandle handle; | 2319 ClientSocketHandle handle; |
2348 TestCompletionCallback callback; | 2320 TestCompletionCallback callback; |
2349 int rv = handle.Init("a", | 2321 int rv = handle.Init( |
2350 params_, | 2322 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog()); |
2351 LOWEST, | |
2352 callback.callback(), | |
2353 pool_.get(), | |
2354 BoundNetLog()); | |
2355 EXPECT_EQ(ERR_IO_PENDING, rv); | 2323 EXPECT_EQ(ERR_IO_PENDING, rv); |
2356 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2324 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
2357 | 2325 |
2358 ClientSocketHandle handle2; | 2326 ClientSocketHandle handle2; |
2359 TestCompletionCallback callback2; | 2327 TestCompletionCallback callback2; |
2360 rv = handle2.Init("a", | 2328 rv = handle2.Init( |
2361 params_, | 2329 "a", params_, LOWEST, callback2.callback(), pool_.get(), BoundNetLog()); |
2362 LOWEST, | |
2363 callback2.callback(), | |
2364 pool_.get(), | |
2365 BoundNetLog()); | |
2366 EXPECT_EQ(ERR_IO_PENDING, rv); | 2330 EXPECT_EQ(ERR_IO_PENDING, rv); |
2367 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); | 2331 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); |
2368 | 2332 |
2369 // Cancel one of the requests. Wait for the other, which will get the first | 2333 // Cancel one of the requests. Wait for the other, which will get the first |
2370 // job. Release the socket. Run the loop again to make sure the second | 2334 // job. Release the socket. Run the loop again to make sure the second |
2371 // socket is sitting idle and the first one is released (since ReleaseSocket() | 2335 // socket is sitting idle and the first one is released (since ReleaseSocket() |
2372 // just posts a DoReleaseSocket() task). | 2336 // just posts a DoReleaseSocket() task). |
2373 | 2337 |
2374 handle.Reset(); | 2338 handle.Reset(); |
2375 EXPECT_EQ(OK, callback2.WaitForResult()); | 2339 EXPECT_EQ(OK, callback2.WaitForResult()); |
2376 // Use the socket. | 2340 // Use the socket. |
2377 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); | 2341 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); |
2378 handle2.Reset(); | 2342 handle2.Reset(); |
2379 | 2343 |
2380 // We post all of our delayed tasks with a 2ms delay. I.e. they don't | 2344 // We post all of our delayed tasks with a 2ms delay. I.e. they don't |
2381 // actually become pending until 2ms after they have been created. In order | 2345 // actually become pending until 2ms after they have been created. In order |
2382 // to flush all tasks, we need to wait so that we know there are no | 2346 // to flush all tasks, we need to wait so that we know there are no |
2383 // soon-to-be-pending tasks waiting. | 2347 // soon-to-be-pending tasks waiting. |
2384 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 2348 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
2385 base::MessageLoop::current()->RunUntilIdle(); | 2349 base::MessageLoop::current()->RunUntilIdle(); |
2386 | 2350 |
2387 ASSERT_EQ(2, pool_->IdleSocketCount()); | 2351 ASSERT_EQ(2, pool_->IdleSocketCount()); |
2388 | 2352 |
2389 // Invoke the idle socket cleanup check. Only one socket should be left, the | 2353 // Invoke the idle socket cleanup check. Only one socket should be left, the |
2390 // used socket. Request it to make sure that it's used. | 2354 // used socket. Request it to make sure that it's used. |
2391 | 2355 |
2392 pool_->CleanupTimedOutIdleSockets(); | 2356 pool_->CleanupTimedOutIdleSockets(); |
2393 CapturingBoundNetLog log; | 2357 CapturingBoundNetLog log; |
2394 rv = handle.Init("a", | 2358 rv = handle.Init( |
2395 params_, | 2359 "a", params_, LOWEST, callback.callback(), pool_.get(), log.bound()); |
2396 LOWEST, | |
2397 callback.callback(), | |
2398 pool_.get(), | |
2399 log.bound()); | |
2400 EXPECT_EQ(OK, rv); | 2360 EXPECT_EQ(OK, rv); |
2401 EXPECT_TRUE(handle.is_reused()); | 2361 EXPECT_TRUE(handle.is_reused()); |
2402 | 2362 |
2403 CapturingNetLog::CapturedEntryList entries; | 2363 CapturingNetLog::CapturedEntryList entries; |
2404 log.GetEntries(&entries); | 2364 log.GetEntries(&entries); |
2405 EXPECT_TRUE(LogContainsEntryWithType( | 2365 EXPECT_TRUE(LogContainsEntryWithType( |
2406 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); | 2366 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); |
2407 } | 2367 } |
2408 | 2368 |
2409 // Make sure that we process all pending requests even when we're stalling | 2369 // Make sure that we process all pending requests even when we're stalling |
2410 // because of multiple releasing disconnected sockets. | 2370 // because of multiple releasing disconnected sockets. |
2411 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { | 2371 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { |
2412 CreatePoolWithIdleTimeouts( | 2372 CreatePoolWithIdleTimeouts( |
2413 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2373 kDefaultMaxSockets, |
2414 base::TimeDelta(), // Time out unused sockets immediately. | 2374 kDefaultMaxSocketsPerGroup, |
| 2375 base::TimeDelta(), // Time out unused sockets immediately. |
2415 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2376 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
2416 | 2377 |
2417 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2378 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
2418 | 2379 |
2419 // Startup 4 connect jobs. Two of them will be pending. | 2380 // Startup 4 connect jobs. Two of them will be pending. |
2420 | 2381 |
2421 ClientSocketHandle handle; | 2382 ClientSocketHandle handle; |
2422 TestCompletionCallback callback; | 2383 TestCompletionCallback callback; |
2423 int rv = handle.Init("a", | 2384 int rv = handle.Init( |
2424 params_, | 2385 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog()); |
2425 LOWEST, | |
2426 callback.callback(), | |
2427 pool_.get(), | |
2428 BoundNetLog()); | |
2429 EXPECT_EQ(OK, rv); | 2386 EXPECT_EQ(OK, rv); |
2430 | 2387 |
2431 ClientSocketHandle handle2; | 2388 ClientSocketHandle handle2; |
2432 TestCompletionCallback callback2; | 2389 TestCompletionCallback callback2; |
2433 rv = handle2.Init("a", | 2390 rv = handle2.Init( |
2434 params_, | 2391 "a", params_, LOWEST, callback2.callback(), pool_.get(), BoundNetLog()); |
2435 LOWEST, | |
2436 callback2.callback(), | |
2437 pool_.get(), | |
2438 BoundNetLog()); | |
2439 EXPECT_EQ(OK, rv); | 2392 EXPECT_EQ(OK, rv); |
2440 | 2393 |
2441 ClientSocketHandle handle3; | 2394 ClientSocketHandle handle3; |
2442 TestCompletionCallback callback3; | 2395 TestCompletionCallback callback3; |
2443 rv = handle3.Init("a", | 2396 rv = handle3.Init( |
2444 params_, | 2397 "a", params_, LOWEST, callback3.callback(), pool_.get(), BoundNetLog()); |
2445 LOWEST, | |
2446 callback3.callback(), | |
2447 pool_.get(), | |
2448 BoundNetLog()); | |
2449 EXPECT_EQ(ERR_IO_PENDING, rv); | 2398 EXPECT_EQ(ERR_IO_PENDING, rv); |
2450 | 2399 |
2451 ClientSocketHandle handle4; | 2400 ClientSocketHandle handle4; |
2452 TestCompletionCallback callback4; | 2401 TestCompletionCallback callback4; |
2453 rv = handle4.Init("a", | 2402 rv = handle4.Init( |
2454 params_, | 2403 "a", params_, LOWEST, callback4.callback(), pool_.get(), BoundNetLog()); |
2455 LOWEST, | |
2456 callback4.callback(), | |
2457 pool_.get(), | |
2458 BoundNetLog()); | |
2459 EXPECT_EQ(ERR_IO_PENDING, rv); | 2404 EXPECT_EQ(ERR_IO_PENDING, rv); |
2460 | 2405 |
2461 // Release two disconnected sockets. | 2406 // Release two disconnected sockets. |
2462 | 2407 |
2463 handle.socket()->Disconnect(); | 2408 handle.socket()->Disconnect(); |
2464 handle.Reset(); | 2409 handle.Reset(); |
2465 handle2.socket()->Disconnect(); | 2410 handle2.socket()->Disconnect(); |
2466 handle2.Reset(); | 2411 handle2.Reset(); |
2467 | 2412 |
2468 EXPECT_EQ(OK, callback3.WaitForResult()); | 2413 EXPECT_EQ(OK, callback3.WaitForResult()); |
2469 EXPECT_FALSE(handle3.is_reused()); | 2414 EXPECT_FALSE(handle3.is_reused()); |
2470 EXPECT_EQ(OK, callback4.WaitForResult()); | 2415 EXPECT_EQ(OK, callback4.WaitForResult()); |
2471 EXPECT_FALSE(handle4.is_reused()); | 2416 EXPECT_FALSE(handle4.is_reused()); |
2472 } | 2417 } |
2473 | 2418 |
2474 // Regression test for http://crbug.com/42267. | 2419 // Regression test for http://crbug.com/42267. |
2475 // When DoReleaseSocket() is processed for one socket, it is blocked because the | 2420 // When DoReleaseSocket() is processed for one socket, it is blocked because the |
2476 // other stalled groups all have releasing sockets, so no progress can be made. | 2421 // other stalled groups all have releasing sockets, so no progress can be made. |
2477 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { | 2422 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { |
2478 CreatePoolWithIdleTimeouts( | 2423 CreatePoolWithIdleTimeouts( |
2479 4 /* socket limit */, 4 /* socket limit per group */, | 2424 4 /* socket limit */, |
2480 base::TimeDelta(), // Time out unused sockets immediately. | 2425 4 /* socket limit per group */, |
| 2426 base::TimeDelta(), // Time out unused sockets immediately. |
2481 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2427 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
2482 | 2428 |
2483 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2429 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
2484 | 2430 |
2485 // Max out the socket limit with 2 per group. | 2431 // Max out the socket limit with 2 per group. |
2486 | 2432 |
2487 ClientSocketHandle handle_a[4]; | 2433 ClientSocketHandle handle_a[4]; |
2488 TestCompletionCallback callback_a[4]; | 2434 TestCompletionCallback callback_a[4]; |
2489 ClientSocketHandle handle_b[4]; | 2435 ClientSocketHandle handle_b[4]; |
2490 TestCompletionCallback callback_b[4]; | 2436 TestCompletionCallback callback_b[4]; |
2491 | 2437 |
2492 for (int i = 0; i < 2; ++i) { | 2438 for (int i = 0; i < 2; ++i) { |
2493 EXPECT_EQ(OK, handle_a[i].Init("a", | 2439 EXPECT_EQ(OK, |
2494 params_, | 2440 handle_a[i].Init("a", |
2495 LOWEST, | 2441 params_, |
2496 callback_a[i].callback(), | 2442 LOWEST, |
2497 pool_.get(), | 2443 callback_a[i].callback(), |
2498 BoundNetLog())); | 2444 pool_.get(), |
2499 EXPECT_EQ(OK, handle_b[i].Init("b", | 2445 BoundNetLog())); |
2500 params_, | 2446 EXPECT_EQ(OK, |
2501 LOWEST, | 2447 handle_b[i].Init("b", |
2502 callback_b[i].callback(), | 2448 params_, |
2503 pool_.get(), | 2449 LOWEST, |
2504 BoundNetLog())); | 2450 callback_b[i].callback(), |
| 2451 pool_.get(), |
| 2452 BoundNetLog())); |
2505 } | 2453 } |
2506 | 2454 |
2507 // Make 4 pending requests, 2 per group. | 2455 // Make 4 pending requests, 2 per group. |
2508 | 2456 |
2509 for (int i = 2; i < 4; ++i) { | 2457 for (int i = 2; i < 4; ++i) { |
2510 EXPECT_EQ(ERR_IO_PENDING, | 2458 EXPECT_EQ(ERR_IO_PENDING, |
2511 handle_a[i].Init("a", | 2459 handle_a[i].Init("a", |
2512 params_, | 2460 params_, |
2513 LOWEST, | 2461 LOWEST, |
2514 callback_a[i].callback(), | 2462 callback_a[i].callback(), |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2581 | 2529 |
2582 class TestReleasingSocketRequest : public TestCompletionCallbackBase { | 2530 class TestReleasingSocketRequest : public TestCompletionCallbackBase { |
2583 public: | 2531 public: |
2584 TestReleasingSocketRequest(TestClientSocketPool* pool, | 2532 TestReleasingSocketRequest(TestClientSocketPool* pool, |
2585 int expected_result, | 2533 int expected_result, |
2586 bool reset_releasing_handle) | 2534 bool reset_releasing_handle) |
2587 : pool_(pool), | 2535 : pool_(pool), |
2588 expected_result_(expected_result), | 2536 expected_result_(expected_result), |
2589 reset_releasing_handle_(reset_releasing_handle), | 2537 reset_releasing_handle_(reset_releasing_handle), |
2590 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete, | 2538 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete, |
2591 base::Unretained(this))) { | 2539 base::Unretained(this))) {} |
2592 } | |
2593 | 2540 |
2594 virtual ~TestReleasingSocketRequest() {} | 2541 virtual ~TestReleasingSocketRequest() {} |
2595 | 2542 |
2596 ClientSocketHandle* handle() { return &handle_; } | 2543 ClientSocketHandle* handle() { return &handle_; } |
2597 | 2544 |
2598 const CompletionCallback& callback() const { return callback_; } | 2545 const CompletionCallback& callback() const { return callback_; } |
2599 | 2546 |
2600 private: | 2547 private: |
2601 void OnComplete(int result) { | 2548 void OnComplete(int result) { |
2602 SetResult(result); | 2549 SetResult(result); |
2603 if (reset_releasing_handle_) | 2550 if (reset_releasing_handle_) |
2604 handle_.Reset(); | 2551 handle_.Reset(); |
2605 | 2552 |
2606 scoped_refptr<TestSocketParams> con_params( | 2553 scoped_refptr<TestSocketParams> con_params( |
2607 new TestSocketParams(false /* ignore_limits */)); | 2554 new TestSocketParams(false /* ignore_limits */)); |
2608 EXPECT_EQ(expected_result_, | 2555 EXPECT_EQ(expected_result_, |
2609 handle2_.Init("a", con_params, DEFAULT_PRIORITY, | 2556 handle2_.Init("a", |
2610 callback2_.callback(), pool_, BoundNetLog())); | 2557 con_params, |
| 2558 DEFAULT_PRIORITY, |
| 2559 callback2_.callback(), |
| 2560 pool_, |
| 2561 BoundNetLog())); |
2611 } | 2562 } |
2612 | 2563 |
2613 TestClientSocketPool* const pool_; | 2564 TestClientSocketPool* const pool_; |
2614 int expected_result_; | 2565 int expected_result_; |
2615 bool reset_releasing_handle_; | 2566 bool reset_releasing_handle_; |
2616 ClientSocketHandle handle_; | 2567 ClientSocketHandle handle_; |
2617 ClientSocketHandle handle2_; | 2568 ClientSocketHandle handle2_; |
2618 CompletionCallback callback_; | 2569 CompletionCallback callback_; |
2619 TestCompletionCallback callback2_; | 2570 TestCompletionCallback callback2_; |
2620 }; | 2571 }; |
2621 | 2572 |
2622 | |
2623 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { | 2573 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { |
2624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2574 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
2625 | 2575 |
2626 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 2576 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); |
2627 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 2577 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
2628 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 2578 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); |
2629 | 2579 |
2630 EXPECT_EQ(static_cast<int>(requests_size()), | 2580 EXPECT_EQ(static_cast<int>(requests_size()), |
2631 client_socket_factory_.allocation_count()); | 2581 client_socket_factory_.allocation_count()); |
2632 | 2582 |
2633 connect_job_factory_->set_job_type( | 2583 connect_job_factory_->set_job_type( |
2634 TestConnectJob::kMockPendingAdditionalErrorStateJob); | 2584 TestConnectJob::kMockPendingAdditionalErrorStateJob); |
2635 TestReleasingSocketRequest req(pool_.get(), OK, false); | 2585 TestReleasingSocketRequest req(pool_.get(), OK, false); |
2636 EXPECT_EQ(ERR_IO_PENDING, | 2586 EXPECT_EQ(ERR_IO_PENDING, |
2637 req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(), | 2587 req.handle()->Init("a", |
2638 pool_.get(), BoundNetLog())); | 2588 params_, |
| 2589 DEFAULT_PRIORITY, |
| 2590 req.callback(), |
| 2591 pool_.get(), |
| 2592 BoundNetLog())); |
2639 // The next job should complete synchronously | 2593 // The next job should complete synchronously |
2640 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2594 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
2641 | 2595 |
2642 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); | 2596 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); |
2643 EXPECT_FALSE(req.handle()->is_initialized()); | 2597 EXPECT_FALSE(req.handle()->is_initialized()); |
2644 EXPECT_FALSE(req.handle()->socket()); | 2598 EXPECT_FALSE(req.handle()->socket()); |
2645 EXPECT_TRUE(req.handle()->is_ssl_error()); | 2599 EXPECT_TRUE(req.handle()->is_ssl_error()); |
2646 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); | 2600 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); |
2647 } | 2601 } |
2648 | 2602 |
2649 // http://crbug.com/44724 regression test. | 2603 // http://crbug.com/44724 regression test. |
2650 // We start releasing the pool when we flush on network change. When that | 2604 // We start releasing the pool when we flush on network change. When that |
2651 // happens, the only active references are in the ClientSocketHandles. When a | 2605 // happens, the only active references are in the ClientSocketHandles. When a |
2652 // ConnectJob completes and calls back into the last ClientSocketHandle, that | 2606 // ConnectJob completes and calls back into the last ClientSocketHandle, that |
2653 // callback can release the last reference and delete the pool. After the | 2607 // callback can release the last reference and delete the pool. After the |
2654 // callback finishes, we go back to the stack frame within the now-deleted pool. | 2608 // callback finishes, we go back to the stack frame within the now-deleted pool. |
2655 // Executing any code that refers to members of the now-deleted pool can cause | 2609 // Executing any code that refers to members of the now-deleted pool can cause |
2656 // crashes. | 2610 // crashes. |
2657 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { | 2611 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { |
2658 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2612 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
2659 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 2613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
2660 | 2614 |
2661 ClientSocketHandle handle; | 2615 ClientSocketHandle handle; |
2662 TestCompletionCallback callback; | 2616 TestCompletionCallback callback; |
2663 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2617 EXPECT_EQ(ERR_IO_PENDING, |
2664 params_, | 2618 handle.Init("a", |
2665 DEFAULT_PRIORITY, | 2619 params_, |
2666 callback.callback(), | 2620 DEFAULT_PRIORITY, |
2667 pool_.get(), | 2621 callback.callback(), |
2668 BoundNetLog())); | 2622 pool_.get(), |
| 2623 BoundNetLog())); |
2669 | 2624 |
2670 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2625 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
2671 | 2626 |
2672 // We'll call back into this now. | 2627 // We'll call back into this now. |
2673 callback.WaitForResult(); | 2628 callback.WaitForResult(); |
2674 } | 2629 } |
2675 | 2630 |
2676 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { | 2631 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { |
2677 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2632 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
2678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2633 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
2679 | 2634 |
2680 ClientSocketHandle handle; | 2635 ClientSocketHandle handle; |
2681 TestCompletionCallback callback; | 2636 TestCompletionCallback callback; |
2682 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2637 EXPECT_EQ(ERR_IO_PENDING, |
2683 params_, | 2638 handle.Init("a", |
2684 DEFAULT_PRIORITY, | 2639 params_, |
2685 callback.callback(), | 2640 DEFAULT_PRIORITY, |
2686 pool_.get(), | 2641 callback.callback(), |
2687 BoundNetLog())); | 2642 pool_.get(), |
| 2643 BoundNetLog())); |
2688 EXPECT_EQ(OK, callback.WaitForResult()); | 2644 EXPECT_EQ(OK, callback.WaitForResult()); |
2689 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); | 2645 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); |
2690 | 2646 |
2691 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2647 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
2692 | 2648 |
2693 handle.Reset(); | 2649 handle.Reset(); |
2694 base::MessageLoop::current()->RunUntilIdle(); | 2650 base::MessageLoop::current()->RunUntilIdle(); |
2695 | 2651 |
2696 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2652 EXPECT_EQ(ERR_IO_PENDING, |
2697 params_, | 2653 handle.Init("a", |
2698 DEFAULT_PRIORITY, | 2654 params_, |
2699 callback.callback(), | 2655 DEFAULT_PRIORITY, |
2700 pool_.get(), | 2656 callback.callback(), |
2701 BoundNetLog())); | 2657 pool_.get(), |
| 2658 BoundNetLog())); |
2702 EXPECT_EQ(OK, callback.WaitForResult()); | 2659 EXPECT_EQ(OK, callback.WaitForResult()); |
2703 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); | 2660 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); |
2704 } | 2661 } |
2705 | 2662 |
2706 class ConnectWithinCallback : public TestCompletionCallbackBase { | 2663 class ConnectWithinCallback : public TestCompletionCallbackBase { |
2707 public: | 2664 public: |
2708 ConnectWithinCallback( | 2665 ConnectWithinCallback(const std::string& group_name, |
2709 const std::string& group_name, | 2666 const scoped_refptr<TestSocketParams>& params, |
2710 const scoped_refptr<TestSocketParams>& params, | 2667 TestClientSocketPool* pool) |
2711 TestClientSocketPool* pool) | |
2712 : group_name_(group_name), | 2668 : group_name_(group_name), |
2713 params_(params), | 2669 params_(params), |
2714 pool_(pool), | 2670 pool_(pool), |
2715 callback_(base::Bind(&ConnectWithinCallback::OnComplete, | 2671 callback_(base::Bind(&ConnectWithinCallback::OnComplete, |
2716 base::Unretained(this))) { | 2672 base::Unretained(this))) {} |
2717 } | |
2718 | 2673 |
2719 virtual ~ConnectWithinCallback() {} | 2674 virtual ~ConnectWithinCallback() {} |
2720 | 2675 |
2721 int WaitForNestedResult() { | 2676 int WaitForNestedResult() { return nested_callback_.WaitForResult(); } |
2722 return nested_callback_.WaitForResult(); | |
2723 } | |
2724 | 2677 |
2725 const CompletionCallback& callback() const { return callback_; } | 2678 const CompletionCallback& callback() const { return callback_; } |
2726 | 2679 |
2727 private: | 2680 private: |
2728 void OnComplete(int result) { | 2681 void OnComplete(int result) { |
2729 SetResult(result); | 2682 SetResult(result); |
2730 EXPECT_EQ(ERR_IO_PENDING, | 2683 EXPECT_EQ(ERR_IO_PENDING, |
2731 handle_.Init(group_name_, | 2684 handle_.Init(group_name_, |
2732 params_, | 2685 params_, |
2733 DEFAULT_PRIORITY, | 2686 DEFAULT_PRIORITY, |
(...skipping 13 matching lines...) Expand all Loading... |
2747 }; | 2700 }; |
2748 | 2701 |
2749 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { | 2702 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { |
2750 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2703 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
2751 | 2704 |
2752 // First job will be waiting until it gets aborted. | 2705 // First job will be waiting until it gets aborted. |
2753 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2706 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
2754 | 2707 |
2755 ClientSocketHandle handle; | 2708 ClientSocketHandle handle; |
2756 ConnectWithinCallback callback("a", params_, pool_.get()); | 2709 ConnectWithinCallback callback("a", params_, pool_.get()); |
2757 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2710 EXPECT_EQ(ERR_IO_PENDING, |
2758 params_, | 2711 handle.Init("a", |
2759 DEFAULT_PRIORITY, | 2712 params_, |
2760 callback.callback(), | 2713 DEFAULT_PRIORITY, |
2761 pool_.get(), | 2714 callback.callback(), |
2762 BoundNetLog())); | 2715 pool_.get(), |
| 2716 BoundNetLog())); |
2763 | 2717 |
2764 // Second job will be started during the first callback, and will | 2718 // Second job will be started during the first callback, and will |
2765 // asynchronously complete with OK. | 2719 // asynchronously complete with OK. |
2766 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2720 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
2767 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2721 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
2768 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); | 2722 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); |
2769 EXPECT_EQ(OK, callback.WaitForNestedResult()); | 2723 EXPECT_EQ(OK, callback.WaitForNestedResult()); |
2770 } | 2724 } |
2771 | 2725 |
2772 // Cancel a pending socket request while we're at max sockets, | 2726 // Cancel a pending socket request while we're at max sockets, |
2773 // and verify that the backup socket firing doesn't cause a crash. | 2727 // and verify that the backup socket firing doesn't cause a crash. |
2774 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { | 2728 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { |
2775 // Max 4 sockets globally, max 4 sockets per group. | 2729 // Max 4 sockets globally, max 4 sockets per group. |
2776 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2730 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
2777 pool_->EnableConnectBackupJobs(); | 2731 pool_->EnableConnectBackupJobs(); |
2778 | 2732 |
2779 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2733 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
2780 // timer. | 2734 // timer. |
2781 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2735 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
2782 ClientSocketHandle handle; | 2736 ClientSocketHandle handle; |
2783 TestCompletionCallback callback; | 2737 TestCompletionCallback callback; |
2784 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", | 2738 EXPECT_EQ(ERR_IO_PENDING, |
2785 params_, | 2739 handle.Init("bar", |
2786 DEFAULT_PRIORITY, | 2740 params_, |
2787 callback.callback(), | 2741 DEFAULT_PRIORITY, |
2788 pool_.get(), | 2742 callback.callback(), |
2789 BoundNetLog())); | 2743 pool_.get(), |
| 2744 BoundNetLog())); |
2790 | 2745 |
2791 // Start (MaxSockets - 1) connected sockets to reach max sockets. | 2746 // Start (MaxSockets - 1) connected sockets to reach max sockets. |
2792 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2747 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
2793 ClientSocketHandle handles[kDefaultMaxSockets]; | 2748 ClientSocketHandle handles[kDefaultMaxSockets]; |
2794 for (int i = 1; i < kDefaultMaxSockets; ++i) { | 2749 for (int i = 1; i < kDefaultMaxSockets; ++i) { |
2795 TestCompletionCallback callback; | 2750 TestCompletionCallback callback; |
2796 EXPECT_EQ(OK, handles[i].Init("bar", | 2751 EXPECT_EQ(OK, |
2797 params_, | 2752 handles[i].Init("bar", |
2798 DEFAULT_PRIORITY, | 2753 params_, |
2799 callback.callback(), | 2754 DEFAULT_PRIORITY, |
2800 pool_.get(), | 2755 callback.callback(), |
2801 BoundNetLog())); | 2756 pool_.get(), |
| 2757 BoundNetLog())); |
2802 } | 2758 } |
2803 | 2759 |
2804 base::MessageLoop::current()->RunUntilIdle(); | 2760 base::MessageLoop::current()->RunUntilIdle(); |
2805 | 2761 |
2806 // Cancel the pending request. | 2762 // Cancel the pending request. |
2807 handle.Reset(); | 2763 handle.Reset(); |
2808 | 2764 |
2809 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2765 // Wait for the backup timer to fire (add some slop to ensure it fires) |
2810 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2766 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
2811 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2767 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
2812 | 2768 |
2813 base::MessageLoop::current()->RunUntilIdle(); | 2769 base::MessageLoop::current()->RunUntilIdle(); |
2814 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 2770 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
2815 } | 2771 } |
2816 | 2772 |
2817 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { | 2773 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { |
2818 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2774 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
2819 pool_->EnableConnectBackupJobs(); | 2775 pool_->EnableConnectBackupJobs(); |
2820 | 2776 |
2821 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2777 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
2822 // timer. | 2778 // timer. |
2823 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2779 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
2824 ClientSocketHandle handle; | 2780 ClientSocketHandle handle; |
2825 TestCompletionCallback callback; | 2781 TestCompletionCallback callback; |
2826 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", | 2782 EXPECT_EQ(ERR_IO_PENDING, |
2827 params_, | 2783 handle.Init("bar", |
2828 DEFAULT_PRIORITY, | 2784 params_, |
2829 callback.callback(), | 2785 DEFAULT_PRIORITY, |
2830 pool_.get(), | 2786 callback.callback(), |
2831 BoundNetLog())); | 2787 pool_.get(), |
| 2788 BoundNetLog())); |
2832 ASSERT_TRUE(pool_->HasGroup("bar")); | 2789 ASSERT_TRUE(pool_->HasGroup("bar")); |
2833 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); | 2790 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); |
2834 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); | 2791 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); |
2835 | 2792 |
2836 // Cancel the socket request. This should cancel the backup timer. Wait for | 2793 // Cancel the socket request. This should cancel the backup timer. Wait for |
2837 // the backup time to see if it indeed got canceled. | 2794 // the backup time to see if it indeed got canceled. |
2838 handle.Reset(); | 2795 handle.Reset(); |
2839 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2796 // Wait for the backup timer to fire (add some slop to ensure it fires) |
2840 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2797 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
2841 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2798 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
2842 base::MessageLoop::current()->RunUntilIdle(); | 2799 base::MessageLoop::current()->RunUntilIdle(); |
2843 ASSERT_TRUE(pool_->HasGroup("bar")); | 2800 ASSERT_TRUE(pool_->HasGroup("bar")); |
2844 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); | 2801 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); |
2845 } | 2802 } |
2846 | 2803 |
2847 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { | 2804 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { |
2848 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2805 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
2849 pool_->EnableConnectBackupJobs(); | 2806 pool_->EnableConnectBackupJobs(); |
2850 | 2807 |
2851 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2808 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
2852 // timer. | 2809 // timer. |
2853 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2810 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
2854 ClientSocketHandle handle; | 2811 ClientSocketHandle handle; |
2855 TestCompletionCallback callback; | 2812 TestCompletionCallback callback; |
2856 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", | 2813 EXPECT_EQ(ERR_IO_PENDING, |
2857 params_, | 2814 handle.Init("bar", |
2858 DEFAULT_PRIORITY, | 2815 params_, |
2859 callback.callback(), | 2816 DEFAULT_PRIORITY, |
2860 pool_.get(), | 2817 callback.callback(), |
2861 BoundNetLog())); | 2818 pool_.get(), |
| 2819 BoundNetLog())); |
2862 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
2863 ClientSocketHandle handle2; | 2821 ClientSocketHandle handle2; |
2864 TestCompletionCallback callback2; | 2822 TestCompletionCallback callback2; |
2865 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", | 2823 EXPECT_EQ(ERR_IO_PENDING, |
2866 params_, | 2824 handle2.Init("bar", |
2867 DEFAULT_PRIORITY, | 2825 params_, |
2868 callback2.callback(), | 2826 DEFAULT_PRIORITY, |
2869 pool_.get(), | 2827 callback2.callback(), |
2870 BoundNetLog())); | 2828 pool_.get(), |
| 2829 BoundNetLog())); |
2871 ASSERT_TRUE(pool_->HasGroup("bar")); | 2830 ASSERT_TRUE(pool_->HasGroup("bar")); |
2872 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); | 2831 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); |
2873 | 2832 |
2874 // Cancel request 1 and then complete request 2. With the requests finished, | 2833 // Cancel request 1 and then complete request 2. With the requests finished, |
2875 // the backup timer should be cancelled. | 2834 // the backup timer should be cancelled. |
2876 handle.Reset(); | 2835 handle.Reset(); |
2877 EXPECT_EQ(OK, callback2.WaitForResult()); | 2836 EXPECT_EQ(OK, callback2.WaitForResult()); |
2878 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2837 // Wait for the backup timer to fire (add some slop to ensure it fires) |
2879 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2838 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
2880 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2839 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3103 EXPECT_FALSE(pool_->HasGroup("a")); | 3062 EXPECT_FALSE(pool_->HasGroup("a")); |
3104 } | 3063 } |
3105 | 3064 |
3106 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { | 3065 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { |
3107 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 3066 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
3108 | 3067 |
3109 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3068 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3110 | 3069 |
3111 ClientSocketHandle handle1; | 3070 ClientSocketHandle handle1; |
3112 TestCompletionCallback callback1; | 3071 TestCompletionCallback callback1; |
3113 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3072 EXPECT_EQ(ERR_IO_PENDING, |
3114 params_, | 3073 handle1.Init("a", |
3115 DEFAULT_PRIORITY, | 3074 params_, |
3116 callback1.callback(), | 3075 DEFAULT_PRIORITY, |
3117 pool_.get(), | 3076 callback1.callback(), |
3118 BoundNetLog())); | 3077 pool_.get(), |
| 3078 BoundNetLog())); |
3119 | 3079 |
3120 ClientSocketHandle handle2; | 3080 ClientSocketHandle handle2; |
3121 TestCompletionCallback callback2; | 3081 TestCompletionCallback callback2; |
3122 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 3082 EXPECT_EQ(ERR_IO_PENDING, |
3123 params_, | 3083 handle2.Init("a", |
3124 DEFAULT_PRIORITY, | 3084 params_, |
3125 callback2.callback(), | 3085 DEFAULT_PRIORITY, |
3126 pool_.get(), | 3086 callback2.callback(), |
3127 BoundNetLog())); | 3087 pool_.get(), |
| 3088 BoundNetLog())); |
3128 ClientSocketHandle handle3; | 3089 ClientSocketHandle handle3; |
3129 TestCompletionCallback callback3; | 3090 TestCompletionCallback callback3; |
3130 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", | 3091 EXPECT_EQ(ERR_IO_PENDING, |
3131 params_, | 3092 handle3.Init("a", |
3132 DEFAULT_PRIORITY, | 3093 params_, |
3133 callback3.callback(), | 3094 DEFAULT_PRIORITY, |
3134 pool_.get(), | 3095 callback3.callback(), |
3135 BoundNetLog())); | 3096 pool_.get(), |
| 3097 BoundNetLog())); |
3136 | 3098 |
3137 EXPECT_EQ(OK, callback1.WaitForResult()); | 3099 EXPECT_EQ(OK, callback1.WaitForResult()); |
3138 EXPECT_EQ(OK, callback2.WaitForResult()); | 3100 EXPECT_EQ(OK, callback2.WaitForResult()); |
3139 EXPECT_EQ(OK, callback3.WaitForResult()); | 3101 EXPECT_EQ(OK, callback3.WaitForResult()); |
3140 | 3102 |
3141 // Use the socket. | 3103 // Use the socket. |
3142 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); | 3104 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); |
3143 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); | 3105 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); |
3144 | 3106 |
3145 handle1.Reset(); | 3107 handle1.Reset(); |
3146 handle2.Reset(); | 3108 handle2.Reset(); |
3147 handle3.Reset(); | 3109 handle3.Reset(); |
3148 | 3110 |
3149 EXPECT_EQ(OK, handle1.Init("a", | 3111 EXPECT_EQ(OK, |
3150 params_, | 3112 handle1.Init("a", |
3151 DEFAULT_PRIORITY, | 3113 params_, |
3152 callback1.callback(), | 3114 DEFAULT_PRIORITY, |
3153 pool_.get(), | 3115 callback1.callback(), |
3154 BoundNetLog())); | 3116 pool_.get(), |
3155 EXPECT_EQ(OK, handle2.Init("a", | 3117 BoundNetLog())); |
3156 params_, | 3118 EXPECT_EQ(OK, |
3157 DEFAULT_PRIORITY, | 3119 handle2.Init("a", |
3158 callback2.callback(), | 3120 params_, |
3159 pool_.get(), | 3121 DEFAULT_PRIORITY, |
3160 BoundNetLog())); | 3122 callback2.callback(), |
3161 EXPECT_EQ(OK, handle3.Init("a", | 3123 pool_.get(), |
3162 params_, | 3124 BoundNetLog())); |
3163 DEFAULT_PRIORITY, | 3125 EXPECT_EQ(OK, |
3164 callback3.callback(), | 3126 handle3.Init("a", |
3165 pool_.get(), | 3127 params_, |
3166 BoundNetLog())); | 3128 DEFAULT_PRIORITY, |
| 3129 callback3.callback(), |
| 3130 pool_.get(), |
| 3131 BoundNetLog())); |
3167 | 3132 |
3168 EXPECT_TRUE(handle1.socket()->WasEverUsed()); | 3133 EXPECT_TRUE(handle1.socket()->WasEverUsed()); |
3169 EXPECT_TRUE(handle2.socket()->WasEverUsed()); | 3134 EXPECT_TRUE(handle2.socket()->WasEverUsed()); |
3170 EXPECT_FALSE(handle3.socket()->WasEverUsed()); | 3135 EXPECT_FALSE(handle3.socket()->WasEverUsed()); |
3171 } | 3136 } |
3172 | 3137 |
3173 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { | 3138 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { |
3174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3175 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3140 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3176 | 3141 |
3177 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3142 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3178 | 3143 |
3179 ASSERT_TRUE(pool_->HasGroup("a")); | 3144 ASSERT_TRUE(pool_->HasGroup("a")); |
3180 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3145 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
3181 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 3146 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
3182 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3147 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3183 | 3148 |
3184 ClientSocketHandle handle1; | 3149 ClientSocketHandle handle1; |
3185 TestCompletionCallback callback1; | 3150 TestCompletionCallback callback1; |
3186 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3151 EXPECT_EQ(ERR_IO_PENDING, |
3187 params_, | 3152 handle1.Init("a", |
3188 DEFAULT_PRIORITY, | 3153 params_, |
3189 callback1.callback(), | 3154 DEFAULT_PRIORITY, |
3190 pool_.get(), | 3155 callback1.callback(), |
3191 BoundNetLog())); | 3156 pool_.get(), |
| 3157 BoundNetLog())); |
3192 | 3158 |
3193 ClientSocketHandle handle2; | 3159 ClientSocketHandle handle2; |
3194 TestCompletionCallback callback2; | 3160 TestCompletionCallback callback2; |
3195 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 3161 EXPECT_EQ(ERR_IO_PENDING, |
3196 params_, | 3162 handle2.Init("a", |
3197 DEFAULT_PRIORITY, | 3163 params_, |
3198 callback2.callback(), | 3164 DEFAULT_PRIORITY, |
3199 pool_.get(), | 3165 callback2.callback(), |
3200 BoundNetLog())); | 3166 pool_.get(), |
| 3167 BoundNetLog())); |
3201 | 3168 |
3202 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3169 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
3203 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3170 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3204 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3171 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3205 | 3172 |
3206 EXPECT_EQ(OK, callback1.WaitForResult()); | 3173 EXPECT_EQ(OK, callback1.WaitForResult()); |
3207 EXPECT_EQ(OK, callback2.WaitForResult()); | 3174 EXPECT_EQ(OK, callback2.WaitForResult()); |
3208 handle1.Reset(); | 3175 handle1.Reset(); |
3209 handle2.Reset(); | 3176 handle2.Reset(); |
3210 | 3177 |
3211 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3178 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3212 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3179 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3213 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); | 3180 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); |
3214 } | 3181 } |
3215 | 3182 |
3216 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { | 3183 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { |
3217 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3184 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3218 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3185 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3219 | 3186 |
3220 ClientSocketHandle handle1; | 3187 ClientSocketHandle handle1; |
3221 TestCompletionCallback callback1; | 3188 TestCompletionCallback callback1; |
3222 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3189 EXPECT_EQ(ERR_IO_PENDING, |
3223 params_, | 3190 handle1.Init("a", |
3224 DEFAULT_PRIORITY, | 3191 params_, |
3225 callback1.callback(), | 3192 DEFAULT_PRIORITY, |
3226 pool_.get(), | 3193 callback1.callback(), |
3227 BoundNetLog())); | 3194 pool_.get(), |
| 3195 BoundNetLog())); |
3228 | 3196 |
3229 ASSERT_TRUE(pool_->HasGroup("a")); | 3197 ASSERT_TRUE(pool_->HasGroup("a")); |
3230 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3198 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3231 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3199 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3232 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3200 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3233 | 3201 |
3234 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3202 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3235 | 3203 |
3236 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3204 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
3237 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3205 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
3238 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3206 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3239 | 3207 |
3240 ClientSocketHandle handle2; | 3208 ClientSocketHandle handle2; |
3241 TestCompletionCallback callback2; | 3209 TestCompletionCallback callback2; |
3242 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 3210 EXPECT_EQ(ERR_IO_PENDING, |
3243 params_, | 3211 handle2.Init("a", |
3244 DEFAULT_PRIORITY, | 3212 params_, |
3245 callback2.callback(), | 3213 DEFAULT_PRIORITY, |
3246 pool_.get(), | 3214 callback2.callback(), |
3247 BoundNetLog())); | 3215 pool_.get(), |
| 3216 BoundNetLog())); |
3248 | 3217 |
3249 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3218 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
3250 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3219 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3251 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3220 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3252 | 3221 |
3253 EXPECT_EQ(OK, callback1.WaitForResult()); | 3222 EXPECT_EQ(OK, callback1.WaitForResult()); |
3254 EXPECT_EQ(OK, callback2.WaitForResult()); | 3223 EXPECT_EQ(OK, callback2.WaitForResult()); |
3255 handle1.Reset(); | 3224 handle1.Reset(); |
3256 handle2.Reset(); | 3225 handle2.Reset(); |
3257 | 3226 |
3258 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3227 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3259 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3228 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3260 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); | 3229 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); |
3261 } | 3230 } |
3262 | 3231 |
3263 TEST_F(ClientSocketPoolBaseTest, | 3232 TEST_F(ClientSocketPoolBaseTest, |
3264 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { | 3233 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { |
3265 CreatePool(4, 4); | 3234 CreatePool(4, 4); |
3266 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3235 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3267 | 3236 |
3268 ClientSocketHandle handle1; | 3237 ClientSocketHandle handle1; |
3269 TestCompletionCallback callback1; | 3238 TestCompletionCallback callback1; |
3270 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3239 EXPECT_EQ(ERR_IO_PENDING, |
3271 params_, | 3240 handle1.Init("a", |
3272 DEFAULT_PRIORITY, | 3241 params_, |
3273 callback1.callback(), | 3242 DEFAULT_PRIORITY, |
3274 pool_.get(), | 3243 callback1.callback(), |
3275 BoundNetLog())); | 3244 pool_.get(), |
| 3245 BoundNetLog())); |
3276 | 3246 |
3277 ClientSocketHandle handle2; | 3247 ClientSocketHandle handle2; |
3278 TestCompletionCallback callback2; | 3248 TestCompletionCallback callback2; |
3279 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 3249 EXPECT_EQ(ERR_IO_PENDING, |
3280 params_, | 3250 handle2.Init("a", |
3281 DEFAULT_PRIORITY, | 3251 params_, |
3282 callback2.callback(), | 3252 DEFAULT_PRIORITY, |
3283 pool_.get(), | 3253 callback2.callback(), |
3284 BoundNetLog())); | 3254 pool_.get(), |
| 3255 BoundNetLog())); |
3285 | 3256 |
3286 ClientSocketHandle handle3; | 3257 ClientSocketHandle handle3; |
3287 TestCompletionCallback callback3; | 3258 TestCompletionCallback callback3; |
3288 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", | 3259 EXPECT_EQ(ERR_IO_PENDING, |
3289 params_, | 3260 handle3.Init("a", |
3290 DEFAULT_PRIORITY, | 3261 params_, |
3291 callback3.callback(), | 3262 DEFAULT_PRIORITY, |
3292 pool_.get(), | 3263 callback3.callback(), |
3293 BoundNetLog())); | 3264 pool_.get(), |
| 3265 BoundNetLog())); |
3294 | 3266 |
3295 ASSERT_TRUE(pool_->HasGroup("a")); | 3267 ASSERT_TRUE(pool_->HasGroup("a")); |
3296 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); | 3268 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); |
3297 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3269 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3298 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3270 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3299 | 3271 |
3300 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3272 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3301 | 3273 |
3302 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); | 3274 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); |
3303 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3275 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
(...skipping 10 matching lines...) Expand all Loading... |
3314 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3286 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3315 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); | 3287 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); |
3316 } | 3288 } |
3317 | 3289 |
3318 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { | 3290 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { |
3319 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 3291 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
3320 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3292 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3321 | 3293 |
3322 ASSERT_FALSE(pool_->HasGroup("a")); | 3294 ASSERT_FALSE(pool_->HasGroup("a")); |
3323 | 3295 |
3324 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets, | 3296 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets, BoundNetLog()); |
3325 BoundNetLog()); | |
3326 | 3297 |
3327 ASSERT_TRUE(pool_->HasGroup("a")); | 3298 ASSERT_TRUE(pool_->HasGroup("a")); |
3328 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a")); | 3299 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a")); |
3329 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a")); | 3300 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a")); |
3330 | 3301 |
3331 ASSERT_FALSE(pool_->HasGroup("b")); | 3302 ASSERT_FALSE(pool_->HasGroup("b")); |
3332 | 3303 |
3333 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, | 3304 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, BoundNetLog()); |
3334 BoundNetLog()); | |
3335 | 3305 |
3336 ASSERT_FALSE(pool_->HasGroup("b")); | 3306 ASSERT_FALSE(pool_->HasGroup("b")); |
3337 } | 3307 } |
3338 | 3308 |
3339 TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) { | 3309 TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) { |
3340 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 3310 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
3341 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3311 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3342 | 3312 |
3343 ASSERT_FALSE(pool_->HasGroup("a")); | 3313 ASSERT_FALSE(pool_->HasGroup("a")); |
3344 | 3314 |
3345 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets - 1, | 3315 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets - 1, BoundNetLog()); |
3346 BoundNetLog()); | |
3347 | 3316 |
3348 ASSERT_TRUE(pool_->HasGroup("a")); | 3317 ASSERT_TRUE(pool_->HasGroup("a")); |
3349 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a")); | 3318 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a")); |
3350 EXPECT_EQ(kDefaultMaxSockets - 1, | 3319 EXPECT_EQ(kDefaultMaxSockets - 1, |
3351 pool_->NumUnassignedConnectJobsInGroup("a")); | 3320 pool_->NumUnassignedConnectJobsInGroup("a")); |
3352 EXPECT_FALSE(pool_->IsStalled()); | 3321 EXPECT_FALSE(pool_->IsStalled()); |
3353 | 3322 |
3354 ASSERT_FALSE(pool_->HasGroup("b")); | 3323 ASSERT_FALSE(pool_->HasGroup("b")); |
3355 | 3324 |
3356 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, | 3325 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, BoundNetLog()); |
3357 BoundNetLog()); | |
3358 | 3326 |
3359 ASSERT_TRUE(pool_->HasGroup("b")); | 3327 ASSERT_TRUE(pool_->HasGroup("b")); |
3360 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); | 3328 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); |
3361 EXPECT_FALSE(pool_->IsStalled()); | 3329 EXPECT_FALSE(pool_->IsStalled()); |
3362 } | 3330 } |
3363 | 3331 |
3364 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { | 3332 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { |
3365 CreatePool(4, 4); | 3333 CreatePool(4, 4); |
3366 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3334 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3367 | 3335 |
3368 ClientSocketHandle handle1; | 3336 ClientSocketHandle handle1; |
3369 TestCompletionCallback callback1; | 3337 TestCompletionCallback callback1; |
3370 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3338 EXPECT_EQ(ERR_IO_PENDING, |
3371 params_, | 3339 handle1.Init("a", |
3372 DEFAULT_PRIORITY, | 3340 params_, |
3373 callback1.callback(), | 3341 DEFAULT_PRIORITY, |
3374 pool_.get(), | 3342 callback1.callback(), |
3375 BoundNetLog())); | 3343 pool_.get(), |
| 3344 BoundNetLog())); |
3376 ASSERT_EQ(OK, callback1.WaitForResult()); | 3345 ASSERT_EQ(OK, callback1.WaitForResult()); |
3377 handle1.Reset(); | 3346 handle1.Reset(); |
3378 | 3347 |
3379 ASSERT_TRUE(pool_->HasGroup("a")); | 3348 ASSERT_TRUE(pool_->HasGroup("a")); |
3380 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3349 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3381 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3350 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3382 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3351 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3383 | 3352 |
3384 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3353 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3385 | 3354 |
3386 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3355 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3387 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3356 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
3388 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3357 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3389 } | 3358 } |
3390 | 3359 |
3391 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { | 3360 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { |
3392 CreatePool(4, 4); | 3361 CreatePool(4, 4); |
3393 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3362 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3394 | 3363 |
3395 ClientSocketHandle handle1; | 3364 ClientSocketHandle handle1; |
3396 TestCompletionCallback callback1; | 3365 TestCompletionCallback callback1; |
3397 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3366 EXPECT_EQ(ERR_IO_PENDING, |
3398 params_, | 3367 handle1.Init("a", |
3399 DEFAULT_PRIORITY, | 3368 params_, |
3400 callback1.callback(), | 3369 DEFAULT_PRIORITY, |
3401 pool_.get(), | 3370 callback1.callback(), |
3402 BoundNetLog())); | 3371 pool_.get(), |
| 3372 BoundNetLog())); |
3403 ASSERT_EQ(OK, callback1.WaitForResult()); | 3373 ASSERT_EQ(OK, callback1.WaitForResult()); |
3404 | 3374 |
3405 ASSERT_TRUE(pool_->HasGroup("a")); | 3375 ASSERT_TRUE(pool_->HasGroup("a")); |
3406 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3376 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3407 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3377 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3408 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3378 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3409 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3379 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
3410 | 3380 |
3411 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3381 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3412 | 3382 |
3413 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3383 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3414 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3384 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
3415 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3385 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3416 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3386 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
3417 } | 3387 } |
3418 | 3388 |
3419 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) { | 3389 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) { |
3420 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3390 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3421 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3391 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3422 | 3392 |
3423 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, | 3393 pool_->RequestSockets( |
3424 BoundNetLog()); | 3394 "a", ¶ms_, kDefaultMaxSocketsPerGroup, BoundNetLog()); |
3425 | 3395 |
3426 ASSERT_TRUE(pool_->HasGroup("a")); | 3396 ASSERT_TRUE(pool_->HasGroup("a")); |
3427 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3397 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3428 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3398 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3429 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a")); | 3399 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a")); |
3430 | 3400 |
3431 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSocketsPerGroup, | 3401 pool_->RequestSockets( |
3432 BoundNetLog()); | 3402 "b", ¶ms_, kDefaultMaxSocketsPerGroup, BoundNetLog()); |
3433 | 3403 |
3434 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); | 3404 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); |
3435 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); | 3405 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); |
3436 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b")); | 3406 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b")); |
3437 } | 3407 } |
3438 | 3408 |
3439 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) { | 3409 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) { |
3440 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3410 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3441 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 3411 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
3442 | 3412 |
3443 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, | 3413 pool_->RequestSockets( |
3444 BoundNetLog()); | 3414 "a", ¶ms_, kDefaultMaxSocketsPerGroup, BoundNetLog()); |
3445 | 3415 |
3446 ASSERT_FALSE(pool_->HasGroup("a")); | 3416 ASSERT_FALSE(pool_->HasGroup("a")); |
3447 | 3417 |
3448 connect_job_factory_->set_job_type( | 3418 connect_job_factory_->set_job_type( |
3449 TestConnectJob::kMockAdditionalErrorStateJob); | 3419 TestConnectJob::kMockAdditionalErrorStateJob); |
3450 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, | 3420 pool_->RequestSockets( |
3451 BoundNetLog()); | 3421 "a", ¶ms_, kDefaultMaxSocketsPerGroup, BoundNetLog()); |
3452 | 3422 |
3453 ASSERT_FALSE(pool_->HasGroup("a")); | 3423 ASSERT_FALSE(pool_->HasGroup("a")); |
3454 } | 3424 } |
3455 | 3425 |
3456 TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) { | 3426 TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) { |
3457 CreatePool(4, 4); | 3427 CreatePool(4, 4); |
3458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3428 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3459 | 3429 |
3460 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3430 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3461 | 3431 |
3462 ASSERT_TRUE(pool_->HasGroup("a")); | 3432 ASSERT_TRUE(pool_->HasGroup("a")); |
3463 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3433 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
3464 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 3434 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
3465 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3435 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3466 | 3436 |
3467 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3437 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
3468 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3438 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
3469 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 3439 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
3470 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3440 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3471 | 3441 |
3472 ClientSocketHandle handle1; | 3442 ClientSocketHandle handle1; |
3473 TestCompletionCallback callback1; | 3443 TestCompletionCallback callback1; |
3474 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3444 EXPECT_EQ(ERR_IO_PENDING, |
3475 params_, | 3445 handle1.Init("a", |
3476 DEFAULT_PRIORITY, | 3446 params_, |
3477 callback1.callback(), | 3447 DEFAULT_PRIORITY, |
3478 pool_.get(), | 3448 callback1.callback(), |
3479 BoundNetLog())); | 3449 pool_.get(), |
| 3450 BoundNetLog())); |
3480 ASSERT_EQ(OK, callback1.WaitForResult()); | 3451 ASSERT_EQ(OK, callback1.WaitForResult()); |
3481 | 3452 |
3482 ClientSocketHandle handle2; | 3453 ClientSocketHandle handle2; |
3483 TestCompletionCallback callback2; | 3454 TestCompletionCallback callback2; |
3484 int rv = handle2.Init("a", | 3455 int rv = handle2.Init("a", |
3485 params_, | 3456 params_, |
3486 DEFAULT_PRIORITY, | 3457 DEFAULT_PRIORITY, |
3487 callback2.callback(), | 3458 callback2.callback(), |
3488 pool_.get(), | 3459 pool_.get(), |
3489 BoundNetLog()); | 3460 BoundNetLog()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3543 | 3514 |
3544 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); | 3515 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); |
3545 | 3516 |
3546 ASSERT_TRUE(pool_->HasGroup("a")); | 3517 ASSERT_TRUE(pool_->HasGroup("a")); |
3547 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3518 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3548 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3519 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
3549 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3520 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3550 | 3521 |
3551 ClientSocketHandle handle1; | 3522 ClientSocketHandle handle1; |
3552 TestCompletionCallback callback1; | 3523 TestCompletionCallback callback1; |
3553 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3524 EXPECT_EQ(ERR_IO_PENDING, |
3554 params_, | 3525 handle1.Init("a", |
3555 DEFAULT_PRIORITY, | 3526 params_, |
3556 callback1.callback(), | 3527 DEFAULT_PRIORITY, |
3557 pool_.get(), | 3528 callback1.callback(), |
3558 BoundNetLog())); | 3529 pool_.get(), |
| 3530 BoundNetLog())); |
3559 | 3531 |
3560 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3532 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3561 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3533 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3562 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3534 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3563 | 3535 |
3564 ASSERT_EQ(OK, callback1.WaitForResult()); | 3536 ASSERT_EQ(OK, callback1.WaitForResult()); |
3565 | 3537 |
3566 // Make sure if a preconnected socket is not fully connected when a request | 3538 // Make sure if a preconnected socket is not fully connected when a request |
3567 // starts, it has a connect start time. | 3539 // starts, it has a connect start time. |
3568 TestLoadTimingInfoConnectedNotReused(handle1); | 3540 TestLoadTimingInfoConnectedNotReused(handle1); |
3569 handle1.Reset(); | 3541 handle1.Reset(); |
3570 | 3542 |
3571 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3543 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3572 } | 3544 } |
3573 | 3545 |
3574 // Checks that fully connected preconnect jobs have no connect times, and are | 3546 // Checks that fully connected preconnect jobs have no connect times, and are |
3575 // marked as reused. | 3547 // marked as reused. |
3576 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) { | 3548 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) { |
3577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3549 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3578 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3550 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3579 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); | 3551 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); |
3580 | 3552 |
3581 ASSERT_TRUE(pool_->HasGroup("a")); | 3553 ASSERT_TRUE(pool_->HasGroup("a")); |
3582 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3554 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3583 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3555 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3584 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3556 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3585 | 3557 |
3586 ClientSocketHandle handle; | 3558 ClientSocketHandle handle; |
3587 TestCompletionCallback callback; | 3559 TestCompletionCallback callback; |
3588 EXPECT_EQ(OK, handle.Init("a", | 3560 EXPECT_EQ(OK, |
3589 params_, | 3561 handle.Init("a", |
3590 DEFAULT_PRIORITY, | 3562 params_, |
3591 callback.callback(), | 3563 DEFAULT_PRIORITY, |
3592 pool_.get(), | 3564 callback.callback(), |
3593 BoundNetLog())); | 3565 pool_.get(), |
| 3566 BoundNetLog())); |
3594 | 3567 |
3595 // Make sure the idle socket was used. | 3568 // Make sure the idle socket was used. |
3596 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3569 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3597 | 3570 |
3598 TestLoadTimingInfoConnectedReused(handle); | 3571 TestLoadTimingInfoConnectedReused(handle); |
3599 handle.Reset(); | 3572 handle.Reset(); |
3600 TestLoadTimingInfoNotConnected(handle); | 3573 TestLoadTimingInfoNotConnected(handle); |
3601 } | 3574 } |
3602 | 3575 |
3603 // http://crbug.com/64940 regression test. | 3576 // http://crbug.com/64940 regression test. |
3604 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { | 3577 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { |
3605 const int kMaxTotalSockets = 3; | 3578 const int kMaxTotalSockets = 3; |
3606 const int kMaxSocketsPerGroup = 2; | 3579 const int kMaxSocketsPerGroup = 2; |
3607 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); | 3580 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); |
3608 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3581 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3609 | 3582 |
3610 // Note that group name ordering matters here. "a" comes before "b", so | 3583 // Note that group name ordering matters here. "a" comes before "b", so |
3611 // CloseOneIdleSocket() will try to close "a"'s idle socket. | 3584 // CloseOneIdleSocket() will try to close "a"'s idle socket. |
3612 | 3585 |
3613 // Set up one idle socket in "a". | 3586 // Set up one idle socket in "a". |
3614 ClientSocketHandle handle1; | 3587 ClientSocketHandle handle1; |
3615 TestCompletionCallback callback1; | 3588 TestCompletionCallback callback1; |
3616 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3589 EXPECT_EQ(ERR_IO_PENDING, |
3617 params_, | 3590 handle1.Init("a", |
3618 DEFAULT_PRIORITY, | 3591 params_, |
3619 callback1.callback(), | 3592 DEFAULT_PRIORITY, |
3620 pool_.get(), | 3593 callback1.callback(), |
3621 BoundNetLog())); | 3594 pool_.get(), |
| 3595 BoundNetLog())); |
3622 | 3596 |
3623 ASSERT_EQ(OK, callback1.WaitForResult()); | 3597 ASSERT_EQ(OK, callback1.WaitForResult()); |
3624 handle1.Reset(); | 3598 handle1.Reset(); |
3625 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3599 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3626 | 3600 |
3627 // Set up two active sockets in "b". | 3601 // Set up two active sockets in "b". |
3628 ClientSocketHandle handle2; | 3602 ClientSocketHandle handle2; |
3629 TestCompletionCallback callback2; | 3603 TestCompletionCallback callback2; |
3630 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", | 3604 EXPECT_EQ(ERR_IO_PENDING, |
3631 params_, | 3605 handle1.Init("b", |
3632 DEFAULT_PRIORITY, | 3606 params_, |
3633 callback1.callback(), | 3607 DEFAULT_PRIORITY, |
3634 pool_.get(), | 3608 callback1.callback(), |
3635 BoundNetLog())); | 3609 pool_.get(), |
3636 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", | 3610 BoundNetLog())); |
3637 params_, | 3611 EXPECT_EQ(ERR_IO_PENDING, |
3638 DEFAULT_PRIORITY, | 3612 handle2.Init("b", |
3639 callback2.callback(), | 3613 params_, |
3640 pool_.get(), | 3614 DEFAULT_PRIORITY, |
3641 BoundNetLog())); | 3615 callback2.callback(), |
| 3616 pool_.get(), |
| 3617 BoundNetLog())); |
3642 | 3618 |
3643 ASSERT_EQ(OK, callback1.WaitForResult()); | 3619 ASSERT_EQ(OK, callback1.WaitForResult()); |
3644 ASSERT_EQ(OK, callback2.WaitForResult()); | 3620 ASSERT_EQ(OK, callback2.WaitForResult()); |
3645 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); | 3621 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); |
3646 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); | 3622 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); |
3647 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); | 3623 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); |
3648 | 3624 |
3649 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means | 3625 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means |
3650 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. | 3626 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. |
3651 // Requesting 2 preconnected sockets for "a" should fail to allocate any more | 3627 // Requesting 2 preconnected sockets for "a" should fail to allocate any more |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3714 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); | 3690 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); |
3715 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3691 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3716 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3692 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
3717 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3693 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3718 base::MessageLoop::current()->RunUntilIdle(); | 3694 base::MessageLoop::current()->RunUntilIdle(); |
3719 | 3695 |
3720 // Make the backup job be a pending job, so it completes normally. | 3696 // Make the backup job be a pending job, so it completes normally. |
3721 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3697 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
3722 ClientSocketHandle handle; | 3698 ClientSocketHandle handle; |
3723 TestCompletionCallback callback; | 3699 TestCompletionCallback callback; |
3724 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 3700 EXPECT_EQ(ERR_IO_PENDING, |
3725 params_, | 3701 handle.Init("a", |
3726 DEFAULT_PRIORITY, | 3702 params_, |
3727 callback.callback(), | 3703 DEFAULT_PRIORITY, |
3728 pool_.get(), | 3704 callback.callback(), |
3729 BoundNetLog())); | 3705 pool_.get(), |
| 3706 BoundNetLog())); |
3730 // Timer has started, but the backup connect job shouldn't be created yet. | 3707 // Timer has started, but the backup connect job shouldn't be created yet. |
3731 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3708 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3732 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3709 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3733 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3710 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3734 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); | 3711 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); |
3735 ASSERT_EQ(OK, callback.WaitForResult()); | 3712 ASSERT_EQ(OK, callback.WaitForResult()); |
3736 | 3713 |
3737 // The hung connect job should still be there, but everything else should be | 3714 // The hung connect job should still be there, but everything else should be |
3738 // complete. | 3715 // complete. |
3739 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3716 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
(...skipping 13 matching lines...) Expand all Loading... |
3753 ASSERT_TRUE(pool_->HasGroup("a")); | 3730 ASSERT_TRUE(pool_->HasGroup("a")); |
3754 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3731 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3755 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3732 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3756 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3733 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3757 | 3734 |
3758 // Fail future jobs to be sure that handle receives the preconnected socket | 3735 // Fail future jobs to be sure that handle receives the preconnected socket |
3759 // rather than closing it and making a new one. | 3736 // rather than closing it and making a new one. |
3760 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 3737 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
3761 ClientSocketHandle handle; | 3738 ClientSocketHandle handle; |
3762 TestCompletionCallback callback; | 3739 TestCompletionCallback callback; |
3763 EXPECT_EQ(OK, handle.Init("a", | 3740 EXPECT_EQ(OK, |
3764 params_, | 3741 handle.Init("a", |
3765 DEFAULT_PRIORITY, | 3742 params_, |
3766 callback.callback(), | 3743 DEFAULT_PRIORITY, |
3767 pool_.get(), | 3744 callback.callback(), |
3768 BoundNetLog())); | 3745 pool_.get(), |
| 3746 BoundNetLog())); |
3769 | 3747 |
3770 ASSERT_TRUE(pool_->HasGroup("a")); | 3748 ASSERT_TRUE(pool_->HasGroup("a")); |
3771 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3749 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
3772 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3750 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3773 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3751 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3774 | 3752 |
3775 // Drain the pending read. | 3753 // Drain the pending read. |
3776 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback())); | 3754 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback())); |
3777 | 3755 |
3778 TestLoadTimingInfoConnectedReused(handle); | 3756 TestLoadTimingInfoConnectedReused(handle); |
3779 handle.Reset(); | 3757 handle.Reset(); |
3780 | 3758 |
3781 // The socket should be usable now that it's idle again. | 3759 // The socket should be usable now that it's idle again. |
3782 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3760 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
3783 } | 3761 } |
3784 | 3762 |
3785 class MockLayeredPool : public HigherLayeredPool { | 3763 class MockLayeredPool : public HigherLayeredPool { |
3786 public: | 3764 public: |
3787 MockLayeredPool(TestClientSocketPool* pool, | 3765 MockLayeredPool(TestClientSocketPool* pool, const std::string& group_name) |
3788 const std::string& group_name) | 3766 : pool_(pool), group_name_(group_name), can_release_connection_(true) { |
3789 : pool_(pool), | |
3790 group_name_(group_name), | |
3791 can_release_connection_(true) { | |
3792 pool_->AddHigherLayeredPool(this); | 3767 pool_->AddHigherLayeredPool(this); |
3793 } | 3768 } |
3794 | 3769 |
3795 ~MockLayeredPool() { | 3770 ~MockLayeredPool() { pool_->RemoveHigherLayeredPool(this); } |
3796 pool_->RemoveHigherLayeredPool(this); | |
3797 } | |
3798 | 3771 |
3799 int RequestSocket(TestClientSocketPool* pool) { | 3772 int RequestSocket(TestClientSocketPool* pool) { |
3800 scoped_refptr<TestSocketParams> params( | 3773 scoped_refptr<TestSocketParams> params( |
3801 new TestSocketParams(false /* ignore_limits */)); | 3774 new TestSocketParams(false /* ignore_limits */)); |
3802 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, | 3775 return handle_.Init(group_name_, |
3803 callback_.callback(), pool, BoundNetLog()); | 3776 params, |
| 3777 DEFAULT_PRIORITY, |
| 3778 callback_.callback(), |
| 3779 pool, |
| 3780 BoundNetLog()); |
3804 } | 3781 } |
3805 | 3782 |
3806 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { | 3783 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { |
3807 scoped_refptr<TestSocketParams> params( | 3784 scoped_refptr<TestSocketParams> params( |
3808 new TestSocketParams(true /* ignore_limits */)); | 3785 new TestSocketParams(true /* ignore_limits */)); |
3809 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, | 3786 return handle_.Init(group_name_, |
3810 callback_.callback(), pool, BoundNetLog()); | 3787 params, |
| 3788 MAXIMUM_PRIORITY, |
| 3789 callback_.callback(), |
| 3790 pool, |
| 3791 BoundNetLog()); |
3811 } | 3792 } |
3812 | 3793 |
3813 bool ReleaseOneConnection() { | 3794 bool ReleaseOneConnection() { |
3814 if (!handle_.is_initialized() || !can_release_connection_) { | 3795 if (!handle_.is_initialized() || !can_release_connection_) { |
3815 return false; | 3796 return false; |
3816 } | 3797 } |
3817 handle_.socket()->Disconnect(); | 3798 handle_.socket()->Disconnect(); |
3818 handle_.Reset(); | 3799 handle_.Reset(); |
3819 return true; | 3800 return true; |
3820 } | 3801 } |
(...skipping 22 matching lines...) Expand all Loading... |
3843 .WillOnce(Return(false)); | 3824 .WillOnce(Return(false)); |
3844 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); | 3825 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
3845 } | 3826 } |
3846 | 3827 |
3847 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { | 3828 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { |
3848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3829 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3849 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3830 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3850 | 3831 |
3851 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3832 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3852 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3833 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3853 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3834 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillOnce( |
3854 .WillOnce(Invoke(&mock_layered_pool, | 3835 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection)); |
3855 &MockLayeredPool::ReleaseOneConnection)); | |
3856 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); | 3836 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
3857 } | 3837 } |
3858 | 3838 |
3859 // Tests the basic case of closing an idle socket in a higher layered pool when | 3839 // Tests the basic case of closing an idle socket in a higher layered pool when |
3860 // a new request is issued and the lower layer pool is stalled. | 3840 // a new request is issued and the lower layer pool is stalled. |
3861 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { | 3841 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { |
3862 CreatePool(1, 1); | 3842 CreatePool(1, 1); |
3863 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3843 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3864 | 3844 |
3865 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3845 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3866 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3846 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3867 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3847 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillOnce( |
3868 .WillOnce(Invoke(&mock_layered_pool, | 3848 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection)); |
3869 &MockLayeredPool::ReleaseOneConnection)); | |
3870 ClientSocketHandle handle; | 3849 ClientSocketHandle handle; |
3871 TestCompletionCallback callback; | 3850 TestCompletionCallback callback; |
3872 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 3851 EXPECT_EQ(ERR_IO_PENDING, |
3873 params_, | 3852 handle.Init("a", |
3874 DEFAULT_PRIORITY, | 3853 params_, |
3875 callback.callback(), | 3854 DEFAULT_PRIORITY, |
3876 pool_.get(), | 3855 callback.callback(), |
3877 BoundNetLog())); | 3856 pool_.get(), |
| 3857 BoundNetLog())); |
3878 EXPECT_EQ(OK, callback.WaitForResult()); | 3858 EXPECT_EQ(OK, callback.WaitForResult()); |
3879 } | 3859 } |
3880 | 3860 |
3881 // Same as above, but the idle socket is in the same group as the stalled | 3861 // Same as above, but the idle socket is in the same group as the stalled |
3882 // socket, and closes the only other request in its group when closing requests | 3862 // socket, and closes the only other request in its group when closing requests |
3883 // in higher layered pools. This generally shouldn't happen, but it may be | 3863 // in higher layered pools. This generally shouldn't happen, but it may be |
3884 // possible if a higher level pool issues a request and the request is | 3864 // possible if a higher level pool issues a request and the request is |
3885 // subsequently cancelled. Even if it's not possible, best not to crash. | 3865 // subsequently cancelled. Even if it's not possible, best not to crash. |
3886 TEST_F(ClientSocketPoolBaseTest, | 3866 TEST_F(ClientSocketPoolBaseTest, |
3887 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { | 3867 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { |
3888 CreatePool(2, 2); | 3868 CreatePool(2, 2); |
3889 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3869 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3890 | 3870 |
3891 // Need a socket in another group for the pool to be stalled (If a group | 3871 // Need a socket in another group for the pool to be stalled (If a group |
3892 // has the maximum number of connections already, it's not stalled). | 3872 // has the maximum number of connections already, it's not stalled). |
3893 ClientSocketHandle handle1; | 3873 ClientSocketHandle handle1; |
3894 TestCompletionCallback callback1; | 3874 TestCompletionCallback callback1; |
3895 EXPECT_EQ(OK, handle1.Init("group1", | 3875 EXPECT_EQ(OK, |
3896 params_, | 3876 handle1.Init("group1", |
3897 DEFAULT_PRIORITY, | 3877 params_, |
3898 callback1.callback(), | 3878 DEFAULT_PRIORITY, |
3899 pool_.get(), | 3879 callback1.callback(), |
3900 BoundNetLog())); | 3880 pool_.get(), |
| 3881 BoundNetLog())); |
3901 | 3882 |
3902 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3883 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
3903 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3884 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3904 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3885 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillOnce( |
3905 .WillOnce(Invoke(&mock_layered_pool, | 3886 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection)); |
3906 &MockLayeredPool::ReleaseOneConnection)); | |
3907 ClientSocketHandle handle; | 3887 ClientSocketHandle handle; |
3908 TestCompletionCallback callback2; | 3888 TestCompletionCallback callback2; |
3909 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2", | 3889 EXPECT_EQ(ERR_IO_PENDING, |
3910 params_, | 3890 handle.Init("group2", |
3911 DEFAULT_PRIORITY, | 3891 params_, |
3912 callback2.callback(), | 3892 DEFAULT_PRIORITY, |
3913 pool_.get(), | 3893 callback2.callback(), |
3914 BoundNetLog())); | 3894 pool_.get(), |
| 3895 BoundNetLog())); |
3915 EXPECT_EQ(OK, callback2.WaitForResult()); | 3896 EXPECT_EQ(OK, callback2.WaitForResult()); |
3916 } | 3897 } |
3917 | 3898 |
3918 // Tests the case when an idle socket can be closed when a new request is | 3899 // Tests the case when an idle socket can be closed when a new request is |
3919 // issued, and the new request belongs to a group that was previously stalled. | 3900 // issued, and the new request belongs to a group that was previously stalled. |
3920 TEST_F(ClientSocketPoolBaseTest, | 3901 TEST_F(ClientSocketPoolBaseTest, |
3921 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { | 3902 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { |
3922 CreatePool(2, 2); | 3903 CreatePool(2, 2); |
3923 std::list<TestConnectJob::JobType> job_types; | 3904 std::list<TestConnectJob::JobType> job_types; |
3924 job_types.push_back(TestConnectJob::kMockJob); | 3905 job_types.push_back(TestConnectJob::kMockJob); |
3925 job_types.push_back(TestConnectJob::kMockJob); | 3906 job_types.push_back(TestConnectJob::kMockJob); |
3926 job_types.push_back(TestConnectJob::kMockJob); | 3907 job_types.push_back(TestConnectJob::kMockJob); |
3927 job_types.push_back(TestConnectJob::kMockJob); | 3908 job_types.push_back(TestConnectJob::kMockJob); |
3928 connect_job_factory_->set_job_types(&job_types); | 3909 connect_job_factory_->set_job_types(&job_types); |
3929 | 3910 |
3930 ClientSocketHandle handle1; | 3911 ClientSocketHandle handle1; |
3931 TestCompletionCallback callback1; | 3912 TestCompletionCallback callback1; |
3932 EXPECT_EQ(OK, handle1.Init("group1", | 3913 EXPECT_EQ(OK, |
3933 params_, | 3914 handle1.Init("group1", |
3934 DEFAULT_PRIORITY, | 3915 params_, |
3935 callback1.callback(), | 3916 DEFAULT_PRIORITY, |
3936 pool_.get(), | 3917 callback1.callback(), |
3937 BoundNetLog())); | 3918 pool_.get(), |
| 3919 BoundNetLog())); |
3938 | 3920 |
3939 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3921 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
3940 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3922 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3941 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3923 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillRepeatedly( |
3942 .WillRepeatedly(Invoke(&mock_layered_pool, | 3924 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection)); |
3943 &MockLayeredPool::ReleaseOneConnection)); | |
3944 mock_layered_pool.set_can_release_connection(false); | 3925 mock_layered_pool.set_can_release_connection(false); |
3945 | 3926 |
3946 // The third request is made when the socket pool is in a stalled state. | 3927 // The third request is made when the socket pool is in a stalled state. |
3947 ClientSocketHandle handle3; | 3928 ClientSocketHandle handle3; |
3948 TestCompletionCallback callback3; | 3929 TestCompletionCallback callback3; |
3949 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", | 3930 EXPECT_EQ(ERR_IO_PENDING, |
3950 params_, | 3931 handle3.Init("group3", |
3951 DEFAULT_PRIORITY, | 3932 params_, |
3952 callback3.callback(), | 3933 DEFAULT_PRIORITY, |
3953 pool_.get(), | 3934 callback3.callback(), |
3954 BoundNetLog())); | 3935 pool_.get(), |
| 3936 BoundNetLog())); |
3955 | 3937 |
3956 base::RunLoop().RunUntilIdle(); | 3938 base::RunLoop().RunUntilIdle(); |
3957 EXPECT_FALSE(callback3.have_result()); | 3939 EXPECT_FALSE(callback3.have_result()); |
3958 | 3940 |
3959 // The fourth request is made when the pool is no longer stalled. The third | 3941 // The fourth request is made when the pool is no longer stalled. The third |
3960 // request should be serviced first, since it was issued first and has the | 3942 // request should be serviced first, since it was issued first and has the |
3961 // same priority. | 3943 // same priority. |
3962 mock_layered_pool.set_can_release_connection(true); | 3944 mock_layered_pool.set_can_release_connection(true); |
3963 ClientSocketHandle handle4; | 3945 ClientSocketHandle handle4; |
3964 TestCompletionCallback callback4; | 3946 TestCompletionCallback callback4; |
3965 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", | 3947 EXPECT_EQ(ERR_IO_PENDING, |
3966 params_, | 3948 handle4.Init("group3", |
3967 DEFAULT_PRIORITY, | 3949 params_, |
3968 callback4.callback(), | 3950 DEFAULT_PRIORITY, |
3969 pool_.get(), | 3951 callback4.callback(), |
3970 BoundNetLog())); | 3952 pool_.get(), |
| 3953 BoundNetLog())); |
3971 EXPECT_EQ(OK, callback3.WaitForResult()); | 3954 EXPECT_EQ(OK, callback3.WaitForResult()); |
3972 EXPECT_FALSE(callback4.have_result()); | 3955 EXPECT_FALSE(callback4.have_result()); |
3973 | 3956 |
3974 // Closing a handle should free up another socket slot. | 3957 // Closing a handle should free up another socket slot. |
3975 handle1.Reset(); | 3958 handle1.Reset(); |
3976 EXPECT_EQ(OK, callback4.WaitForResult()); | 3959 EXPECT_EQ(OK, callback4.WaitForResult()); |
3977 } | 3960 } |
3978 | 3961 |
3979 // Tests the case when an idle socket can be closed when a new request is | 3962 // Tests the case when an idle socket can be closed when a new request is |
3980 // issued, and the new request belongs to a group that was previously stalled. | 3963 // issued, and the new request belongs to a group that was previously stalled. |
3981 // | 3964 // |
3982 // The two differences from the above test are that the stalled requests are not | 3965 // The two differences from the above test are that the stalled requests are not |
3983 // in the same group as the layered pool's request, and the the fourth request | 3966 // in the same group as the layered pool's request, and the the fourth request |
3984 // has a higher priority than the third one, so gets a socket first. | 3967 // has a higher priority than the third one, so gets a socket first. |
3985 TEST_F(ClientSocketPoolBaseTest, | 3968 TEST_F(ClientSocketPoolBaseTest, |
3986 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { | 3969 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { |
3987 CreatePool(2, 2); | 3970 CreatePool(2, 2); |
3988 std::list<TestConnectJob::JobType> job_types; | 3971 std::list<TestConnectJob::JobType> job_types; |
3989 job_types.push_back(TestConnectJob::kMockJob); | 3972 job_types.push_back(TestConnectJob::kMockJob); |
3990 job_types.push_back(TestConnectJob::kMockJob); | 3973 job_types.push_back(TestConnectJob::kMockJob); |
3991 job_types.push_back(TestConnectJob::kMockJob); | 3974 job_types.push_back(TestConnectJob::kMockJob); |
3992 job_types.push_back(TestConnectJob::kMockJob); | 3975 job_types.push_back(TestConnectJob::kMockJob); |
3993 connect_job_factory_->set_job_types(&job_types); | 3976 connect_job_factory_->set_job_types(&job_types); |
3994 | 3977 |
3995 ClientSocketHandle handle1; | 3978 ClientSocketHandle handle1; |
3996 TestCompletionCallback callback1; | 3979 TestCompletionCallback callback1; |
3997 EXPECT_EQ(OK, handle1.Init("group1", | 3980 EXPECT_EQ(OK, |
3998 params_, | 3981 handle1.Init("group1", |
3999 DEFAULT_PRIORITY, | 3982 params_, |
4000 callback1.callback(), | 3983 DEFAULT_PRIORITY, |
4001 pool_.get(), | 3984 callback1.callback(), |
4002 BoundNetLog())); | 3985 pool_.get(), |
| 3986 BoundNetLog())); |
4003 | 3987 |
4004 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3988 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
4005 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3989 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
4006 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3990 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillRepeatedly( |
4007 .WillRepeatedly(Invoke(&mock_layered_pool, | 3991 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection)); |
4008 &MockLayeredPool::ReleaseOneConnection)); | |
4009 mock_layered_pool.set_can_release_connection(false); | 3992 mock_layered_pool.set_can_release_connection(false); |
4010 | 3993 |
4011 // The third request is made when the socket pool is in a stalled state. | 3994 // The third request is made when the socket pool is in a stalled state. |
4012 ClientSocketHandle handle3; | 3995 ClientSocketHandle handle3; |
4013 TestCompletionCallback callback3; | 3996 TestCompletionCallback callback3; |
4014 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", | 3997 EXPECT_EQ(ERR_IO_PENDING, |
4015 params_, | 3998 handle3.Init("group3", |
4016 MEDIUM, | 3999 params_, |
4017 callback3.callback(), | 4000 MEDIUM, |
4018 pool_.get(), | 4001 callback3.callback(), |
4019 BoundNetLog())); | 4002 pool_.get(), |
| 4003 BoundNetLog())); |
4020 | 4004 |
4021 base::RunLoop().RunUntilIdle(); | 4005 base::RunLoop().RunUntilIdle(); |
4022 EXPECT_FALSE(callback3.have_result()); | 4006 EXPECT_FALSE(callback3.have_result()); |
4023 | 4007 |
4024 // The fourth request is made when the pool is no longer stalled. This | 4008 // The fourth request is made when the pool is no longer stalled. This |
4025 // request has a higher priority than the third request, so is serviced first. | 4009 // request has a higher priority than the third request, so is serviced first. |
4026 mock_layered_pool.set_can_release_connection(true); | 4010 mock_layered_pool.set_can_release_connection(true); |
4027 ClientSocketHandle handle4; | 4011 ClientSocketHandle handle4; |
4028 TestCompletionCallback callback4; | 4012 TestCompletionCallback callback4; |
4029 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", | 4013 EXPECT_EQ(ERR_IO_PENDING, |
4030 params_, | 4014 handle4.Init("group3", |
4031 HIGHEST, | 4015 params_, |
4032 callback4.callback(), | 4016 HIGHEST, |
4033 pool_.get(), | 4017 callback4.callback(), |
4034 BoundNetLog())); | 4018 pool_.get(), |
| 4019 BoundNetLog())); |
4035 EXPECT_EQ(OK, callback4.WaitForResult()); | 4020 EXPECT_EQ(OK, callback4.WaitForResult()); |
4036 EXPECT_FALSE(callback3.have_result()); | 4021 EXPECT_FALSE(callback3.have_result()); |
4037 | 4022 |
4038 // Closing a handle should free up another socket slot. | 4023 // Closing a handle should free up another socket slot. |
4039 handle1.Reset(); | 4024 handle1.Reset(); |
4040 EXPECT_EQ(OK, callback3.WaitForResult()); | 4025 EXPECT_EQ(OK, callback3.WaitForResult()); |
4041 } | 4026 } |
4042 | 4027 |
4043 TEST_F(ClientSocketPoolBaseTest, | 4028 TEST_F(ClientSocketPoolBaseTest, |
4044 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { | 4029 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { |
4045 CreatePool(1, 1); | 4030 CreatePool(1, 1); |
4046 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 4031 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
4047 | 4032 |
4048 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); | 4033 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); |
4049 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); | 4034 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); |
4050 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) | 4035 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()).WillRepeatedly( |
4051 .WillRepeatedly(Invoke(&mock_layered_pool1, | 4036 Invoke(&mock_layered_pool1, &MockLayeredPool::ReleaseOneConnection)); |
4052 &MockLayeredPool::ReleaseOneConnection)); | |
4053 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); | 4037 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); |
4054 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); | 4038 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); |
4055 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) | 4039 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()).WillRepeatedly( |
4056 .WillRepeatedly(Invoke(&mock_layered_pool2, | 4040 Invoke(&mock_layered_pool2, &MockLayeredPool::ReleaseOneConnection)); |
4057 &MockLayeredPool::ReleaseOneConnection)); | |
4058 ClientSocketHandle handle; | 4041 ClientSocketHandle handle; |
4059 TestCompletionCallback callback; | 4042 TestCompletionCallback callback; |
4060 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 4043 EXPECT_EQ(ERR_IO_PENDING, |
4061 params_, | 4044 handle.Init("a", |
4062 DEFAULT_PRIORITY, | 4045 params_, |
4063 callback.callback(), | 4046 DEFAULT_PRIORITY, |
4064 pool_.get(), | 4047 callback.callback(), |
4065 BoundNetLog())); | 4048 pool_.get(), |
| 4049 BoundNetLog())); |
4066 EXPECT_EQ(OK, callback.WaitForResult()); | 4050 EXPECT_EQ(OK, callback.WaitForResult()); |
4067 } | 4051 } |
4068 | 4052 |
4069 // Test that when a socket pool and group are at their limits, a request | 4053 // Test that when a socket pool and group are at their limits, a request |
4070 // with |ignore_limits| triggers creation of a new socket, and gets the socket | 4054 // with |ignore_limits| triggers creation of a new socket, and gets the socket |
4071 // instead of a request with the same priority that was issued earlier, but | 4055 // instead of a request with the same priority that was issued earlier, but |
4072 // that does not have |ignore_limits| set. | 4056 // that does not have |ignore_limits| set. |
4073 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { | 4057 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { |
4074 scoped_refptr<TestSocketParams> params_ignore_limits( | 4058 scoped_refptr<TestSocketParams> params_ignore_limits( |
4075 new TestSocketParams(true /* ignore_limits */)); | 4059 new TestSocketParams(true /* ignore_limits */)); |
4076 CreatePool(1, 1); | 4060 CreatePool(1, 1); |
4077 | 4061 |
4078 // Issue a request to reach the socket pool limit. | 4062 // Issue a request to reach the socket pool limit. |
4079 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); | 4063 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); |
4080 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 4064 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
4081 | 4065 |
4082 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 4066 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
4083 | 4067 |
4084 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 4068 EXPECT_EQ(ERR_IO_PENDING, |
4085 params_)); | 4069 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); |
4086 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 4070 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
4087 | 4071 |
4088 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 4072 EXPECT_EQ( |
4089 params_ignore_limits)); | 4073 ERR_IO_PENDING, |
| 4074 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_ignore_limits)); |
4090 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 4075 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
4091 | 4076 |
4092 EXPECT_EQ(OK, request(2)->WaitForResult()); | 4077 EXPECT_EQ(OK, request(2)->WaitForResult()); |
4093 EXPECT_FALSE(request(1)->have_result()); | 4078 EXPECT_FALSE(request(1)->have_result()); |
4094 } | 4079 } |
4095 | 4080 |
4096 // Test that when a socket pool and group are at their limits, a ConnectJob | 4081 // Test that when a socket pool and group are at their limits, a ConnectJob |
4097 // issued for a request with |ignore_limits| set is not cancelled when a request | 4082 // issued for a request with |ignore_limits| set is not cancelled when a request |
4098 // without |ignore_limits| issued to the same group is cancelled. | 4083 // without |ignore_limits| issued to the same group is cancelled. |
4099 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { | 4084 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { |
4100 scoped_refptr<TestSocketParams> params_ignore_limits( | 4085 scoped_refptr<TestSocketParams> params_ignore_limits( |
4101 new TestSocketParams(true /* ignore_limits */)); | 4086 new TestSocketParams(true /* ignore_limits */)); |
4102 CreatePool(1, 1); | 4087 CreatePool(1, 1); |
4103 | 4088 |
4104 // Issue a request to reach the socket pool limit. | 4089 // Issue a request to reach the socket pool limit. |
4105 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); | 4090 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); |
4106 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 4091 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
4107 | 4092 |
4108 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 4093 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
4109 | 4094 |
4110 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 4095 EXPECT_EQ(ERR_IO_PENDING, |
4111 params_)); | 4096 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); |
4112 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 4097 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
4113 | 4098 |
4114 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 4099 EXPECT_EQ( |
4115 params_ignore_limits)); | 4100 ERR_IO_PENDING, |
| 4101 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_ignore_limits)); |
4116 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 4102 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
4117 | 4103 |
4118 // Cancel the pending request without ignore_limits set. The ConnectJob | 4104 // Cancel the pending request without ignore_limits set. The ConnectJob |
4119 // should not be cancelled. | 4105 // should not be cancelled. |
4120 request(1)->handle()->Reset(); | 4106 request(1)->handle()->Reset(); |
4121 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 4107 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
4122 | 4108 |
4123 EXPECT_EQ(OK, request(2)->WaitForResult()); | 4109 EXPECT_EQ(OK, request(2)->WaitForResult()); |
4124 EXPECT_FALSE(request(1)->have_result()); | 4110 EXPECT_FALSE(request(1)->have_result()); |
4125 } | 4111 } |
4126 | 4112 |
4127 } // namespace | 4113 } // namespace |
4128 | 4114 |
4129 } // namespace net | 4115 } // namespace net |
OLD | NEW |