OLD | NEW |
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 Loading... |
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", ¶ms_, 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", ¶ms_, 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 |
OLD | NEW |