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/host_resolver_unittest.h" | |
9 #include "net/base/listen_socket.h" | 8 #include "net/base/listen_socket.h" |
| 9 #include "net/base/mock_host_resolver.h" |
10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
11 #include "net/base/winsock_init.h" | 11 #include "net/base/winsock_init.h" |
12 #include "net/socket/client_socket_factory.h" | 12 #include "net/socket/client_socket_factory.h" |
13 #include "net/socket/tcp_client_socket.h" | 13 #include "net/socket/tcp_client_socket.h" |
14 #include "net/socket/socket_test_util.h" | 14 #include "net/socket/socket_test_util.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "testing/platform_test.h" | 16 #include "testing/platform_test.h" |
17 | 17 |
18 //----------------------------------------------------------------------------- | 18 //----------------------------------------------------------------------------- |
19 | 19 |
20 namespace net { | 20 namespace net { |
21 | 21 |
22 const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; | 22 const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; |
23 const char kSOCKS4aInitialRequest[] = | 23 const char kSOCKS4aInitialRequest[] = |
24 { 0x04, 0x01, 0x00, 0x50, 0, 0, 0, 127, 0 }; | 24 { 0x04, 0x01, 0x00, 0x50, 0, 0, 0, 127, 0 }; |
25 const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 25 const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
26 | 26 |
27 class SOCKSClientSocketTest : public PlatformTest { | 27 class SOCKSClientSocketTest : public PlatformTest { |
28 public: | 28 public: |
29 SOCKSClientSocketTest(); | 29 SOCKSClientSocketTest(); |
30 // Create a SOCKSClientSocket on top of a MockSocket. | 30 // Create a SOCKSClientSocket on top of a MockSocket. |
31 SOCKSClientSocket* BuildMockSocket(MockRead reads[], MockWrite writes[], | 31 SOCKSClientSocket* BuildMockSocket(MockRead reads[], MockWrite writes[], |
32 const std::string& hostname, int port); | 32 const std::string& hostname, int port); |
33 virtual void SetUp(); | 33 virtual void SetUp(); |
34 | 34 |
35 protected: | 35 protected: |
36 scoped_ptr<SOCKSClientSocket> user_sock_; | 36 scoped_ptr<SOCKSClientSocket> user_sock_; |
37 AddressList address_list_; | 37 AddressList address_list_; |
38 ClientSocket* tcp_sock_; | 38 ClientSocket* tcp_sock_; |
39 ScopedHostMapper host_mapper_; | |
40 TestCompletionCallback callback_; | 39 TestCompletionCallback callback_; |
41 scoped_refptr<RuleBasedHostMapper> mapper_; | 40 scoped_refptr<MockHostResolver> host_resolver_; |
42 scoped_refptr<HostResolver> host_resolver_; | |
43 scoped_ptr<MockSocket> mock_socket_; | 41 scoped_ptr<MockSocket> mock_socket_; |
44 | 42 |
45 private: | 43 private: |
46 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest); | 44 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest); |
47 }; | 45 }; |
48 | 46 |
49 SOCKSClientSocketTest::SOCKSClientSocketTest() | 47 SOCKSClientSocketTest::SOCKSClientSocketTest() |
50 : host_resolver_(new HostResolver(0, 0)) { | 48 : host_resolver_(new MockHostResolver) { |
51 } | 49 } |
52 | 50 |
53 // Set up platform before every test case | 51 // Set up platform before every test case |
54 void SOCKSClientSocketTest::SetUp() { | 52 void SOCKSClientSocketTest::SetUp() { |
55 PlatformTest::SetUp(); | 53 PlatformTest::SetUp(); |
56 | |
57 // Resolve the "localhost" AddressList used by the tcp_connection to connect. | |
58 scoped_refptr<HostResolver> resolver = new HostResolver(); | |
59 HostResolver::RequestInfo info("localhost", 1080); | |
60 int rv = resolver->Resolve(info, &address_list_, NULL, NULL); | |
61 ASSERT_EQ(OK, rv); | |
62 | |
63 // Create a new host mapping for the duration of this test case only. | |
64 mapper_ = new RuleBasedHostMapper(); | |
65 host_mapper_.Init(mapper_); | |
66 mapper_->AddRule("www.google.com", "127.0.0.1"); | |
67 } | 54 } |
68 | 55 |
69 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( | 56 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( |
70 MockRead reads[], | 57 MockRead reads[], |
71 MockWrite writes[], | 58 MockWrite writes[], |
72 const std::string& hostname, | 59 const std::string& hostname, |
73 int port) { | 60 int port) { |
74 | 61 |
75 TestCompletionCallback callback; | 62 TestCompletionCallback callback; |
76 mock_socket_.reset(new StaticMockSocket(reads, writes)); | 63 mock_socket_.reset(new StaticMockSocket(reads, writes)); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 EXPECT_EQ(ERR_IO_PENDING, rv); | 220 EXPECT_EQ(ERR_IO_PENDING, rv); |
234 rv = callback_.WaitForResult(); | 221 rv = callback_.WaitForResult(); |
235 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); | 222 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); |
236 EXPECT_FALSE(user_sock_->IsConnected()); | 223 EXPECT_FALSE(user_sock_->IsConnected()); |
237 } | 224 } |
238 | 225 |
239 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. | 226 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. |
240 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { | 227 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { |
241 const char hostname[] = "unresolved.ipv4.address"; | 228 const char hostname[] = "unresolved.ipv4.address"; |
242 | 229 |
243 mapper_->AddSimulatedFailure(hostname); | 230 host_resolver_->rules()->AddSimulatedFailure(hostname); |
244 | 231 |
245 std::string request(kSOCKS4aInitialRequest, | 232 std::string request(kSOCKS4aInitialRequest, |
246 arraysize(kSOCKS4aInitialRequest)); | 233 arraysize(kSOCKS4aInitialRequest)); |
247 request.append(hostname, arraysize(hostname)); | 234 request.append(hostname, arraysize(hostname)); |
248 | 235 |
249 MockWrite data_writes[] = { | 236 MockWrite data_writes[] = { |
250 MockWrite(false, request.data(), request.size()) }; | 237 MockWrite(false, request.data(), request.size()) }; |
251 MockRead data_reads[] = { | 238 MockRead data_reads[] = { |
252 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 239 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
253 | 240 |
254 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 241 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
255 | 242 |
256 int rv = user_sock_->Connect(&callback_); | 243 int rv = user_sock_->Connect(&callback_); |
257 EXPECT_EQ(ERR_IO_PENDING, rv); | 244 EXPECT_EQ(ERR_IO_PENDING, rv); |
258 rv = callback_.WaitForResult(); | 245 rv = callback_.WaitForResult(); |
259 EXPECT_EQ(OK, rv); | 246 EXPECT_EQ(OK, rv); |
260 EXPECT_TRUE(user_sock_->IsConnected()); | 247 EXPECT_TRUE(user_sock_->IsConnected()); |
261 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 248 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
262 } | 249 } |
263 | 250 |
264 // Tries to connect to a domain that resolves to IPv6. | 251 // Tries to connect to a domain that resolves to IPv6. |
265 // Should revert to SOCKS4a. | 252 // Should revert to SOCKS4a. |
266 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { | 253 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { |
267 const char hostname[] = "an.ipv6.address"; | 254 const char hostname[] = "an.ipv6.address"; |
268 | 255 |
269 mapper_->AddRule(hostname, "2001:db8:8714:3a90::12"); | 256 host_resolver_->rules()->AddRule(hostname, "2001:db8:8714:3a90::12"); |
270 | 257 |
271 std::string request(kSOCKS4aInitialRequest, | 258 std::string request(kSOCKS4aInitialRequest, |
272 arraysize(kSOCKS4aInitialRequest)); | 259 arraysize(kSOCKS4aInitialRequest)); |
273 request.append(hostname, arraysize(hostname)); | 260 request.append(hostname, arraysize(hostname)); |
274 | 261 |
275 MockWrite data_writes[] = { | 262 MockWrite data_writes[] = { |
276 MockWrite(false, request.data(), request.size()) }; | 263 MockWrite(false, request.data(), request.size()) }; |
277 MockRead data_reads[] = { | 264 MockRead data_reads[] = { |
278 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 265 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
279 | 266 |
280 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 267 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
281 | 268 |
282 int rv = user_sock_->Connect(&callback_); | 269 int rv = user_sock_->Connect(&callback_); |
283 EXPECT_EQ(ERR_IO_PENDING, rv); | 270 EXPECT_EQ(ERR_IO_PENDING, rv); |
284 rv = callback_.WaitForResult(); | 271 rv = callback_.WaitForResult(); |
285 EXPECT_EQ(OK, rv); | 272 EXPECT_EQ(OK, rv); |
286 EXPECT_TRUE(user_sock_->IsConnected()); | 273 EXPECT_TRUE(user_sock_->IsConnected()); |
287 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 274 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
288 } | 275 } |
289 | 276 |
290 } // namespace net | 277 } // namespace net |
291 | 278 |
OLD | NEW |