Chromium Code Reviews| 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 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 const SSLClientSocketContext& context) OVERRIDE { | 213 const SSLClientSocketContext& context) OVERRIDE { |
| 214 NOTIMPLEMENTED(); | 214 NOTIMPLEMENTED(); |
| 215 return NULL; | 215 return NULL; |
| 216 } | 216 } |
| 217 | 217 |
| 218 virtual void ClearSSLSessionCache() OVERRIDE { | 218 virtual void ClearSSLSessionCache() OVERRIDE { |
| 219 NOTIMPLEMENTED(); | 219 NOTIMPLEMENTED(); |
| 220 } | 220 } |
| 221 | 221 |
| 222 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } | 222 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } |
| 223 | |
| 223 void SignalJobs(); | 224 void SignalJobs(); |
| 224 | 225 |
| 226 void SignalJob(size_t job); | |
| 227 | |
| 228 void SetJobLoadState(size_t job, LoadState load_state); | |
| 229 | |
| 225 int allocation_count() const { return allocation_count_; } | 230 int allocation_count() const { return allocation_count_; } |
| 226 | 231 |
| 227 private: | 232 private: |
| 228 int allocation_count_; | 233 int allocation_count_; |
| 229 std::vector<TestConnectJob*> waiting_jobs_; | 234 std::vector<TestConnectJob*> waiting_jobs_; |
| 230 }; | 235 }; |
| 231 | 236 |
| 232 class TestConnectJob : public ConnectJob { | 237 class TestConnectJob : public ConnectJob { |
| 233 public: | 238 public: |
| 234 enum JobType { | 239 enum JobType { |
| 235 kMockJob, | 240 kMockJob, |
| 236 kMockFailingJob, | 241 kMockFailingJob, |
| 237 kMockPendingJob, | 242 kMockPendingJob, |
| 238 kMockPendingFailingJob, | 243 kMockPendingFailingJob, |
| 239 kMockWaitingJob, | 244 kMockWaitingJob, |
| 240 kMockAdvancingLoadStateJob, | |
| 241 kMockRecoverableJob, | 245 kMockRecoverableJob, |
| 242 kMockPendingRecoverableJob, | 246 kMockPendingRecoverableJob, |
| 243 kMockAdditionalErrorStateJob, | 247 kMockAdditionalErrorStateJob, |
| 244 kMockPendingAdditionalErrorStateJob, | 248 kMockPendingAdditionalErrorStateJob, |
| 245 }; | 249 }; |
| 246 | 250 |
| 247 // The kMockPendingJob uses a slight delay before allowing the connect | 251 // The kMockPendingJob uses a slight delay before allowing the connect |
| 248 // to complete. | 252 // to complete. |
| 249 static const int kPendingConnectDelay = 2; | 253 static const int kPendingConnectDelay = 2; |
| 250 | 254 |
| 251 TestConnectJob(JobType job_type, | 255 TestConnectJob(JobType job_type, |
| 252 const std::string& group_name, | 256 const std::string& group_name, |
| 253 const TestClientSocketPoolBase::Request& request, | 257 const TestClientSocketPoolBase::Request& request, |
| 254 base::TimeDelta timeout_duration, | 258 base::TimeDelta timeout_duration, |
| 255 ConnectJob::Delegate* delegate, | 259 ConnectJob::Delegate* delegate, |
| 256 MockClientSocketFactory* client_socket_factory, | 260 MockClientSocketFactory* client_socket_factory, |
| 257 NetLog* net_log) | 261 NetLog* net_log) |
| 258 : ConnectJob(group_name, timeout_duration, delegate, | 262 : ConnectJob(group_name, timeout_duration, delegate, |
| 259 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), | 263 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), |
| 260 job_type_(job_type), | 264 job_type_(job_type), |
| 261 client_socket_factory_(client_socket_factory), | 265 client_socket_factory_(client_socket_factory), |
| 262 weak_factory_(this), | 266 weak_factory_(this), |
| 263 load_state_(LOAD_STATE_IDLE), | 267 load_state_(LOAD_STATE_IDLE), |
| 264 store_additional_error_state_(false) {} | 268 store_additional_error_state_(false) {} |
| 265 | 269 |
| 266 void Signal() { | 270 void Signal() { |
| 267 DoConnect(waiting_success_, true /* async */, false /* recoverable */); | 271 DoConnect(waiting_success_, true /* async */, false /* recoverable */); |
| 268 } | 272 } |
| 269 | 273 |
| 274 void set_load_state(LoadState load_state) { load_state_ = load_state; } | |
| 275 | |
| 276 // From ConnectJob: | |
| 277 | |
| 270 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; } | 278 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; } |
| 271 | 279 |
| 272 virtual void GetAdditionalErrorState(ClientSocketHandle* handle) OVERRIDE { | 280 virtual void GetAdditionalErrorState(ClientSocketHandle* handle) OVERRIDE { |
| 273 if (store_additional_error_state_) { | 281 if (store_additional_error_state_) { |
| 274 // Set all of the additional error state fields in some way. | 282 // Set all of the additional error state fields in some way. |
| 275 handle->set_is_ssl_error(true); | 283 handle->set_is_ssl_error(true); |
| 276 HttpResponseInfo info; | 284 HttpResponseInfo info; |
| 277 info.headers = new HttpResponseHeaders(std::string()); | 285 info.headers = new HttpResponseHeaders(std::string()); |
| 278 handle->set_ssl_error_response_info(info); | 286 handle->set_ssl_error_response_info(info); |
| 279 } | 287 } |
| 280 } | 288 } |
| 281 | 289 |
| 282 private: | 290 private: |
| 283 // ConnectJob implementation. | 291 // From ConnectJob: |
| 284 | 292 |
| 285 virtual int ConnectInternal() OVERRIDE { | 293 virtual int ConnectInternal() OVERRIDE { |
| 286 AddressList ignored; | 294 AddressList ignored; |
| 287 client_socket_factory_->CreateTransportClientSocket( | 295 client_socket_factory_->CreateTransportClientSocket( |
| 288 ignored, NULL, net::NetLog::Source()); | 296 ignored, NULL, net::NetLog::Source()); |
| 289 set_socket(new MockClientSocket(net_log().net_log())); | 297 set_socket(new MockClientSocket(net_log().net_log())); |
| 290 switch (job_type_) { | 298 switch (job_type_) { |
| 291 case kMockJob: | 299 case kMockJob: |
| 292 return DoConnect(true /* successful */, false /* sync */, | 300 return DoConnect(true /* successful */, false /* sync */, |
| 293 false /* recoverable */); | 301 false /* recoverable */); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 322 base::MessageLoop::current()->PostDelayedTask( | 330 base::MessageLoop::current()->PostDelayedTask( |
| 323 FROM_HERE, | 331 FROM_HERE, |
| 324 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), | 332 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), |
| 325 weak_factory_.GetWeakPtr(), | 333 weak_factory_.GetWeakPtr(), |
| 326 false /* error */, | 334 false /* error */, |
| 327 true /* async */, | 335 true /* async */, |
| 328 false /* recoverable */), | 336 false /* recoverable */), |
| 329 base::TimeDelta::FromMilliseconds(2)); | 337 base::TimeDelta::FromMilliseconds(2)); |
| 330 return ERR_IO_PENDING; | 338 return ERR_IO_PENDING; |
| 331 case kMockWaitingJob: | 339 case kMockWaitingJob: |
| 340 set_load_state(LOAD_STATE_CONNECTING); | |
| 332 client_socket_factory_->WaitForSignal(this); | 341 client_socket_factory_->WaitForSignal(this); |
| 333 waiting_success_ = true; | 342 waiting_success_ = true; |
| 334 return ERR_IO_PENDING; | 343 return ERR_IO_PENDING; |
| 335 case kMockAdvancingLoadStateJob: | |
| 336 base::MessageLoop::current()->PostTask( | |
| 337 FROM_HERE, base::Bind(&TestConnectJob::AdvanceLoadState, | |
| 338 weak_factory_.GetWeakPtr(), load_state_)); | |
| 339 return ERR_IO_PENDING; | |
| 340 case kMockRecoverableJob: | 344 case kMockRecoverableJob: |
| 341 return DoConnect(false /* error */, false /* sync */, | 345 return DoConnect(false /* error */, false /* sync */, |
| 342 true /* recoverable */); | 346 true /* recoverable */); |
| 343 case kMockPendingRecoverableJob: | 347 case kMockPendingRecoverableJob: |
| 344 set_load_state(LOAD_STATE_CONNECTING); | 348 set_load_state(LOAD_STATE_CONNECTING); |
| 345 base::MessageLoop::current()->PostDelayedTask( | 349 base::MessageLoop::current()->PostDelayedTask( |
| 346 FROM_HERE, | 350 FROM_HERE, |
| 347 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), | 351 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), |
| 348 weak_factory_.GetWeakPtr(), | 352 weak_factory_.GetWeakPtr(), |
| 349 false /* error */, | 353 false /* error */, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 367 false /* recoverable */), | 371 false /* recoverable */), |
| 368 base::TimeDelta::FromMilliseconds(2)); | 372 base::TimeDelta::FromMilliseconds(2)); |
| 369 return ERR_IO_PENDING; | 373 return ERR_IO_PENDING; |
| 370 default: | 374 default: |
| 371 NOTREACHED(); | 375 NOTREACHED(); |
| 372 set_socket(NULL); | 376 set_socket(NULL); |
| 373 return ERR_FAILED; | 377 return ERR_FAILED; |
| 374 } | 378 } |
| 375 } | 379 } |
| 376 | 380 |
| 377 void set_load_state(LoadState load_state) { load_state_ = load_state; } | |
| 378 | |
| 379 int DoConnect(bool succeed, bool was_async, bool recoverable) { | 381 int DoConnect(bool succeed, bool was_async, bool recoverable) { |
| 380 int result = OK; | 382 int result = OK; |
| 381 if (succeed) { | 383 if (succeed) { |
| 382 socket()->Connect(CompletionCallback()); | 384 socket()->Connect(CompletionCallback()); |
| 383 } else if (recoverable) { | 385 } else if (recoverable) { |
| 384 result = ERR_PROXY_AUTH_REQUESTED; | 386 result = ERR_PROXY_AUTH_REQUESTED; |
| 385 } else { | 387 } else { |
| 386 result = ERR_CONNECTION_FAILED; | 388 result = ERR_CONNECTION_FAILED; |
| 387 set_socket(NULL); | 389 set_socket(NULL); |
| 388 } | 390 } |
| 389 | 391 |
| 390 if (was_async) | 392 if (was_async) |
| 391 NotifyDelegateOfCompletion(result); | 393 NotifyDelegateOfCompletion(result); |
| 392 return result; | 394 return result; |
| 393 } | 395 } |
| 394 | 396 |
| 395 // This function helps simulate the progress of load states on a ConnectJob. | |
| 396 // Each time it is called it advances the load state and posts a task to be | |
| 397 // called again. It stops at the last connecting load state (the one | |
| 398 // before LOAD_STATE_SENDING_REQUEST). | |
| 399 void AdvanceLoadState(LoadState state) { | |
| 400 int tmp = state; | |
| 401 tmp++; | |
| 402 if (tmp < LOAD_STATE_SENDING_REQUEST) { | |
| 403 state = static_cast<LoadState>(tmp); | |
| 404 set_load_state(state); | |
| 405 base::MessageLoop::current()->PostTask( | |
| 406 FROM_HERE, base::Bind(&TestConnectJob::AdvanceLoadState, | |
| 407 weak_factory_.GetWeakPtr(), state)); | |
| 408 } | |
| 409 } | |
| 410 | |
| 411 bool waiting_success_; | 397 bool waiting_success_; |
| 412 const JobType job_type_; | 398 const JobType job_type_; |
| 413 MockClientSocketFactory* const client_socket_factory_; | 399 MockClientSocketFactory* const client_socket_factory_; |
| 414 base::WeakPtrFactory<TestConnectJob> weak_factory_; | 400 base::WeakPtrFactory<TestConnectJob> weak_factory_; |
| 415 LoadState load_state_; | 401 LoadState load_state_; |
| 416 bool store_additional_error_state_; | 402 bool store_additional_error_state_; |
| 417 | 403 |
| 418 DISALLOW_COPY_AND_ASSIGN(TestConnectJob); | 404 DISALLOW_COPY_AND_ASSIGN(TestConnectJob); |
| 419 }; | 405 }; |
| 420 | 406 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 617 namespace { | 603 namespace { |
| 618 | 604 |
| 619 void MockClientSocketFactory::SignalJobs() { | 605 void MockClientSocketFactory::SignalJobs() { |
| 620 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); | 606 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); |
| 621 it != waiting_jobs_.end(); ++it) { | 607 it != waiting_jobs_.end(); ++it) { |
| 622 (*it)->Signal(); | 608 (*it)->Signal(); |
| 623 } | 609 } |
| 624 waiting_jobs_.clear(); | 610 waiting_jobs_.clear(); |
| 625 } | 611 } |
| 626 | 612 |
| 613 void MockClientSocketFactory::SignalJob(size_t job) { | |
| 614 ASSERT_LT(job, waiting_jobs_.size()); | |
| 615 waiting_jobs_[job]->Signal(); | |
| 616 waiting_jobs_.erase(waiting_jobs_.begin() + job); | |
| 617 } | |
| 618 | |
| 619 void MockClientSocketFactory::SetJobLoadState(size_t job, | |
| 620 LoadState load_state) { | |
| 621 ASSERT_LT(job, waiting_jobs_.size()); | |
| 622 waiting_jobs_[job]->set_load_state(load_state); | |
| 623 } | |
| 624 | |
| 627 class TestConnectJobDelegate : public ConnectJob::Delegate { | 625 class TestConnectJobDelegate : public ConnectJob::Delegate { |
| 628 public: | 626 public: |
| 629 TestConnectJobDelegate() | 627 TestConnectJobDelegate() |
| 630 : have_result_(false), waiting_for_result_(false), result_(OK) {} | 628 : have_result_(false), waiting_for_result_(false), result_(OK) {} |
| 631 virtual ~TestConnectJobDelegate() {} | 629 virtual ~TestConnectJobDelegate() {} |
| 632 | 630 |
| 633 virtual void OnConnectJobComplete(int result, ConnectJob* job) OVERRIDE { | 631 virtual void OnConnectJobComplete(int result, ConnectJob* job) OVERRIDE { |
| 634 result_ = result; | 632 result_ = result; |
| 635 scoped_ptr<StreamSocket> socket(job->ReleaseSocket()); | 633 scoped_ptr<StreamSocket> socket(job->ReleaseSocket()); |
| 636 // socket.get() should be NULL iff result != OK | 634 // socket.get() should be NULL iff result != OK |
| (...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1917 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); | 1915 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); |
| 1918 EXPECT_EQ(OK, req2.WaitForResult()); | 1916 EXPECT_EQ(OK, req2.WaitForResult()); |
| 1919 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); | 1917 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); |
| 1920 | 1918 |
| 1921 ASSERT_EQ(3U, request_order.size()); | 1919 ASSERT_EQ(3U, request_order.size()); |
| 1922 EXPECT_EQ(&req1, request_order[0]); | 1920 EXPECT_EQ(&req1, request_order[0]); |
| 1923 EXPECT_EQ(&req2, request_order[1]); | 1921 EXPECT_EQ(&req2, request_order[1]); |
| 1924 EXPECT_EQ(&req3, request_order[2]); | 1922 EXPECT_EQ(&req3, request_order[2]); |
| 1925 } | 1923 } |
| 1926 | 1924 |
| 1927 TEST_F(ClientSocketPoolBaseTest, LoadState) { | 1925 // Test GetLoadState in the case there's only one socket request. |
| 1926 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { | |
| 1928 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1927 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1929 connect_job_factory_->set_job_type( | 1928 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1930 TestConnectJob::kMockAdvancingLoadStateJob); | |
| 1931 | 1929 |
| 1932 ClientSocketHandle handle; | 1930 ClientSocketHandle handle; |
| 1933 TestCompletionCallback callback; | 1931 TestCompletionCallback callback; |
| 1934 int rv = handle.Init("a", | 1932 int rv = handle.Init("a", |
| 1935 params_, | 1933 params_, |
| 1936 kDefaultPriority, | 1934 kDefaultPriority, |
| 1937 callback.callback(), | 1935 callback.callback(), |
| 1938 pool_.get(), | 1936 pool_.get(), |
| 1939 BoundNetLog()); | 1937 BoundNetLog()); |
| 1940 EXPECT_EQ(ERR_IO_PENDING, rv); | 1938 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1941 EXPECT_EQ(LOAD_STATE_IDLE, handle.GetLoadState()); | 1939 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1942 | 1940 |
| 1943 base::MessageLoop::current()->RunUntilIdle(); | 1941 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 1942 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | |
| 1943 | |
| 1944 // No point in completing the connection, since ClientSocketHandles only | |
| 1945 // expect the LoadState to be checked while connecting. | |
| 1946 } | |
| 1947 | |
| 1948 // Test GetLoadState in the case there's two socket requests. | |
|
eroman
2013/07/16 21:41:03
nit: there's --> there are
mmenke
2013/07/17 14:43:06
Done.
| |
| 1949 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { | |
| 1950 CreatePool(2, 2); | |
| 1951 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | |
| 1952 | |
| 1953 ClientSocketHandle handle; | |
| 1954 TestCompletionCallback callback; | |
| 1955 int rv = handle.Init("a", | |
| 1956 params_, | |
| 1957 kDefaultPriority, | |
| 1958 callback.callback(), | |
| 1959 pool_.get(), | |
| 1960 BoundNetLog()); | |
| 1961 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1944 | 1962 |
| 1945 ClientSocketHandle handle2; | 1963 ClientSocketHandle handle2; |
| 1946 TestCompletionCallback callback2; | 1964 TestCompletionCallback callback2; |
| 1947 rv = handle2.Init("a", params_, kDefaultPriority, callback2.callback(), | 1965 rv = handle2.Init("a", |
| 1948 pool_.get(), BoundNetLog()); | 1966 params_, |
| 1967 kDefaultPriority, | |
| 1968 callback2.callback(), | |
| 1969 pool_.get(), | |
| 1970 BoundNetLog()); | |
| 1949 EXPECT_EQ(ERR_IO_PENDING, rv); | 1971 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1950 EXPECT_NE(LOAD_STATE_IDLE, handle.GetLoadState()); | 1972 |
| 1951 EXPECT_NE(LOAD_STATE_IDLE, handle2.GetLoadState()); | 1973 // If the first Job is in an earlier state than the second, the state of |
| 1974 // the second job should be used for both handles. | |
| 1975 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); | |
| 1976 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | |
| 1977 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | |
| 1978 | |
| 1979 // If the second Job is in an earlier state than the second, the state of | |
| 1980 // the first job should be used for both handles. | |
| 1981 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | |
| 1982 // One request is farther | |
| 1983 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | |
| 1984 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); | |
| 1985 | |
| 1986 // Farthest along job connects and the first request gets the socket. The | |
| 1987 // second handle switches to the state of the remaining ConnectJob. | |
| 1988 client_socket_factory_.SignalJob(0); | |
| 1989 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 1990 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | |
| 1991 } | |
| 1992 | |
| 1993 // Test GetLoadState in the case the per-group limit is reached. | |
| 1994 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { | |
| 1995 CreatePool(2, 1); | |
| 1996 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | |
| 1997 | |
| 1998 ClientSocketHandle handle; | |
| 1999 TestCompletionCallback callback; | |
| 2000 int rv = handle.Init("a", | |
| 2001 params_, | |
| 2002 MEDIUM, | |
| 2003 callback.callback(), | |
| 2004 pool_.get(), | |
| 2005 BoundNetLog()); | |
| 2006 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2007 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | |
| 2008 | |
| 2009 // Request another socket from the same pool, buth with a higher priority. | |
| 2010 // The first request should now be stalled at the socket group limit. | |
| 2011 ClientSocketHandle handle2; | |
| 2012 TestCompletionCallback callback2; | |
| 2013 rv = handle2.Init("a", | |
| 2014 params_, | |
| 2015 HIGHEST, | |
| 2016 callback2.callback(), | |
| 2017 pool_.get(), | |
| 2018 BoundNetLog()); | |
| 2019 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2020 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | |
| 2021 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | |
| 2022 | |
| 2023 // The first handle should remain stalled as the other socket goes through | |
| 2024 // the connect process. | |
| 2025 | |
| 2026 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | |
| 2027 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | |
| 2028 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); | |
| 2029 | |
| 2030 client_socket_factory_.SignalJob(0); | |
| 2031 EXPECT_EQ(OK, callback2.WaitForResult()); | |
| 2032 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | |
| 2033 | |
| 2034 // Closing the second socket should cause the stalled handle to finally get a | |
| 2035 // ConnectJob. | |
| 2036 handle2.socket()->Disconnect(); | |
| 2037 handle2.Reset(); | |
| 2038 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | |
| 2039 } | |
| 2040 | |
| 2041 // Test GetLoadState in the case the per-pool limit is reached. | |
| 2042 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { | |
| 2043 CreatePool(2, 2); | |
| 2044 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | |
| 2045 | |
| 2046 ClientSocketHandle handle; | |
| 2047 TestCompletionCallback callback; | |
| 2048 int rv = handle.Init("a", | |
| 2049 params_, | |
| 2050 kDefaultPriority, | |
| 2051 callback.callback(), | |
| 2052 pool_.get(), | |
| 2053 BoundNetLog()); | |
| 2054 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2055 | |
| 2056 // Request for socket from another pool. | |
| 2057 ClientSocketHandle handle2; | |
| 2058 TestCompletionCallback callback2; | |
| 2059 rv = handle2.Init("b", | |
| 2060 params_, | |
| 2061 kDefaultPriority, | |
| 2062 callback2.callback(), | |
| 2063 pool_.get(), | |
| 2064 BoundNetLog()); | |
| 2065 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2066 | |
| 2067 // Request another socket from the first pool. Request should stall at the | |
| 2068 // socket pool limit. | |
| 2069 ClientSocketHandle handle3; | |
| 2070 TestCompletionCallback callback3; | |
| 2071 rv = handle3.Init("a", | |
| 2072 params_, | |
| 2073 kDefaultPriority, | |
| 2074 callback2.callback(), | |
| 2075 pool_.get(), | |
| 2076 BoundNetLog()); | |
| 2077 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 2078 | |
| 2079 // The third handle should remain stalled as the other sockets in its group | |
| 2080 // goes through the connect process. | |
| 2081 | |
| 2082 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | |
| 2083 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | |
| 2084 | |
| 2085 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | |
| 2086 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | |
| 2087 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | |
| 2088 | |
| 2089 client_socket_factory_.SignalJob(0); | |
| 2090 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 2091 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | |
| 2092 | |
| 2093 // Closing a socket should allow the stalled handle to finally get a new | |
| 2094 // ConnectJob. | |
| 2095 handle.socket()->Disconnect(); | |
| 2096 handle.Reset(); | |
| 2097 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); | |
| 1952 } | 2098 } |
| 1953 | 2099 |
| 1954 TEST_F(ClientSocketPoolBaseTest, Recoverable) { | 2100 TEST_F(ClientSocketPoolBaseTest, Recoverable) { |
| 1955 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2101 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1956 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); | 2102 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); |
| 1957 | 2103 |
| 1958 ClientSocketHandle handle; | 2104 ClientSocketHandle handle; |
| 1959 TestCompletionCallback callback; | 2105 TestCompletionCallback callback; |
| 1960 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, | 2106 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, |
| 1961 handle.Init("a", params_, kDefaultPriority, callback.callback(), | 2107 handle.Init("a", params_, kDefaultPriority, callback.callback(), |
| (...skipping 2048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4010 EXPECT_EQ(1, GetOrderOfRequest(5)); | 4156 EXPECT_EQ(1, GetOrderOfRequest(5)); |
| 4011 EXPECT_EQ(2, GetOrderOfRequest(3)); | 4157 EXPECT_EQ(2, GetOrderOfRequest(3)); |
| 4012 EXPECT_EQ(3, GetOrderOfRequest(4)); | 4158 EXPECT_EQ(3, GetOrderOfRequest(4)); |
| 4013 EXPECT_EQ(4, GetOrderOfRequest(1)); | 4159 EXPECT_EQ(4, GetOrderOfRequest(1)); |
| 4014 EXPECT_EQ(5, GetOrderOfRequest(2)); | 4160 EXPECT_EQ(5, GetOrderOfRequest(2)); |
| 4015 } | 4161 } |
| 4016 | 4162 |
| 4017 } // namespace | 4163 } // namespace |
| 4018 | 4164 |
| 4019 } // namespace net | 4165 } // namespace net |
| OLD | NEW |