| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/socks_client_socket_pool.h" | 5 #include "net/socket/socks_client_socket_pool.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/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "net/base/load_timing_info.h" | 10 #include "net/base/load_timing_info.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 EXPECT_FALSE(load_timing_info.socket_reused); | 36 EXPECT_FALSE(load_timing_info.socket_reused); |
| 37 | 37 |
| 38 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, | 38 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, |
| 39 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); | 39 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); |
| 40 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); | 40 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); |
| 41 } | 41 } |
| 42 | 42 |
| 43 | 43 |
| 44 scoped_refptr<TransportSocketParams> CreateProxyHostParams() { | 44 scoped_refptr<TransportSocketParams> CreateProxyHostParams() { |
| 45 return new TransportSocketParams( | 45 return new TransportSocketParams( |
| 46 HostPortPair("proxy", 80), false, false, OnHostResolutionCallback(), | 46 HostPortPair("proxy", 80), false, OnHostResolutionCallback(), |
| 47 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); | 47 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); |
| 48 } | 48 } |
| 49 | 49 |
| 50 scoped_refptr<SOCKSSocketParams> CreateSOCKSv4Params() { | 50 scoped_refptr<SOCKSSocketParams> CreateSOCKSv4Params() { |
| 51 return new SOCKSSocketParams( | 51 return new SOCKSSocketParams( |
| 52 CreateProxyHostParams(), false /* socks_v5 */, | 52 CreateProxyHostParams(), false /* socks_v5 */, |
| 53 HostPortPair("host", 80)); | 53 HostPortPair("host", 80)); |
| 54 } | 54 } |
| 55 | 55 |
| 56 scoped_refptr<SOCKSSocketParams> CreateSOCKSv5Params() { | 56 scoped_refptr<SOCKSSocketParams> CreateSOCKSv5Params() { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 pool_(kMaxSockets, | 95 pool_(kMaxSockets, |
| 96 kMaxSocketsPerGroup, | 96 kMaxSocketsPerGroup, |
| 97 &host_resolver_, | 97 &host_resolver_, |
| 98 &transport_socket_pool_, | 98 &transport_socket_pool_, |
| 99 NULL) {} | 99 NULL) {} |
| 100 | 100 |
| 101 ~SOCKSClientSocketPoolTest() override {} | 101 ~SOCKSClientSocketPoolTest() override {} |
| 102 | 102 |
| 103 int StartRequestV5(const std::string& group_name, RequestPriority priority) { | 103 int StartRequestV5(const std::string& group_name, RequestPriority priority) { |
| 104 return test_base_.StartRequestUsingPool( | 104 return test_base_.StartRequestUsingPool( |
| 105 &pool_, group_name, priority, CreateSOCKSv5Params()); | 105 &pool_, group_name, priority, ClientSocketPool::IgnoreLimits::DISABLED, |
| 106 CreateSOCKSv5Params()); |
| 106 } | 107 } |
| 107 | 108 |
| 108 int GetOrderOfRequest(size_t index) const { | 109 int GetOrderOfRequest(size_t index) const { |
| 109 return test_base_.GetOrderOfRequest(index); | 110 return test_base_.GetOrderOfRequest(index); |
| 110 } | 111 } |
| 111 | 112 |
| 112 std::vector<scoped_ptr<TestSocketRequest>>* requests() { | 113 std::vector<scoped_ptr<TestSocketRequest>>* requests() { |
| 113 return test_base_.requests(); | 114 return test_base_.requests(); |
| 114 } | 115 } |
| 115 | 116 |
| 116 MockClientSocketFactory transport_client_socket_factory_; | 117 MockClientSocketFactory transport_client_socket_factory_; |
| 117 MockTransportClientSocketPool transport_socket_pool_; | 118 MockTransportClientSocketPool transport_socket_pool_; |
| 118 | 119 |
| 119 MockHostResolver host_resolver_; | 120 MockHostResolver host_resolver_; |
| 120 SOCKSClientSocketPool pool_; | 121 SOCKSClientSocketPool pool_; |
| 121 ClientSocketPoolTest test_base_; | 122 ClientSocketPoolTest test_base_; |
| 122 }; | 123 }; |
| 123 | 124 |
| 124 TEST_F(SOCKSClientSocketPoolTest, Simple) { | 125 TEST_F(SOCKSClientSocketPoolTest, Simple) { |
| 125 SOCKS5MockData data(SYNCHRONOUS); | 126 SOCKS5MockData data(SYNCHRONOUS); |
| 126 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 127 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 127 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 128 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 128 | 129 |
| 129 ClientSocketHandle handle; | 130 ClientSocketHandle handle; |
| 130 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), | 131 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 131 &pool_, BoundNetLog()); | 132 ClientSocketPool::IgnoreLimits::DISABLED, |
| 133 CompletionCallback(), &pool_, BoundNetLog()); |
| 132 EXPECT_EQ(OK, rv); | 134 EXPECT_EQ(OK, rv); |
| 133 EXPECT_TRUE(handle.is_initialized()); | 135 EXPECT_TRUE(handle.is_initialized()); |
| 134 EXPECT_TRUE(handle.socket()); | 136 EXPECT_TRUE(handle.socket()); |
| 135 TestLoadTimingInfo(handle); | 137 TestLoadTimingInfo(handle); |
| 136 } | 138 } |
| 137 | 139 |
| 138 // Make sure that SOCKSConnectJob passes on its priority to its | 140 // Make sure that SOCKSConnectJob passes on its priority to its |
| 139 // socket request on Init. | 141 // socket request on Init. |
| 140 TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 142 TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 141 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | 143 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
| 142 RequestPriority priority = static_cast<RequestPriority>(i); | 144 RequestPriority priority = static_cast<RequestPriority>(i); |
| 143 SOCKS5MockData data(SYNCHRONOUS); | 145 SOCKS5MockData data(SYNCHRONOUS); |
| 144 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 146 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 145 transport_client_socket_factory_.AddSocketDataProvider( | 147 transport_client_socket_factory_.AddSocketDataProvider( |
| 146 data.data_provider()); | 148 data.data_provider()); |
| 147 | 149 |
| 148 ClientSocketHandle handle; | 150 ClientSocketHandle handle; |
| 149 EXPECT_EQ(OK, | 151 EXPECT_EQ(OK, handle.Init("a", CreateSOCKSv5Params(), priority, |
| 150 handle.Init("a", CreateSOCKSv5Params(), priority, | 152 ClientSocketPool::IgnoreLimits::DISABLED, |
| 151 CompletionCallback(), &pool_, BoundNetLog())); | 153 CompletionCallback(), &pool_, BoundNetLog())); |
| 152 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); | 154 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); |
| 153 handle.socket()->Disconnect(); | 155 handle.socket()->Disconnect(); |
| 154 } | 156 } |
| 155 } | 157 } |
| 156 | 158 |
| 157 // Make sure that SOCKSConnectJob passes on its priority to its | 159 // Make sure that SOCKSConnectJob passes on its priority to its |
| 158 // HostResolver request (for non-SOCKS5) on Init. | 160 // HostResolver request (for non-SOCKS5) on Init. |
| 159 TEST_F(SOCKSClientSocketPoolTest, SetResolvePriorityOnInit) { | 161 TEST_F(SOCKSClientSocketPoolTest, SetResolvePriorityOnInit) { |
| 160 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | 162 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
| 161 RequestPriority priority = static_cast<RequestPriority>(i); | 163 RequestPriority priority = static_cast<RequestPriority>(i); |
| 162 SOCKS5MockData data(SYNCHRONOUS); | 164 SOCKS5MockData data(SYNCHRONOUS); |
| 163 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 165 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 164 transport_client_socket_factory_.AddSocketDataProvider( | 166 transport_client_socket_factory_.AddSocketDataProvider( |
| 165 data.data_provider()); | 167 data.data_provider()); |
| 166 | 168 |
| 167 ClientSocketHandle handle; | 169 ClientSocketHandle handle; |
| 168 EXPECT_EQ(ERR_IO_PENDING, | 170 EXPECT_EQ(ERR_IO_PENDING, |
| 169 handle.Init("a", CreateSOCKSv4Params(), priority, | 171 handle.Init("a", CreateSOCKSv4Params(), priority, |
| 172 ClientSocketPool::IgnoreLimits::DISABLED, |
| 170 CompletionCallback(), &pool_, BoundNetLog())); | 173 CompletionCallback(), &pool_, BoundNetLog())); |
| 171 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); | 174 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); |
| 172 EXPECT_EQ(priority, host_resolver_.last_request_priority()); | 175 EXPECT_EQ(priority, host_resolver_.last_request_priority()); |
| 173 EXPECT_TRUE(handle.socket() == NULL); | 176 EXPECT_TRUE(handle.socket() == NULL); |
| 174 } | 177 } |
| 175 } | 178 } |
| 176 | 179 |
| 177 TEST_F(SOCKSClientSocketPoolTest, Async) { | 180 TEST_F(SOCKSClientSocketPoolTest, Async) { |
| 178 SOCKS5MockData data(ASYNC); | 181 SOCKS5MockData data(ASYNC); |
| 179 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 182 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 180 | 183 |
| 181 TestCompletionCallback callback; | 184 TestCompletionCallback callback; |
| 182 ClientSocketHandle handle; | 185 ClientSocketHandle handle; |
| 183 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), | 186 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 184 &pool_, BoundNetLog()); | 187 ClientSocketPool::IgnoreLimits::DISABLED, |
| 188 callback.callback(), &pool_, BoundNetLog()); |
| 185 EXPECT_EQ(ERR_IO_PENDING, rv); | 189 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 186 EXPECT_FALSE(handle.is_initialized()); | 190 EXPECT_FALSE(handle.is_initialized()); |
| 187 EXPECT_FALSE(handle.socket()); | 191 EXPECT_FALSE(handle.socket()); |
| 188 | 192 |
| 189 EXPECT_EQ(OK, callback.WaitForResult()); | 193 EXPECT_EQ(OK, callback.WaitForResult()); |
| 190 EXPECT_TRUE(handle.is_initialized()); | 194 EXPECT_TRUE(handle.is_initialized()); |
| 191 EXPECT_TRUE(handle.socket()); | 195 EXPECT_TRUE(handle.socket()); |
| 192 TestLoadTimingInfo(handle); | 196 TestLoadTimingInfo(handle); |
| 193 } | 197 } |
| 194 | 198 |
| 195 TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { | 199 TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { |
| 196 StaticSocketDataProvider socket_data; | 200 StaticSocketDataProvider socket_data; |
| 197 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, | 201 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, |
| 198 ERR_CONNECTION_REFUSED)); | 202 ERR_CONNECTION_REFUSED)); |
| 199 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 203 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 200 | 204 |
| 201 ClientSocketHandle handle; | 205 ClientSocketHandle handle; |
| 202 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), | 206 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 203 &pool_, BoundNetLog()); | 207 ClientSocketPool::IgnoreLimits::DISABLED, |
| 208 CompletionCallback(), &pool_, BoundNetLog()); |
| 204 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); | 209 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); |
| 205 EXPECT_FALSE(handle.is_initialized()); | 210 EXPECT_FALSE(handle.is_initialized()); |
| 206 EXPECT_FALSE(handle.socket()); | 211 EXPECT_FALSE(handle.socket()); |
| 207 } | 212 } |
| 208 | 213 |
| 209 TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { | 214 TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { |
| 210 StaticSocketDataProvider socket_data; | 215 StaticSocketDataProvider socket_data; |
| 211 socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); | 216 socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); |
| 212 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 217 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 213 | 218 |
| 214 TestCompletionCallback callback; | 219 TestCompletionCallback callback; |
| 215 ClientSocketHandle handle; | 220 ClientSocketHandle handle; |
| 216 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), | 221 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 217 &pool_, BoundNetLog()); | 222 ClientSocketPool::IgnoreLimits::DISABLED, |
| 223 callback.callback(), &pool_, BoundNetLog()); |
| 218 EXPECT_EQ(ERR_IO_PENDING, rv); | 224 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 219 EXPECT_FALSE(handle.is_initialized()); | 225 EXPECT_FALSE(handle.is_initialized()); |
| 220 EXPECT_FALSE(handle.socket()); | 226 EXPECT_FALSE(handle.socket()); |
| 221 | 227 |
| 222 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); | 228 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); |
| 223 EXPECT_FALSE(handle.is_initialized()); | 229 EXPECT_FALSE(handle.is_initialized()); |
| 224 EXPECT_FALSE(handle.socket()); | 230 EXPECT_FALSE(handle.socket()); |
| 225 } | 231 } |
| 226 | 232 |
| 227 TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { | 233 TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { |
| 228 MockRead failed_read[] = { | 234 MockRead failed_read[] = { |
| 229 MockRead(SYNCHRONOUS, 0), | 235 MockRead(SYNCHRONOUS, 0), |
| 230 }; | 236 }; |
| 231 StaticSocketDataProvider socket_data( | 237 StaticSocketDataProvider socket_data( |
| 232 failed_read, arraysize(failed_read), NULL, 0); | 238 failed_read, arraysize(failed_read), NULL, 0); |
| 233 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 239 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 234 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 240 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 235 | 241 |
| 236 ClientSocketHandle handle; | 242 ClientSocketHandle handle; |
| 237 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 243 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 238 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), | 244 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 239 &pool_, BoundNetLog()); | 245 ClientSocketPool::IgnoreLimits::DISABLED, |
| 246 CompletionCallback(), &pool_, BoundNetLog()); |
| 240 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 247 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); |
| 241 EXPECT_FALSE(handle.is_initialized()); | 248 EXPECT_FALSE(handle.is_initialized()); |
| 242 EXPECT_FALSE(handle.socket()); | 249 EXPECT_FALSE(handle.socket()); |
| 243 EXPECT_EQ(1, transport_socket_pool_.release_count()); | 250 EXPECT_EQ(1, transport_socket_pool_.release_count()); |
| 244 } | 251 } |
| 245 | 252 |
| 246 TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { | 253 TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { |
| 247 MockRead failed_read[] = { | 254 MockRead failed_read[] = { |
| 248 MockRead(ASYNC, 0), | 255 MockRead(ASYNC, 0), |
| 249 }; | 256 }; |
| 250 StaticSocketDataProvider socket_data( | 257 StaticSocketDataProvider socket_data( |
| 251 failed_read, arraysize(failed_read), NULL, 0); | 258 failed_read, arraysize(failed_read), NULL, 0); |
| 252 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 259 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 253 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 260 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 254 | 261 |
| 255 TestCompletionCallback callback; | 262 TestCompletionCallback callback; |
| 256 ClientSocketHandle handle; | 263 ClientSocketHandle handle; |
| 257 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 264 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 258 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), | 265 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 259 &pool_, BoundNetLog()); | 266 ClientSocketPool::IgnoreLimits::DISABLED, |
| 267 callback.callback(), &pool_, BoundNetLog()); |
| 260 EXPECT_EQ(ERR_IO_PENDING, rv); | 268 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 261 EXPECT_FALSE(handle.is_initialized()); | 269 EXPECT_FALSE(handle.is_initialized()); |
| 262 EXPECT_FALSE(handle.socket()); | 270 EXPECT_FALSE(handle.socket()); |
| 263 | 271 |
| 264 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); | 272 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); |
| 265 EXPECT_FALSE(handle.is_initialized()); | 273 EXPECT_FALSE(handle.is_initialized()); |
| 266 EXPECT_FALSE(handle.socket()); | 274 EXPECT_FALSE(handle.socket()); |
| 267 EXPECT_EQ(1, transport_socket_pool_.release_count()); | 275 EXPECT_EQ(1, transport_socket_pool_.release_count()); |
| 268 } | 276 } |
| 269 | 277 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 | 342 |
| 335 (*requests())[0]->handle()->Reset(); | 343 (*requests())[0]->handle()->Reset(); |
| 336 (*requests())[1]->handle()->Reset(); | 344 (*requests())[1]->handle()->Reset(); |
| 337 } | 345 } |
| 338 | 346 |
| 339 // It would be nice to also test the timeouts in SOCKSClientSocketPool. | 347 // It would be nice to also test the timeouts in SOCKSClientSocketPool. |
| 340 | 348 |
| 341 } // namespace | 349 } // namespace |
| 342 | 350 |
| 343 } // namespace net | 351 } // namespace net |
| OLD | NEW |