| 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 |