blob: 020bc985d78bb23e1d31404028079c0268b9f0bd [file] [log] [blame]
[email protected]5a3b9142009-08-28 21:03:171// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]ab838892009-06-30 18:49:055#include "net/socket/client_socket_pool_base.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
7#include "base/compiler_specific.h"
8#include "base/message_loop.h"
[email protected]974ebd62009-08-03 23:14:349#include "base/platform_thread.h"
[email protected]c9d6a1d2009-07-14 16:15:2010#include "base/scoped_vector.h"
[email protected]fd7b7c92009-08-20 19:38:3011#include "net/base/load_log.h"
12#include "net/base/load_log_unittest.h"
[email protected]f6d1d6eb2009-06-24 20:16:0913#include "net/base/net_errors.h"
14#include "net/base/test_completion_callback.h"
15#include "net/socket/client_socket.h"
16#include "net/socket/client_socket_factory.h"
17#include "net/socket/client_socket_handle.h"
[email protected]75439d3b2009-07-23 22:11:1718#include "net/socket/socket_test_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0919#include "testing/gtest/include/gtest/gtest.h"
20
21namespace net {
22
23namespace {
24
[email protected]211d21722009-07-22 15:48:5325const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2026const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0127const int kDefaultPriority = 5;
28
[email protected]d80a4322009-08-14 07:07:4929typedef ClientSocketPoolBase<const void*> TestClientSocketPoolBase;
30
[email protected]f6d1d6eb2009-06-24 20:16:0931class MockClientSocket : public ClientSocket {
32 public:
33 MockClientSocket() : connected_(false) {}
34
[email protected]ab838892009-06-30 18:49:0535 // Socket methods:
36 virtual int Read(
37 IOBuffer* /* buf */, int /* len */, CompletionCallback* /* callback */) {
38 return ERR_UNEXPECTED;
39 }
40
41 virtual int Write(
42 IOBuffer* /* buf */, int /* len */, CompletionCallback* /* callback */) {
43 return ERR_UNEXPECTED;
44 }
45
[email protected]f6d1d6eb2009-06-24 20:16:0946 // ClientSocket methods:
[email protected]ab838892009-06-30 18:49:0547
[email protected]f6d1d6eb2009-06-24 20:16:0948 virtual int Connect(CompletionCallback* callback) {
49 connected_ = true;
50 return OK;
51 }
[email protected]f6d1d6eb2009-06-24 20:16:0952
[email protected]ab838892009-06-30 18:49:0553 virtual void Disconnect() { connected_ = false; }
54 virtual bool IsConnected() const { return connected_; }
55 virtual bool IsConnectedAndIdle() const { return connected_; }
[email protected]0b7648c2009-07-06 20:14:0156
[email protected]ab838892009-06-30 18:49:0557#if defined(OS_LINUX)
58 virtual int GetPeerName(struct sockaddr* /* name */,
59 socklen_t* /* namelen */) {
60 return 0;
[email protected]f6d1d6eb2009-06-24 20:16:0961 }
[email protected]ab838892009-06-30 18:49:0562#endif
[email protected]f6d1d6eb2009-06-24 20:16:0963
64 private:
65 bool connected_;
[email protected]f6d1d6eb2009-06-24 20:16:0966
[email protected]ab838892009-06-30 18:49:0567 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:0968};
69
[email protected]5fc08e32009-07-15 17:09:5770class TestConnectJob;
71
[email protected]f6d1d6eb2009-06-24 20:16:0972class MockClientSocketFactory : public ClientSocketFactory {
73 public:
[email protected]ab838892009-06-30 18:49:0574 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:0975
76 virtual ClientSocket* CreateTCPClientSocket(const AddressList& addresses) {
77 allocation_count_++;
[email protected]ab838892009-06-30 18:49:0578 return NULL;
[email protected]f6d1d6eb2009-06-24 20:16:0979 }
80
81 virtual SSLClientSocket* CreateSSLClientSocket(
82 ClientSocket* transport_socket,
83 const std::string& hostname,
84 const SSLConfig& ssl_config) {
85 NOTIMPLEMENTED();
86 return NULL;
87 }
88
[email protected]5fc08e32009-07-15 17:09:5789 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
90 void SignalJobs();
91
[email protected]f6d1d6eb2009-06-24 20:16:0992 int allocation_count() const { return allocation_count_; }
93
[email protected]f6d1d6eb2009-06-24 20:16:0994 private:
95 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:5796 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:0997};
98
[email protected]ab838892009-06-30 18:49:0599class TestConnectJob : public ConnectJob {
100 public:
101 enum JobType {
102 kMockJob,
103 kMockFailingJob,
104 kMockPendingJob,
105 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57106 kMockWaitingJob,
107 kMockAdvancingLoadStateJob,
[email protected]ab838892009-06-30 18:49:05108 };
109
110 TestConnectJob(JobType job_type,
111 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49112 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34113 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05114 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30115 MockClientSocketFactory* client_socket_factory,
116 LoadLog* load_log)
117 : ConnectJob(group_name, request.handle(), timeout_duration,
118 delegate, load_log),
[email protected]2ab05b52009-07-01 23:57:58119 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05120 client_socket_factory_(client_socket_factory),
[email protected]ab838892009-06-30 18:49:05121 method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
122
[email protected]974ebd62009-08-03 23:14:34123 void Signal() {
124 DoConnect(waiting_success_, true /* async */);
125 }
126
127 private:
[email protected]ab838892009-06-30 18:49:05128 // ConnectJob methods:
129
[email protected]974ebd62009-08-03 23:14:34130 virtual int ConnectInternal() {
[email protected]ab838892009-06-30 18:49:05131 AddressList ignored;
132 client_socket_factory_->CreateTCPClientSocket(ignored);
[email protected]6e713f02009-08-06 02:56:40133 set_socket(new MockClientSocket());
[email protected]ab838892009-06-30 18:49:05134 switch (job_type_) {
135 case kMockJob:
136 return DoConnect(true /* successful */, false /* sync */);
137 case kMockFailingJob:
138 return DoConnect(false /* error */, false /* sync */);
139 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57140 set_load_state(LOAD_STATE_CONNECTING);
[email protected]ab838892009-06-30 18:49:05141 MessageLoop::current()->PostTask(
142 FROM_HERE,
143 method_factory_.NewRunnableMethod(
144 &TestConnectJob::DoConnect,
145 true /* successful */,
146 true /* async */));
147 return ERR_IO_PENDING;
148 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57149 set_load_state(LOAD_STATE_CONNECTING);
[email protected]ab838892009-06-30 18:49:05150 MessageLoop::current()->PostTask(
151 FROM_HERE,
152 method_factory_.NewRunnableMethod(
153 &TestConnectJob::DoConnect,
154 false /* error */,
155 true /* async */));
156 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57157 case kMockWaitingJob:
158 client_socket_factory_->WaitForSignal(this);
159 waiting_success_ = true;
160 return ERR_IO_PENDING;
161 case kMockAdvancingLoadStateJob:
162 MessageLoop::current()->PostTask(
163 FROM_HERE,
164 method_factory_.NewRunnableMethod(
165 &TestConnectJob::AdvanceLoadState, load_state()));
166 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05167 default:
168 NOTREACHED();
[email protected]6e713f02009-08-06 02:56:40169 set_socket(NULL);
[email protected]ab838892009-06-30 18:49:05170 return ERR_FAILED;
171 }
172 }
173
[email protected]ab838892009-06-30 18:49:05174 int DoConnect(bool succeed, bool was_async) {
175 int result = ERR_CONNECTION_FAILED;
[email protected]ab838892009-06-30 18:49:05176 if (succeed) {
177 result = OK;
[email protected]2ab05b52009-07-01 23:57:58178 socket()->Connect(NULL);
[email protected]6e713f02009-08-06 02:56:40179 } else {
180 set_socket(NULL);
[email protected]ab838892009-06-30 18:49:05181 }
[email protected]2ab05b52009-07-01 23:57:58182
183 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30184 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05185 return result;
186 }
187
[email protected]5fc08e32009-07-15 17:09:57188 void AdvanceLoadState(LoadState state) {
189 int tmp = state;
190 tmp++;
191 state = static_cast<LoadState>(tmp);
192 set_load_state(state);
193 // Post a delayed task so RunAllPending() won't run it.
194 MessageLoop::current()->PostDelayedTask(
195 FROM_HERE,
196 method_factory_.NewRunnableMethod(&TestConnectJob::AdvanceLoadState,
197 state),
198 1 /* 1ms delay */);
199 }
200
201 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05202 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57203 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05204 ScopedRunnableMethodFactory<TestConnectJob> method_factory_;
205
206 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
207};
208
[email protected]d80a4322009-08-14 07:07:49209class TestConnectJobFactory
210 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05211 public:
[email protected]5fc08e32009-07-15 17:09:57212 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory)
[email protected]ab838892009-06-30 18:49:05213 : job_type_(TestConnectJob::kMockJob),
214 client_socket_factory_(client_socket_factory) {}
215
216 virtual ~TestConnectJobFactory() {}
217
218 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
219
[email protected]974ebd62009-08-03 23:14:34220 void set_timeout_duration(base::TimeDelta timeout_duration) {
221 timeout_duration_ = timeout_duration;
222 }
223
[email protected]ab838892009-06-30 18:49:05224 // ConnectJobFactory methods:
225
226 virtual ConnectJob* NewConnectJob(
227 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49228 const TestClientSocketPoolBase::Request& request,
[email protected]fd7b7c92009-08-20 19:38:30229 ConnectJob::Delegate* delegate,
230 LoadLog* load_log) const {
[email protected]ab838892009-06-30 18:49:05231 return new TestConnectJob(job_type_,
232 group_name,
233 request,
[email protected]974ebd62009-08-03 23:14:34234 timeout_duration_,
[email protected]ab838892009-06-30 18:49:05235 delegate,
[email protected]fd7b7c92009-08-20 19:38:30236 client_socket_factory_,
237 load_log);
[email protected]ab838892009-06-30 18:49:05238 }
239
240 private:
241 TestConnectJob::JobType job_type_;
[email protected]974ebd62009-08-03 23:14:34242 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57243 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05244
245 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
246};
247
248class TestClientSocketPool : public ClientSocketPool {
249 public:
250 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53251 int max_sockets,
[email protected]ab838892009-06-30 18:49:05252 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16253 base::TimeDelta unused_idle_socket_timeout,
254 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49255 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
[email protected]9bf28db2009-08-29 01:35:16256 : base_(max_sockets, max_sockets_per_group,
257 unused_idle_socket_timeout, used_idle_socket_timeout,
258 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05259
260 virtual int RequestSocket(
261 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49262 const void* params,
[email protected]ab838892009-06-30 18:49:05263 int priority,
264 ClientSocketHandle* handle,
[email protected]684970b2009-08-14 04:54:46265 CompletionCallback* callback,
266 LoadLog* load_log) {
[email protected]d80a4322009-08-14 07:07:49267 return base_.RequestSocket(
268 group_name, params, priority, handle, callback, load_log);
[email protected]ab838892009-06-30 18:49:05269 }
270
271 virtual void CancelRequest(
272 const std::string& group_name,
273 const ClientSocketHandle* handle) {
[email protected]d80a4322009-08-14 07:07:49274 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05275 }
276
277 virtual void ReleaseSocket(
278 const std::string& group_name,
279 ClientSocket* socket) {
[email protected]d80a4322009-08-14 07:07:49280 base_.ReleaseSocket(group_name, socket);
[email protected]ab838892009-06-30 18:49:05281 }
282
283 virtual void CloseIdleSockets() {
[email protected]d80a4322009-08-14 07:07:49284 base_.CloseIdleSockets();
[email protected]ab838892009-06-30 18:49:05285 }
286
[email protected]d80a4322009-08-14 07:07:49287 virtual int IdleSocketCount() const { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05288
289 virtual int IdleSocketCountInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49290 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05291 }
292
293 virtual LoadState GetLoadState(const std::string& group_name,
294 const ClientSocketHandle* handle) const {
[email protected]d80a4322009-08-14 07:07:49295 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05296 }
297
[email protected]d80a4322009-08-14 07:07:49298 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20299
[email protected]974ebd62009-08-03 23:14:34300 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49301 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34302 }
303
[email protected]9bf28db2009-08-29 01:35:16304 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
305
[email protected]ab838892009-06-30 18:49:05306 private:
[email protected]d80a4322009-08-14 07:07:49307 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05308
309 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
310};
311
[email protected]a937a06d2009-08-19 21:19:24312} // namespace
313
314REGISTER_SOCKET_PARAMS_FOR_POOL(TestClientSocketPool, const void*);
315
316namespace {
317
[email protected]5fc08e32009-07-15 17:09:57318void MockClientSocketFactory::SignalJobs() {
319 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
320 it != waiting_jobs_.end(); ++it) {
321 (*it)->Signal();
322 }
323 waiting_jobs_.clear();
324}
325
[email protected]974ebd62009-08-03 23:14:34326class TestConnectJobDelegate : public ConnectJob::Delegate {
327 public:
328 TestConnectJobDelegate()
329 : have_result_(false), waiting_for_result_(false), result_(OK) {}
330 virtual ~TestConnectJobDelegate() {}
331
332 virtual void OnConnectJobComplete(int result, ConnectJob* job) {
333 result_ = result;
[email protected]6e713f02009-08-06 02:56:40334 scoped_ptr<ClientSocket> socket(job->ReleaseSocket());
335 if (result == OK) {
[email protected]5a3b9142009-08-28 21:03:17336 EXPECT_TRUE(socket.get() != NULL);
[email protected]6e713f02009-08-06 02:56:40337 } else {
[email protected]5a3b9142009-08-28 21:03:17338 EXPECT_EQ(NULL, socket.get());
[email protected]6e713f02009-08-06 02:56:40339 }
[email protected]974ebd62009-08-03 23:14:34340 delete job;
341 have_result_ = true;
342 if (waiting_for_result_)
343 MessageLoop::current()->Quit();
344 }
345
346 int WaitForResult() {
347 DCHECK(!waiting_for_result_);
348 while (!have_result_) {
349 waiting_for_result_ = true;
350 MessageLoop::current()->Run();
351 waiting_for_result_ = false;
352 }
353 have_result_ = false; // auto-reset for next callback
354 return result_;
355 }
356
357 private:
358 bool have_result_;
359 bool waiting_for_result_;
360 int result_;
361};
362
[email protected]75439d3b2009-07-23 22:11:17363class ClientSocketPoolBaseTest : public ClientSocketPoolTest {
[email protected]f6d1d6eb2009-06-24 20:16:09364 protected:
[email protected]17a0c6c2009-08-04 00:07:04365 ClientSocketPoolBaseTest() {}
[email protected]c9d6a1d2009-07-14 16:15:20366
[email protected]211d21722009-07-22 15:48:53367 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16368 CreatePoolWithIdleTimeouts(
369 max_sockets,
370 max_sockets_per_group,
371 base::TimeDelta::FromSeconds(kUnusedIdleSocketTimeout),
372 base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout));
373 }
374
375 void CreatePoolWithIdleTimeouts(
376 int max_sockets, int max_sockets_per_group,
377 base::TimeDelta unused_idle_socket_timeout,
378 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20379 DCHECK(!pool_.get());
[email protected]17a0c6c2009-08-04 00:07:04380 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_);
[email protected]211d21722009-07-22 15:48:53381 pool_ = new TestClientSocketPool(max_sockets,
382 max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16383 unused_idle_socket_timeout,
384 used_idle_socket_timeout,
[email protected]c9d6a1d2009-07-14 16:15:20385 connect_job_factory_);
386 }
[email protected]f6d1d6eb2009-06-24 20:16:09387
[email protected]75439d3b2009-07-23 22:11:17388 int StartRequest(const std::string& group_name, int priority) {
[email protected]a937a06d2009-08-19 21:19:24389 return StartRequestUsingPool<TestClientSocketPool, const void*>(
390 pool_.get(), group_name, priority, NULL);
[email protected]f6d1d6eb2009-06-24 20:16:09391 }
392
393 virtual void TearDown() {
[email protected]211d21722009-07-22 15:48:53394 // Need to delete |pool_| before we turn late binding back off. We also need
395 // to delete |requests_| because the pool is reference counted and requests
396 // keep reference to it.
397 // TODO(willchan): Remove this part when late binding becomes the default.
[email protected]5fc08e32009-07-15 17:09:57398 pool_ = NULL;
[email protected]211d21722009-07-22 15:48:53399 requests_.reset();
400
[email protected]d80a4322009-08-14 07:07:49401 EnableLateBindingOfSockets(false);
[email protected]75439d3b2009-07-23 22:11:17402
403 ClientSocketPoolTest::TearDown();
[email protected]f6d1d6eb2009-06-24 20:16:09404 }
405
[email protected]f6d1d6eb2009-06-24 20:16:09406 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04407 TestConnectJobFactory* connect_job_factory_;
[email protected]c9d6a1d2009-07-14 16:15:20408 scoped_refptr<TestClientSocketPool> pool_;
[email protected]f6d1d6eb2009-06-24 20:16:09409};
410
[email protected]a937a06d2009-08-19 21:19:24411// Helper function which explicitly specifies the template parameters, since
412// the compiler will infer (in this case, incorrectly) that NULL is of type int.
413int InitHandle(ClientSocketHandle* handle,
414 const std::string& group_name,
415 int priority,
416 CompletionCallback* callback,
417 TestClientSocketPool* pool,
418 LoadLog* load_log) {
419 return handle->Init<const void*, TestClientSocketPool>(
420 group_name, NULL, priority, callback, pool, load_log);
421}
422
[email protected]974ebd62009-08-03 23:14:34423// Even though a timeout is specified, it doesn't time out on a synchronous
424// completion.
425TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
426 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06427 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49428 TestClientSocketPoolBase::Request request(
429 &ignored, NULL, kDefaultPriority, NULL, NULL);
[email protected]974ebd62009-08-03 23:14:34430 scoped_ptr<TestConnectJob> job(
431 new TestConnectJob(TestConnectJob::kMockJob,
[email protected]ec08bb22009-08-12 00:25:12432 "a",
[email protected]974ebd62009-08-03 23:14:34433 request,
434 base::TimeDelta::FromMicroseconds(1),
435 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30436 &client_socket_factory_,
437 NULL));
[email protected]974ebd62009-08-03 23:14:34438 EXPECT_EQ(OK, job->Connect());
439}
440
441TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
442 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06443 ClientSocketHandle ignored;
[email protected]fd7b7c92009-08-20 19:38:30444 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]d80a4322009-08-14 07:07:49445 TestClientSocketPoolBase::Request request(
446 &ignored, NULL, kDefaultPriority, NULL, NULL);
[email protected]974ebd62009-08-03 23:14:34447 // Deleted by TestConnectJobDelegate.
448 TestConnectJob* job =
449 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12450 "a",
[email protected]974ebd62009-08-03 23:14:34451 request,
452 base::TimeDelta::FromMicroseconds(1),
453 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30454 &client_socket_factory_,
455 log);
[email protected]974ebd62009-08-03 23:14:34456 ASSERT_EQ(ERR_IO_PENDING, job->Connect());
457 PlatformThread::Sleep(1);
458 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult());
[email protected]fd7b7c92009-08-20 19:38:30459
460 EXPECT_EQ(3u, log->events().size());
461 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
462 LoadLog::PHASE_BEGIN);
463 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
464 LoadLog::PHASE_NONE);
465 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
466 LoadLog::PHASE_END);
[email protected]974ebd62009-08-03 23:14:34467}
468
[email protected]5fc08e32009-07-15 17:09:57469TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53470 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20471
[email protected]f6d1d6eb2009-06-24 20:16:09472 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06473 ClientSocketHandle handle;
[email protected]fd7b7c92009-08-20 19:38:30474 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]a937a06d2009-08-19 21:19:24475 EXPECT_EQ(OK, InitHandle(&handle, "a", kDefaultPriority,
[email protected]fd7b7c92009-08-20 19:38:30476 &callback, pool_.get(), log));
[email protected]f6d1d6eb2009-06-24 20:16:09477 EXPECT_TRUE(handle.is_initialized());
478 EXPECT_TRUE(handle.socket());
[email protected]f6d1d6eb2009-06-24 20:16:09479 handle.Reset();
[email protected]fd7b7c92009-08-20 19:38:30480
481 EXPECT_EQ(4u, log->events().size());
482 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
483 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
484 LoadLog::PHASE_BEGIN);
485 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
486 LoadLog::PHASE_END);
487 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]f6d1d6eb2009-06-24 20:16:09488}
489
[email protected]5fc08e32009-07-15 17:09:57490TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:53491 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:57492
493 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]fd7b7c92009-08-20 19:38:30494 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]a512f5982009-08-18 16:01:06495 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]fd7b7c92009-08-20 19:38:30496 int rv = InitHandle(req.handle(), "a", 0, &req, pool_.get(), log);
[email protected]5fc08e32009-07-15 17:09:57497 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]a6c59f62009-07-29 16:33:33498 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle()));
[email protected]5fc08e32009-07-15 17:09:57499 EXPECT_EQ(OK, req.WaitForResult());
[email protected]a6c59f62009-07-29 16:33:33500 EXPECT_TRUE(req.handle()->is_initialized());
501 EXPECT_TRUE(req.handle()->socket());
502 req.handle()->Reset();
[email protected]fd7b7c92009-08-20 19:38:30503
504 EXPECT_EQ(4u, log->events().size());
505 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
506 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
507 LoadLog::PHASE_BEGIN);
508 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
509 LoadLog::PHASE_END);
510 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]5fc08e32009-07-15 17:09:57511}
512
[email protected]ab838892009-06-30 18:49:05513TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53514 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20515
[email protected]ab838892009-06-30 18:49:05516 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
[email protected]fd7b7c92009-08-20 19:38:30517 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]a512f5982009-08-18 16:01:06518 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]3ae82302009-06-26 06:01:21519 EXPECT_EQ(ERR_CONNECTION_FAILED,
[email protected]a937a06d2009-08-19 21:19:24520 InitHandle(req.handle(), "a", kDefaultPriority, &req,
[email protected]fd7b7c92009-08-20 19:38:30521 pool_.get(), log));
522
523 EXPECT_EQ(4u, log->events().size());
524 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
525 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
526 LoadLog::PHASE_BEGIN);
527 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
528 LoadLog::PHASE_END);
529 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]f6d1d6eb2009-06-24 20:16:09530}
531
[email protected]5fc08e32009-07-15 17:09:57532TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:53533 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:57534
535 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]fd7b7c92009-08-20 19:38:30536 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]a512f5982009-08-18 16:01:06537 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]5fc08e32009-07-15 17:09:57538 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:24539 InitHandle(req.handle(), "a", kDefaultPriority, &req,
[email protected]fd7b7c92009-08-20 19:38:30540 pool_.get(), log));
[email protected]a6c59f62009-07-29 16:33:33541 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle()));
[email protected]5fc08e32009-07-15 17:09:57542 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
[email protected]fd7b7c92009-08-20 19:38:30543
544 EXPECT_EQ(4u, log->events().size());
545 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
546 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
547 LoadLog::PHASE_BEGIN);
548 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
549 LoadLog::PHASE_END);
550 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]5fc08e32009-07-15 17:09:57551}
552
[email protected]211d21722009-07-22 15:48:53553TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
554 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
555
[email protected]fd7b7c92009-08-20 19:38:30556 // TODO(eroman): Check that the LoadLog contains this event.
557
[email protected]211d21722009-07-22 15:48:53558 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
559 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
560 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority));
561 EXPECT_EQ(OK, StartRequest("d", kDefaultPriority));
562
563 EXPECT_EQ(static_cast<int>(requests_.size()),
564 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17565 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_);
[email protected]211d21722009-07-22 15:48:53566
567 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority));
568 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", kDefaultPriority));
569 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", kDefaultPriority));
570
571 ReleaseAllConnections(KEEP_ALIVE);
572
573 EXPECT_EQ(static_cast<int>(requests_.size()),
574 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17575 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_);
[email protected]211d21722009-07-22 15:48:53576
577 EXPECT_EQ(1, GetOrderOfRequest(1));
578 EXPECT_EQ(2, GetOrderOfRequest(2));
579 EXPECT_EQ(3, GetOrderOfRequest(3));
580 EXPECT_EQ(4, GetOrderOfRequest(4));
581 EXPECT_EQ(5, GetOrderOfRequest(5));
582 EXPECT_EQ(6, GetOrderOfRequest(6));
583 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17584
585 // Make sure we test order of all requests made.
586 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53587}
588
589TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
590 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
591
[email protected]fd7b7c92009-08-20 19:38:30592 // TODO(eroman): Check that the LoadLog contains this event.
593
[email protected]211d21722009-07-22 15:48:53594 // Reach all limits: max total sockets, and max sockets per group.
595 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
596 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
597 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
598 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
599
600 EXPECT_EQ(static_cast<int>(requests_.size()),
601 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17602 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_);
[email protected]211d21722009-07-22 15:48:53603
604 // Now create a new group and verify that we don't starve it.
605 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority));
606
607 ReleaseAllConnections(KEEP_ALIVE);
608
609 EXPECT_EQ(static_cast<int>(requests_.size()),
610 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17611 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_);
[email protected]211d21722009-07-22 15:48:53612
613 EXPECT_EQ(1, GetOrderOfRequest(1));
614 EXPECT_EQ(2, GetOrderOfRequest(2));
615 EXPECT_EQ(3, GetOrderOfRequest(3));
616 EXPECT_EQ(4, GetOrderOfRequest(4));
617 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17618
619 // Make sure we test order of all requests made.
620 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53621}
622
623TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
625
626 EXPECT_EQ(OK, StartRequest("b", 3));
627 EXPECT_EQ(OK, StartRequest("a", 3));
628 EXPECT_EQ(OK, StartRequest("b", 6));
629 EXPECT_EQ(OK, StartRequest("a", 6));
630
631 EXPECT_EQ(static_cast<int>(requests_.size()),
632 client_socket_factory_.allocation_count());
633
634 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", 4));
635 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 5));
636 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", 7));
637
638 ReleaseAllConnections(KEEP_ALIVE);
639
640 // We're re-using one socket for group "a", and one for "b".
641 EXPECT_EQ(static_cast<int>(requests_.size()) - 2,
642 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17643 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_);
[email protected]211d21722009-07-22 15:48:53644
645 // First 4 requests don't have to wait, and finish in order.
646 EXPECT_EQ(1, GetOrderOfRequest(1));
647 EXPECT_EQ(2, GetOrderOfRequest(2));
648 EXPECT_EQ(3, GetOrderOfRequest(3));
649 EXPECT_EQ(4, GetOrderOfRequest(4));
650
651 // Request ("b", 7) has the highest priority, then ("a", 5),
652 // and then ("c", 4).
653 EXPECT_EQ(7, GetOrderOfRequest(5));
654 EXPECT_EQ(6, GetOrderOfRequest(6));
655 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17656
657 // Make sure we test order of all requests made.
658 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53659}
660
661TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
662 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
663
664 EXPECT_EQ(OK, StartRequest("a", 3));
665 EXPECT_EQ(OK, StartRequest("a", 6));
666 EXPECT_EQ(OK, StartRequest("b", 3));
667 EXPECT_EQ(OK, StartRequest("b", 6));
668
669 EXPECT_EQ(static_cast<int>(requests_.size()),
670 client_socket_factory_.allocation_count());
671
672 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", 6));
673 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
674 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", 7));
675
676 ReleaseAllConnections(KEEP_ALIVE);
677
678 // We're re-using one socket for group "a", and one for "b".
679 EXPECT_EQ(static_cast<int>(requests_.size()) - 2,
680 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17681 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_);
[email protected]211d21722009-07-22 15:48:53682
683 // First 4 requests don't have to wait, and finish in order.
684 EXPECT_EQ(1, GetOrderOfRequest(1));
685 EXPECT_EQ(2, GetOrderOfRequest(2));
686 EXPECT_EQ(3, GetOrderOfRequest(3));
687 EXPECT_EQ(4, GetOrderOfRequest(4));
688
689 // Request ("b", 7) has the highest priority, but we can't make new socket for
690 // group "b", because it has reached the per-group limit. Then we make
691 // socket for ("c", 6), because it has higher priority than ("a", 4),
692 // and we still can't make a socket for group "b".
693 EXPECT_EQ(5, GetOrderOfRequest(5));
694 EXPECT_EQ(6, GetOrderOfRequest(6));
695 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17696
697 // Make sure we test order of all requests made.
698 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53699}
700
701// Make sure that we count connecting sockets against the total limit.
702TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
703 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
704
705 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
706 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
707 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority));
708
709 // Create one asynchronous request.
710 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
711 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority));
712
713 // The next synchronous request should wait for its turn.
714 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
715 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority));
716
717 ReleaseAllConnections(KEEP_ALIVE);
718
719 EXPECT_EQ(static_cast<int>(requests_.size()),
720 client_socket_factory_.allocation_count());
721
722 EXPECT_EQ(1, GetOrderOfRequest(1));
723 EXPECT_EQ(2, GetOrderOfRequest(2));
724 EXPECT_EQ(3, GetOrderOfRequest(3));
725 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:17726 EXPECT_EQ(5, GetOrderOfRequest(5));
727
728 // Make sure we test order of all requests made.
729 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53730}
731
732// Inside ClientSocketPoolBase we have a may_have_stalled_group flag,
733// which tells it to use more expensive, but accurate, group selection
734// algorithm. Make sure it doesn't get stuck in the "on" state.
735TEST_F(ClientSocketPoolBaseTest, MayHaveStalledGroupReset) {
736 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
737
738 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
739
740 // Reach group socket limit.
741 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
742 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
743 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
744
745 // Reach total limit, but don't request more sockets.
746 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
747 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
748 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
749
750 // Request one more socket while we are at the maximum sockets limit.
751 // This should flip the may_have_stalled_group flag.
752 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority));
753 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
754
755 // After releasing first connection for "a", we're still at the
756 // maximum sockets limit, but every group's pending queue is empty,
757 // so we reset the flag.
758 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
759 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
760
761 // Requesting additional socket while at the total limit should
762 // flip the flag back to "on".
763 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority));
764 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
765
766 // We'll request one more socket to verify that we don't reset the flag
767 // too eagerly.
768 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority));
769 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
770
771 // We're at the maximum socket limit, and still have one request pending
772 // for "d". Flag should be "on".
773 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
774 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
775
776 // Now every group's pending queue should be empty again.
777 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
778 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
779
780 ReleaseAllConnections(KEEP_ALIVE);
781 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
782}
783
[email protected]ab838892009-06-30 18:49:05784TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:53785 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:09786
[email protected]c9d6a1d2009-07-14 16:15:20787 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
788 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
789 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
790 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
791 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
792 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
793 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
[email protected]f6d1d6eb2009-06-24 20:16:09794
[email protected]c9d6a1d2009-07-14 16:15:20795 ReleaseAllConnections(KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:09796
[email protected]c9d6a1d2009-07-14 16:15:20797 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
798 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17799 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_);
[email protected]f6d1d6eb2009-06-24 20:16:09800
[email protected]c9d6a1d2009-07-14 16:15:20801 EXPECT_EQ(1, GetOrderOfRequest(1));
802 EXPECT_EQ(2, GetOrderOfRequest(2));
803 EXPECT_EQ(6, GetOrderOfRequest(3));
804 EXPECT_EQ(4, GetOrderOfRequest(4));
805 EXPECT_EQ(3, GetOrderOfRequest(5));
806 EXPECT_EQ(5, GetOrderOfRequest(6));
807 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17808
809 // Make sure we test order of all requests made.
810 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:09811}
812
[email protected]ab838892009-06-30 18:49:05813TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:53814 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:09815
[email protected]c9d6a1d2009-07-14 16:15:20816 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
817 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
818 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
819 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
820 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
821 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
822 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
[email protected]f6d1d6eb2009-06-24 20:16:09823
[email protected]c9d6a1d2009-07-14 16:15:20824 ReleaseAllConnections(NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:09825
[email protected]c9d6a1d2009-07-14 16:15:20826 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i)
827 EXPECT_EQ(OK, requests_[i]->WaitForResult());
828
829 EXPECT_EQ(static_cast<int>(requests_.size()),
830 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:17831 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_);
[email protected]f6d1d6eb2009-06-24 20:16:09832}
833
834// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:05835// The pending connect job will be cancelled and should not call back into
836// ClientSocketPoolBase.
837TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:53838 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20839
[email protected]ab838892009-06-30 18:49:05840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:06841 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]ab838892009-06-30 18:49:05842 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:24843 InitHandle(req.handle(), "a", kDefaultPriority, &req,
844 pool_.get(), NULL));
[email protected]a6c59f62009-07-29 16:33:33845 req.handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:09846}
847
[email protected]ab838892009-06-30 18:49:05848TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]211d21722009-07-22 15:48:53849 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20850
[email protected]ab838892009-06-30 18:49:05851 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:06852 TestSocketRequest req(&request_order_, &completion_count_);
853 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]f6d1d6eb2009-06-24 20:16:09854
[email protected]ab838892009-06-30 18:49:05855 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:24856 InitHandle(req.handle(), "a", kDefaultPriority, &req,
857 pool_.get(), NULL));
[email protected]ab838892009-06-30 18:49:05858 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:24859 InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
860 pool_.get(), NULL));
[email protected]f6d1d6eb2009-06-24 20:16:09861
[email protected]a6c59f62009-07-29 16:33:33862 req.handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:09863
864 EXPECT_EQ(OK, req2.WaitForResult());
[email protected]a6c59f62009-07-29 16:33:33865 req2.handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:09866}
867
[email protected]ab838892009-06-30 18:49:05868TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:53869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20870
[email protected]ab838892009-06-30 18:49:05871 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:06872 ClientSocketHandle handle;
[email protected]f6d1d6eb2009-06-24 20:16:09873 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06874 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]f6d1d6eb2009-06-24 20:16:09875
[email protected]ab838892009-06-30 18:49:05876 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:24877 InitHandle(&handle, "a", kDefaultPriority, &callback,
878 pool_.get(), NULL));
[email protected]f6d1d6eb2009-06-24 20:16:09879
880 handle.Reset();
881
882 TestCompletionCallback callback2;
[email protected]ab838892009-06-30 18:49:05883 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:24884 InitHandle(&handle, "a", kDefaultPriority, &callback2,
885 pool_.get(), NULL));
[email protected]f6d1d6eb2009-06-24 20:16:09886
887 EXPECT_EQ(OK, callback2.WaitForResult());
888 EXPECT_FALSE(callback.have_result());
889
890 handle.Reset();
891}
892
[email protected]ab838892009-06-30 18:49:05893TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:53894 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:09895
[email protected]c9d6a1d2009-07-14 16:15:20896 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
897 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
898 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
899 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
900 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
901 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
902 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
[email protected]f6d1d6eb2009-06-24 20:16:09903
904 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:20905 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]a6c59f62009-07-29 16:33:33906 EXPECT_FALSE(requests_[index_to_cancel]->handle()->is_initialized());
907 requests_[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:09908
[email protected]c9d6a1d2009-07-14 16:15:20909 ReleaseAllConnections(KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:09910
[email protected]c9d6a1d2009-07-14 16:15:20911 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
912 client_socket_factory_.allocation_count());
913 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup - 1,
[email protected]75439d3b2009-07-23 22:11:17914 completion_count_);
[email protected]f6d1d6eb2009-06-24 20:16:09915
[email protected]c9d6a1d2009-07-14 16:15:20916 EXPECT_EQ(1, GetOrderOfRequest(1));
917 EXPECT_EQ(2, GetOrderOfRequest(2));
918 EXPECT_EQ(5, GetOrderOfRequest(3));
919 EXPECT_EQ(3, GetOrderOfRequest(4));
920 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request.
921 EXPECT_EQ(4, GetOrderOfRequest(6));
922 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17923
924 // Make sure we test order of all requests made.
925 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:09926}
927
928class RequestSocketCallback : public CallbackRunner< Tuple1<int> > {
929 public:
[email protected]2ab05b52009-07-01 23:57:58930 RequestSocketCallback(ClientSocketHandle* handle,
[email protected]a937a06d2009-08-19 21:19:24931 TestClientSocketPool* pool,
[email protected]2ab05b52009-07-01 23:57:58932 TestConnectJobFactory* test_connect_job_factory,
933 TestConnectJob::JobType next_job_type)
[email protected]f6d1d6eb2009-06-24 20:16:09934 : handle_(handle),
[email protected]a512f5982009-08-18 16:01:06935 pool_(pool),
[email protected]2ab05b52009-07-01 23:57:58936 within_callback_(false),
937 test_connect_job_factory_(test_connect_job_factory),
938 next_job_type_(next_job_type) {}
[email protected]f6d1d6eb2009-06-24 20:16:09939
940 virtual void RunWithParams(const Tuple1<int>& params) {
941 callback_.RunWithParams(params);
942 ASSERT_EQ(OK, params.a);
943
944 if (!within_callback_) {
[email protected]2ab05b52009-07-01 23:57:58945 test_connect_job_factory_->set_job_type(next_job_type_);
[email protected]f6d1d6eb2009-06-24 20:16:09946 handle_->Reset();
947 within_callback_ = true;
[email protected]a937a06d2009-08-19 21:19:24948 int rv = InitHandle(
949 handle_, "a", kDefaultPriority, this, pool_.get(), NULL);
[email protected]2ab05b52009-07-01 23:57:58950 switch (next_job_type_) {
951 case TestConnectJob::kMockJob:
952 EXPECT_EQ(OK, rv);
953 break;
954 case TestConnectJob::kMockPendingJob:
955 EXPECT_EQ(ERR_IO_PENDING, rv);
956 break;
957 default:
958 FAIL() << "Unexpected job type: " << next_job_type_;
959 break;
960 }
[email protected]f6d1d6eb2009-06-24 20:16:09961 }
962 }
963
964 int WaitForResult() {
965 return callback_.WaitForResult();
966 }
967
968 private:
969 ClientSocketHandle* const handle_;
[email protected]a937a06d2009-08-19 21:19:24970 const scoped_refptr<TestClientSocketPool> pool_;
[email protected]f6d1d6eb2009-06-24 20:16:09971 bool within_callback_;
[email protected]2ab05b52009-07-01 23:57:58972 TestConnectJobFactory* const test_connect_job_factory_;
973 TestConnectJob::JobType next_job_type_;
[email protected]f6d1d6eb2009-06-24 20:16:09974 TestCompletionCallback callback_;
975};
976
[email protected]2ab05b52009-07-01 23:57:58977TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:53978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20979
[email protected]0b7648c2009-07-06 20:14:01980 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:06981 ClientSocketHandle handle;
[email protected]2ab05b52009-07-01 23:57:58982 RequestSocketCallback callback(
[email protected]a512f5982009-08-18 16:01:06983 &handle, pool_.get(), connect_job_factory_,
984 TestConnectJob::kMockPendingJob);
[email protected]a937a06d2009-08-19 21:19:24985 int rv = InitHandle(&handle, "a", kDefaultPriority, &callback,
986 pool_.get(), NULL);
[email protected]f6d1d6eb2009-06-24 20:16:09987 ASSERT_EQ(ERR_IO_PENDING, rv);
988
989 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]2ab05b52009-07-01 23:57:58990 handle.Reset();
991}
[email protected]f6d1d6eb2009-06-24 20:16:09992
[email protected]2ab05b52009-07-01 23:57:58993TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:53994 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20995
[email protected]0b7648c2009-07-06 20:14:01996 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:06997 ClientSocketHandle handle;
[email protected]2ab05b52009-07-01 23:57:58998 RequestSocketCallback callback(
[email protected]a512f5982009-08-18 16:01:06999 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob);
[email protected]a937a06d2009-08-19 21:19:241000 int rv = InitHandle(&handle, "a", kDefaultPriority, &callback,
1001 pool_.get(), NULL);
[email protected]2ab05b52009-07-01 23:57:581002 ASSERT_EQ(ERR_IO_PENDING, rv);
1003
1004 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]f6d1d6eb2009-06-24 20:16:091005 handle.Reset();
1006}
1007
1008// Make sure that pending requests get serviced after active requests get
1009// cancelled.
[email protected]ab838892009-06-30 18:49:051010TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531011 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201012
[email protected]0b7648c2009-07-06 20:14:011013 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091014
[email protected]c9d6a1d2009-07-14 16:15:201015 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1016 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1017 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1018 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1019 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1020 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1021 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
[email protected]f6d1d6eb2009-06-24 20:16:091022
[email protected]c9d6a1d2009-07-14 16:15:201023 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1024 // Let's cancel them.
1025 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]a6c59f62009-07-29 16:33:331026 ASSERT_FALSE(requests_[i]->handle()->is_initialized());
1027 requests_[i]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091028 }
1029
[email protected]f6d1d6eb2009-06-24 20:16:091030 // Let's wait for the rest to complete now.
[email protected]c9d6a1d2009-07-14 16:15:201031 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) {
1032 EXPECT_EQ(OK, requests_[i]->WaitForResult());
[email protected]a6c59f62009-07-29 16:33:331033 requests_[i]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091034 }
1035
[email protected]75439d3b2009-07-23 22:11:171036 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_);
[email protected]f6d1d6eb2009-06-24 20:16:091037}
1038
1039// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051040TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531041 const size_t kMaxSockets = 5;
1042 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201043
[email protected]0b7648c2009-07-06 20:14:011044 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091045
[email protected]211d21722009-07-22 15:48:531046 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1047 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091048
1049 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531050 for (size_t i = 0; i < kNumberOfRequests; ++i)
1051 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
[email protected]f6d1d6eb2009-06-24 20:16:091052
[email protected]211d21722009-07-22 15:48:531053 for (size_t i = 0; i < kNumberOfRequests; ++i)
1054 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult());
[email protected]f6d1d6eb2009-06-24 20:16:091055}
1056
[email protected]5fc08e32009-07-15 17:09:571057TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531058 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571059
1060 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1061
[email protected]a512f5982009-08-18 16:01:061062 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241063 int rv = InitHandle(req.handle(), "a", kDefaultPriority, &req,
1064 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571065 EXPECT_EQ(ERR_IO_PENDING, rv);
1066
1067 // Cancel the active request.
[email protected]a6c59f62009-07-29 16:33:331068 req.handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571069
[email protected]a937a06d2009-08-19 21:19:241070 rv = InitHandle(req.handle(), "a", kDefaultPriority, &req,
1071 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571072 EXPECT_EQ(ERR_IO_PENDING, rv);
1073 EXPECT_EQ(OK, req.WaitForResult());
1074
[email protected]a6c59f62009-07-29 16:33:331075 EXPECT_FALSE(req.handle()->is_reused());
[email protected]75439d3b2009-07-23 22:11:171076 EXPECT_EQ(1U, completion_count_);
[email protected]5fc08e32009-07-15 17:09:571077 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1078}
1079
[email protected]2ab05b52009-07-01 23:57:581080// A pending asynchronous job completes, which will free up a socket slot. The
1081// next job finishes synchronously. The callback for the asynchronous job
1082// should be first though.
1083TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531084 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201085
[email protected]2ab05b52009-07-01 23:57:581086 // First two jobs are async.
[email protected]0b7648c2009-07-06 20:14:011087 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2ab05b52009-07-01 23:57:581088
1089 // Start job 1 (async error).
[email protected]a512f5982009-08-18 16:01:061090 TestSocketRequest req1(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241091 int rv = InitHandle(req1.handle(), "a", kDefaultPriority, &req1,
1092 pool_.get(), NULL);
[email protected]2ab05b52009-07-01 23:57:581093 EXPECT_EQ(ERR_IO_PENDING, rv);
1094
1095 // Start job 2 (async error).
[email protected]a512f5982009-08-18 16:01:061096 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241097 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
1098 pool_.get(), NULL);
[email protected]2ab05b52009-07-01 23:57:581099 EXPECT_EQ(ERR_IO_PENDING, rv);
1100
1101 // The pending job is sync.
[email protected]0b7648c2009-07-06 20:14:011102 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]2ab05b52009-07-01 23:57:581103
1104 // Request 3 does not have a ConnectJob yet. It's just pending.
[email protected]a512f5982009-08-18 16:01:061105 TestSocketRequest req3(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241106 rv = InitHandle(
1107 req3.handle(), "a", kDefaultPriority, &req3, pool_.get(), NULL);
[email protected]2ab05b52009-07-01 23:57:581108 EXPECT_EQ(ERR_IO_PENDING, rv);
1109
1110 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult());
1111 EXPECT_EQ(ERR_CONNECTION_FAILED, req2.WaitForResult());
1112 EXPECT_EQ(OK, req3.WaitForResult());
1113
1114 ASSERT_EQ(3U, request_order_.size());
1115
1116 // After job 1 finishes unsuccessfully, it will try to process the pending
1117 // requests queue, so it starts up job 3 for request 3. This job
1118 // synchronously succeeds, so the request order is 1, 3, 2.
1119 EXPECT_EQ(&req1, request_order_[0]);
1120 EXPECT_EQ(&req2, request_order_[2]);
1121 EXPECT_EQ(&req3, request_order_[1]);
1122}
1123
[email protected]5fc08e32009-07-15 17:09:571124// When a ConnectJob is coupled to a request, even if a free socket becomes
1125// available, the request will be serviced by the ConnectJob.
1126TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531127 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]d80a4322009-08-14 07:07:491128 EnableLateBindingOfSockets(false);
[email protected]5fc08e32009-07-15 17:09:571129
1130 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321131 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571132
[email protected]a512f5982009-08-18 16:01:061133 TestSocketRequest req1(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241134 int rv = InitHandle(req1.handle(), "a", kDefaultPriority, &req1,
1135 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571136 EXPECT_EQ(ERR_IO_PENDING, rv);
1137 EXPECT_EQ(OK, req1.WaitForResult());
1138
1139 // Job 1 finished OK. Start job 2 (also async OK). Release socket 1.
1140 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1141
[email protected]a512f5982009-08-18 16:01:061142 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241143 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
1144 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571145 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]a6c59f62009-07-29 16:33:331146 req1.handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571147 MessageLoop::current()->RunAllPending(); // Run the DoReleaseSocket()
1148
1149 // Job 2 is pending. Start request 3 (which has no associated job since it
1150 // will use the idle socket).
1151
[email protected]a512f5982009-08-18 16:01:061152 TestSocketRequest req3(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241153 rv = InitHandle(req3.handle(), "a", kDefaultPriority, &req3,
1154 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571155 EXPECT_EQ(OK, rv);
1156
[email protected]a6c59f62009-07-29 16:33:331157 EXPECT_FALSE(req2.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571158 client_socket_factory_.SignalJobs();
1159 EXPECT_EQ(OK, req2.WaitForResult());
1160
1161 ASSERT_EQ(2U, request_order_.size());
1162 EXPECT_EQ(&req1, request_order_[0]);
1163 EXPECT_EQ(&req2, request_order_[1]);
1164 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1165}
1166
[email protected]2b7523d2009-07-29 20:29:231167// Regression test for http://crbug.com/17985.
1168TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1169 const int kMaxSockets = 3;
1170 const int kMaxSocketsPerGroup = 2;
1171 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1172
1173 const int kHighPriority = kDefaultPriority + 100;
1174
1175 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1176 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1177
1178 // This is going to be a pending request in an otherwise empty group.
1179 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1180
1181 // Reach the maximum socket limit.
1182 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
1183
1184 // Create a stalled group with high priorities.
1185 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1186 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1187 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
1188
1189 // Release the first two sockets from "a", which will make room
1190 // for requests from "c". After that "a" will have no active sockets
1191 // and one pending request.
1192 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
1193 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
1194
1195 // Closing idle sockets should not get us into trouble, but in the bug
1196 // we were hitting a CHECK here.
1197 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
1198 pool_->CloseIdleSockets();
1199 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1200}
1201
[email protected]5fc08e32009-07-15 17:09:571202class ClientSocketPoolBaseTest_LateBinding : public ClientSocketPoolBaseTest {
1203 protected:
1204 virtual void SetUp() {
1205 ClientSocketPoolBaseTest::SetUp();
[email protected]d80a4322009-08-14 07:07:491206 EnableLateBindingOfSockets(true);
[email protected]5fc08e32009-07-15 17:09:571207 }
1208};
1209
[email protected]6e713f02009-08-06 02:56:401210// Even though a timeout is specified, it doesn't time out on a synchronous
1211// completion.
1212TEST_F(ClientSocketPoolBaseTest_LateBinding,
1213 ConnectJob_NoTimeoutOnSynchronousCompletion) {
1214 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:061215 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:491216 TestClientSocketPoolBase::Request request(&ignored, NULL, 0, NULL, NULL);
[email protected]6e713f02009-08-06 02:56:401217 scoped_ptr<TestConnectJob> job(
1218 new TestConnectJob(TestConnectJob::kMockJob,
[email protected]ec08bb22009-08-12 00:25:121219 "a",
[email protected]6e713f02009-08-06 02:56:401220 request,
1221 base::TimeDelta::FromMicroseconds(1),
1222 &delegate,
[email protected]fd7b7c92009-08-20 19:38:301223 &client_socket_factory_,
1224 NULL));
[email protected]6e713f02009-08-06 02:56:401225 EXPECT_EQ(OK, job->Connect());
1226}
1227
1228TEST_F(ClientSocketPoolBaseTest_LateBinding, ConnectJob_TimedOut) {
1229 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:061230 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:491231 TestClientSocketPoolBase::Request request(&ignored, NULL, 0, NULL, NULL);
[email protected]6e713f02009-08-06 02:56:401232 // Deleted by TestConnectJobDelegate.
1233 TestConnectJob* job =
1234 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:121235 "a",
[email protected]6e713f02009-08-06 02:56:401236 request,
1237 base::TimeDelta::FromMicroseconds(1),
1238 &delegate,
[email protected]fd7b7c92009-08-20 19:38:301239 &client_socket_factory_,
1240 NULL);
[email protected]6e713f02009-08-06 02:56:401241 ASSERT_EQ(ERR_IO_PENDING, job->Connect());
1242 PlatformThread::Sleep(1);
1243 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult());
1244}
1245
[email protected]5fc08e32009-07-15 17:09:571246TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:531247 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571248
1249 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:061250 ClientSocketHandle handle;
[email protected]fd7b7c92009-08-20 19:38:301251 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]a937a06d2009-08-19 21:19:241252 EXPECT_EQ(OK, InitHandle(&handle, "a", kDefaultPriority, &callback,
[email protected]fd7b7c92009-08-20 19:38:301253 pool_.get(), log));
[email protected]5fc08e32009-07-15 17:09:571254 EXPECT_TRUE(handle.is_initialized());
1255 EXPECT_TRUE(handle.socket());
1256 handle.Reset();
[email protected]fd7b7c92009-08-20 19:38:301257
1258 EXPECT_EQ(4u, log->events().size());
1259 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1260 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1261 LoadLog::PHASE_BEGIN);
1262 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1263 LoadLog::PHASE_END);
1264 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]5fc08e32009-07-15 17:09:571265}
1266
1267TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531268 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571269
1270 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061271 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]fd7b7c92009-08-20 19:38:301272 scoped_refptr<LoadLog> log(new LoadLog);
1273 int rv = InitHandle(req.handle(), "a", 0, &req, pool_.get(), log);
[email protected]5fc08e32009-07-15 17:09:571274 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]a6c59f62009-07-29 16:33:331275 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle()));
[email protected]5fc08e32009-07-15 17:09:571276 EXPECT_EQ(OK, req.WaitForResult());
[email protected]a6c59f62009-07-29 16:33:331277 EXPECT_TRUE(req.handle()->is_initialized());
1278 EXPECT_TRUE(req.handle()->socket());
1279 req.handle()->Reset();
[email protected]fd7b7c92009-08-20 19:38:301280
1281 EXPECT_EQ(6u, log->events().size());
1282 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1283 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1284 LoadLog::PHASE_BEGIN);
1285 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1286 LoadLog::PHASE_END);
1287 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1288 LoadLog::PHASE_BEGIN);
1289 ExpectLogContains(log, 4, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1290 LoadLog::PHASE_END);
1291 ExpectLogContains(log, 5, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]5fc08e32009-07-15 17:09:571292}
1293
1294TEST_F(ClientSocketPoolBaseTest_LateBinding, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:531295 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571296
1297 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
[email protected]a512f5982009-08-18 16:01:061298 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]fd7b7c92009-08-20 19:38:301299 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]5fc08e32009-07-15 17:09:571300 EXPECT_EQ(ERR_CONNECTION_FAILED,
[email protected]a937a06d2009-08-19 21:19:241301 InitHandle(req.handle(), "a", kDefaultPriority, &req,
[email protected]fd7b7c92009-08-20 19:38:301302 pool_.get(), log));
1303
1304 EXPECT_EQ(4u, log->events().size());
1305 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1306 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1307 LoadLog::PHASE_BEGIN);
1308 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1309 LoadLog::PHASE_END);
1310 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]5fc08e32009-07-15 17:09:571311}
1312
1313TEST_F(ClientSocketPoolBaseTest_LateBinding,
1314 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531315 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571316
1317 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]a512f5982009-08-18 16:01:061318 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]fd7b7c92009-08-20 19:38:301319 scoped_refptr<LoadLog> log(new LoadLog);
[email protected]5fc08e32009-07-15 17:09:571320 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:241321 InitHandle(req.handle(), "a", kDefaultPriority, &req,
[email protected]fd7b7c92009-08-20 19:38:301322 pool_.get(), log));
[email protected]a6c59f62009-07-29 16:33:331323 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle()));
[email protected]5fc08e32009-07-15 17:09:571324 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
[email protected]fd7b7c92009-08-20 19:38:301325
1326 EXPECT_EQ(6u, log->events().size());
1327 ExpectLogContains(log, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1328 ExpectLogContains(log, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1329 LoadLog::PHASE_BEGIN);
1330 ExpectLogContains(log, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1331 LoadLog::PHASE_END);
1332 ExpectLogContains(log, 3, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1333 LoadLog::PHASE_BEGIN);
1334 ExpectLogContains(log, 4, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1335 LoadLog::PHASE_END);
1336 ExpectLogContains(log, 5, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
[email protected]5fc08e32009-07-15 17:09:571337}
1338
1339TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531340 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571341
1342 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1343 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1344 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1345 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
1346 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
1347 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
1348 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1349
1350 ReleaseAllConnections(KEEP_ALIVE);
1351
1352 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1353 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:171354 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_);
[email protected]5fc08e32009-07-15 17:09:571355
1356 EXPECT_EQ(1, GetOrderOfRequest(1));
1357 EXPECT_EQ(2, GetOrderOfRequest(2));
1358 EXPECT_EQ(6, GetOrderOfRequest(3));
1359 EXPECT_EQ(4, GetOrderOfRequest(4));
1360 EXPECT_EQ(3, GetOrderOfRequest(5));
1361 EXPECT_EQ(5, GetOrderOfRequest(6));
1362 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171363
1364 // Make sure we test order of all requests made.
1365 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]5fc08e32009-07-15 17:09:571366}
1367
1368TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571370
1371 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1372 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1373 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1374 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
1375 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
1376 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
1377 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1378
1379 ReleaseAllConnections(NO_KEEP_ALIVE);
1380
1381 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i)
1382 EXPECT_EQ(OK, requests_[i]->WaitForResult());
1383
1384 EXPECT_EQ(static_cast<int>(requests_.size()),
1385 client_socket_factory_.allocation_count());
[email protected]75439d3b2009-07-23 22:11:171386 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_);
[email protected]5fc08e32009-07-15 17:09:571387}
1388
1389// This test will start up a RequestSocket() and then immediately Cancel() it.
1390// The pending connect job will be cancelled and should not call back into
1391// ClientSocketPoolBase.
1392TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531393 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571394
1395 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061396 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]5fc08e32009-07-15 17:09:571397 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:241398 InitHandle(req.handle(), "a", kDefaultPriority, &req,
1399 pool_.get(), NULL));
[email protected]a6c59f62009-07-29 16:33:331400 req.handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571401}
1402
1403TEST_F(ClientSocketPoolBaseTest_LateBinding, TwoRequestsCancelOne) {
[email protected]211d21722009-07-22 15:48:531404 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571405
1406 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061407 TestSocketRequest req(&request_order_, &completion_count_);
1408 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]5fc08e32009-07-15 17:09:571409
[email protected]fd7b7c92009-08-20 19:38:301410 scoped_refptr<LoadLog> log1(new LoadLog);
[email protected]5fc08e32009-07-15 17:09:571411 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:241412 InitHandle(req.handle(), "a", kDefaultPriority, &req,
[email protected]fd7b7c92009-08-20 19:38:301413 pool_.get(), log1));
1414 scoped_refptr<LoadLog> log2(new LoadLog);
[email protected]5fc08e32009-07-15 17:09:571415 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:241416 InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
[email protected]fd7b7c92009-08-20 19:38:301417 pool_.get(), log2));
[email protected]5fc08e32009-07-15 17:09:571418
[email protected]a6c59f62009-07-29 16:33:331419 req.handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571420
[email protected]fd7b7c92009-08-20 19:38:301421 EXPECT_EQ(5u, log1->events().size());
1422 ExpectLogContains(log1, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1423 ExpectLogContains(log1, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1424 LoadLog::PHASE_BEGIN);
1425 ExpectLogContains(log1, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1426 LoadLog::PHASE_END);
1427 ExpectLogContains(log1, 3, LoadLog::TYPE_CANCELLED, LoadLog::PHASE_NONE);
1428 ExpectLogContains(log1, 4, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
1429
1430 // At this point, request 2 is just waiting for the connect job to finish.
1431 EXPECT_EQ(2u, log2->events().size());
1432 ExpectLogContains(log2, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1433 ExpectLogContains(log2, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1434 LoadLog::PHASE_BEGIN);
1435
[email protected]5fc08e32009-07-15 17:09:571436 EXPECT_EQ(OK, req2.WaitForResult());
[email protected]a6c59f62009-07-29 16:33:331437 req2.handle()->Reset();
[email protected]fd7b7c92009-08-20 19:38:301438
1439 // Now request 2 has actually finished.
1440 EXPECT_EQ(6u, log2->events().size());
1441 ExpectLogContains(log2, 0, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_BEGIN);
1442 ExpectLogContains(log2, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1443 LoadLog::PHASE_BEGIN);
1444 ExpectLogContains(log1, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE,
1445 LoadLog::PHASE_END);
1446 ExpectLogContains(log2, 3, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1447 LoadLog::PHASE_BEGIN);
1448 ExpectLogContains(log2, 4, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB,
1449 LoadLog::PHASE_END);
1450 ExpectLogContains(log2, 5, LoadLog::TYPE_SOCKET_POOL, LoadLog::PHASE_END);
1451
[email protected]5fc08e32009-07-15 17:09:571452}
1453
1454TEST_F(ClientSocketPoolBaseTest_LateBinding, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531455 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571456
1457 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061458 ClientSocketHandle handle;
[email protected]5fc08e32009-07-15 17:09:571459 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:061460 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]5fc08e32009-07-15 17:09:571461
1462 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:241463 InitHandle(&handle, "a", kDefaultPriority, &callback,
1464 pool_.get(), NULL));
[email protected]5fc08e32009-07-15 17:09:571465
1466 handle.Reset();
1467
1468 TestCompletionCallback callback2;
1469 EXPECT_EQ(ERR_IO_PENDING,
[email protected]a937a06d2009-08-19 21:19:241470 InitHandle(&handle, "a", kDefaultPriority, &callback2,
1471 pool_.get(), NULL));
[email protected]5fc08e32009-07-15 17:09:571472
1473 EXPECT_EQ(OK, callback2.WaitForResult());
1474 EXPECT_FALSE(callback.have_result());
1475
1476 handle.Reset();
1477}
1478
1479TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531480 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571481
1482 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1483 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1484 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1485 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
1486 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
1487 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
1488 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1489
1490 // Cancel a request.
1491 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]a6c59f62009-07-29 16:33:331492 EXPECT_FALSE(requests_[index_to_cancel]->handle()->is_initialized());
1493 requests_[index_to_cancel]->handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571494
1495 ReleaseAllConnections(KEEP_ALIVE);
1496
1497 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1498 client_socket_factory_.allocation_count());
1499 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup - 1,
[email protected]75439d3b2009-07-23 22:11:171500 completion_count_);
[email protected]5fc08e32009-07-15 17:09:571501
1502 EXPECT_EQ(1, GetOrderOfRequest(1));
1503 EXPECT_EQ(2, GetOrderOfRequest(2));
1504 EXPECT_EQ(5, GetOrderOfRequest(3));
1505 EXPECT_EQ(3, GetOrderOfRequest(4));
1506 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request.
1507 EXPECT_EQ(4, GetOrderOfRequest(6));
1508 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171509
1510 // Make sure we test order of all requests made.
1511 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]5fc08e32009-07-15 17:09:571512}
1513
[email protected]974ebd62009-08-03 23:14:341514TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341515 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1516
[email protected]17a0c6c2009-08-04 00:07:041517 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1518
[email protected]974ebd62009-08-03 23:14:341519 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1520 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
1521 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
1522 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
1523
1524 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1525 requests_[2]->handle()->Reset();
1526 requests_[3]->handle()->Reset();
1527 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1528
1529 requests_[1]->handle()->Reset();
1530 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1531
1532 requests_[0]->handle()->Reset();
1533 EXPECT_EQ(kDefaultMaxSocketsPerGroup - 1, pool_->NumConnectJobsInGroup("a"));
1534}
1535
[email protected]5fc08e32009-07-15 17:09:571536TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531537 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571538
1539 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061540 ClientSocketHandle handle;
[email protected]5fc08e32009-07-15 17:09:571541 RequestSocketCallback callback(
[email protected]a512f5982009-08-18 16:01:061542 &handle, pool_.get(), connect_job_factory_,
1543 TestConnectJob::kMockPendingJob);
[email protected]a937a06d2009-08-19 21:19:241544 int rv = InitHandle(
1545 &handle, "a", kDefaultPriority, &callback, pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571546 ASSERT_EQ(ERR_IO_PENDING, rv);
1547
1548 EXPECT_EQ(OK, callback.WaitForResult());
1549 handle.Reset();
1550}
1551
1552TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531553 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571554
1555 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061556 ClientSocketHandle handle;
[email protected]5fc08e32009-07-15 17:09:571557 RequestSocketCallback callback(
[email protected]a512f5982009-08-18 16:01:061558 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob);
[email protected]a937a06d2009-08-19 21:19:241559 int rv = InitHandle(
1560 &handle, "a", kDefaultPriority, &callback,
[email protected]a512f5982009-08-18 16:01:061561 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571562 ASSERT_EQ(ERR_IO_PENDING, rv);
1563
1564 EXPECT_EQ(OK, callback.WaitForResult());
1565 handle.Reset();
1566}
1567
1568// Make sure that pending requests get serviced after active requests get
1569// cancelled.
1570TEST_F(ClientSocketPoolBaseTest_LateBinding,
1571 CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531572 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571573
1574 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1575
1576 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1577 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1578 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1579 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1580 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1581 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1582 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1583
1584 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1585 // Let's cancel them.
1586 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]a6c59f62009-07-29 16:33:331587 ASSERT_FALSE(requests_[i]->handle()->is_initialized());
1588 requests_[i]->handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571589 }
1590
1591 // Let's wait for the rest to complete now.
1592 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) {
1593 EXPECT_EQ(OK, requests_[i]->WaitForResult());
[email protected]a6c59f62009-07-29 16:33:331594 requests_[i]->handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571595 }
1596
[email protected]75439d3b2009-07-23 22:11:171597 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_);
[email protected]5fc08e32009-07-15 17:09:571598}
1599
1600// Make sure that pending requests get serviced after active requests fail.
1601TEST_F(ClientSocketPoolBaseTest_LateBinding,
1602 FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531603 const int kMaxSockets = 5;
1604 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571605
1606 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1607
[email protected]211d21722009-07-22 15:48:531608 const int kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1609 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test hangs.
[email protected]5fc08e32009-07-15 17:09:571610
1611 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531612 for (int i = 0; i < kNumberOfRequests; ++i)
1613 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
[email protected]5fc08e32009-07-15 17:09:571614
[email protected]211d21722009-07-22 15:48:531615 for (int i = 0; i < kNumberOfRequests; ++i)
1616 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult());
[email protected]5fc08e32009-07-15 17:09:571617}
1618
1619TEST_F(ClientSocketPoolBaseTest_LateBinding,
1620 CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531621 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571622
1623 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1624
[email protected]a512f5982009-08-18 16:01:061625 TestSocketRequest req(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241626 int rv = InitHandle(req.handle(), "a", kDefaultPriority, &req,
1627 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571628 EXPECT_EQ(ERR_IO_PENDING, rv);
1629
1630 // Cancel the active request.
[email protected]a6c59f62009-07-29 16:33:331631 req.handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571632
[email protected]a937a06d2009-08-19 21:19:241633 rv = InitHandle(req.handle(), "a", kDefaultPriority, &req,
1634 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571635 EXPECT_EQ(ERR_IO_PENDING, rv);
1636 EXPECT_EQ(OK, req.WaitForResult());
1637
[email protected]a6c59f62009-07-29 16:33:331638 EXPECT_FALSE(req.handle()->is_reused());
[email protected]75439d3b2009-07-23 22:11:171639 EXPECT_EQ(1U, completion_count_);
[email protected]5fc08e32009-07-15 17:09:571640 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1641}
1642
1643// When requests and ConnectJobs are not coupled, the request will get serviced
1644// by whatever comes first.
1645TEST_F(ClientSocketPoolBaseTest_LateBinding, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531646 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571647
1648 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321649 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571650
[email protected]a512f5982009-08-18 16:01:061651 TestSocketRequest req1(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241652 int rv = InitHandle(req1.handle(), "a", kDefaultPriority,
1653 &req1, pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571654 EXPECT_EQ(ERR_IO_PENDING, rv);
1655 EXPECT_EQ(OK, req1.WaitForResult());
1656
1657 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1658 // without a job.
1659 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1660
[email protected]a512f5982009-08-18 16:01:061661 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241662 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
1663 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571664 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]a512f5982009-08-18 16:01:061665 TestSocketRequest req3(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241666 rv = InitHandle(
1667 req3.handle(), "a", kDefaultPriority, &req3, pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571668 EXPECT_EQ(ERR_IO_PENDING, rv);
1669
1670 // Both Requests 2 and 3 are pending. We release socket 1 which should
1671 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331672 req1.handle()->Reset();
[email protected]5fc08e32009-07-15 17:09:571673 MessageLoop::current()->RunAllPending(); // Run the DoReleaseSocket()
[email protected]a6c59f62009-07-29 16:33:331674 ASSERT_TRUE(req2.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571675 EXPECT_EQ(OK, req2.WaitForResult());
[email protected]a6c59f62009-07-29 16:33:331676 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571677
1678 // Signal job 2, which should service request 3.
1679
1680 client_socket_factory_.SignalJobs();
1681 EXPECT_EQ(OK, req3.WaitForResult());
1682
1683 ASSERT_EQ(3U, request_order_.size());
1684 EXPECT_EQ(&req1, request_order_[0]);
1685 EXPECT_EQ(&req2, request_order_[1]);
1686 EXPECT_EQ(&req3, request_order_[2]);
1687 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1688}
1689
1690// The requests are not coupled to the jobs. So, the requests should finish in
1691// their priority / insertion order.
1692TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531693 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571694 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321695 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571696
[email protected]a512f5982009-08-18 16:01:061697 TestSocketRequest req1(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241698 int rv = InitHandle(
1699 req1.handle(), "a", kDefaultPriority, &req1, pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571700 EXPECT_EQ(ERR_IO_PENDING, rv);
1701
[email protected]a512f5982009-08-18 16:01:061702 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241703 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
1704 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571705 EXPECT_EQ(ERR_IO_PENDING, rv);
1706
1707 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321708 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571709
[email protected]a512f5982009-08-18 16:01:061710 TestSocketRequest req3(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241711 rv = InitHandle(
1712 req3.handle(), "a", kDefaultPriority, &req3, pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571713 EXPECT_EQ(ERR_IO_PENDING, rv);
1714
1715 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult());
1716 EXPECT_EQ(OK, req2.WaitForResult());
1717 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult());
1718
1719 ASSERT_EQ(3U, request_order_.size());
1720 EXPECT_EQ(&req1, request_order_[0]);
1721 EXPECT_EQ(&req2, request_order_[1]);
1722 EXPECT_EQ(&req3, request_order_[2]);
1723}
1724
[email protected]f0109a7d2009-07-16 00:09:521725TEST_F(ClientSocketPoolBaseTest_LateBinding, DISABLED_LoadState) {
[email protected]211d21722009-07-22 15:48:531726 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571727 connect_job_factory_->set_job_type(
[email protected]b59ff372009-07-15 22:04:321728 TestConnectJob::kMockAdvancingLoadStateJob);
[email protected]5fc08e32009-07-15 17:09:571729
[email protected]a512f5982009-08-18 16:01:061730 TestSocketRequest req1(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241731 int rv = InitHandle(
1732 req1.handle(), "a", kDefaultPriority, &req1, pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571733 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]a6c59f62009-07-29 16:33:331734 EXPECT_EQ(LOAD_STATE_IDLE, req1.handle()->GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571735
1736 MessageLoop::current()->RunAllPending();
1737
[email protected]a512f5982009-08-18 16:01:061738 TestSocketRequest req2(&request_order_, &completion_count_);
[email protected]a937a06d2009-08-19 21:19:241739 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2,
1740 pool_.get(), NULL);
[email protected]5fc08e32009-07-15 17:09:571741 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]a6c59f62009-07-29 16:33:331742 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req1.handle()->GetLoadState());
1743 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req2.handle()->GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571744}
1745
[email protected]2b7523d2009-07-29 20:29:231746// Regression test for http://crbug.com/17985.
1747TEST_F(ClientSocketPoolBaseTest_LateBinding,
1748 GroupWithPendingRequestsIsNotEmpty) {
1749 const int kMaxSockets = 3;
1750 const int kMaxSocketsPerGroup = 2;
1751 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1752
1753 const int kHighPriority = kDefaultPriority + 100;
1754
1755 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1756 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
1757
1758 // This is going to be a pending request in an otherwise empty group.
1759 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1760
1761 // Reach the maximum socket limit.
1762 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
1763
1764 // Create a stalled group with high priorities.
1765 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1766 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1767 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
1768
1769 // Release the first two sockets from "a", which will make room
1770 // for requests from "c". After that "a" will have no active sockets
1771 // and one pending request.
1772 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
1773 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
1774
1775 // Closing idle sockets should not get us into trouble, but in the bug
1776 // we were hitting a CHECK here.
1777 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
1778 pool_->CloseIdleSockets();
1779 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1780}
1781
[email protected]9bf28db2009-08-29 01:35:161782TEST_F(ClientSocketPoolBaseTest_LateBinding, CleanupTimedOutIdleSockets) {
1783 CreatePoolWithIdleTimeouts(
1784 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1785 base::TimeDelta(), // Time out unused sockets immediately.
1786 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
1787
1788 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1789
1790 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
1791
1792 TestSocketRequest req(&request_order_, &completion_count_);
1793 int rv = InitHandle(req.handle(), "a", 0, &req, pool_.get(), NULL);
1794 EXPECT_EQ(ERR_IO_PENDING, rv);
1795 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle()));
1796
1797 TestSocketRequest req2(&request_order_, &completion_count_);
1798 rv = InitHandle(req2.handle(), "a", 0, &req2, pool_.get(), NULL);
1799 EXPECT_EQ(ERR_IO_PENDING, rv);
1800 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req2.handle()));
1801
1802 // Cancel one of the requests. Wait for the other, which will get the first
1803 // job. Release the socket. Run the loop again to make sure the second
1804 // socket is sitting idle and the first one is released (since ReleaseSocket()
1805 // just posts a DoReleaseSocket() task).
1806
1807 req.handle()->Reset();
1808 EXPECT_EQ(OK, req2.WaitForResult());
1809 req2.handle()->Reset();
1810 MessageLoop::current()->RunAllPending();
1811
1812 ASSERT_EQ(2, pool_->IdleSocketCount());
1813
1814 // Invoke the idle socket cleanup check. Only one socket should be left, the
1815 // used socket. Request it to make sure that it's used.
1816
1817 pool_->CleanupTimedOutIdleSockets();
1818 rv = InitHandle(req.handle(), "a", 0, &req, pool_.get(), NULL);
1819 EXPECT_EQ(OK, rv);
1820 EXPECT_TRUE(req.handle()->is_reused());
1821}
1822
[email protected]f6d1d6eb2009-06-24 20:16:091823} // namespace
1824
1825} // namespace net