diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/socket/client_socket_pool_base.cc | 77 | ||||
-rw-r--r-- | net/socket/client_socket_pool_base.h | 55 | ||||
-rw-r--r-- | net/socket/client_socket_pool_base_unittest.cc | 64 |
3 files changed, 126 insertions, 70 deletions
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index 521436f..90f52f7 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc @@ -74,8 +74,7 @@ ConnectJob::ConnectJob(const std::string& group_name, timeout_duration_(timeout_duration), delegate_(delegate), net_log_(net_log), - idle_(true), - preconnect_state_(NOT_PRECONNECT) { + idle_(true) { DCHECK(!group_name.empty()); DCHECK(delegate); net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB, NULL); @@ -85,13 +84,6 @@ ConnectJob::~ConnectJob() { net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB, NULL); } -void ConnectJob::Initialize(bool is_preconnect) { - if (is_preconnect) - preconnect_state_ = UNUSED_PRECONNECT; - else - preconnect_state_ = NOT_PRECONNECT; -} - int ConnectJob::Connect() { if (timeout_duration_ != base::TimeDelta()) timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout); @@ -110,11 +102,6 @@ int ConnectJob::Connect() { return rv; } -void ConnectJob::UseForNormalRequest() { - DCHECK_EQ(UNUSED_PRECONNECT, preconnect_state_); - preconnect_state_ = USED_PRECONNECT; -} - void ConnectJob::set_socket(StreamSocket* socket) { if (socket) { net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, make_scoped_refptr( @@ -338,11 +325,14 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal( if (!(request->flags() & NO_IDLE_SOCKETS)) { // Try to reuse a socket. - if (AssignIdleSocketToGroup(request, group)) + if (AssignIdleSocketToRequest(request, group)) return OK; } - if (!preconnecting && group->TryToUsePreconnectConnectJob()) + // If there are more ConnectJobs than pending requests, don't need to do + // anything. Can just wait for the extra job to connect, and then assign it + // to the request. + if (!preconnecting && group->TryToUseUnassignedConnectJob()) return ERR_IO_PENDING; // Can we make another active socket now? @@ -381,7 +371,6 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal( scoped_ptr<ConnectJob> connect_job( connect_job_factory_->NewConnectJob(group_name, *request, this)); - connect_job->Initialize(preconnecting); int rv = connect_job->Connect(); if (rv == OK) { LogBoundConnectJobToRequest(connect_job->net_log().source(), request); @@ -402,7 +391,7 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal( connecting_socket_count_++; - group->AddJob(connect_job.release()); + group->AddJob(connect_job.release(), preconnecting); } else { LogBoundConnectJobToRequest(connect_job->net_log().source(), request); StreamSocket* error_socket = NULL; @@ -422,7 +411,7 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal( return rv; } -bool ClientSocketPoolBaseHelper::AssignIdleSocketToGroup( +bool ClientSocketPoolBaseHelper::AssignIdleSocketToRequest( const Request* request, Group* group) { std::list<IdleSocket>* idle_sockets = group->mutable_idle_sockets(); std::list<IdleSocket>::iterator idle_socket_it = idle_sockets->end(); @@ -1142,11 +1131,13 @@ void ClientSocketPoolBaseHelper::InvokeUserCallback( } ClientSocketPoolBaseHelper::Group::Group() - : active_socket_count_(0), + : unassigned_job_count_(0), + active_socket_count_(0), ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {} ClientSocketPoolBaseHelper::Group::~Group() { CleanupBackupJob(); + DCHECK_EQ(0u, unassigned_job_count_); } void ClientSocketPoolBaseHelper::Group::StartBackupSocketTimer( @@ -1163,16 +1154,31 @@ void ClientSocketPoolBaseHelper::Group::StartBackupSocketTimer( pool->ConnectRetryInterval()); } -bool ClientSocketPoolBaseHelper::Group::TryToUsePreconnectConnectJob() { - for (std::set<ConnectJob*>::iterator it = jobs_.begin(); - it != jobs_.end(); ++it) { - ConnectJob* job = *it; - if (job->is_unused_preconnect()) { - job->UseForNormalRequest(); - return true; - } - } - return false; +bool ClientSocketPoolBaseHelper::Group::TryToUseUnassignedConnectJob() { + SanityCheck(); + + if (unassigned_job_count_ == 0) + return false; + --unassigned_job_count_; + return true; +} + +void ClientSocketPoolBaseHelper::Group::AddJob(ConnectJob* job, + bool is_preconnect) { + SanityCheck(); + + if (is_preconnect) + ++unassigned_job_count_; + jobs_.insert(job); +} + +void ClientSocketPoolBaseHelper::Group::RemoveJob(ConnectJob* job) { + SanityCheck(); + + jobs_.erase(job); + size_t job_count = jobs_.size(); + if (job_count < unassigned_job_count_) + unassigned_job_count_ = job_count; } void ClientSocketPoolBaseHelper::Group::OnBackupSocketTimerFired( @@ -1185,7 +1191,7 @@ void ClientSocketPoolBaseHelper::Group::OnBackupSocketTimerFired( return; } - // If our backup job is waiting on DNS, or if we can't create any sockets + // If our old job is waiting on DNS, or if we can't create any sockets // right now due to limits, just reset the timer. if (pool->ReachedMaxSocketsLimit() || !HasAvailableSocketSlot(pool->max_sockets_per_group_) || @@ -1203,14 +1209,21 @@ void ClientSocketPoolBaseHelper::Group::OnBackupSocketTimerFired( SIMPLE_STATS_COUNTER("socket.backup_created"); int rv = backup_job->Connect(); pool->connecting_socket_count_++; - AddJob(backup_job); + AddJob(backup_job, false); if (rv != ERR_IO_PENDING) pool->OnConnectJobComplete(rv, backup_job); } +void ClientSocketPoolBaseHelper::Group::SanityCheck() { + DCHECK_LE(unassigned_job_count_, jobs_.size()); +} + void ClientSocketPoolBaseHelper::Group::RemoveAllJobs() { + SanityCheck(); + // Delete active jobs. STLDeleteElements(&jobs_); + unassigned_job_count_ = 0; // Cancel pending backup job. weak_factory_.InvalidateWeakPtrs(); diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h index 832c166..0775dc59 100644 --- a/net/socket/client_socket_pool_base.h +++ b/net/socket/client_socket_pool_base.h @@ -85,16 +85,6 @@ class NET_EXPORT_PRIVATE ConnectJob { // Accessors const std::string& group_name() const { return group_name_; } const BoundNetLog& net_log() { return net_log_; } - bool is_preconnect() const { return preconnect_state_ != NOT_PRECONNECT; } - bool is_unused_preconnect() const { - return preconnect_state_ == UNUSED_PRECONNECT; - } - - // Initialized by the ClientSocketPoolBaseHelper. - // TODO(willchan): Move most of the constructor arguments over here. We - // shouldn't give the ConnectJobFactory (subclasses) the ability to screw up - // the initialization. - void Initialize(bool is_preconnect); // Releases |socket_| to the client. On connection error, this should return // NULL. @@ -108,10 +98,6 @@ class NET_EXPORT_PRIVATE ConnectJob { // if it succeeded. int Connect(); - // Precondition: is_unused_preconnect() must be true. Marks the job as a - // used preconnect job. - void UseForNormalRequest(); - virtual LoadState GetLoadState() const = 0; // If Connect returns an error (or OnConnectJobComplete reports an error @@ -128,12 +114,6 @@ class NET_EXPORT_PRIVATE ConnectJob { void ResetTimer(base::TimeDelta remainingTime); private: - enum PreconnectState { - NOT_PRECONNECT, - UNUSED_PRECONNECT, - USED_PRECONNECT, - }; - virtual int ConnectInternal() = 0; void LogConnectStart(); @@ -151,7 +131,6 @@ class NET_EXPORT_PRIVATE ConnectJob { BoundNetLog net_log_; // A ConnectJob is idle until Connect() has been called. bool idle_; - PreconnectState preconnect_state_; DISALLOW_COPY_AND_ASSIGN(ConnectJob); }; @@ -293,6 +272,10 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper ClientSocketPool::kMaxConnectRetryIntervalMs); } + int NumUnassignedConnectJobsInGroup(const std::string& group_name) const { + return group_map_.find(group_name)->second->unassigned_job_count(); + } + int NumConnectJobsInGroup(const std::string& group_name) const { return group_map_.find(group_name)->second->jobs().size(); } @@ -409,17 +392,19 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper void StartBackupSocketTimer(const std::string& group_name, ClientSocketPoolBaseHelper* pool); - // Searches |jobs_| to see if there's a preconnect ConnectJob, and if so, - // uses it. Returns true on success. Otherwise, returns false. - bool TryToUsePreconnectConnectJob(); + // If there's a ConnectJob that's never been assigned to Request, + // decrements |unassigned_job_count_| and returns true. + // Otherwise, returns false. + bool TryToUseUnassignedConnectJob(); - void AddJob(ConnectJob* job) { jobs_.insert(job); } - void RemoveJob(ConnectJob* job) { jobs_.erase(job); } + void AddJob(ConnectJob* job, bool is_preconnect); + void RemoveJob(ConnectJob* job); void RemoveAllJobs(); void IncrementActiveSocketCount() { active_socket_count_++; } void DecrementActiveSocketCount() { active_socket_count_--; } + int unassigned_job_count() const { return unassigned_job_count_; } const std::set<ConnectJob*>& jobs() const { return jobs_; } const std::list<IdleSocket>& idle_sockets() const { return idle_sockets_; } const RequestQueue& pending_requests() const { return pending_requests_; } @@ -433,6 +418,18 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper std::string group_name, ClientSocketPoolBaseHelper* pool); + // Checks that |unassigned_job_count_| does not execeed the number of + // ConnectJobs. + void SanityCheck(); + + // Total number of ConnectJobs that have never been assigned to a Request. + // Since jobs use late binding to requests, which ConnectJobs have or have + // not been assigned to a request are not tracked. This is incremented on + // preconnect and decremented when a preconnect is assigned, or when there + // are fewer than |unassigned_job_count_| ConnectJobs. Not incremented + // when a request is cancelled. + size_t unassigned_job_count_; + std::list<IdleSocket> idle_sockets_; std::set<ConnectJob*> jobs_; RequestQueue pending_requests_; @@ -525,7 +522,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper // Assigns an idle socket for the group to the request. // Returns |true| if an idle socket is available, false otherwise. - bool AssignIdleSocketToGroup(const Request* request, Group* group); + bool AssignIdleSocketToRequest(const Request* request, Group* group); static void LogBoundConnectJobToRequest( const NetLog::Source& connect_job_source, const Request* request); @@ -734,6 +731,10 @@ class ClientSocketPoolBase { return helper_.OnConnectJobComplete(result, job); } + int NumUnassignedConnectJobsInGroup(const std::string& group_name) const { + return helper_.NumUnassignedConnectJobsInGroup(group_name); + } + int NumConnectJobsInGroup(const std::string& group_name) const { return helper_.NumConnectJobsInGroup(group_name); } diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc index eec553f..212438c 100644 --- a/net/socket/client_socket_pool_base_unittest.cc +++ b/net/socket/client_socket_pool_base_unittest.cc @@ -525,6 +525,10 @@ class TestClientSocketPool : public ClientSocketPool { const TestClientSocketPoolBase* base() const { return &base_; } + int NumUnassignedConnectJobsInGroup(const std::string& group_name) const { + return base_.NumUnassignedConnectJobsInGroup(group_name); + } + int NumConnectJobsInGroup(const std::string& group_name) const { return base_.NumConnectJobsInGroup(group_name); } @@ -1182,12 +1186,14 @@ TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { // Since it is stalled, it should have no connect jobs. EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); // Cancel the stalled request. handles[0].Reset(); // Now we should have a connect job. EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); // The stalled socket should connect. EXPECT_EQ(OK, callback.WaitForResult()); @@ -1196,6 +1202,7 @@ TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { client_socket_factory_.allocation_count()); EXPECT_EQ(0, pool_->IdleSocketCount()); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); // Dropping out of scope will close all handles and return them to idle. } @@ -2641,6 +2648,7 @@ TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { BoundNetLog())); ASSERT_TRUE(pool_->HasGroup("bar")); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); // Cancel the socket request. This should cancel the backup timer. Wait for // the backup time to see if it indeed got canceled. @@ -2987,6 +2995,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSockets) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); ClientSocketHandle handle1; @@ -3008,6 +3017,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSockets) { BoundNetLog())); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(OK, callback1.WaitForResult()); @@ -3016,6 +3026,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSockets) { handle2.Reset(); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); } @@ -3034,11 +3045,13 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); ClientSocketHandle handle2; @@ -3051,6 +3064,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { BoundNetLog())); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(OK, callback1.WaitForResult()); @@ -3059,6 +3073,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { handle2.Reset(); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); } @@ -3096,11 +3111,13 @@ TEST_F(ClientSocketPoolBaseTest, ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(OK, callback1.WaitForResult()); @@ -3111,6 +3128,7 @@ TEST_F(ClientSocketPoolBaseTest, handle3.Reset(); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); } @@ -3125,6 +3143,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a")); ASSERT_FALSE(pool_->HasGroup("b")); @@ -3145,6 +3164,8 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(kDefaultMaxSockets - 1, + pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_FALSE(pool_->IsStalled()); ASSERT_FALSE(pool_->HasGroup("b")); @@ -3174,11 +3195,13 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); } @@ -3198,12 +3221,14 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); } @@ -3217,12 +3242,14 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("b", ¶ms_, kDefaultMaxSocketsPerGroup, BoundNetLog()); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b")); } @@ -3243,17 +3270,7 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) { ASSERT_FALSE(pool_->HasGroup("a")); } -// http://crbug.com/129364 -#if defined(OS_WIN) -#define MAYBE_RequestSocketsMultipleTimesDoesNothing \ - DISABLED_RequestSocketsMultipleTimesDoesNothing -#else -#define MAYBE_RequestSocketsMultipleTimesDoesNothing \ - RequestSocketsMultipleTimesDoesNothing -#endif - -TEST_F(ClientSocketPoolBaseTest, - MAYBE_RequestSocketsMultipleTimesDoesNothing) { +TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) { CreatePool(4, 4); connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); @@ -3261,10 +3278,12 @@ TEST_F(ClientSocketPoolBaseTest, ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); ClientSocketHandle handle1; @@ -3290,13 +3309,21 @@ TEST_F(ClientSocketPoolBaseTest, EXPECT_EQ(OK, callback2.WaitForResult()); } + EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); + EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a")); + EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); + handle1.Reset(); handle2.Reset(); + EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); } @@ -3308,18 +3335,22 @@ TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 3, BoundNetLog()); EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); } @@ -3331,6 +3362,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) { ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); ClientSocketHandle handle1; @@ -3343,6 +3375,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) { BoundNetLog())); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); ASSERT_EQ(OK, callback1.WaitForResult()); @@ -3395,6 +3428,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { ASSERT_EQ(OK, callback1.WaitForResult()); ASSERT_EQ(OK, callback2.WaitForResult()); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means @@ -3404,9 +3438,11 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); @@ -3420,9 +3456,11 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b")); EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b")); } @@ -3437,6 +3475,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) { base::TimeDelta::FromMilliseconds(500)); pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); // Verify the backup timer doesn't create a backup job, by making @@ -3457,6 +3496,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) { connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); MessageLoop::current()->RunAllPending(); @@ -3472,6 +3512,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) { BoundNetLog())); // Timer has started, but the backup connect job shouldn't be created yet. EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); ASSERT_EQ(OK, callback.WaitForResult()); @@ -3479,6 +3520,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) { // The hung connect job should still be there, but everything else should be // complete. EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); + EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); } |