| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| 11 #include "net/base/net_log.h" | 11 #include "net/base/net_log.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 29 // Base class to test SOCKS5ClientSocket | 29 // Base class to test SOCKS5ClientSocket |
| 30 class SOCKS5ClientSocketTest : public PlatformTest { | 30 class SOCKS5ClientSocketTest : public PlatformTest { |
| 31 public: | 31 public: |
| 32 SOCKS5ClientSocketTest(); | 32 SOCKS5ClientSocketTest(); |
| 33 // Create a SOCKSClientSocket on top of a MockSocket. | 33 // Create a SOCKSClientSocket on top of a MockSocket. |
| 34 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], | 34 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], |
| 35 size_t reads_count, | 35 size_t reads_count, |
| 36 MockWrite writes[], | 36 MockWrite writes[], |
| 37 size_t writes_count, | 37 size_t writes_count, |
| 38 const std::string& hostname, | 38 const std::string& hostname, |
| 39 int port); | 39 int port, |
| 40 NetLog* net_log); |
| 40 | 41 |
| 41 virtual void SetUp(); | 42 virtual void SetUp(); |
| 42 | 43 |
| 43 protected: | 44 protected: |
| 44 const uint16 kNwPort; | 45 const uint16 kNwPort; |
| 46 CapturingNetLog net_log_; |
| 45 scoped_ptr<SOCKS5ClientSocket> user_sock_; | 47 scoped_ptr<SOCKS5ClientSocket> user_sock_; |
| 46 AddressList address_list_; | 48 AddressList address_list_; |
| 47 ClientSocket* tcp_sock_; | 49 ClientSocket* tcp_sock_; |
| 48 TestCompletionCallback callback_; | 50 TestCompletionCallback callback_; |
| 49 scoped_refptr<MockHostResolver> host_resolver_; | 51 scoped_refptr<MockHostResolver> host_resolver_; |
| 50 scoped_ptr<SocketDataProvider> data_; | 52 scoped_ptr<SocketDataProvider> data_; |
| 51 | 53 |
| 52 private: | 54 private: |
| 53 DISALLOW_COPY_AND_ASSIGN(SOCKS5ClientSocketTest); | 55 DISALLOW_COPY_AND_ASSIGN(SOCKS5ClientSocketTest); |
| 54 }; | 56 }; |
| 55 | 57 |
| 56 SOCKS5ClientSocketTest::SOCKS5ClientSocketTest() | 58 SOCKS5ClientSocketTest::SOCKS5ClientSocketTest() |
| 57 : kNwPort(htons(80)), host_resolver_(new MockHostResolver) { | 59 : kNwPort(htons(80)), |
| 60 net_log_(CapturingNetLog::kUnbounded), |
| 61 host_resolver_(new MockHostResolver) { |
| 58 } | 62 } |
| 59 | 63 |
| 60 // Set up platform before every test case | 64 // Set up platform before every test case |
| 61 void SOCKS5ClientSocketTest::SetUp() { | 65 void SOCKS5ClientSocketTest::SetUp() { |
| 62 PlatformTest::SetUp(); | 66 PlatformTest::SetUp(); |
| 63 | 67 |
| 64 // Resolve the "localhost" AddressList used by the TCP connection to connect. | 68 // Resolve the "localhost" AddressList used by the TCP connection to connect. |
| 65 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); | 69 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); |
| 66 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); | 70 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); |
| 67 ASSERT_EQ(OK, rv); | 71 ASSERT_EQ(OK, rv); |
| 68 } | 72 } |
| 69 | 73 |
| 70 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( | 74 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( |
| 71 MockRead reads[], | 75 MockRead reads[], |
| 72 size_t reads_count, | 76 size_t reads_count, |
| 73 MockWrite writes[], | 77 MockWrite writes[], |
| 74 size_t writes_count, | 78 size_t writes_count, |
| 75 const std::string& hostname, | 79 const std::string& hostname, |
| 76 int port) { | 80 int port, |
| 81 NetLog* net_log) { |
| 77 TestCompletionCallback callback; | 82 TestCompletionCallback callback; |
| 78 data_.reset(new StaticSocketDataProvider(reads, reads_count, | 83 data_.reset(new StaticSocketDataProvider(reads, reads_count, |
| 79 writes, writes_count)); | 84 writes, writes_count)); |
| 80 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); | 85 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); |
| 81 | 86 |
| 82 int rv = tcp_sock_->Connect(&callback, NULL); | 87 int rv = tcp_sock_->Connect(&callback); |
| 83 EXPECT_EQ(ERR_IO_PENDING, rv); | 88 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 84 rv = callback.WaitForResult(); | 89 rv = callback.WaitForResult(); |
| 85 EXPECT_EQ(OK, rv); | 90 EXPECT_EQ(OK, rv); |
| 86 EXPECT_TRUE(tcp_sock_->IsConnected()); | 91 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 87 | 92 |
| 88 return new SOCKS5ClientSocket(tcp_sock_, | 93 return new SOCKS5ClientSocket(tcp_sock_, |
| 89 HostResolver::RequestInfo(hostname, port)); | 94 HostResolver::RequestInfo(hostname, port)); |
| 90 } | 95 } |
| 91 | 96 |
| 92 // Tests a complete SOCKS5 handshake and the disconnection. | 97 // Tests a complete SOCKS5 handshake and the disconnection. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 109 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 114 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 110 MockWrite(true, kOkRequest, arraysize(kOkRequest)), | 115 MockWrite(true, kOkRequest, arraysize(kOkRequest)), |
| 111 MockWrite(true, payload_write.data(), payload_write.size()) }; | 116 MockWrite(true, payload_write.data(), payload_write.size()) }; |
| 112 MockRead data_reads[] = { | 117 MockRead data_reads[] = { |
| 113 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 118 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 114 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength), | 119 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength), |
| 115 MockRead(true, payload_read.data(), payload_read.size()) }; | 120 MockRead(true, payload_read.data(), payload_read.size()) }; |
| 116 | 121 |
| 117 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 122 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 118 data_writes, arraysize(data_writes), | 123 data_writes, arraysize(data_writes), |
| 119 "localhost", 80)); | 124 "localhost", 80, &net_log_)); |
| 120 | 125 |
| 121 // At this state the TCP connection is completed but not the SOCKS handshake. | 126 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 122 EXPECT_TRUE(tcp_sock_->IsConnected()); | 127 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 123 EXPECT_FALSE(user_sock_->IsConnected()); | 128 EXPECT_FALSE(user_sock_->IsConnected()); |
| 124 | 129 |
| 125 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 130 int rv = user_sock_->Connect(&callback_); |
| 126 int rv = user_sock_->Connect(&callback_, log.bound()); | |
| 127 EXPECT_EQ(ERR_IO_PENDING, rv); | 131 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 128 EXPECT_FALSE(user_sock_->IsConnected()); | 132 EXPECT_FALSE(user_sock_->IsConnected()); |
| 129 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONNEC
T)); | 133 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 134 NetLog::TYPE_SOCKS5_CONNECT)); |
| 130 | 135 |
| 131 rv = callback_.WaitForResult(); | 136 rv = callback_.WaitForResult(); |
| 132 | 137 |
| 133 EXPECT_EQ(OK, rv); | 138 EXPECT_EQ(OK, rv); |
| 134 EXPECT_TRUE(user_sock_->IsConnected()); | 139 EXPECT_TRUE(user_sock_->IsConnected()); |
| 135 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNECT
)); | 140 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 141 NetLog::TYPE_SOCKS5_CONNECT)); |
| 136 | 142 |
| 137 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); | 143 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); |
| 138 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 144 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
| 139 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 145 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
| 140 EXPECT_EQ(ERR_IO_PENDING, rv); | 146 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 141 rv = callback_.WaitForResult(); | 147 rv = callback_.WaitForResult(); |
| 142 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 148 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
| 143 | 149 |
| 144 buffer = new IOBuffer(payload_read.size()); | 150 buffer = new IOBuffer(payload_read.size()); |
| 145 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); | 151 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 173 MockWrite(false, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 179 MockWrite(false, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 174 MockWrite(false, request.data(), request.size()) | 180 MockWrite(false, request.data(), request.size()) |
| 175 }; | 181 }; |
| 176 MockRead data_reads[] = { | 182 MockRead data_reads[] = { |
| 177 MockRead(false, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 183 MockRead(false, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 178 MockRead(false, kSOCKS5OkResponse, kSOCKS5OkResponseLength) | 184 MockRead(false, kSOCKS5OkResponse, kSOCKS5OkResponseLength) |
| 179 }; | 185 }; |
| 180 | 186 |
| 181 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 187 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 182 data_writes, arraysize(data_writes), | 188 data_writes, arraysize(data_writes), |
| 183 hostname, 80)); | 189 hostname, 80, NULL)); |
| 184 | 190 |
| 185 int rv = user_sock_->Connect(&callback_, NULL); | 191 int rv = user_sock_->Connect(&callback_); |
| 186 EXPECT_EQ(OK, rv); | 192 EXPECT_EQ(OK, rv); |
| 187 EXPECT_TRUE(user_sock_->IsConnected()); | 193 EXPECT_TRUE(user_sock_->IsConnected()); |
| 188 | 194 |
| 189 user_sock_->Disconnect(); | 195 user_sock_->Disconnect(); |
| 190 EXPECT_FALSE(user_sock_->IsConnected()); | 196 EXPECT_FALSE(user_sock_->IsConnected()); |
| 191 } | 197 } |
| 192 } | 198 } |
| 193 | 199 |
| 194 // Test that we fail trying to connect to a hosname longer than 255 bytes. | 200 // Test that we fail trying to connect to a hosname longer than 255 bytes. |
| 195 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { | 201 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { |
| 196 // Create a string of length 256, where each character is 'x'. | 202 // Create a string of length 256, where each character is 'x'. |
| 197 std::string large_host_name; | 203 std::string large_host_name; |
| 198 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); | 204 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); |
| 199 | 205 |
| 200 // Create a SOCKS socket, with mock transport socket. | 206 // Create a SOCKS socket, with mock transport socket. |
| 201 MockWrite data_writes[] = {MockWrite()}; | 207 MockWrite data_writes[] = {MockWrite()}; |
| 202 MockRead data_reads[] = {MockRead()}; | 208 MockRead data_reads[] = {MockRead()}; |
| 203 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 209 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 204 data_writes, arraysize(data_writes), | 210 data_writes, arraysize(data_writes), |
| 205 large_host_name, 80)); | 211 large_host_name, 80, NULL)); |
| 206 | 212 |
| 207 // Try to connect -- should fail (without having read/written anything to | 213 // Try to connect -- should fail (without having read/written anything to |
| 208 // the transport socket first) because the hostname is too long. | 214 // the transport socket first) because the hostname is too long. |
| 209 TestCompletionCallback callback; | 215 TestCompletionCallback callback; |
| 210 int rv = user_sock_->Connect(&callback, NULL); | 216 int rv = user_sock_->Connect(&callback); |
| 211 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 217 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); |
| 212 } | 218 } |
| 213 | 219 |
| 214 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 220 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
| 215 const std::string hostname = "www.google.com"; | 221 const std::string hostname = "www.google.com"; |
| 216 | 222 |
| 217 const char kOkRequest[] = { | 223 const char kOkRequest[] = { |
| 218 0x05, // Version | 224 0x05, // Version |
| 219 0x01, // Command (CONNECT) | 225 0x01, // Command (CONNECT) |
| 220 0x00, // Reserved. | 226 0x00, // Reserved. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 231 const char partial2[] = { 0x00 }; | 237 const char partial2[] = { 0x00 }; |
| 232 MockWrite data_writes[] = { | 238 MockWrite data_writes[] = { |
| 233 MockWrite(true, arraysize(partial1)), | 239 MockWrite(true, arraysize(partial1)), |
| 234 MockWrite(true, partial2, arraysize(partial2)), | 240 MockWrite(true, partial2, arraysize(partial2)), |
| 235 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; | 241 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; |
| 236 MockRead data_reads[] = { | 242 MockRead data_reads[] = { |
| 237 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 243 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 238 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 244 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 239 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 245 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 240 data_writes, arraysize(data_writes), | 246 data_writes, arraysize(data_writes), |
| 241 hostname, 80)); | 247 hostname, 80, &net_log_)); |
| 242 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 248 int rv = user_sock_->Connect(&callback_); |
| 243 int rv = user_sock_->Connect(&callback_, log.bound()); | |
| 244 EXPECT_EQ(ERR_IO_PENDING, rv); | 249 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 245 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 250 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 251 NetLog::TYPE_SOCKS5_CONNECT)); |
| 246 rv = callback_.WaitForResult(); | 252 rv = callback_.WaitForResult(); |
| 247 EXPECT_EQ(OK, rv); | 253 EXPECT_EQ(OK, rv); |
| 248 EXPECT_TRUE(user_sock_->IsConnected()); | 254 EXPECT_TRUE(user_sock_->IsConnected()); |
| 249 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 255 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 256 NetLog::TYPE_SOCKS5_CONNECT)); |
| 250 } | 257 } |
| 251 | 258 |
| 252 // Test for partial greet response read | 259 // Test for partial greet response read |
| 253 { | 260 { |
| 254 const char partial1[] = { 0x05 }; | 261 const char partial1[] = { 0x05 }; |
| 255 const char partial2[] = { 0x00 }; | 262 const char partial2[] = { 0x00 }; |
| 256 MockWrite data_writes[] = { | 263 MockWrite data_writes[] = { |
| 257 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 264 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 258 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; | 265 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; |
| 259 MockRead data_reads[] = { | 266 MockRead data_reads[] = { |
| 260 MockRead(true, partial1, arraysize(partial1)), | 267 MockRead(true, partial1, arraysize(partial1)), |
| 261 MockRead(true, partial2, arraysize(partial2)), | 268 MockRead(true, partial2, arraysize(partial2)), |
| 262 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 269 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 263 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 270 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 264 data_writes, arraysize(data_writes), | 271 data_writes, arraysize(data_writes), |
| 265 hostname, 80)); | 272 hostname, 80, &net_log_)); |
| 266 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 273 int rv = user_sock_->Connect(&callback_); |
| 267 int rv = user_sock_->Connect(&callback_, log.bound()); | |
| 268 EXPECT_EQ(ERR_IO_PENDING, rv); | 274 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 269 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 275 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 276 NetLog::TYPE_SOCKS5_CONNECT)); |
| 270 rv = callback_.WaitForResult(); | 277 rv = callback_.WaitForResult(); |
| 271 EXPECT_EQ(OK, rv); | 278 EXPECT_EQ(OK, rv); |
| 272 EXPECT_TRUE(user_sock_->IsConnected()); | 279 EXPECT_TRUE(user_sock_->IsConnected()); |
| 273 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 280 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 281 NetLog::TYPE_SOCKS5_CONNECT)); |
| 274 } | 282 } |
| 275 | 283 |
| 276 // Test for partial handshake request write. | 284 // Test for partial handshake request write. |
| 277 { | 285 { |
| 278 const int kSplitPoint = 3; // Break handshake write into two parts. | 286 const int kSplitPoint = 3; // Break handshake write into two parts. |
| 279 MockWrite data_writes[] = { | 287 MockWrite data_writes[] = { |
| 280 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 288 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 281 MockWrite(true, kOkRequest, kSplitPoint), | 289 MockWrite(true, kOkRequest, kSplitPoint), |
| 282 MockWrite(true, kOkRequest + kSplitPoint, | 290 MockWrite(true, kOkRequest + kSplitPoint, |
| 283 arraysize(kOkRequest) - kSplitPoint) | 291 arraysize(kOkRequest) - kSplitPoint) |
| 284 }; | 292 }; |
| 285 MockRead data_reads[] = { | 293 MockRead data_reads[] = { |
| 286 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 294 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 287 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 295 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 288 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 296 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 289 data_writes, arraysize(data_writes), | 297 data_writes, arraysize(data_writes), |
| 290 hostname, 80)); | 298 hostname, 80, &net_log_)); |
| 291 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 299 int rv = user_sock_->Connect(&callback_); |
| 292 int rv = user_sock_->Connect(&callback_, log.bound()); | |
| 293 EXPECT_EQ(ERR_IO_PENDING, rv); | 300 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 294 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 301 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 302 NetLog::TYPE_SOCKS5_CONNECT)); |
| 295 rv = callback_.WaitForResult(); | 303 rv = callback_.WaitForResult(); |
| 296 EXPECT_EQ(OK, rv); | 304 EXPECT_EQ(OK, rv); |
| 297 EXPECT_TRUE(user_sock_->IsConnected()); | 305 EXPECT_TRUE(user_sock_->IsConnected()); |
| 298 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 306 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 307 NetLog::TYPE_SOCKS5_CONNECT)); |
| 299 } | 308 } |
| 300 | 309 |
| 301 // Test for partial handshake response read | 310 // Test for partial handshake response read |
| 302 { | 311 { |
| 303 const int kSplitPoint = 6; // Break the handshake read into two parts. | 312 const int kSplitPoint = 6; // Break the handshake read into two parts. |
| 304 MockWrite data_writes[] = { | 313 MockWrite data_writes[] = { |
| 305 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 314 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 306 MockWrite(true, kOkRequest, arraysize(kOkRequest)) | 315 MockWrite(true, kOkRequest, arraysize(kOkRequest)) |
| 307 }; | 316 }; |
| 308 MockRead data_reads[] = { | 317 MockRead data_reads[] = { |
| 309 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 318 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 310 MockRead(true, kSOCKS5OkResponse, kSplitPoint), | 319 MockRead(true, kSOCKS5OkResponse, kSplitPoint), |
| 311 MockRead(true, kSOCKS5OkResponse + kSplitPoint, | 320 MockRead(true, kSOCKS5OkResponse + kSplitPoint, |
| 312 kSOCKS5OkResponseLength - kSplitPoint) | 321 kSOCKS5OkResponseLength - kSplitPoint) |
| 313 }; | 322 }; |
| 314 | 323 |
| 315 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 324 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 316 data_writes, arraysize(data_writes), | 325 data_writes, arraysize(data_writes), |
| 317 hostname, 80)); | 326 hostname, 80, &net_log_)); |
| 318 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 327 int rv = user_sock_->Connect(&callback_); |
| 319 int rv = user_sock_->Connect(&callback_, log.bound()); | |
| 320 EXPECT_EQ(ERR_IO_PENDING, rv); | 328 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 321 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 329 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 330 NetLog::TYPE_SOCKS5_CONNECT)); |
| 322 rv = callback_.WaitForResult(); | 331 rv = callback_.WaitForResult(); |
| 323 EXPECT_EQ(OK, rv); | 332 EXPECT_EQ(OK, rv); |
| 324 EXPECT_TRUE(user_sock_->IsConnected()); | 333 EXPECT_TRUE(user_sock_->IsConnected()); |
| 325 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 334 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 335 NetLog::TYPE_SOCKS5_CONNECT)); |
| 326 } | 336 } |
| 327 } | 337 } |
| 328 | 338 |
| 329 } // namespace | 339 } // namespace |
| 330 | 340 |
| 331 } // namespace net | 341 } // namespace net |
| OLD | NEW |