| 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 |