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 |