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::RespectLimits::ENABLED, |
| 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::RespectLimits::ENABLED, |
| 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::RespectLimits::ENABLED, |
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::RespectLimits::ENABLED, |
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::RespectLimits::ENABLED, |
| 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::RespectLimits::ENABLED, |
| 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::RespectLimits::ENABLED, |
| 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::RespectLimits::ENABLED, |
| 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::RespectLimits::ENABLED, |
| 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 |