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 |