| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 &transport_client_socket_factory_), | 94 &transport_client_socket_factory_), |
| 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(&pool_, group_name, priority, false, |
| 105 &pool_, group_name, priority, CreateSOCKSv5Params()); | 105 CreateSOCKSv5Params()); |
| 106 } | 106 } |
| 107 | 107 |
| 108 int GetOrderOfRequest(size_t index) const { | 108 int GetOrderOfRequest(size_t index) const { |
| 109 return test_base_.GetOrderOfRequest(index); | 109 return test_base_.GetOrderOfRequest(index); |
| 110 } | 110 } |
| 111 | 111 |
| 112 std::vector<scoped_ptr<TestSocketRequest>>* requests() { | 112 std::vector<scoped_ptr<TestSocketRequest>>* requests() { |
| 113 return test_base_.requests(); | 113 return test_base_.requests(); |
| 114 } | 114 } |
| 115 | 115 |
| 116 MockClientSocketFactory transport_client_socket_factory_; | 116 MockClientSocketFactory transport_client_socket_factory_; |
| 117 MockTransportClientSocketPool transport_socket_pool_; | 117 MockTransportClientSocketPool transport_socket_pool_; |
| 118 | 118 |
| 119 MockHostResolver host_resolver_; | 119 MockHostResolver host_resolver_; |
| 120 SOCKSClientSocketPool pool_; | 120 SOCKSClientSocketPool pool_; |
| 121 ClientSocketPoolTest test_base_; | 121 ClientSocketPoolTest test_base_; |
| 122 }; | 122 }; |
| 123 | 123 |
| 124 TEST_F(SOCKSClientSocketPoolTest, Simple) { | 124 TEST_F(SOCKSClientSocketPoolTest, Simple) { |
| 125 SOCKS5MockData data(SYNCHRONOUS); | 125 SOCKS5MockData data(SYNCHRONOUS); |
| 126 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 126 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 127 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 127 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 128 | 128 |
| 129 ClientSocketHandle handle; | 129 ClientSocketHandle handle; |
| 130 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), | 130 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, false, |
| 131 &pool_, BoundNetLog()); | 131 CompletionCallback(), &pool_, BoundNetLog()); |
| 132 EXPECT_EQ(OK, rv); | 132 EXPECT_EQ(OK, rv); |
| 133 EXPECT_TRUE(handle.is_initialized()); | 133 EXPECT_TRUE(handle.is_initialized()); |
| 134 EXPECT_TRUE(handle.socket()); | 134 EXPECT_TRUE(handle.socket()); |
| 135 TestLoadTimingInfo(handle); | 135 TestLoadTimingInfo(handle); |
| 136 } | 136 } |
| 137 | 137 |
| 138 // Make sure that SOCKSConnectJob passes on its priority to its | 138 // Make sure that SOCKSConnectJob passes on its priority to its |
| 139 // socket request on Init. | 139 // socket request on Init. |
| 140 TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 140 TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 141 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | 141 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
| 142 RequestPriority priority = static_cast<RequestPriority>(i); | 142 RequestPriority priority = static_cast<RequestPriority>(i); |
| 143 SOCKS5MockData data(SYNCHRONOUS); | 143 SOCKS5MockData data(SYNCHRONOUS); |
| 144 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 144 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 145 transport_client_socket_factory_.AddSocketDataProvider( | 145 transport_client_socket_factory_.AddSocketDataProvider( |
| 146 data.data_provider()); | 146 data.data_provider()); |
| 147 | 147 |
| 148 ClientSocketHandle handle; | 148 ClientSocketHandle handle; |
| 149 EXPECT_EQ(OK, | 149 EXPECT_EQ(OK, handle.Init("a", CreateSOCKSv5Params(), priority, false, |
| 150 handle.Init("a", CreateSOCKSv5Params(), priority, | 150 CompletionCallback(), &pool_, BoundNetLog())); |
| 151 CompletionCallback(), &pool_, BoundNetLog())); | |
| 152 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); | 151 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); |
| 153 handle.socket()->Disconnect(); | 152 handle.socket()->Disconnect(); |
| 154 } | 153 } |
| 155 } | 154 } |
| 156 | 155 |
| 157 // Make sure that SOCKSConnectJob passes on its priority to its | 156 // Make sure that SOCKSConnectJob passes on its priority to its |
| 158 // HostResolver request (for non-SOCKS5) on Init. | 157 // HostResolver request (for non-SOCKS5) on Init. |
| 159 TEST_F(SOCKSClientSocketPoolTest, SetResolvePriorityOnInit) { | 158 TEST_F(SOCKSClientSocketPoolTest, SetResolvePriorityOnInit) { |
| 160 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | 159 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
| 161 RequestPriority priority = static_cast<RequestPriority>(i); | 160 RequestPriority priority = static_cast<RequestPriority>(i); |
| 162 SOCKS5MockData data(SYNCHRONOUS); | 161 SOCKS5MockData data(SYNCHRONOUS); |
| 163 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 162 data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 164 transport_client_socket_factory_.AddSocketDataProvider( | 163 transport_client_socket_factory_.AddSocketDataProvider( |
| 165 data.data_provider()); | 164 data.data_provider()); |
| 166 | 165 |
| 167 ClientSocketHandle handle; | 166 ClientSocketHandle handle; |
| 168 EXPECT_EQ(ERR_IO_PENDING, | 167 EXPECT_EQ(ERR_IO_PENDING, |
| 169 handle.Init("a", CreateSOCKSv4Params(), priority, | 168 handle.Init("a", CreateSOCKSv4Params(), priority, false, |
| 170 CompletionCallback(), &pool_, BoundNetLog())); | 169 CompletionCallback(), &pool_, BoundNetLog())); |
| 171 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); | 170 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); |
| 172 EXPECT_EQ(priority, host_resolver_.last_request_priority()); | 171 EXPECT_EQ(priority, host_resolver_.last_request_priority()); |
| 173 EXPECT_TRUE(handle.socket() == NULL); | 172 EXPECT_TRUE(handle.socket() == NULL); |
| 174 } | 173 } |
| 175 } | 174 } |
| 176 | 175 |
| 177 TEST_F(SOCKSClientSocketPoolTest, Async) { | 176 TEST_F(SOCKSClientSocketPoolTest, Async) { |
| 178 SOCKS5MockData data(ASYNC); | 177 SOCKS5MockData data(ASYNC); |
| 179 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); | 178 transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); |
| 180 | 179 |
| 181 TestCompletionCallback callback; | 180 TestCompletionCallback callback; |
| 182 ClientSocketHandle handle; | 181 ClientSocketHandle handle; |
| 183 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), | 182 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, false, |
| 184 &pool_, BoundNetLog()); | 183 callback.callback(), &pool_, BoundNetLog()); |
| 185 EXPECT_EQ(ERR_IO_PENDING, rv); | 184 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 186 EXPECT_FALSE(handle.is_initialized()); | 185 EXPECT_FALSE(handle.is_initialized()); |
| 187 EXPECT_FALSE(handle.socket()); | 186 EXPECT_FALSE(handle.socket()); |
| 188 | 187 |
| 189 EXPECT_EQ(OK, callback.WaitForResult()); | 188 EXPECT_EQ(OK, callback.WaitForResult()); |
| 190 EXPECT_TRUE(handle.is_initialized()); | 189 EXPECT_TRUE(handle.is_initialized()); |
| 191 EXPECT_TRUE(handle.socket()); | 190 EXPECT_TRUE(handle.socket()); |
| 192 TestLoadTimingInfo(handle); | 191 TestLoadTimingInfo(handle); |
| 193 } | 192 } |
| 194 | 193 |
| 195 TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { | 194 TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { |
| 196 StaticSocketDataProvider socket_data; | 195 StaticSocketDataProvider socket_data; |
| 197 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, | 196 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, |
| 198 ERR_CONNECTION_REFUSED)); | 197 ERR_CONNECTION_REFUSED)); |
| 199 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 198 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 200 | 199 |
| 201 ClientSocketHandle handle; | 200 ClientSocketHandle handle; |
| 202 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), | 201 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, false, |
| 203 &pool_, BoundNetLog()); | 202 CompletionCallback(), &pool_, BoundNetLog()); |
| 204 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); | 203 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); |
| 205 EXPECT_FALSE(handle.is_initialized()); | 204 EXPECT_FALSE(handle.is_initialized()); |
| 206 EXPECT_FALSE(handle.socket()); | 205 EXPECT_FALSE(handle.socket()); |
| 207 } | 206 } |
| 208 | 207 |
| 209 TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { | 208 TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { |
| 210 StaticSocketDataProvider socket_data; | 209 StaticSocketDataProvider socket_data; |
| 211 socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); | 210 socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); |
| 212 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 211 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 213 | 212 |
| 214 TestCompletionCallback callback; | 213 TestCompletionCallback callback; |
| 215 ClientSocketHandle handle; | 214 ClientSocketHandle handle; |
| 216 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), | 215 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, false, |
| 217 &pool_, BoundNetLog()); | 216 callback.callback(), &pool_, BoundNetLog()); |
| 218 EXPECT_EQ(ERR_IO_PENDING, rv); | 217 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 219 EXPECT_FALSE(handle.is_initialized()); | 218 EXPECT_FALSE(handle.is_initialized()); |
| 220 EXPECT_FALSE(handle.socket()); | 219 EXPECT_FALSE(handle.socket()); |
| 221 | 220 |
| 222 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); | 221 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); |
| 223 EXPECT_FALSE(handle.is_initialized()); | 222 EXPECT_FALSE(handle.is_initialized()); |
| 224 EXPECT_FALSE(handle.socket()); | 223 EXPECT_FALSE(handle.socket()); |
| 225 } | 224 } |
| 226 | 225 |
| 227 TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { | 226 TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { |
| 228 MockRead failed_read[] = { | 227 MockRead failed_read[] = { |
| 229 MockRead(SYNCHRONOUS, 0), | 228 MockRead(SYNCHRONOUS, 0), |
| 230 }; | 229 }; |
| 231 StaticSocketDataProvider socket_data( | 230 StaticSocketDataProvider socket_data( |
| 232 failed_read, arraysize(failed_read), NULL, 0); | 231 failed_read, arraysize(failed_read), NULL, 0); |
| 233 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 232 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 234 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 233 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 235 | 234 |
| 236 ClientSocketHandle handle; | 235 ClientSocketHandle handle; |
| 237 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 236 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 238 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), | 237 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, false, |
| 239 &pool_, BoundNetLog()); | 238 CompletionCallback(), &pool_, BoundNetLog()); |
| 240 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 239 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); |
| 241 EXPECT_FALSE(handle.is_initialized()); | 240 EXPECT_FALSE(handle.is_initialized()); |
| 242 EXPECT_FALSE(handle.socket()); | 241 EXPECT_FALSE(handle.socket()); |
| 243 EXPECT_EQ(1, transport_socket_pool_.release_count()); | 242 EXPECT_EQ(1, transport_socket_pool_.release_count()); |
| 244 } | 243 } |
| 245 | 244 |
| 246 TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { | 245 TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { |
| 247 MockRead failed_read[] = { | 246 MockRead failed_read[] = { |
| 248 MockRead(ASYNC, 0), | 247 MockRead(ASYNC, 0), |
| 249 }; | 248 }; |
| 250 StaticSocketDataProvider socket_data( | 249 StaticSocketDataProvider socket_data( |
| 251 failed_read, arraysize(failed_read), NULL, 0); | 250 failed_read, arraysize(failed_read), NULL, 0); |
| 252 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 251 socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 253 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); | 252 transport_client_socket_factory_.AddSocketDataProvider(&socket_data); |
| 254 | 253 |
| 255 TestCompletionCallback callback; | 254 TestCompletionCallback callback; |
| 256 ClientSocketHandle handle; | 255 ClientSocketHandle handle; |
| 257 EXPECT_EQ(0, transport_socket_pool_.release_count()); | 256 EXPECT_EQ(0, transport_socket_pool_.release_count()); |
| 258 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), | 257 int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, false, |
| 259 &pool_, BoundNetLog()); | 258 callback.callback(), &pool_, BoundNetLog()); |
| 260 EXPECT_EQ(ERR_IO_PENDING, rv); | 259 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 261 EXPECT_FALSE(handle.is_initialized()); | 260 EXPECT_FALSE(handle.is_initialized()); |
| 262 EXPECT_FALSE(handle.socket()); | 261 EXPECT_FALSE(handle.socket()); |
| 263 | 262 |
| 264 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); | 263 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); |
| 265 EXPECT_FALSE(handle.is_initialized()); | 264 EXPECT_FALSE(handle.is_initialized()); |
| 266 EXPECT_FALSE(handle.socket()); | 265 EXPECT_FALSE(handle.socket()); |
| 267 EXPECT_EQ(1, transport_socket_pool_.release_count()); | 266 EXPECT_EQ(1, transport_socket_pool_.release_count()); |
| 268 } | 267 } |
| 269 | 268 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 | 333 |
| 335 (*requests())[0]->handle()->Reset(); | 334 (*requests())[0]->handle()->Reset(); |
| 336 (*requests())[1]->handle()->Reset(); | 335 (*requests())[1]->handle()->Reset(); |
| 337 } | 336 } |
| 338 | 337 |
| 339 // It would be nice to also test the timeouts in SOCKSClientSocketPool. | 338 // It would be nice to also test the timeouts in SOCKSClientSocketPool. |
| 340 | 339 |
| 341 } // namespace | 340 } // namespace |
| 342 | 341 |
| 343 } // namespace net | 342 } // namespace net |
| OLD | NEW |