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

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

Issue 5549001: Fix preconnect crash when we hit max socket limit. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/client_socket_pool_base.h" 5 #include "net/socket/client_socket_pool_base.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/platform_thread.h" 10 #include "base/platform_thread.h"
(...skipping 2997 matching lines...) Expand 10 before | Expand all | Expand 10 after
3008 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3008 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3009 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3009 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3010 3010
3011 ASSERT_EQ(OK, callback1.WaitForResult()); 3011 ASSERT_EQ(OK, callback1.WaitForResult());
3012 3012
3013 handle1.Reset(); 3013 handle1.Reset();
3014 3014
3015 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3015 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3016 } 3016 }
3017 3017
3018 // http://crbug.com/64940 regression test.
3019 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3020 const int kMaxTotalSockets = 3;
3021 const int kMaxSocketsPerGroup = 2;
3022 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3023 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3024
3025 // Note that group name ordering matters here. "a" comes before "b", so
3026 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3027
3028 // Set up one idle socket in "a".
3029 ClientSocketHandle handle1;
3030 TestCompletionCallback callback1;
3031 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3032 params_,
3033 kDefaultPriority,
3034 &callback1,
3035 pool_.get(),
3036 BoundNetLog()));
3037
3038 ASSERT_EQ(OK, callback1.WaitForResult());
3039 handle1.Reset();
3040 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3041
3042 // Set up two active sockets in "b".
3043 ClientSocketHandle handle2;
3044 TestCompletionCallback callback2;
3045 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b",
3046 params_,
3047 kDefaultPriority,
3048 &callback1,
3049 pool_.get(),
3050 BoundNetLog()));
3051 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b",
3052 params_,
3053 kDefaultPriority,
3054 &callback2,
3055 pool_.get(),
3056 BoundNetLog()));
3057
3058 ASSERT_EQ(OK, callback1.WaitForResult());
3059 ASSERT_EQ(OK, callback2.WaitForResult());
3060 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3061 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3062
3063 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3064 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3065 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3066 // sockets for "a", and "b" should still have 2 active sockets.
3067
3068 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3069 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3070 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3071 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3072 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
3073 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3074 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3075
3076 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3077 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3078 // "a" should result in closing 1 for "b".
3079 handle1.Reset();
3080 handle2.Reset();
3081 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3082 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3083
3084 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3085 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3086 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3087 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3088 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
3089 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3090 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3091 }
3092
3018 } // namespace 3093 } // namespace
3019 3094
3020 } // namespace net 3095 } // namespace net
OLDNEW
« net/socket/client_socket_pool_base.cc ('K') | « net/socket/client_socket_pool_base.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698