| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <iterator> | 8 #include <iterator> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/sys_byteorder.h" | 13 #include "base/sys_byteorder.h" |
| 14 #include "net/base/address_list.h" | 14 #include "net/base/address_list.h" |
| 15 #include "net/base/test_completion_callback.h" | 15 #include "net/base/test_completion_callback.h" |
| 16 #include "net/base/winsock_init.h" | 16 #include "net/base/winsock_init.h" |
| 17 #include "net/dns/mock_host_resolver.h" | 17 #include "net/dns/mock_host_resolver.h" |
| 18 #include "net/log/net_log.h" | 18 #include "net/log/net_log.h" |
| 19 #include "net/log/test_net_log.h" | 19 #include "net/log/test_net_log.h" |
| 20 #include "net/log/test_net_log_entry.h" | 20 #include "net/log/test_net_log_entry.h" |
| 21 #include "net/log/test_net_log_util.h" | 21 #include "net/log/test_net_log_util.h" |
| 22 #include "net/socket/client_socket_factory.h" | 22 #include "net/socket/client_socket_factory.h" |
| 23 #include "net/socket/socket_test_util.h" | 23 #include "net/socket/socket_test_util.h" |
| 24 #include "net/socket/tcp_client_socket.h" | 24 #include "net/socket/tcp_client_socket.h" |
| 25 #include "net/test/gtest_util.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "testing/platform_test.h" | 28 #include "testing/platform_test.h" |
| 27 | 29 |
| 30 using net::test::IsError; |
| 31 using net::test::IsOk; |
| 32 |
| 28 //----------------------------------------------------------------------------- | 33 //----------------------------------------------------------------------------- |
| 29 | 34 |
| 30 namespace net { | 35 namespace net { |
| 31 | 36 |
| 32 namespace { | 37 namespace { |
| 33 | 38 |
| 34 // Base class to test SOCKS5ClientSocket | 39 // Base class to test SOCKS5ClientSocket |
| 35 class SOCKS5ClientSocketTest : public PlatformTest { | 40 class SOCKS5ClientSocketTest : public PlatformTest { |
| 36 public: | 41 public: |
| 37 SOCKS5ClientSocketTest(); | 42 SOCKS5ClientSocketTest(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 | 79 |
| 75 // Resolve the "localhost" AddressList used by the TCP connection to connect. | 80 // Resolve the "localhost" AddressList used by the TCP connection to connect. |
| 76 HostResolver::RequestInfo info(HostPortPair("www.socks-proxy.com", 1080)); | 81 HostResolver::RequestInfo info(HostPortPair("www.socks-proxy.com", 1080)); |
| 77 TestCompletionCallback callback; | 82 TestCompletionCallback callback; |
| 78 int rv = host_resolver_->Resolve(info, | 83 int rv = host_resolver_->Resolve(info, |
| 79 DEFAULT_PRIORITY, | 84 DEFAULT_PRIORITY, |
| 80 &address_list_, | 85 &address_list_, |
| 81 callback.callback(), | 86 callback.callback(), |
| 82 NULL, | 87 NULL, |
| 83 BoundNetLog()); | 88 BoundNetLog()); |
| 84 ASSERT_EQ(ERR_IO_PENDING, rv); | 89 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 85 rv = callback.WaitForResult(); | 90 rv = callback.WaitForResult(); |
| 86 ASSERT_EQ(OK, rv); | 91 ASSERT_THAT(rv, IsOk()); |
| 87 } | 92 } |
| 88 | 93 |
| 89 std::unique_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket( | 94 std::unique_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket( |
| 90 MockRead reads[], | 95 MockRead reads[], |
| 91 size_t reads_count, | 96 size_t reads_count, |
| 92 MockWrite writes[], | 97 MockWrite writes[], |
| 93 size_t writes_count, | 98 size_t writes_count, |
| 94 const std::string& hostname, | 99 const std::string& hostname, |
| 95 int port, | 100 int port, |
| 96 NetLog* net_log) { | 101 NetLog* net_log) { |
| 97 TestCompletionCallback callback; | 102 TestCompletionCallback callback; |
| 98 data_.reset(new StaticSocketDataProvider(reads, reads_count, | 103 data_.reset(new StaticSocketDataProvider(reads, reads_count, |
| 99 writes, writes_count)); | 104 writes, writes_count)); |
| 100 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); | 105 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); |
| 101 | 106 |
| 102 int rv = tcp_sock_->Connect(callback.callback()); | 107 int rv = tcp_sock_->Connect(callback.callback()); |
| 103 EXPECT_EQ(ERR_IO_PENDING, rv); | 108 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 104 rv = callback.WaitForResult(); | 109 rv = callback.WaitForResult(); |
| 105 EXPECT_EQ(OK, rv); | 110 EXPECT_THAT(rv, IsOk()); |
| 106 EXPECT_TRUE(tcp_sock_->IsConnected()); | 111 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 107 | 112 |
| 108 std::unique_ptr<ClientSocketHandle> connection(new ClientSocketHandle); | 113 std::unique_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
| 109 // |connection| takes ownership of |tcp_sock_|, but keep a | 114 // |connection| takes ownership of |tcp_sock_|, but keep a |
| 110 // non-owning pointer to it. | 115 // non-owning pointer to it. |
| 111 connection->SetSocket(std::unique_ptr<StreamSocket>(tcp_sock_)); | 116 connection->SetSocket(std::unique_ptr<StreamSocket>(tcp_sock_)); |
| 112 return std::unique_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket( | 117 return std::unique_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket( |
| 113 std::move(connection), | 118 std::move(connection), |
| 114 HostResolver::RequestInfo(HostPortPair(hostname, port)))); | 119 HostResolver::RequestInfo(HostPortPair(hostname, port)))); |
| 115 } | 120 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 141 | 146 |
| 142 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 147 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 143 data_writes, arraysize(data_writes), | 148 data_writes, arraysize(data_writes), |
| 144 "localhost", 80, &net_log_); | 149 "localhost", 80, &net_log_); |
| 145 | 150 |
| 146 // At this state the TCP connection is completed but not the SOCKS handshake. | 151 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 147 EXPECT_TRUE(tcp_sock_->IsConnected()); | 152 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 148 EXPECT_FALSE(user_sock_->IsConnected()); | 153 EXPECT_FALSE(user_sock_->IsConnected()); |
| 149 | 154 |
| 150 int rv = user_sock_->Connect(callback_.callback()); | 155 int rv = user_sock_->Connect(callback_.callback()); |
| 151 EXPECT_EQ(ERR_IO_PENDING, rv); | 156 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 152 EXPECT_FALSE(user_sock_->IsConnected()); | 157 EXPECT_FALSE(user_sock_->IsConnected()); |
| 153 | 158 |
| 154 TestNetLogEntry::List net_log_entries; | 159 TestNetLogEntry::List net_log_entries; |
| 155 net_log_.GetEntries(&net_log_entries); | 160 net_log_.GetEntries(&net_log_entries); |
| 156 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 161 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 157 NetLog::TYPE_SOCKS5_CONNECT)); | 162 NetLog::TYPE_SOCKS5_CONNECT)); |
| 158 | 163 |
| 159 rv = callback_.WaitForResult(); | 164 rv = callback_.WaitForResult(); |
| 160 | 165 |
| 161 EXPECT_EQ(OK, rv); | 166 EXPECT_THAT(rv, IsOk()); |
| 162 EXPECT_TRUE(user_sock_->IsConnected()); | 167 EXPECT_TRUE(user_sock_->IsConnected()); |
| 163 | 168 |
| 164 net_log_.GetEntries(&net_log_entries); | 169 net_log_.GetEntries(&net_log_entries); |
| 165 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 170 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 166 NetLog::TYPE_SOCKS5_CONNECT)); | 171 NetLog::TYPE_SOCKS5_CONNECT)); |
| 167 | 172 |
| 168 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); | 173 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); |
| 169 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 174 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
| 170 rv = user_sock_->Write( | 175 rv = user_sock_->Write( |
| 171 buffer.get(), payload_write.size(), callback_.callback()); | 176 buffer.get(), payload_write.size(), callback_.callback()); |
| 172 EXPECT_EQ(ERR_IO_PENDING, rv); | 177 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 173 rv = callback_.WaitForResult(); | 178 rv = callback_.WaitForResult(); |
| 174 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 179 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
| 175 | 180 |
| 176 buffer = new IOBuffer(payload_read.size()); | 181 buffer = new IOBuffer(payload_read.size()); |
| 177 rv = | 182 rv = |
| 178 user_sock_->Read(buffer.get(), payload_read.size(), callback_.callback()); | 183 user_sock_->Read(buffer.get(), payload_read.size(), callback_.callback()); |
| 179 EXPECT_EQ(ERR_IO_PENDING, rv); | 184 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 180 rv = callback_.WaitForResult(); | 185 rv = callback_.WaitForResult(); |
| 181 EXPECT_EQ(static_cast<int>(payload_read.size()), rv); | 186 EXPECT_EQ(static_cast<int>(payload_read.size()), rv); |
| 182 EXPECT_EQ(payload_read, std::string(buffer->data(), payload_read.size())); | 187 EXPECT_EQ(payload_read, std::string(buffer->data(), payload_read.size())); |
| 183 | 188 |
| 184 user_sock_->Disconnect(); | 189 user_sock_->Disconnect(); |
| 185 EXPECT_FALSE(tcp_sock_->IsConnected()); | 190 EXPECT_FALSE(tcp_sock_->IsConnected()); |
| 186 EXPECT_FALSE(user_sock_->IsConnected()); | 191 EXPECT_FALSE(user_sock_->IsConnected()); |
| 187 } | 192 } |
| 188 | 193 |
| 189 // Test that you can call Connect() again after having called Disconnect(). | 194 // Test that you can call Connect() again after having called Disconnect(). |
| (...skipping 19 matching lines...) Expand all Loading... |
| 209 MockRead data_reads[] = { | 214 MockRead data_reads[] = { |
| 210 MockRead(SYNCHRONOUS, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 215 MockRead(SYNCHRONOUS, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 211 MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength) | 216 MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength) |
| 212 }; | 217 }; |
| 213 | 218 |
| 214 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 219 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 215 data_writes, arraysize(data_writes), | 220 data_writes, arraysize(data_writes), |
| 216 hostname, 80, NULL); | 221 hostname, 80, NULL); |
| 217 | 222 |
| 218 int rv = user_sock_->Connect(callback_.callback()); | 223 int rv = user_sock_->Connect(callback_.callback()); |
| 219 EXPECT_EQ(OK, rv); | 224 EXPECT_THAT(rv, IsOk()); |
| 220 EXPECT_TRUE(user_sock_->IsConnected()); | 225 EXPECT_TRUE(user_sock_->IsConnected()); |
| 221 | 226 |
| 222 user_sock_->Disconnect(); | 227 user_sock_->Disconnect(); |
| 223 EXPECT_FALSE(user_sock_->IsConnected()); | 228 EXPECT_FALSE(user_sock_->IsConnected()); |
| 224 } | 229 } |
| 225 } | 230 } |
| 226 | 231 |
| 227 // Test that we fail trying to connect to a hosname longer than 255 bytes. | 232 // Test that we fail trying to connect to a hosname longer than 255 bytes. |
| 228 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { | 233 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { |
| 229 // Create a string of length 256, where each character is 'x'. | 234 // Create a string of length 256, where each character is 'x'. |
| 230 std::string large_host_name; | 235 std::string large_host_name; |
| 231 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); | 236 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); |
| 232 | 237 |
| 233 // Create a SOCKS socket, with mock transport socket. | 238 // Create a SOCKS socket, with mock transport socket. |
| 234 MockWrite data_writes[] = {MockWrite()}; | 239 MockWrite data_writes[] = {MockWrite()}; |
| 235 MockRead data_reads[] = {MockRead()}; | 240 MockRead data_reads[] = {MockRead()}; |
| 236 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 241 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 237 data_writes, arraysize(data_writes), | 242 data_writes, arraysize(data_writes), |
| 238 large_host_name, 80, NULL); | 243 large_host_name, 80, NULL); |
| 239 | 244 |
| 240 // Try to connect -- should fail (without having read/written anything to | 245 // Try to connect -- should fail (without having read/written anything to |
| 241 // the transport socket first) because the hostname is too long. | 246 // the transport socket first) because the hostname is too long. |
| 242 TestCompletionCallback callback; | 247 TestCompletionCallback callback; |
| 243 int rv = user_sock_->Connect(callback.callback()); | 248 int rv = user_sock_->Connect(callback.callback()); |
| 244 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 249 EXPECT_THAT(rv, IsError(ERR_SOCKS_CONNECTION_FAILED)); |
| 245 } | 250 } |
| 246 | 251 |
| 247 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 252 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
| 248 const std::string hostname = "www.google.com"; | 253 const std::string hostname = "www.google.com"; |
| 249 | 254 |
| 250 const char kOkRequest[] = { | 255 const char kOkRequest[] = { |
| 251 0x05, // Version | 256 0x05, // Version |
| 252 0x01, // Command (CONNECT) | 257 0x01, // Command (CONNECT) |
| 253 0x00, // Reserved. | 258 0x00, // Reserved. |
| 254 0x03, // Address type (DOMAINNAME). | 259 0x03, // Address type (DOMAINNAME). |
| (...skipping 11 matching lines...) Expand all Loading... |
| 266 MockWrite(ASYNC, partial1, arraysize(partial1)), | 271 MockWrite(ASYNC, partial1, arraysize(partial1)), |
| 267 MockWrite(ASYNC, partial2, arraysize(partial2)), | 272 MockWrite(ASYNC, partial2, arraysize(partial2)), |
| 268 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 273 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; |
| 269 MockRead data_reads[] = { | 274 MockRead data_reads[] = { |
| 270 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 275 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 271 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 276 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 272 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 277 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 273 data_writes, arraysize(data_writes), | 278 data_writes, arraysize(data_writes), |
| 274 hostname, 80, &net_log_); | 279 hostname, 80, &net_log_); |
| 275 int rv = user_sock_->Connect(callback_.callback()); | 280 int rv = user_sock_->Connect(callback_.callback()); |
| 276 EXPECT_EQ(ERR_IO_PENDING, rv); | 281 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 277 | 282 |
| 278 TestNetLogEntry::List net_log_entries; | 283 TestNetLogEntry::List net_log_entries; |
| 279 net_log_.GetEntries(&net_log_entries); | 284 net_log_.GetEntries(&net_log_entries); |
| 280 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 285 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 281 NetLog::TYPE_SOCKS5_CONNECT)); | 286 NetLog::TYPE_SOCKS5_CONNECT)); |
| 282 | 287 |
| 283 rv = callback_.WaitForResult(); | 288 rv = callback_.WaitForResult(); |
| 284 EXPECT_EQ(OK, rv); | 289 EXPECT_THAT(rv, IsOk()); |
| 285 EXPECT_TRUE(user_sock_->IsConnected()); | 290 EXPECT_TRUE(user_sock_->IsConnected()); |
| 286 | 291 |
| 287 net_log_.GetEntries(&net_log_entries); | 292 net_log_.GetEntries(&net_log_entries); |
| 288 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 293 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 289 NetLog::TYPE_SOCKS5_CONNECT)); | 294 NetLog::TYPE_SOCKS5_CONNECT)); |
| 290 } | 295 } |
| 291 | 296 |
| 292 // Test for partial greet response read | 297 // Test for partial greet response read |
| 293 { | 298 { |
| 294 const char partial1[] = { 0x05 }; | 299 const char partial1[] = { 0x05 }; |
| 295 const char partial2[] = { 0x00 }; | 300 const char partial2[] = { 0x00 }; |
| 296 MockWrite data_writes[] = { | 301 MockWrite data_writes[] = { |
| 297 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 302 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 298 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 303 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; |
| 299 MockRead data_reads[] = { | 304 MockRead data_reads[] = { |
| 300 MockRead(ASYNC, partial1, arraysize(partial1)), | 305 MockRead(ASYNC, partial1, arraysize(partial1)), |
| 301 MockRead(ASYNC, partial2, arraysize(partial2)), | 306 MockRead(ASYNC, partial2, arraysize(partial2)), |
| 302 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 307 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 303 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 308 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 304 data_writes, arraysize(data_writes), | 309 data_writes, arraysize(data_writes), |
| 305 hostname, 80, &net_log_); | 310 hostname, 80, &net_log_); |
| 306 int rv = user_sock_->Connect(callback_.callback()); | 311 int rv = user_sock_->Connect(callback_.callback()); |
| 307 EXPECT_EQ(ERR_IO_PENDING, rv); | 312 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 308 | 313 |
| 309 TestNetLogEntry::List net_log_entries; | 314 TestNetLogEntry::List net_log_entries; |
| 310 net_log_.GetEntries(&net_log_entries); | 315 net_log_.GetEntries(&net_log_entries); |
| 311 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 316 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 312 NetLog::TYPE_SOCKS5_CONNECT)); | 317 NetLog::TYPE_SOCKS5_CONNECT)); |
| 313 rv = callback_.WaitForResult(); | 318 rv = callback_.WaitForResult(); |
| 314 EXPECT_EQ(OK, rv); | 319 EXPECT_THAT(rv, IsOk()); |
| 315 EXPECT_TRUE(user_sock_->IsConnected()); | 320 EXPECT_TRUE(user_sock_->IsConnected()); |
| 316 net_log_.GetEntries(&net_log_entries); | 321 net_log_.GetEntries(&net_log_entries); |
| 317 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 322 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 318 NetLog::TYPE_SOCKS5_CONNECT)); | 323 NetLog::TYPE_SOCKS5_CONNECT)); |
| 319 } | 324 } |
| 320 | 325 |
| 321 // Test for partial handshake request write. | 326 // Test for partial handshake request write. |
| 322 { | 327 { |
| 323 const int kSplitPoint = 3; // Break handshake write into two parts. | 328 const int kSplitPoint = 3; // Break handshake write into two parts. |
| 324 MockWrite data_writes[] = { | 329 MockWrite data_writes[] = { |
| 325 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 330 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 326 MockWrite(ASYNC, kOkRequest, kSplitPoint), | 331 MockWrite(ASYNC, kOkRequest, kSplitPoint), |
| 327 MockWrite(ASYNC, kOkRequest + kSplitPoint, | 332 MockWrite(ASYNC, kOkRequest + kSplitPoint, |
| 328 arraysize(kOkRequest) - kSplitPoint) | 333 arraysize(kOkRequest) - kSplitPoint) |
| 329 }; | 334 }; |
| 330 MockRead data_reads[] = { | 335 MockRead data_reads[] = { |
| 331 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 336 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 332 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 337 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 333 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 338 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 334 data_writes, arraysize(data_writes), | 339 data_writes, arraysize(data_writes), |
| 335 hostname, 80, &net_log_); | 340 hostname, 80, &net_log_); |
| 336 int rv = user_sock_->Connect(callback_.callback()); | 341 int rv = user_sock_->Connect(callback_.callback()); |
| 337 EXPECT_EQ(ERR_IO_PENDING, rv); | 342 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 338 TestNetLogEntry::List net_log_entries; | 343 TestNetLogEntry::List net_log_entries; |
| 339 net_log_.GetEntries(&net_log_entries); | 344 net_log_.GetEntries(&net_log_entries); |
| 340 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 345 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 341 NetLog::TYPE_SOCKS5_CONNECT)); | 346 NetLog::TYPE_SOCKS5_CONNECT)); |
| 342 rv = callback_.WaitForResult(); | 347 rv = callback_.WaitForResult(); |
| 343 EXPECT_EQ(OK, rv); | 348 EXPECT_THAT(rv, IsOk()); |
| 344 EXPECT_TRUE(user_sock_->IsConnected()); | 349 EXPECT_TRUE(user_sock_->IsConnected()); |
| 345 net_log_.GetEntries(&net_log_entries); | 350 net_log_.GetEntries(&net_log_entries); |
| 346 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 351 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 347 NetLog::TYPE_SOCKS5_CONNECT)); | 352 NetLog::TYPE_SOCKS5_CONNECT)); |
| 348 } | 353 } |
| 349 | 354 |
| 350 // Test for partial handshake response read | 355 // Test for partial handshake response read |
| 351 { | 356 { |
| 352 const int kSplitPoint = 6; // Break the handshake read into two parts. | 357 const int kSplitPoint = 6; // Break the handshake read into two parts. |
| 353 MockWrite data_writes[] = { | 358 MockWrite data_writes[] = { |
| 354 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 359 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 355 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) | 360 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) |
| 356 }; | 361 }; |
| 357 MockRead data_reads[] = { | 362 MockRead data_reads[] = { |
| 358 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 363 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 359 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), | 364 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), |
| 360 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, | 365 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, |
| 361 kSOCKS5OkResponseLength - kSplitPoint) | 366 kSOCKS5OkResponseLength - kSplitPoint) |
| 362 }; | 367 }; |
| 363 | 368 |
| 364 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 369 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 365 data_writes, arraysize(data_writes), | 370 data_writes, arraysize(data_writes), |
| 366 hostname, 80, &net_log_); | 371 hostname, 80, &net_log_); |
| 367 int rv = user_sock_->Connect(callback_.callback()); | 372 int rv = user_sock_->Connect(callback_.callback()); |
| 368 EXPECT_EQ(ERR_IO_PENDING, rv); | 373 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 369 TestNetLogEntry::List net_log_entries; | 374 TestNetLogEntry::List net_log_entries; |
| 370 net_log_.GetEntries(&net_log_entries); | 375 net_log_.GetEntries(&net_log_entries); |
| 371 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 376 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 372 NetLog::TYPE_SOCKS5_CONNECT)); | 377 NetLog::TYPE_SOCKS5_CONNECT)); |
| 373 rv = callback_.WaitForResult(); | 378 rv = callback_.WaitForResult(); |
| 374 EXPECT_EQ(OK, rv); | 379 EXPECT_THAT(rv, IsOk()); |
| 375 EXPECT_TRUE(user_sock_->IsConnected()); | 380 EXPECT_TRUE(user_sock_->IsConnected()); |
| 376 net_log_.GetEntries(&net_log_entries); | 381 net_log_.GetEntries(&net_log_entries); |
| 377 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 382 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 378 NetLog::TYPE_SOCKS5_CONNECT)); | 383 NetLog::TYPE_SOCKS5_CONNECT)); |
| 379 } | 384 } |
| 380 } | 385 } |
| 381 | 386 |
| 382 } // namespace | 387 } // namespace |
| 383 | 388 |
| 384 } // namespace net | 389 } // namespace net |
| OLD | NEW |