| 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/net_log_event_type.h" |
| 19 #include "net/log/test_net_log.h" | 20 #include "net/log/test_net_log.h" |
| 20 #include "net/log/test_net_log_entry.h" | 21 #include "net/log/test_net_log_entry.h" |
| 21 #include "net/log/test_net_log_util.h" | 22 #include "net/log/test_net_log_util.h" |
| 22 #include "net/socket/client_socket_factory.h" | 23 #include "net/socket/client_socket_factory.h" |
| 23 #include "net/socket/socket_test_util.h" | 24 #include "net/socket/socket_test_util.h" |
| 24 #include "net/socket/tcp_client_socket.h" | 25 #include "net/socket/tcp_client_socket.h" |
| 25 #include "net/test/gtest_util.h" | 26 #include "net/test/gtest_util.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "testing/platform_test.h" | 29 #include "testing/platform_test.h" |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 EXPECT_TRUE(tcp_sock_->IsConnected()); | 151 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 151 EXPECT_FALSE(user_sock_->IsConnected()); | 152 EXPECT_FALSE(user_sock_->IsConnected()); |
| 152 | 153 |
| 153 int rv = user_sock_->Connect(callback_.callback()); | 154 int rv = user_sock_->Connect(callback_.callback()); |
| 154 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 155 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 155 EXPECT_FALSE(user_sock_->IsConnected()); | 156 EXPECT_FALSE(user_sock_->IsConnected()); |
| 156 | 157 |
| 157 TestNetLogEntry::List net_log_entries; | 158 TestNetLogEntry::List net_log_entries; |
| 158 net_log_.GetEntries(&net_log_entries); | 159 net_log_.GetEntries(&net_log_entries); |
| 159 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 160 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 160 NetLog::TYPE_SOCKS5_CONNECT)); | 161 NetLogEventType::SOCKS5_CONNECT)); |
| 161 | 162 |
| 162 rv = callback_.WaitForResult(); | 163 rv = callback_.WaitForResult(); |
| 163 | 164 |
| 164 EXPECT_THAT(rv, IsOk()); | 165 EXPECT_THAT(rv, IsOk()); |
| 165 EXPECT_TRUE(user_sock_->IsConnected()); | 166 EXPECT_TRUE(user_sock_->IsConnected()); |
| 166 | 167 |
| 167 net_log_.GetEntries(&net_log_entries); | 168 net_log_.GetEntries(&net_log_entries); |
| 168 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 169 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 169 NetLog::TYPE_SOCKS5_CONNECT)); | 170 NetLogEventType::SOCKS5_CONNECT)); |
| 170 | 171 |
| 171 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); | 172 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); |
| 172 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 173 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
| 173 rv = user_sock_->Write( | 174 rv = user_sock_->Write( |
| 174 buffer.get(), payload_write.size(), callback_.callback()); | 175 buffer.get(), payload_write.size(), callback_.callback()); |
| 175 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 176 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 176 rv = callback_.WaitForResult(); | 177 rv = callback_.WaitForResult(); |
| 177 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 178 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
| 178 | 179 |
| 179 buffer = new IOBuffer(payload_read.size()); | 180 buffer = new IOBuffer(payload_read.size()); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 275 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 275 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 276 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 276 data_writes, arraysize(data_writes), | 277 data_writes, arraysize(data_writes), |
| 277 hostname, 80, &net_log_); | 278 hostname, 80, &net_log_); |
| 278 int rv = user_sock_->Connect(callback_.callback()); | 279 int rv = user_sock_->Connect(callback_.callback()); |
| 279 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 280 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 280 | 281 |
| 281 TestNetLogEntry::List net_log_entries; | 282 TestNetLogEntry::List net_log_entries; |
| 282 net_log_.GetEntries(&net_log_entries); | 283 net_log_.GetEntries(&net_log_entries); |
| 283 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 284 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 284 NetLog::TYPE_SOCKS5_CONNECT)); | 285 NetLogEventType::SOCKS5_CONNECT)); |
| 285 | 286 |
| 286 rv = callback_.WaitForResult(); | 287 rv = callback_.WaitForResult(); |
| 287 EXPECT_THAT(rv, IsOk()); | 288 EXPECT_THAT(rv, IsOk()); |
| 288 EXPECT_TRUE(user_sock_->IsConnected()); | 289 EXPECT_TRUE(user_sock_->IsConnected()); |
| 289 | 290 |
| 290 net_log_.GetEntries(&net_log_entries); | 291 net_log_.GetEntries(&net_log_entries); |
| 291 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 292 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 292 NetLog::TYPE_SOCKS5_CONNECT)); | 293 NetLogEventType::SOCKS5_CONNECT)); |
| 293 } | 294 } |
| 294 | 295 |
| 295 // Test for partial greet response read | 296 // Test for partial greet response read |
| 296 { | 297 { |
| 297 const char partial1[] = { 0x05 }; | 298 const char partial1[] = { 0x05 }; |
| 298 const char partial2[] = { 0x00 }; | 299 const char partial2[] = { 0x00 }; |
| 299 MockWrite data_writes[] = { | 300 MockWrite data_writes[] = { |
| 300 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 301 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 301 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 302 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; |
| 302 MockRead data_reads[] = { | 303 MockRead data_reads[] = { |
| 303 MockRead(ASYNC, partial1, arraysize(partial1)), | 304 MockRead(ASYNC, partial1, arraysize(partial1)), |
| 304 MockRead(ASYNC, partial2, arraysize(partial2)), | 305 MockRead(ASYNC, partial2, arraysize(partial2)), |
| 305 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 306 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 306 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 307 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 307 data_writes, arraysize(data_writes), | 308 data_writes, arraysize(data_writes), |
| 308 hostname, 80, &net_log_); | 309 hostname, 80, &net_log_); |
| 309 int rv = user_sock_->Connect(callback_.callback()); | 310 int rv = user_sock_->Connect(callback_.callback()); |
| 310 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 311 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 311 | 312 |
| 312 TestNetLogEntry::List net_log_entries; | 313 TestNetLogEntry::List net_log_entries; |
| 313 net_log_.GetEntries(&net_log_entries); | 314 net_log_.GetEntries(&net_log_entries); |
| 314 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 315 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 315 NetLog::TYPE_SOCKS5_CONNECT)); | 316 NetLogEventType::SOCKS5_CONNECT)); |
| 316 rv = callback_.WaitForResult(); | 317 rv = callback_.WaitForResult(); |
| 317 EXPECT_THAT(rv, IsOk()); | 318 EXPECT_THAT(rv, IsOk()); |
| 318 EXPECT_TRUE(user_sock_->IsConnected()); | 319 EXPECT_TRUE(user_sock_->IsConnected()); |
| 319 net_log_.GetEntries(&net_log_entries); | 320 net_log_.GetEntries(&net_log_entries); |
| 320 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 321 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 321 NetLog::TYPE_SOCKS5_CONNECT)); | 322 NetLogEventType::SOCKS5_CONNECT)); |
| 322 } | 323 } |
| 323 | 324 |
| 324 // Test for partial handshake request write. | 325 // Test for partial handshake request write. |
| 325 { | 326 { |
| 326 const int kSplitPoint = 3; // Break handshake write into two parts. | 327 const int kSplitPoint = 3; // Break handshake write into two parts. |
| 327 MockWrite data_writes[] = { | 328 MockWrite data_writes[] = { |
| 328 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 329 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 329 MockWrite(ASYNC, kOkRequest, kSplitPoint), | 330 MockWrite(ASYNC, kOkRequest, kSplitPoint), |
| 330 MockWrite(ASYNC, kOkRequest + kSplitPoint, | 331 MockWrite(ASYNC, kOkRequest + kSplitPoint, |
| 331 arraysize(kOkRequest) - kSplitPoint) | 332 arraysize(kOkRequest) - kSplitPoint) |
| 332 }; | 333 }; |
| 333 MockRead data_reads[] = { | 334 MockRead data_reads[] = { |
| 334 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 335 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 335 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 336 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 336 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 337 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 337 data_writes, arraysize(data_writes), | 338 data_writes, arraysize(data_writes), |
| 338 hostname, 80, &net_log_); | 339 hostname, 80, &net_log_); |
| 339 int rv = user_sock_->Connect(callback_.callback()); | 340 int rv = user_sock_->Connect(callback_.callback()); |
| 340 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 341 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 341 TestNetLogEntry::List net_log_entries; | 342 TestNetLogEntry::List net_log_entries; |
| 342 net_log_.GetEntries(&net_log_entries); | 343 net_log_.GetEntries(&net_log_entries); |
| 343 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 344 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 344 NetLog::TYPE_SOCKS5_CONNECT)); | 345 NetLogEventType::SOCKS5_CONNECT)); |
| 345 rv = callback_.WaitForResult(); | 346 rv = callback_.WaitForResult(); |
| 346 EXPECT_THAT(rv, IsOk()); | 347 EXPECT_THAT(rv, IsOk()); |
| 347 EXPECT_TRUE(user_sock_->IsConnected()); | 348 EXPECT_TRUE(user_sock_->IsConnected()); |
| 348 net_log_.GetEntries(&net_log_entries); | 349 net_log_.GetEntries(&net_log_entries); |
| 349 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 350 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 350 NetLog::TYPE_SOCKS5_CONNECT)); | 351 NetLogEventType::SOCKS5_CONNECT)); |
| 351 } | 352 } |
| 352 | 353 |
| 353 // Test for partial handshake response read | 354 // Test for partial handshake response read |
| 354 { | 355 { |
| 355 const int kSplitPoint = 6; // Break the handshake read into two parts. | 356 const int kSplitPoint = 6; // Break the handshake read into two parts. |
| 356 MockWrite data_writes[] = { | 357 MockWrite data_writes[] = { |
| 357 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 358 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 358 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) | 359 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) |
| 359 }; | 360 }; |
| 360 MockRead data_reads[] = { | 361 MockRead data_reads[] = { |
| 361 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 362 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 362 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), | 363 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), |
| 363 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, | 364 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, |
| 364 kSOCKS5OkResponseLength - kSplitPoint) | 365 kSOCKS5OkResponseLength - kSplitPoint) |
| 365 }; | 366 }; |
| 366 | 367 |
| 367 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 368 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
| 368 data_writes, arraysize(data_writes), | 369 data_writes, arraysize(data_writes), |
| 369 hostname, 80, &net_log_); | 370 hostname, 80, &net_log_); |
| 370 int rv = user_sock_->Connect(callback_.callback()); | 371 int rv = user_sock_->Connect(callback_.callback()); |
| 371 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 372 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 372 TestNetLogEntry::List net_log_entries; | 373 TestNetLogEntry::List net_log_entries; |
| 373 net_log_.GetEntries(&net_log_entries); | 374 net_log_.GetEntries(&net_log_entries); |
| 374 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 375 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 375 NetLog::TYPE_SOCKS5_CONNECT)); | 376 NetLogEventType::SOCKS5_CONNECT)); |
| 376 rv = callback_.WaitForResult(); | 377 rv = callback_.WaitForResult(); |
| 377 EXPECT_THAT(rv, IsOk()); | 378 EXPECT_THAT(rv, IsOk()); |
| 378 EXPECT_TRUE(user_sock_->IsConnected()); | 379 EXPECT_TRUE(user_sock_->IsConnected()); |
| 379 net_log_.GetEntries(&net_log_entries); | 380 net_log_.GetEntries(&net_log_entries); |
| 380 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 381 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 381 NetLog::TYPE_SOCKS5_CONNECT)); | 382 NetLogEventType::SOCKS5_CONNECT)); |
| 382 } | 383 } |
| 383 } | 384 } |
| 384 | 385 |
| 385 } // namespace | 386 } // namespace |
| 386 | 387 |
| 387 } // namespace net | 388 } // namespace net |
| OLD | NEW |