| 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/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| 11 #include "net/base/load_timing_info.h" | 11 #include "net/base/load_timing_info.h" |
| 12 #include "net/base/load_timing_info_test_util.h" | 12 #include "net/base/load_timing_info_test_util.h" |
| 13 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
| 14 #include "net/base/test_completion_callback.h" | 14 #include "net/base/test_completion_callback.h" |
| 15 #include "net/dns/mock_host_resolver.h" | 15 #include "net/dns/mock_host_resolver.h" |
| 16 #include "net/socket/client_socket_factory.h" | 16 #include "net/socket/client_socket_factory.h" |
| 17 #include "net/socket/client_socket_handle.h" | 17 #include "net/socket/client_socket_handle.h" |
| 18 #include "net/socket/socket_test_util.h" | 18 #include "net/socket/socket_test_util.h" |
| 19 #include "net/test/gtest_util.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 20 | 22 |
| 23 using net::test::IsError; |
| 24 using net::test::IsOk; |
| 25 |
| 21 namespace net { | 26 namespace net { |
| 22 | 27 |
| 23 namespace { | 28 namespace { |
| 24 | 29 |
| 25 const int kMaxSockets = 32; | 30 const int kMaxSockets = 32; |
| 26 const int kMaxSocketsPerGroup = 6; | 31 const int kMaxSocketsPerGroup = 6; |
| 27 | 32 |
| 28 // Make sure |handle|'s load times are set correctly. Only connect times should | 33 // Make sure |handle|'s load times are set correctly. Only connect times should |
| 29 // be set. | 34 // be set. |
| 30 void TestLoadTimingInfo(const ClientSocketHandle& handle) { | 35 void TestLoadTimingInfo(const ClientSocketHandle& handle) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 131 |
| 127 TEST_F(SOCKSClientSocketPoolTest, Simple) { | 132 TEST_F(SOCKSClientSocketPoolTest, Simple) { |
| 128 SOCKS5MockData data(SYNCHRONOUS); | 133 SOCKS5MockData data(SYNCHRONOUS); |
| 129 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 134 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 130 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 135 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 131 | 136 |
| 132 ClientSocketHandle handle; | 137 ClientSocketHandle handle; |
| 133 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, | 138 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 134 ClientSocketPool::RespectLimits::ENABLED, | 139 ClientSocketPool::RespectLimits::ENABLED, |
| 135 CompletionCallback(), &pool_, BoundNetLog()); | 140 CompletionCallback(), &pool_, BoundNetLog()); |
| 136 EXPECT_EQ(OK, rv); | 141 EXPECT_THAT(rv, IsOk()); |
| 137 EXPECT_TRUE(handle.is_initialized()); | 142 EXPECT_TRUE(handle.is_initialized()); |
| 138 EXPECT_TRUE(handle.socket()); | 143 EXPECT_TRUE(handle.socket()); |
| 139 TestLoadTimingInfo(handle); | 144 TestLoadTimingInfo(handle); |
| 140 } | 145 } |
| 141 | 146 |
| 142 // Make sure that SOCKSConnectJob passes on its priority to its | 147 // Make sure that SOCKSConnectJob passes on its priority to its |
| 143 // socket request on Init. | 148 // socket request on Init. |
| 144 TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 149 TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 145 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | 150 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
| 146 RequestPriority priority = static_cast<RequestPriority>(i); | 151 RequestPriority priority = static_cast<RequestPriority>(i); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 | 186 |
| 182 TEST_F(SOCKSClientSocketPoolTest, Async) { | 187 TEST_F(SOCKSClientSocketPoolTest, Async) { |
| 183 SOCKS5MockData data(ASYNC); | 188 SOCKS5MockData data(ASYNC); |
| 184 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 189 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 185 | 190 |
| 186 TestCompletionCallback callback; | 191 TestCompletionCallback callback; |
| 187 ClientSocketHandle handle; | 192 ClientSocketHandle handle; |
| 188 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, | 193 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 189 ClientSocketPool::RespectLimits::ENABLED, | 194 ClientSocketPool::RespectLimits::ENABLED, |
| 190 callback.callback(), &pool_, BoundNetLog()); | 195 callback.callback(), &pool_, BoundNetLog()); |
| 191 EXPECT_EQ(ERR_IO_PENDING, rv); | 196 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 192 EXPECT_FALSE(handle.is_initialized()); | 197 EXPECT_FALSE(handle.is_initialized()); |
| 193 EXPECT_FALSE(handle.socket()); | 198 EXPECT_FALSE(handle.socket()); |
| 194 | 199 |
| 195 EXPECT_EQ(OK, callback.WaitForResult()); | 200 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 196 EXPECT_TRUE(handle.is_initialized()); | 201 EXPECT_TRUE(handle.is_initialized()); |
| 197 EXPECT_TRUE(handle.socket()); | 202 EXPECT_TRUE(handle.socket()); |
| 198 TestLoadTimingInfo(handle); | 203 TestLoadTimingInfo(handle); |
| 199 } | 204 } |
| 200 | 205 |
| 201 TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { | 206 TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { |
| 202 StaticSocketDataProvider socket_data; | 207 StaticSocketDataProvider socket_data; |
| 203 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, | 208 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, |
| 204 ERR_CONNECTION_REFUSED)); | 209 ERR_CONNECTION_REFUSED)); |
| 205 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 210 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 206 | 211 |
| 207 ClientSocketHandle handle; | 212 ClientSocketHandle handle; |
| 208 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, | 213 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 209 ClientSocketPool::RespectLimits::ENABLED, | 214 ClientSocketPool::RespectLimits::ENABLED, |
| 210 CompletionCallback(), &pool_, BoundNetLog()); | 215 CompletionCallback(), &pool_, BoundNetLog()); |
| 211 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); | 216 EXPECT_THAT(rv, IsError(ERR_PROXY_CONNECTION_FAILED)); |
| 212 EXPECT_FALSE(handle.is_initialized()); | 217 EXPECT_FALSE(handle.is_initialized()); |
| 213 EXPECT_FALSE(handle.socket()); | 218 EXPECT_FALSE(handle.socket()); |
| 214 } | 219 } |
| 215 | 220 |
| 216 TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { | 221 TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { |
| 217 StaticSocketDataProvider socket_data; | 222 StaticSocketDataProvider socket_data; |
| 218 socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); | 223 socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); |
| 219 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 224 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 220 | 225 |
| 221 TestCompletionCallback callback; | 226 TestCompletionCallback callback; |
| 222 ClientSocketHandle handle; | 227 ClientSocketHandle handle; |
| 223 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, | 228 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 224 ClientSocketPool::RespectLimits::ENABLED, | 229 ClientSocketPool::RespectLimits::ENABLED, |
| 225 callback.callback(), &pool_, BoundNetLog()); | 230 callback.callback(), &pool_, BoundNetLog()); |
| 226 EXPECT_EQ(ERR_IO_PENDING, rv); | 231 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 227 EXPECT_FALSE(handle.is_initialized()); | 232 EXPECT_FALSE(handle.is_initialized()); |
| 228 EXPECT_FALSE(handle.socket()); | 233 EXPECT_FALSE(handle.socket()); |
| 229 | 234 |
| 230 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); | 235 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_CONNECTION_FAILED)); |
| 231 EXPECT_FALSE(handle.is_initialized()); | 236 EXPECT_FALSE(handle.is_initialized()); |
| 232 EXPECT_FALSE(handle.socket()); | 237 EXPECT_FALSE(handle.socket()); |
| 233 } | 238 } |
| 234 | 239 |
| 235 TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { | 240 TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { |
| 236 MockRead failed_read[] = { | 241 MockRead failed_read[] = { |
| 237 MockRead(SYNCHRONOUS, 0), | 242 MockRead(SYNCHRONOUS, 0), |
| 238 }; | 243 }; |
| 239 StaticSocketDataProvider socket_data( | 244 StaticSocketDataProvider socket_data( |
| 240 failed_read, arraysize(failed_read), NULL, 0); | 245 failed_read, arraysize(failed_read), NULL, 0); |
| 241 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 246 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 242 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 247 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 243 | 248 |
| 244 ClientSocketHandle handle; | 249 ClientSocketHandle handle; |
| 245 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 250 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 246 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, | 251 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 247 ClientSocketPool::RespectLimits::ENABLED, | 252 ClientSocketPool::RespectLimits::ENABLED, |
| 248 CompletionCallback(), &pool_, BoundNetLog()); | 253 CompletionCallback(), &pool_, BoundNetLog()); |
| 249 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 254 EXPECT_THAT(rv, IsError(ERR_SOCKS_CONNECTION_FAILED)); |
| 250 EXPECT_FALSE(handle.is_initialized()); | 255 EXPECT_FALSE(handle.is_initialized()); |
| 251 EXPECT_FALSE(handle.socket()); | 256 EXPECT_FALSE(handle.socket()); |
| 252 EXPECT_EQ(1, transport_socket_pool_.release_count()); | 257 EXPECT_EQ(1, transport_socket_pool_.release_count()); |
| 253 } | 258 } |
| 254 | 259 |
| 255 TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { | 260 TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { |
| 256 MockRead failed_read[] = { | 261 MockRead failed_read[] = { |
| 257 MockRead(ASYNC, 0), | 262 MockRead(ASYNC, 0), |
| 258 }; | 263 }; |
| 259 StaticSocketDataProvider socket_data( | 264 StaticSocketDataProvider socket_data( |
| 260 failed_read, arraysize(failed_read), NULL, 0); | 265 failed_read, arraysize(failed_read), NULL, 0); |
| 261 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 266 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 262 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 267 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 263 | 268 |
| 264 TestCompletionCallback callback; | 269 TestCompletionCallback callback; |
| 265 ClientSocketHandle handle; | 270 ClientSocketHandle handle; |
| 266 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 271 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 267 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, | 272 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, |
| 268 ClientSocketPool::RespectLimits::ENABLED, | 273 ClientSocketPool::RespectLimits::ENABLED, |
| 269 callback.callback(), &pool_, BoundNetLog()); | 274 callback.callback(), &pool_, BoundNetLog()); |
| 270 EXPECT_EQ(ERR_IO_PENDING, rv); | 275 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 271 EXPECT_FALSE(handle.is_initialized()); | 276 EXPECT_FALSE(handle.is_initialized()); |
| 272 EXPECT_FALSE(handle.socket()); | 277 EXPECT_FALSE(handle.socket()); |
| 273 | 278 |
| 274 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); | 279 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_SOCKS_CONNECTION_FAILED)); |
| 275 EXPECT_FALSE(handle.is_initialized()); | 280 EXPECT_FALSE(handle.is_initialized()); |
| 276 EXPECT_FALSE(handle.socket()); | 281 EXPECT_FALSE(handle.socket()); |
| 277 EXPECT_EQ(1, transport_socket_pool_.release_count()); | 282 EXPECT_EQ(1, transport_socket_pool_.release_count()); |
| 278 } | 283 } |
| 279 | 284 |
| 280 TEST_F(SOCKSClientSocketPoolTest, CancelDuringTransportConnect) { | 285 TEST_F(SOCKSClientSocketPoolTest, CancelDuringTransportConnect) { |
| 281 SOCKS5MockData data(SYNCHRONOUS); | 286 SOCKS5MockData data(SYNCHRONOUS); |
| 282 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 287 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 283 // We need two connections because the pool base lets one cancelled | 288 // We need two connections because the pool base lets one cancelled |
| 284 // connect job proceed for potential future use. | 289 // connect job proceed for potential future use. |
| 285 SOCKS5MockData data2(SYNCHRONOUS); | 290 SOCKS5MockData data2(SYNCHRONOUS); |
| 286 transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); | 291 transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); |
| 287 | 292 |
| 288 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); | 293 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); |
| 289 int rv = StartRequestV5("a", LOW); | 294 int rv = StartRequestV5("a", LOW); |
| 290 EXPECT_EQ(ERR_IO_PENDING, rv); | 295 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 291 | 296 |
| 292 rv = StartRequestV5("a", LOW); | 297 rv = StartRequestV5("a", LOW); |
| 293 EXPECT_EQ(ERR_IO_PENDING, rv); | 298 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 294 | 299 |
| 295 pool_.CancelRequest("a", (*requests())[0]->handle()); | 300 pool_.CancelRequest("a", (*requests())[0]->handle()); |
| 296 pool_.CancelRequest("a", (*requests())[1]->handle()); | 301 pool_.CancelRequest("a", (*requests())[1]->handle()); |
| 297 // Requests in the connect phase don't actually get cancelled. | 302 // Requests in the connect phase don't actually get cancelled. |
| 298 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); | 303 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); |
| 299 | 304 |
| 300 // Now wait for the TCP sockets to connect. | 305 // Now wait for the TCP sockets to connect. |
| 301 base::RunLoop().RunUntilIdle(); | 306 base::RunLoop().RunUntilIdle(); |
| 302 | 307 |
| 303 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); | 308 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 315 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 320 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 316 // We need two connections because the pool base lets one cancelled | 321 // We need two connections because the pool base lets one cancelled |
| 317 // connect job proceed for potential future use. | 322 // connect job proceed for potential future use. |
| 318 SOCKS5MockData data2(ASYNC); | 323 SOCKS5MockData data2(ASYNC); |
| 319 data2.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 324 data2.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 320 transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); | 325 transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); |
| 321 | 326 |
| 322 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); | 327 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); |
| 323 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 328 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 324 int rv = StartRequestV5("a", LOW); | 329 int rv = StartRequestV5("a", LOW); |
| 325 EXPECT_EQ(ERR_IO_PENDING, rv); | 330 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 326 | 331 |
| 327 rv = StartRequestV5("a", LOW); | 332 rv = StartRequestV5("a", LOW); |
| 328 EXPECT_EQ(ERR_IO_PENDING, rv); | 333 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 329 | 334 |
| 330 pool_.CancelRequest("a", (*requests())[0]->handle()); | 335 pool_.CancelRequest("a", (*requests())[0]->handle()); |
| 331 pool_.CancelRequest("a", (*requests())[1]->handle()); | 336 pool_.CancelRequest("a", (*requests())[1]->handle()); |
| 332 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); | 337 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); |
| 333 // Requests in the connect phase don't actually get cancelled. | 338 // Requests in the connect phase don't actually get cancelled. |
| 334 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 339 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 335 | 340 |
| 336 // Now wait for the async data to reach the SOCKS connect jobs. | 341 // Now wait for the async data to reach the SOCKS connect jobs. |
| 337 base::RunLoop().RunUntilIdle(); | 342 base::RunLoop().RunUntilIdle(); |
| 338 | 343 |
| 339 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); | 344 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); |
| 340 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(2)); | 345 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(2)); |
| 341 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); | 346 EXPECT_EQ(0, transport_socket_pool_.cancel_count()); |
| 342 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 347 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 343 EXPECT_EQ(2, pool_.IdleSocketCount()); | 348 EXPECT_EQ(2, pool_.IdleSocketCount()); |
| 344 | 349 |
| 345 (*requests())[0]->handle()->Reset(); | 350 (*requests())[0]->handle()->Reset(); |
| 346 (*requests())[1]->handle()->Reset(); | 351 (*requests())[1]->handle()->Reset(); |
| 347 } | 352 } |
| 348 | 353 |
| 349 // It would be nice to also test the timeouts in SOCKSClientSocketPool. | 354 // It would be nice to also test the timeouts in SOCKSClientSocketPool. |
| 350 | 355 |
| 351 } // namespace | 356 } // namespace |
| 352 | 357 |
| 353 } // namespace net | 358 } // namespace net |
| OLD | NEW |