| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/net_log.h" | 8 #include "net/base/net_log.h" |
| 9 #include "net/base/net_log_unittest.h" | 9 #include "net/base/net_log_unittest.h" |
| 10 #include "net/base/mock_host_resolver.h" | 10 #include "net/base/mock_host_resolver.h" |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 | 120 |
| 121 DISALLOW_COPY_AND_ASSIGN(HangingHostResolverWithCancel); | 121 DISALLOW_COPY_AND_ASSIGN(HangingHostResolverWithCancel); |
| 122 }; | 122 }; |
| 123 | 123 |
| 124 // Tests a complete handshake and the disconnection. | 124 // Tests a complete handshake and the disconnection. |
| 125 TEST_F(SOCKSClientSocketTest, CompleteHandshake) { | 125 TEST_F(SOCKSClientSocketTest, CompleteHandshake) { |
| 126 const std::string payload_write = "random data"; | 126 const std::string payload_write = "random data"; |
| 127 const std::string payload_read = "moar random data"; | 127 const std::string payload_read = "moar random data"; |
| 128 | 128 |
| 129 MockWrite data_writes[] = { | 129 MockWrite data_writes[] = { |
| 130 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), | 130 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), |
| 131 MockWrite(true, payload_write.data(), payload_write.size()) }; | 131 MockWrite(ASYNC, payload_write.data(), payload_write.size()) }; |
| 132 MockRead data_reads[] = { | 132 MockRead data_reads[] = { |
| 133 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), | 133 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)), |
| 134 MockRead(true, payload_read.data(), payload_read.size()) }; | 134 MockRead(ASYNC, payload_read.data(), payload_read.size()) }; |
| 135 CapturingNetLog log(CapturingNetLog::kUnbounded); | 135 CapturingNetLog log(CapturingNetLog::kUnbounded); |
| 136 | 136 |
| 137 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 137 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 138 data_writes, arraysize(data_writes), | 138 data_writes, arraysize(data_writes), |
| 139 host_resolver_.get(), | 139 host_resolver_.get(), |
| 140 "localhost", 80, | 140 "localhost", 80, |
| 141 &log)); | 141 &log)); |
| 142 | 142 |
| 143 // At this state the TCP connection is completed but not the SOCKS handshake. | 143 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 144 EXPECT_TRUE(tcp_sock_->IsConnected()); | 144 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 { | 195 { |
| 196 { 0x00, 0x5B, 0x00, 0x00, 0, 0, 0, 0 }, | 196 { 0x00, 0x5B, 0x00, 0x00, 0, 0, 0, 0 }, |
| 197 ERR_SOCKS_CONNECTION_FAILED, | 197 ERR_SOCKS_CONNECTION_FAILED, |
| 198 }, | 198 }, |
| 199 }; | 199 }; |
| 200 | 200 |
| 201 //--------------------------------------- | 201 //--------------------------------------- |
| 202 | 202 |
| 203 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 203 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
| 204 MockWrite data_writes[] = { | 204 MockWrite data_writes[] = { |
| 205 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 205 MockWrite(SYNCHRONOUS, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
| 206 MockRead data_reads[] = { | 206 MockRead data_reads[] = { |
| 207 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; | 207 MockRead(SYNCHRONOUS, tests[i].fail_reply, |
| 208 arraysize(tests[i].fail_reply)) }; |
| 208 CapturingNetLog log(CapturingNetLog::kUnbounded); | 209 CapturingNetLog log(CapturingNetLog::kUnbounded); |
| 209 | 210 |
| 210 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 211 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 211 data_writes, arraysize(data_writes), | 212 data_writes, arraysize(data_writes), |
| 212 host_resolver_.get(), | 213 host_resolver_.get(), |
| 213 "localhost", 80, | 214 "localhost", 80, |
| 214 &log)); | 215 &log)); |
| 215 | 216 |
| 216 int rv = user_sock_->Connect(callback_.callback()); | 217 int rv = user_sock_->Connect(callback_.callback()); |
| 217 EXPECT_EQ(ERR_IO_PENDING, rv); | 218 EXPECT_EQ(ERR_IO_PENDING, rv); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 231 } | 232 } |
| 232 } | 233 } |
| 233 | 234 |
| 234 // Tests scenario when the server sends the handshake response in | 235 // Tests scenario when the server sends the handshake response in |
| 235 // more than one packet. | 236 // more than one packet. |
| 236 TEST_F(SOCKSClientSocketTest, PartialServerReads) { | 237 TEST_F(SOCKSClientSocketTest, PartialServerReads) { |
| 237 const char kSOCKSPartialReply1[] = { 0x00 }; | 238 const char kSOCKSPartialReply1[] = { 0x00 }; |
| 238 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 239 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
| 239 | 240 |
| 240 MockWrite data_writes[] = { | 241 MockWrite data_writes[] = { |
| 241 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 242 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
| 242 MockRead data_reads[] = { | 243 MockRead data_reads[] = { |
| 243 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), | 244 MockRead(ASYNC, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), |
| 244 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; | 245 MockRead(ASYNC, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; |
| 245 CapturingNetLog log(CapturingNetLog::kUnbounded); | 246 CapturingNetLog log(CapturingNetLog::kUnbounded); |
| 246 | 247 |
| 247 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 248 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 248 data_writes, arraysize(data_writes), | 249 data_writes, arraysize(data_writes), |
| 249 host_resolver_.get(), | 250 host_resolver_.get(), |
| 250 "localhost", 80, | 251 "localhost", 80, |
| 251 &log)); | 252 &log)); |
| 252 | 253 |
| 253 int rv = user_sock_->Connect(callback_.callback()); | 254 int rv = user_sock_->Connect(callback_.callback()); |
| 254 EXPECT_EQ(ERR_IO_PENDING, rv); | 255 EXPECT_EQ(ERR_IO_PENDING, rv); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 265 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 266 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 266 } | 267 } |
| 267 | 268 |
| 268 // Tests scenario when the client sends the handshake request in | 269 // Tests scenario when the client sends the handshake request in |
| 269 // more than one packet. | 270 // more than one packet. |
| 270 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { | 271 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { |
| 271 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; | 272 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; |
| 272 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; | 273 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; |
| 273 | 274 |
| 274 MockWrite data_writes[] = { | 275 MockWrite data_writes[] = { |
| 275 MockWrite(true, arraysize(kSOCKSPartialRequest1)), | 276 MockWrite(ASYNC, arraysize(kSOCKSPartialRequest1)), |
| 276 // simulate some empty writes | 277 // simulate some empty writes |
| 277 MockWrite(true, 0), | 278 MockWrite(ASYNC, 0), |
| 278 MockWrite(true, 0), | 279 MockWrite(ASYNC, 0), |
| 279 MockWrite(true, kSOCKSPartialRequest2, | 280 MockWrite(ASYNC, kSOCKSPartialRequest2, |
| 280 arraysize(kSOCKSPartialRequest2)) }; | 281 arraysize(kSOCKSPartialRequest2)) }; |
| 281 MockRead data_reads[] = { | 282 MockRead data_reads[] = { |
| 282 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 283 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
| 283 CapturingNetLog log(CapturingNetLog::kUnbounded); | 284 CapturingNetLog log(CapturingNetLog::kUnbounded); |
| 284 | 285 |
| 285 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 286 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 286 data_writes, arraysize(data_writes), | 287 data_writes, arraysize(data_writes), |
| 287 host_resolver_.get(), | 288 host_resolver_.get(), |
| 288 "localhost", 80, | 289 "localhost", 80, |
| 289 &log)); | 290 &log)); |
| 290 | 291 |
| 291 int rv = user_sock_->Connect(callback_.callback()); | 292 int rv = user_sock_->Connect(callback_.callback()); |
| 292 EXPECT_EQ(ERR_IO_PENDING, rv); | 293 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 293 net::CapturingNetLog::EntryList entries; | 294 net::CapturingNetLog::EntryList entries; |
| 294 log.GetEntries(&entries); | 295 log.GetEntries(&entries); |
| 295 EXPECT_TRUE(LogContainsBeginEvent( | 296 EXPECT_TRUE(LogContainsBeginEvent( |
| 296 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 297 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 297 | 298 |
| 298 rv = callback_.WaitForResult(); | 299 rv = callback_.WaitForResult(); |
| 299 EXPECT_EQ(OK, rv); | 300 EXPECT_EQ(OK, rv); |
| 300 EXPECT_TRUE(user_sock_->IsConnected()); | 301 EXPECT_TRUE(user_sock_->IsConnected()); |
| 301 log.GetEntries(&entries); | 302 log.GetEntries(&entries); |
| 302 EXPECT_TRUE(LogContainsEndEvent( | 303 EXPECT_TRUE(LogContainsEndEvent( |
| 303 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 304 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 304 } | 305 } |
| 305 | 306 |
| 306 // Tests the case when the server sends a smaller sized handshake data | 307 // Tests the case when the server sends a smaller sized handshake data |
| 307 // and closes the connection. | 308 // and closes the connection. |
| 308 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { | 309 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { |
| 309 MockWrite data_writes[] = { | 310 MockWrite data_writes[] = { |
| 310 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 311 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
| 311 MockRead data_reads[] = { | 312 MockRead data_reads[] = { |
| 312 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), | 313 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), |
| 313 // close connection unexpectedly | 314 // close connection unexpectedly |
| 314 MockRead(false, 0) }; | 315 MockRead(SYNCHRONOUS, 0) }; |
| 315 CapturingNetLog log(CapturingNetLog::kUnbounded); | 316 CapturingNetLog log(CapturingNetLog::kUnbounded); |
| 316 | 317 |
| 317 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 318 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 318 data_writes, arraysize(data_writes), | 319 data_writes, arraysize(data_writes), |
| 319 host_resolver_.get(), | 320 host_resolver_.get(), |
| 320 "localhost", 80, | 321 "localhost", 80, |
| 321 &log)); | 322 &log)); |
| 322 | 323 |
| 323 int rv = user_sock_->Connect(callback_.callback()); | 324 int rv = user_sock_->Connect(callback_.callback()); |
| 324 EXPECT_EQ(ERR_IO_PENDING, rv); | 325 EXPECT_EQ(ERR_IO_PENDING, rv); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 366 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 366 } | 367 } |
| 367 | 368 |
| 368 // Calls Disconnect() while a host resolve is in progress. The outstanding host | 369 // Calls Disconnect() while a host resolve is in progress. The outstanding host |
| 369 // resolve should be cancelled. | 370 // resolve should be cancelled. |
| 370 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { | 371 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { |
| 371 scoped_ptr<HangingHostResolverWithCancel> hanging_resolver( | 372 scoped_ptr<HangingHostResolverWithCancel> hanging_resolver( |
| 372 new HangingHostResolverWithCancel()); | 373 new HangingHostResolverWithCancel()); |
| 373 | 374 |
| 374 // Doesn't matter what the socket data is, we will never use it -- garbage. | 375 // Doesn't matter what the socket data is, we will never use it -- garbage. |
| 375 MockWrite data_writes[] = { MockWrite(false, "", 0) }; | 376 MockWrite data_writes[] = { MockWrite(SYNCHRONOUS, "", 0) }; |
| 376 MockRead data_reads[] = { MockRead(false, "", 0) }; | 377 MockRead data_reads[] = { MockRead(SYNCHRONOUS, "", 0) }; |
| 377 | 378 |
| 378 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 379 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 379 data_writes, arraysize(data_writes), | 380 data_writes, arraysize(data_writes), |
| 380 hanging_resolver.get(), | 381 hanging_resolver.get(), |
| 381 "foo", 80, | 382 "foo", 80, |
| 382 NULL)); | 383 NULL)); |
| 383 | 384 |
| 384 // Start connecting (will get stuck waiting for the host to resolve). | 385 // Start connecting (will get stuck waiting for the host to resolve). |
| 385 int rv = user_sock_->Connect(callback_.callback()); | 386 int rv = user_sock_->Connect(callback_.callback()); |
| 386 EXPECT_EQ(ERR_IO_PENDING, rv); | 387 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 387 | 388 |
| 388 EXPECT_FALSE(user_sock_->IsConnected()); | 389 EXPECT_FALSE(user_sock_->IsConnected()); |
| 389 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); | 390 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); |
| 390 | 391 |
| 391 // The host resolver should have received the resolve request. | 392 // The host resolver should have received the resolve request. |
| 392 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest()); | 393 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest()); |
| 393 | 394 |
| 394 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. | 395 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. |
| 395 user_sock_->Disconnect(); | 396 user_sock_->Disconnect(); |
| 396 | 397 |
| 397 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); | 398 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); |
| 398 | 399 |
| 399 EXPECT_FALSE(user_sock_->IsConnected()); | 400 EXPECT_FALSE(user_sock_->IsConnected()); |
| 400 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); | 401 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); |
| 401 } | 402 } |
| 402 | 403 |
| 403 } // namespace net | 404 } // namespace net |
| OLD | NEW |