Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: net/socket/client_socket_pool_base_unittest.cc

Issue 19278016: Add load states for stalled requests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Work on tests a little Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698