OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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.h" | 5 #include "net/socket/socks_client_socket.h" |
6 | 6 |
7 #include "net/base/address_list.h" | 7 #include "net/base/address_list.h" |
8 #include "net/base/load_log.h" | 8 #include "net/base/load_log.h" |
9 #include "net/base/load_log_unittest.h" | 9 #include "net/base/load_log_unittest.h" |
10 #include "net/base/mock_host_resolver.h" | 10 #include "net/base/mock_host_resolver.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; | 23 const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; |
24 const char kSOCKS4aInitialRequest[] = | 24 const char kSOCKS4aInitialRequest[] = |
25 { 0x04, 0x01, 0x00, 0x50, 0, 0, 0, 127, 0 }; | 25 { 0x04, 0x01, 0x00, 0x50, 0, 0, 0, 127, 0 }; |
26 const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 26 const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
27 | 27 |
28 class SOCKSClientSocketTest : public PlatformTest { | 28 class SOCKSClientSocketTest : public PlatformTest { |
29 public: | 29 public: |
30 SOCKSClientSocketTest(); | 30 SOCKSClientSocketTest(); |
31 // Create a SOCKSClientSocket on top of a MockSocket. | 31 // Create a SOCKSClientSocket on top of a MockSocket. |
32 SOCKSClientSocket* BuildMockSocket(MockRead reads[], MockWrite writes[], | 32 SOCKSClientSocket* BuildMockSocket(MockRead reads[], size_t reads_count, |
| 33 MockWrite writes[], size_t writes_count, |
33 HostResolver* host_resolver, | 34 HostResolver* host_resolver, |
34 const std::string& hostname, int port); | 35 const std::string& hostname, int port); |
35 virtual void SetUp(); | 36 virtual void SetUp(); |
36 | 37 |
37 protected: | 38 protected: |
38 scoped_ptr<SOCKSClientSocket> user_sock_; | 39 scoped_ptr<SOCKSClientSocket> user_sock_; |
39 AddressList address_list_; | 40 AddressList address_list_; |
40 ClientSocket* tcp_sock_; | 41 ClientSocket* tcp_sock_; |
41 TestCompletionCallback callback_; | 42 TestCompletionCallback callback_; |
42 scoped_refptr<MockHostResolver> host_resolver_; | 43 scoped_refptr<MockHostResolver> host_resolver_; |
43 scoped_ptr<SocketDataProvider> data_; | 44 scoped_ptr<SocketDataProvider> data_; |
44 | 45 |
45 private: | 46 private: |
46 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest); | 47 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest); |
47 }; | 48 }; |
48 | 49 |
49 SOCKSClientSocketTest::SOCKSClientSocketTest() | 50 SOCKSClientSocketTest::SOCKSClientSocketTest() |
50 : host_resolver_(new MockHostResolver) { | 51 : host_resolver_(new MockHostResolver) { |
51 } | 52 } |
52 | 53 |
53 // Set up platform before every test case | 54 // Set up platform before every test case |
54 void SOCKSClientSocketTest::SetUp() { | 55 void SOCKSClientSocketTest::SetUp() { |
55 PlatformTest::SetUp(); | 56 PlatformTest::SetUp(); |
56 } | 57 } |
57 | 58 |
58 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( | 59 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( |
59 MockRead reads[], | 60 MockRead reads[], |
| 61 size_t reads_count, |
60 MockWrite writes[], | 62 MockWrite writes[], |
| 63 size_t writes_count, |
61 HostResolver* host_resolver, | 64 HostResolver* host_resolver, |
62 const std::string& hostname, | 65 const std::string& hostname, |
63 int port) { | 66 int port) { |
64 | 67 |
65 TestCompletionCallback callback; | 68 TestCompletionCallback callback; |
66 data_.reset(new StaticSocketDataProvider(reads, writes)); | 69 data_.reset(new StaticSocketDataProvider(reads, reads_count, |
| 70 writes, writes_count)); |
67 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); | 71 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); |
68 | 72 |
69 int rv = tcp_sock_->Connect(&callback, NULL); | 73 int rv = tcp_sock_->Connect(&callback, NULL); |
70 EXPECT_EQ(ERR_IO_PENDING, rv); | 74 EXPECT_EQ(ERR_IO_PENDING, rv); |
71 rv = callback.WaitForResult(); | 75 rv = callback.WaitForResult(); |
72 EXPECT_EQ(OK, rv); | 76 EXPECT_EQ(OK, rv); |
73 EXPECT_TRUE(tcp_sock_->IsConnected()); | 77 EXPECT_TRUE(tcp_sock_->IsConnected()); |
74 | 78 |
75 return new SOCKSClientSocket(tcp_sock_, | 79 return new SOCKSClientSocket(tcp_sock_, |
76 HostResolver::RequestInfo(hostname, port), | 80 HostResolver::RequestInfo(hostname, port), |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 const std::string payload_write = "random data"; | 123 const std::string payload_write = "random data"; |
120 const std::string payload_read = "moar random data"; | 124 const std::string payload_read = "moar random data"; |
121 | 125 |
122 MockWrite data_writes[] = { | 126 MockWrite data_writes[] = { |
123 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), | 127 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), |
124 MockWrite(true, payload_write.data(), payload_write.size()) }; | 128 MockWrite(true, payload_write.data(), payload_write.size()) }; |
125 MockRead data_reads[] = { | 129 MockRead data_reads[] = { |
126 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), | 130 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), |
127 MockRead(true, payload_read.data(), payload_read.size()) }; | 131 MockRead(true, payload_read.data(), payload_read.size()) }; |
128 | 132 |
129 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 133 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
130 "localhost", 80)); | 134 data_writes, arraysize(data_writes), |
| 135 host_resolver_, "localhost", 80)); |
131 | 136 |
132 // At this state the TCP connection is completed but not the SOCKS handshake. | 137 // At this state the TCP connection is completed but not the SOCKS handshake. |
133 EXPECT_TRUE(tcp_sock_->IsConnected()); | 138 EXPECT_TRUE(tcp_sock_->IsConnected()); |
134 EXPECT_FALSE(user_sock_->IsConnected()); | 139 EXPECT_FALSE(user_sock_->IsConnected()); |
135 | 140 |
136 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 141 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
137 int rv = user_sock_->Connect(&callback_, log); | 142 int rv = user_sock_->Connect(&callback_, log); |
138 EXPECT_EQ(ERR_IO_PENDING, rv); | 143 EXPECT_EQ(ERR_IO_PENDING, rv); |
139 EXPECT_TRUE( | 144 EXPECT_TRUE( |
140 LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 145 LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 }; | 190 }; |
186 | 191 |
187 //--------------------------------------- | 192 //--------------------------------------- |
188 | 193 |
189 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 194 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
190 MockWrite data_writes[] = { | 195 MockWrite data_writes[] = { |
191 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 196 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
192 MockRead data_reads[] = { | 197 MockRead data_reads[] = { |
193 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; | 198 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; |
194 | 199 |
195 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 200 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
196 "localhost", 80)); | 201 data_writes, arraysize(data_writes), |
| 202 host_resolver_, "localhost", 80)); |
197 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 203 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
198 | 204 |
199 int rv = user_sock_->Connect(&callback_, log); | 205 int rv = user_sock_->Connect(&callback_, log); |
200 EXPECT_EQ(ERR_IO_PENDING, rv); | 206 EXPECT_EQ(ERR_IO_PENDING, rv); |
201 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 207 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
202 rv = callback_.WaitForResult(); | 208 rv = callback_.WaitForResult(); |
203 EXPECT_EQ(tests[i].fail_code, rv); | 209 EXPECT_EQ(tests[i].fail_code, rv); |
204 EXPECT_FALSE(user_sock_->IsConnected()); | 210 EXPECT_FALSE(user_sock_->IsConnected()); |
205 EXPECT_TRUE(tcp_sock_->IsConnected()); | 211 EXPECT_TRUE(tcp_sock_->IsConnected()); |
206 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); | 212 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
207 } | 213 } |
208 } | 214 } |
209 | 215 |
210 // Tests scenario when the server sends the handshake response in | 216 // Tests scenario when the server sends the handshake response in |
211 // more than one packet. | 217 // more than one packet. |
212 TEST_F(SOCKSClientSocketTest, PartialServerReads) { | 218 TEST_F(SOCKSClientSocketTest, PartialServerReads) { |
213 const char kSOCKSPartialReply1[] = { 0x00 }; | 219 const char kSOCKSPartialReply1[] = { 0x00 }; |
214 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 220 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
215 | 221 |
216 MockWrite data_writes[] = { | 222 MockWrite data_writes[] = { |
217 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 223 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
218 MockRead data_reads[] = { | 224 MockRead data_reads[] = { |
219 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), | 225 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), |
220 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; | 226 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; |
221 | 227 |
222 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 228 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
223 "localhost", 80)); | 229 data_writes, arraysize(data_writes), |
| 230 host_resolver_, "localhost", 80)); |
224 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 231 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
225 | 232 |
226 int rv = user_sock_->Connect(&callback_, log); | 233 int rv = user_sock_->Connect(&callback_, log); |
227 EXPECT_EQ(ERR_IO_PENDING, rv); | 234 EXPECT_EQ(ERR_IO_PENDING, rv); |
228 EXPECT_TRUE(LogContainsBeginEvent( | 235 EXPECT_TRUE(LogContainsBeginEvent( |
229 *log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 236 *log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
230 rv = callback_.WaitForResult(); | 237 rv = callback_.WaitForResult(); |
231 EXPECT_EQ(OK, rv); | 238 EXPECT_EQ(OK, rv); |
232 EXPECT_TRUE(user_sock_->IsConnected()); | 239 EXPECT_TRUE(user_sock_->IsConnected()); |
233 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); | 240 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
234 } | 241 } |
235 | 242 |
236 // Tests scenario when the client sends the handshake request in | 243 // Tests scenario when the client sends the handshake request in |
237 // more than one packet. | 244 // more than one packet. |
238 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { | 245 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { |
239 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; | 246 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; |
240 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; | 247 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; |
241 | 248 |
242 MockWrite data_writes[] = { | 249 MockWrite data_writes[] = { |
243 MockWrite(true, arraysize(kSOCKSPartialRequest1)), | 250 MockWrite(true, arraysize(kSOCKSPartialRequest1)), |
244 // simulate some empty writes | 251 // simulate some empty writes |
245 MockWrite(true, 0), | 252 MockWrite(true, 0), |
246 MockWrite(true, 0), | 253 MockWrite(true, 0), |
247 MockWrite(true, kSOCKSPartialRequest2, | 254 MockWrite(true, kSOCKSPartialRequest2, |
248 arraysize(kSOCKSPartialRequest2)) }; | 255 arraysize(kSOCKSPartialRequest2)) }; |
249 MockRead data_reads[] = { | 256 MockRead data_reads[] = { |
250 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 257 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
251 | 258 |
252 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 259 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
253 "localhost", 80)); | 260 data_writes, arraysize(data_writes), |
| 261 host_resolver_, "localhost", 80)); |
254 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 262 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
255 | 263 |
256 int rv = user_sock_->Connect(&callback_, log); | 264 int rv = user_sock_->Connect(&callback_, log); |
257 EXPECT_EQ(ERR_IO_PENDING, rv); | 265 EXPECT_EQ(ERR_IO_PENDING, rv); |
258 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 266 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
259 rv = callback_.WaitForResult(); | 267 rv = callback_.WaitForResult(); |
260 EXPECT_EQ(OK, rv); | 268 EXPECT_EQ(OK, rv); |
261 EXPECT_TRUE(user_sock_->IsConnected()); | 269 EXPECT_TRUE(user_sock_->IsConnected()); |
262 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); | 270 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
263 } | 271 } |
264 | 272 |
265 // Tests the case when the server sends a smaller sized handshake data | 273 // Tests the case when the server sends a smaller sized handshake data |
266 // and closes the connection. | 274 // and closes the connection. |
267 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { | 275 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { |
268 MockWrite data_writes[] = { | 276 MockWrite data_writes[] = { |
269 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 277 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
270 MockRead data_reads[] = { | 278 MockRead data_reads[] = { |
271 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), | 279 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), |
272 // close connection unexpectedly | 280 // close connection unexpectedly |
273 MockRead(false, 0) }; | 281 MockRead(false, 0) }; |
274 | 282 |
275 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 283 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
276 "localhost", 80)); | 284 data_writes, arraysize(data_writes), |
| 285 host_resolver_, "localhost", 80)); |
277 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 286 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
278 | 287 |
279 int rv = user_sock_->Connect(&callback_, log); | 288 int rv = user_sock_->Connect(&callback_, log); |
280 EXPECT_EQ(ERR_IO_PENDING, rv); | 289 EXPECT_EQ(ERR_IO_PENDING, rv); |
281 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 290 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
282 rv = callback_.WaitForResult(); | 291 rv = callback_.WaitForResult(); |
283 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); | 292 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); |
284 EXPECT_FALSE(user_sock_->IsConnected()); | 293 EXPECT_FALSE(user_sock_->IsConnected()); |
285 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); | 294 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
286 } | 295 } |
287 | 296 |
288 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. | 297 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. |
289 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { | 298 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { |
290 const char hostname[] = "unresolved.ipv4.address"; | 299 const char hostname[] = "unresolved.ipv4.address"; |
291 | 300 |
292 host_resolver_->rules()->AddSimulatedFailure(hostname); | 301 host_resolver_->rules()->AddSimulatedFailure(hostname); |
293 | 302 |
294 std::string request(kSOCKS4aInitialRequest, | 303 std::string request(kSOCKS4aInitialRequest, |
295 arraysize(kSOCKS4aInitialRequest)); | 304 arraysize(kSOCKS4aInitialRequest)); |
296 request.append(hostname, arraysize(hostname)); | 305 request.append(hostname, arraysize(hostname)); |
297 | 306 |
298 MockWrite data_writes[] = { | 307 MockWrite data_writes[] = { |
299 MockWrite(false, request.data(), request.size()) }; | 308 MockWrite(false, request.data(), request.size()) }; |
300 MockRead data_reads[] = { | 309 MockRead data_reads[] = { |
301 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 310 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
302 | 311 |
303 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 312 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
304 hostname, 80)); | 313 data_writes, arraysize(data_writes), |
| 314 host_resolver_, hostname, 80)); |
305 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 315 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
306 | 316 |
307 int rv = user_sock_->Connect(&callback_, log); | 317 int rv = user_sock_->Connect(&callback_, log); |
308 EXPECT_EQ(ERR_IO_PENDING, rv); | 318 EXPECT_EQ(ERR_IO_PENDING, rv); |
309 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 319 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
310 rv = callback_.WaitForResult(); | 320 rv = callback_.WaitForResult(); |
311 EXPECT_EQ(OK, rv); | 321 EXPECT_EQ(OK, rv); |
312 EXPECT_TRUE(user_sock_->IsConnected()); | 322 EXPECT_TRUE(user_sock_->IsConnected()); |
313 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 323 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
314 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); | 324 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
315 } | 325 } |
316 | 326 |
317 // Tries to connect to a domain that resolves to IPv6. | 327 // Tries to connect to a domain that resolves to IPv6. |
318 // Should revert to SOCKS4a. | 328 // Should revert to SOCKS4a. |
319 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { | 329 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { |
320 const char hostname[] = "an.ipv6.address"; | 330 const char hostname[] = "an.ipv6.address"; |
321 | 331 |
322 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); | 332 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); |
323 | 333 |
324 std::string request(kSOCKS4aInitialRequest, | 334 std::string request(kSOCKS4aInitialRequest, |
325 arraysize(kSOCKS4aInitialRequest)); | 335 arraysize(kSOCKS4aInitialRequest)); |
326 request.append(hostname, arraysize(hostname)); | 336 request.append(hostname, arraysize(hostname)); |
327 | 337 |
328 MockWrite data_writes[] = { | 338 MockWrite data_writes[] = { |
329 MockWrite(false, request.data(), request.size()) }; | 339 MockWrite(false, request.data(), request.size()) }; |
330 MockRead data_reads[] = { | 340 MockRead data_reads[] = { |
331 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 341 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
332 | 342 |
333 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 343 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
334 hostname, 80)); | 344 data_writes, arraysize(data_writes), |
| 345 host_resolver_, hostname, 80)); |
335 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 346 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
336 | 347 |
337 int rv = user_sock_->Connect(&callback_, log); | 348 int rv = user_sock_->Connect(&callback_, log); |
338 EXPECT_EQ(ERR_IO_PENDING, rv); | 349 EXPECT_EQ(ERR_IO_PENDING, rv); |
339 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); | 350 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
340 rv = callback_.WaitForResult(); | 351 rv = callback_.WaitForResult(); |
341 EXPECT_EQ(OK, rv); | 352 EXPECT_EQ(OK, rv); |
342 EXPECT_TRUE(user_sock_->IsConnected()); | 353 EXPECT_TRUE(user_sock_->IsConnected()); |
343 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 354 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
344 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); | 355 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
345 } | 356 } |
346 | 357 |
347 // Calls Disconnect() while a host resolve is in progress. The outstanding host | 358 // Calls Disconnect() while a host resolve is in progress. The outstanding host |
348 // resolve should be cancelled. | 359 // resolve should be cancelled. |
349 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { | 360 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { |
350 scoped_refptr<HangingHostResolver> hanging_resolver = | 361 scoped_refptr<HangingHostResolver> hanging_resolver = |
351 new HangingHostResolver(); | 362 new HangingHostResolver(); |
352 | 363 |
353 // Doesn't matter what the socket data is, we will never use it -- garbage. | 364 // Doesn't matter what the socket data is, we will never use it -- garbage. |
354 MockWrite data_writes[] = { MockWrite(false, "", 0) }; | 365 MockWrite data_writes[] = { MockWrite(false, "", 0) }; |
355 MockRead data_reads[] = { MockRead(false, "", 0) }; | 366 MockRead data_reads[] = { MockRead(false, "", 0) }; |
356 | 367 |
357 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hanging_resolver, | 368 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
358 "foo", 80)); | 369 data_writes, arraysize(data_writes), |
| 370 hanging_resolver, "foo", 80)); |
359 | 371 |
360 // Start connecting (will get stuck waiting for the host to resolve). | 372 // Start connecting (will get stuck waiting for the host to resolve). |
361 int rv = user_sock_->Connect(&callback_, NULL); | 373 int rv = user_sock_->Connect(&callback_, NULL); |
362 EXPECT_EQ(ERR_IO_PENDING, rv); | 374 EXPECT_EQ(ERR_IO_PENDING, rv); |
363 | 375 |
364 EXPECT_FALSE(user_sock_->IsConnected()); | 376 EXPECT_FALSE(user_sock_->IsConnected()); |
365 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); | 377 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); |
366 | 378 |
367 // The host resolver should have received the resolve request. | 379 // The host resolver should have received the resolve request. |
368 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest()); | 380 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest()); |
369 | 381 |
370 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. | 382 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. |
371 user_sock_->Disconnect(); | 383 user_sock_->Disconnect(); |
372 | 384 |
373 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); | 385 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); |
374 | 386 |
375 EXPECT_FALSE(user_sock_->IsConnected()); | 387 EXPECT_FALSE(user_sock_->IsConnected()); |
376 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); | 388 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); |
377 } | 389 } |
378 | 390 |
379 } // namespace net | 391 } // namespace net |
OLD | NEW |