| 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/socks5_client_socket.h" | 5 #include "net/socket/socks5_client_socket.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "net/base/address_list.h" | 9 #include "net/base/address_list.h" |
| 10 #include "net/base/load_log.h" | 10 #include "net/base/load_log.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 namespace net { | 24 namespace net { |
| 25 | 25 |
| 26 // Base class to test SOCKS5ClientSocket | 26 // Base class to test SOCKS5ClientSocket |
| 27 class SOCKS5ClientSocketTest : public PlatformTest { | 27 class SOCKS5ClientSocketTest : public PlatformTest { |
| 28 public: | 28 public: |
| 29 SOCKS5ClientSocketTest(); | 29 SOCKS5ClientSocketTest(); |
| 30 // Create a SOCKSClientSocket on top of a MockSocket. | 30 // Create a SOCKSClientSocket on top of a MockSocket. |
| 31 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], | 31 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], |
| 32 MockWrite writes[], | 32 MockWrite writes[], |
| 33 const std::string& hostname, | 33 const std::string& hostname, |
| 34 int port); | 34 int port, |
| 35 HostResolver* host_resolver); |
| 36 |
| 35 virtual void SetUp(); | 37 virtual void SetUp(); |
| 36 | 38 |
| 37 protected: | 39 protected: |
| 38 const uint16 kNwPort; | 40 const uint16 kNwPort; |
| 39 scoped_ptr<SOCKS5ClientSocket> user_sock_; | 41 scoped_ptr<SOCKS5ClientSocket> user_sock_; |
| 40 AddressList address_list_; | 42 AddressList address_list_; |
| 41 ClientSocket* tcp_sock_; | 43 ClientSocket* tcp_sock_; |
| 42 TestCompletionCallback callback_; | 44 TestCompletionCallback callback_; |
| 43 scoped_refptr<MockHostResolver> host_resolver_; | 45 scoped_refptr<MockHostResolver> host_resolver_; |
| 44 scoped_ptr<SocketDataProvider> data_; | 46 scoped_ptr<SocketDataProvider> data_; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 58 // Resolve the "localhost" AddressList used by the TCP connection to connect. | 60 // Resolve the "localhost" AddressList used by the TCP connection to connect. |
| 59 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); | 61 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); |
| 60 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); | 62 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); |
| 61 ASSERT_EQ(OK, rv); | 63 ASSERT_EQ(OK, rv); |
| 62 } | 64 } |
| 63 | 65 |
| 64 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( | 66 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( |
| 65 MockRead reads[], | 67 MockRead reads[], |
| 66 MockWrite writes[], | 68 MockWrite writes[], |
| 67 const std::string& hostname, | 69 const std::string& hostname, |
| 68 int port) { | 70 int port, |
| 69 | 71 net::HostResolver* host_resolver) { |
| 70 TestCompletionCallback callback; | 72 TestCompletionCallback callback; |
| 71 data_.reset(new StaticSocketDataProvider(reads, writes)); | 73 data_.reset(new StaticSocketDataProvider(reads, writes)); |
| 72 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); | 74 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); |
| 73 | 75 |
| 74 int rv = tcp_sock_->Connect(&callback, NULL); | 76 int rv = tcp_sock_->Connect(&callback, NULL); |
| 75 EXPECT_EQ(ERR_IO_PENDING, rv); | 77 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 76 rv = callback.WaitForResult(); | 78 rv = callback.WaitForResult(); |
| 77 EXPECT_EQ(OK, rv); | 79 EXPECT_EQ(OK, rv); |
| 78 EXPECT_TRUE(tcp_sock_->IsConnected()); | 80 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 79 | 81 |
| 80 return new SOCKS5ClientSocket(tcp_sock_, | 82 return new SOCKS5ClientSocket(tcp_sock_, |
| 81 HostResolver::RequestInfo(hostname, port), | 83 HostResolver::RequestInfo(hostname, port), |
| 82 host_resolver_); | 84 host_resolver); |
| 83 } | 85 } |
| 84 | 86 |
| 85 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 }; | 87 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 }; |
| 86 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 }; | 88 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 }; |
| 87 | 89 |
| 88 const char kSOCKS5OkRequest[] = | 90 const char kSOCKS5OkRequest[] = |
| 89 { 0x05, 0x01, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 91 { 0x05, 0x01, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
| 90 const char kSOCKS5OkResponse[] = | 92 const char kSOCKS5OkResponse[] = |
| 91 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 93 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
| 92 | 94 |
| 93 // Tests a complete SOCKS5 handshake and the disconnection. | 95 // Tests a complete SOCKS5 handshake and the disconnection. |
| 94 TEST_F(SOCKS5ClientSocketTest, CompleteHandshake) { | 96 TEST_F(SOCKS5ClientSocketTest, CompleteHandshake) { |
| 95 const std::string payload_write = "random data"; | 97 const std::string payload_write = "random data"; |
| 96 const std::string payload_read = "moar random data"; | 98 const std::string payload_read = "moar random data"; |
| 97 | 99 |
| 98 MockWrite data_writes[] = { | 100 MockWrite data_writes[] = { |
| 99 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 101 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 100 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)), | 102 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)), |
| 101 MockWrite(true, payload_write.data(), payload_write.size()) }; | 103 MockWrite(true, payload_write.data(), payload_write.size()) }; |
| 102 MockRead data_reads[] = { | 104 MockRead data_reads[] = { |
| 103 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 105 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 104 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), | 106 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), |
| 105 MockRead(true, payload_read.data(), payload_read.size()) }; | 107 MockRead(true, payload_read.data(), payload_read.size()) }; |
| 106 | 108 |
| 107 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 109 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80, |
| 110 new MockHostResolver)); |
| 108 | 111 |
| 109 // At this state the TCP connection is completed but not the SOCKS handshake. | 112 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 110 EXPECT_TRUE(tcp_sock_->IsConnected()); | 113 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 111 EXPECT_FALSE(user_sock_->IsConnected()); | 114 EXPECT_FALSE(user_sock_->IsConnected()); |
| 112 | 115 |
| 113 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 116 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 114 int rv = user_sock_->Connect(&callback_, log); | 117 int rv = user_sock_->Connect(&callback_, log); |
| 115 EXPECT_EQ(ERR_IO_PENDING, rv); | 118 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 116 EXPECT_FALSE(user_sock_->IsConnected()); | 119 EXPECT_FALSE(user_sock_->IsConnected()); |
| 117 EXPECT_TRUE( | 120 EXPECT_TRUE( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 143 user_sock_->Disconnect(); | 146 user_sock_->Disconnect(); |
| 144 EXPECT_FALSE(tcp_sock_->IsConnected()); | 147 EXPECT_FALSE(tcp_sock_->IsConnected()); |
| 145 EXPECT_FALSE(user_sock_->IsConnected()); | 148 EXPECT_FALSE(user_sock_->IsConnected()); |
| 146 } | 149 } |
| 147 | 150 |
| 148 // Tries to connect to a DNS which fails domain lookup. | 151 // Tries to connect to a DNS which fails domain lookup. |
| 149 TEST_F(SOCKS5ClientSocketTest, FailedDNS) { | 152 TEST_F(SOCKS5ClientSocketTest, FailedDNS) { |
| 150 const std::string hostname = "unresolved.ipv4.address"; | 153 const std::string hostname = "unresolved.ipv4.address"; |
| 151 const char kSOCKS5DomainRequest[] = { 0x05, 0x01, 0x00, 0x03 }; | 154 const char kSOCKS5DomainRequest[] = { 0x05, 0x01, 0x00, 0x03 }; |
| 152 | 155 |
| 153 host_resolver_->rules()->AddSimulatedFailure(hostname.c_str()); | 156 scoped_refptr<MockHostResolver> mock_resolver = new MockHostResolver; |
| 157 mock_resolver->rules()->AddSimulatedFailure(hostname); |
| 154 | 158 |
| 155 std::string request(kSOCKS5DomainRequest, | 159 std::string request(kSOCKS5DomainRequest, |
| 156 arraysize(kSOCKS5DomainRequest)); | 160 arraysize(kSOCKS5DomainRequest)); |
| 157 request.push_back(hostname.size()); | 161 request.push_back(hostname.size()); |
| 158 request.append(hostname); | 162 request.append(hostname); |
| 159 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); | 163 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); |
| 160 | 164 |
| 161 MockWrite data_writes[] = { | 165 MockWrite data_writes[] = { |
| 162 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 166 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 163 MockWrite(false, request.data(), request.size()) }; | 167 MockWrite(false, request.data(), request.size()) }; |
| 164 MockRead data_reads[] = { | 168 MockRead data_reads[] = { |
| 165 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 169 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 166 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 170 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 167 | 171 |
| 168 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 172 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 173 mock_resolver)); |
| 169 | 174 |
| 170 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 175 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 171 int rv = user_sock_->Connect(&callback_, log); | 176 int rv = user_sock_->Connect(&callback_, log); |
| 172 EXPECT_EQ(ERR_IO_PENDING, rv); | 177 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 173 EXPECT_TRUE(LogContains( | 178 EXPECT_TRUE(LogContains( |
| 174 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 179 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 175 rv = callback_.WaitForResult(); | 180 rv = callback_.WaitForResult(); |
| 176 EXPECT_EQ(OK, rv); | 181 EXPECT_EQ(OK, rv); |
| 177 EXPECT_TRUE(user_sock_->IsConnected()); | 182 EXPECT_TRUE(user_sock_->IsConnected()); |
| 178 EXPECT_EQ(SOCKS5ClientSocket::kEndPointFailedDomain, | 183 EXPECT_EQ(SOCKS5ClientSocket::kEndPointFailedDomain, |
| 179 user_sock_->address_type_); | 184 user_sock_->address_type_); |
| 180 EXPECT_TRUE(LogContains( | 185 EXPECT_TRUE(LogContains( |
| 181 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 186 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 182 } | 187 } |
| 183 | 188 |
| 189 // Connect to a domain, making sure to defer the host resolving to the proxy |
| 190 // server. |
| 191 TEST_F(SOCKS5ClientSocketTest, ResolveHostsProxySide) { |
| 192 const std::string hostname = "my-host-name"; |
| 193 const char kSOCKS5DomainRequest[] = { |
| 194 0x05, // VER |
| 195 0x01, // CMD |
| 196 0x00, // RSV |
| 197 0x03, // ATYPE |
| 198 }; |
| 199 |
| 200 std::string request(kSOCKS5DomainRequest, |
| 201 arraysize(kSOCKS5DomainRequest)); |
| 202 request.push_back(hostname.size()); |
| 203 request.append(hostname); |
| 204 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); |
| 205 |
| 206 MockWrite data_writes[] = { |
| 207 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 208 MockWrite(false, request.data(), request.size()) |
| 209 }; |
| 210 MockRead data_reads[] = { |
| 211 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 212 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) |
| 213 }; |
| 214 |
| 215 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 216 NULL)); |
| 217 |
| 218 int rv = user_sock_->Connect(&callback_, NULL); |
| 219 EXPECT_EQ(OK, rv); |
| 220 EXPECT_TRUE(user_sock_->IsConnected()); |
| 221 } |
| 222 |
| 184 // Tries to connect to a domain that resolves to IPv6. | 223 // Tries to connect to a domain that resolves to IPv6. |
| 185 TEST_F(SOCKS5ClientSocketTest, IPv6Domain) { | 224 TEST_F(SOCKS5ClientSocketTest, IPv6Domain) { |
| 186 const std::string hostname = "an.ipv6.address"; | 225 const std::string hostname = "an.ipv6.address"; |
| 187 const char kSOCKS5IPv6Request[] = { 0x05, 0x01, 0x00, 0x04 }; | 226 const char kSOCKS5IPv6Request[] = { 0x05, 0x01, 0x00, 0x04 }; |
| 188 const uint8 ipv6_addr[] = { 0x20, 0x01, 0x0d, 0xb8, 0x87, 0x14, 0x3a, 0x90, | 227 const uint8 ipv6_addr[] = { 0x20, 0x01, 0x0d, 0xb8, 0x87, 0x14, 0x3a, 0x90, |
| 189 0x00, 0x00, 0x00, 0x00, 0x00, 0x000, 0x00, 0x12 }; | 228 0x00, 0x00, 0x00, 0x00, 0x00, 0x000, 0x00, 0x12 }; |
| 190 | 229 |
| 191 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); | 230 scoped_refptr<MockHostResolver> mock_resolver = new MockHostResolver; |
| 231 mock_resolver->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); |
| 192 | 232 |
| 193 std::string request(kSOCKS5IPv6Request, | 233 std::string request(kSOCKS5IPv6Request, |
| 194 arraysize(kSOCKS5IPv6Request)); | 234 arraysize(kSOCKS5IPv6Request)); |
| 195 request.append(reinterpret_cast<const char*>(&ipv6_addr), sizeof(ipv6_addr)); | 235 request.append(reinterpret_cast<const char*>(&ipv6_addr), sizeof(ipv6_addr)); |
| 196 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); | 236 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); |
| 197 | 237 |
| 198 MockWrite data_writes[] = { | 238 MockWrite data_writes[] = { |
| 199 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 239 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 200 MockWrite(false, request.data(), request.size()) }; | 240 MockWrite(false, request.data(), request.size()) }; |
| 201 MockRead data_reads[] = { | 241 MockRead data_reads[] = { |
| 202 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 242 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 203 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 243 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 204 | 244 |
| 205 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 245 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 246 mock_resolver)); |
| 206 | 247 |
| 207 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 248 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 208 int rv = user_sock_->Connect(&callback_, log); | 249 int rv = user_sock_->Connect(&callback_, log); |
| 209 EXPECT_EQ(ERR_IO_PENDING, rv); | 250 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 210 EXPECT_TRUE(LogContains( | 251 EXPECT_TRUE(LogContains( |
| 211 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 252 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 212 rv = callback_.WaitForResult(); | 253 rv = callback_.WaitForResult(); |
| 213 EXPECT_EQ(OK, rv); | 254 EXPECT_EQ(OK, rv); |
| 214 EXPECT_TRUE(user_sock_->IsConnected()); | 255 EXPECT_TRUE(user_sock_->IsConnected()); |
| 215 EXPECT_EQ(SOCKS5ClientSocket::kEndPointResolvedIPv6, | 256 EXPECT_EQ(SOCKS5ClientSocket::kEndPointResolvedIPv6, |
| 216 user_sock_->address_type_); | 257 user_sock_->address_type_); |
| 217 EXPECT_TRUE(LogContains( | 258 EXPECT_TRUE(LogContains( |
| 218 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 259 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 219 } | 260 } |
| 220 | 261 |
| 221 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 262 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
| 222 const std::string hostname = "www.google.com"; | 263 const std::string hostname = "www.google.com"; |
| 223 | 264 |
| 224 // Test for partial greet request write | 265 // Test for partial greet request write |
| 225 { | 266 { |
| 226 const char partial1[] = { 0x05, 0x01 }; | 267 const char partial1[] = { 0x05, 0x01 }; |
| 227 const char partial2[] = { 0x00 }; | 268 const char partial2[] = { 0x00 }; |
| 228 MockWrite data_writes[] = { | 269 MockWrite data_writes[] = { |
| 229 MockWrite(true, arraysize(partial1)), | 270 MockWrite(true, arraysize(partial1)), |
| 230 MockWrite(true, partial2, arraysize(partial2)), | 271 MockWrite(true, partial2, arraysize(partial2)), |
| 231 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 272 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 232 MockRead data_reads[] = { | 273 MockRead data_reads[] = { |
| 233 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 274 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 234 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 275 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 235 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 276 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 277 new MockHostResolver)); |
| 236 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 278 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 237 int rv = user_sock_->Connect(&callback_, log); | 279 int rv = user_sock_->Connect(&callback_, log); |
| 238 EXPECT_EQ(ERR_IO_PENDING, rv); | 280 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 239 EXPECT_TRUE(LogContains( | 281 EXPECT_TRUE(LogContains( |
| 240 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 282 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 241 rv = callback_.WaitForResult(); | 283 rv = callback_.WaitForResult(); |
| 242 EXPECT_EQ(OK, rv); | 284 EXPECT_EQ(OK, rv); |
| 243 EXPECT_TRUE(user_sock_->IsConnected()); | 285 EXPECT_TRUE(user_sock_->IsConnected()); |
| 244 EXPECT_TRUE(LogContains( | 286 EXPECT_TRUE(LogContains( |
| 245 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 287 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 246 } | 288 } |
| 247 | 289 |
| 248 // Test for partial greet response read | 290 // Test for partial greet response read |
| 249 { | 291 { |
| 250 const char partial1[] = { 0x05 }; | 292 const char partial1[] = { 0x05 }; |
| 251 const char partial2[] = { 0x00 }; | 293 const char partial2[] = { 0x00 }; |
| 252 MockWrite data_writes[] = { | 294 MockWrite data_writes[] = { |
| 253 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 295 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 254 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 296 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 255 MockRead data_reads[] = { | 297 MockRead data_reads[] = { |
| 256 MockRead(true, partial1, arraysize(partial1)), | 298 MockRead(true, partial1, arraysize(partial1)), |
| 257 MockRead(true, partial2, arraysize(partial2)), | 299 MockRead(true, partial2, arraysize(partial2)), |
| 258 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 300 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 259 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 301 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 302 new MockHostResolver)); |
| 260 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 303 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 261 int rv = user_sock_->Connect(&callback_, log); | 304 int rv = user_sock_->Connect(&callback_, log); |
| 262 EXPECT_EQ(ERR_IO_PENDING, rv); | 305 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 263 EXPECT_TRUE(LogContains( | 306 EXPECT_TRUE(LogContains( |
| 264 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 307 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 265 rv = callback_.WaitForResult(); | 308 rv = callback_.WaitForResult(); |
| 266 EXPECT_EQ(OK, rv); | 309 EXPECT_EQ(OK, rv); |
| 267 EXPECT_TRUE(user_sock_->IsConnected()); | 310 EXPECT_TRUE(user_sock_->IsConnected()); |
| 268 EXPECT_TRUE(LogContains( | 311 EXPECT_TRUE(LogContains( |
| 269 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 312 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 270 } | 313 } |
| 271 | 314 |
| 272 // Test for partial handshake request write | 315 // Test for partial handshake request write |
| 273 { | 316 { |
| 274 const char partial1[] = { 0x05, 0x01, 0x00 }; | 317 const char partial1[] = { 0x05, 0x01, 0x00 }; |
| 275 const char partial2[] = { 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 318 const char partial2[] = { 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
| 276 MockWrite data_writes[] = { | 319 MockWrite data_writes[] = { |
| 277 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 320 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 278 MockWrite(true, arraysize(partial1)), | 321 MockWrite(true, arraysize(partial1)), |
| 279 MockWrite(true, partial2, arraysize(partial2)) }; | 322 MockWrite(true, partial2, arraysize(partial2)) }; |
| 280 MockRead data_reads[] = { | 323 MockRead data_reads[] = { |
| 281 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 324 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 282 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 325 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 283 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 326 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 327 new MockHostResolver)); |
| 284 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 328 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 285 int rv = user_sock_->Connect(&callback_, log); | 329 int rv = user_sock_->Connect(&callback_, log); |
| 286 EXPECT_EQ(ERR_IO_PENDING, rv); | 330 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 287 EXPECT_TRUE(LogContains( | 331 EXPECT_TRUE(LogContains( |
| 288 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 332 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 289 rv = callback_.WaitForResult(); | 333 rv = callback_.WaitForResult(); |
| 290 EXPECT_EQ(OK, rv); | 334 EXPECT_EQ(OK, rv); |
| 291 EXPECT_TRUE(user_sock_->IsConnected()); | 335 EXPECT_TRUE(user_sock_->IsConnected()); |
| 292 EXPECT_TRUE(LogContains( | 336 EXPECT_TRUE(LogContains( |
| 293 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 337 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 294 } | 338 } |
| 295 | 339 |
| 296 // Test for partial handshake response read | 340 // Test for partial handshake response read |
| 297 { | 341 { |
| 298 const char partial1[] = { 0x05, 0x00, 0x00, 0x01, 127, 0 }; | 342 const char partial1[] = { 0x05, 0x00, 0x00, 0x01, 127, 0 }; |
| 299 const char partial2[] = { 0, 1, 0x00, 0x50 }; | 343 const char partial2[] = { 0, 1, 0x00, 0x50 }; |
| 300 MockWrite data_writes[] = { | 344 MockWrite data_writes[] = { |
| 301 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 345 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 302 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 346 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 303 MockRead data_reads[] = { | 347 MockRead data_reads[] = { |
| 304 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 348 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 305 MockRead(true, partial1, arraysize(partial1)), | 349 MockRead(true, partial1, arraysize(partial1)), |
| 306 MockRead(true, partial2, arraysize(partial2)) }; | 350 MockRead(true, partial2, arraysize(partial2)) }; |
| 307 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 351 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80, |
| 352 new MockHostResolver)); |
| 308 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 353 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 309 int rv = user_sock_->Connect(&callback_, log); | 354 int rv = user_sock_->Connect(&callback_, log); |
| 310 EXPECT_EQ(ERR_IO_PENDING, rv); | 355 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 311 EXPECT_TRUE(LogContains( | 356 EXPECT_TRUE(LogContains( |
| 312 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 357 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 313 rv = callback_.WaitForResult(); | 358 rv = callback_.WaitForResult(); |
| 314 EXPECT_EQ(OK, rv); | 359 EXPECT_EQ(OK, rv); |
| 315 EXPECT_TRUE(user_sock_->IsConnected()); | 360 EXPECT_TRUE(user_sock_->IsConnected()); |
| 316 EXPECT_TRUE(LogContains( | 361 EXPECT_TRUE(LogContains( |
| 317 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 362 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 318 } | 363 } |
| 319 } | 364 } |
| 320 | 365 |
| 321 } // namespace net | 366 } // namespace net |
| OLD | NEW |