| 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/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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), | 130 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), |
| 131 MockWrite(ASYNC, 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(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)), | 133 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)), |
| 134 MockRead(ASYNC, payload_read.data(), payload_read.size()) }; | 134 MockRead(ASYNC, payload_read.data(), payload_read.size()) }; |
| 135 CapturingNetLog log(CapturingNetLog::kUnbounded); | 135 CapturingNetLog log; |
| 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()); |
| 145 EXPECT_FALSE(user_sock_->IsConnected()); | 145 EXPECT_FALSE(user_sock_->IsConnected()); |
| 146 | 146 |
| 147 int rv = user_sock_->Connect(callback_.callback()); | 147 int rv = user_sock_->Connect(callback_.callback()); |
| 148 EXPECT_EQ(ERR_IO_PENDING, rv); | 148 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 149 | 149 |
| 150 net::CapturingNetLog::CapturedEntryList entries; | 150 CapturingNetLog::CapturedEntryList entries; |
| 151 log.GetEntries(&entries); | 151 log.GetEntries(&entries); |
| 152 EXPECT_TRUE( | 152 EXPECT_TRUE( |
| 153 LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 153 LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 154 EXPECT_FALSE(user_sock_->IsConnected()); | 154 EXPECT_FALSE(user_sock_->IsConnected()); |
| 155 | 155 |
| 156 rv = callback_.WaitForResult(); | 156 rv = callback_.WaitForResult(); |
| 157 EXPECT_EQ(OK, rv); | 157 EXPECT_EQ(OK, rv); |
| 158 EXPECT_TRUE(user_sock_->IsConnected()); | 158 EXPECT_TRUE(user_sock_->IsConnected()); |
| 159 log.GetEntries(&entries); | 159 log.GetEntries(&entries); |
| 160 EXPECT_TRUE(LogContainsEndEvent( | 160 EXPECT_TRUE(LogContainsEndEvent( |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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(SYNCHRONOUS, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 205 MockWrite(SYNCHRONOUS, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
| 206 MockRead data_reads[] = { | 206 MockRead data_reads[] = { |
| 207 MockRead(SYNCHRONOUS, tests[i].fail_reply, | 207 MockRead(SYNCHRONOUS, tests[i].fail_reply, |
| 208 arraysize(tests[i].fail_reply)) }; | 208 arraysize(tests[i].fail_reply)) }; |
| 209 CapturingNetLog log(CapturingNetLog::kUnbounded); | 209 CapturingNetLog log; |
| 210 | 210 |
| 211 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 211 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 212 data_writes, arraysize(data_writes), | 212 data_writes, arraysize(data_writes), |
| 213 host_resolver_.get(), | 213 host_resolver_.get(), |
| 214 "localhost", 80, | 214 "localhost", 80, |
| 215 &log)); | 215 &log)); |
| 216 | 216 |
| 217 int rv = user_sock_->Connect(callback_.callback()); | 217 int rv = user_sock_->Connect(callback_.callback()); |
| 218 EXPECT_EQ(ERR_IO_PENDING, rv); | 218 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 219 | 219 |
| 220 net::CapturingNetLog::CapturedEntryList entries; | 220 CapturingNetLog::CapturedEntryList entries; |
| 221 log.GetEntries(&entries); | 221 log.GetEntries(&entries); |
| 222 EXPECT_TRUE(LogContainsBeginEvent( | 222 EXPECT_TRUE(LogContainsBeginEvent( |
| 223 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 223 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 224 | 224 |
| 225 rv = callback_.WaitForResult(); | 225 rv = callback_.WaitForResult(); |
| 226 EXPECT_EQ(tests[i].fail_code, rv); | 226 EXPECT_EQ(tests[i].fail_code, rv); |
| 227 EXPECT_FALSE(user_sock_->IsConnected()); | 227 EXPECT_FALSE(user_sock_->IsConnected()); |
| 228 EXPECT_TRUE(tcp_sock_->IsConnected()); | 228 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 229 log.GetEntries(&entries); | 229 log.GetEntries(&entries); |
| 230 EXPECT_TRUE(LogContainsEndEvent( | 230 EXPECT_TRUE(LogContainsEndEvent( |
| 231 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 231 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 232 } | 232 } |
| 233 } | 233 } |
| 234 | 234 |
| 235 // Tests scenario when the server sends the handshake response in | 235 // Tests scenario when the server sends the handshake response in |
| 236 // more than one packet. | 236 // more than one packet. |
| 237 TEST_F(SOCKSClientSocketTest, PartialServerReads) { | 237 TEST_F(SOCKSClientSocketTest, PartialServerReads) { |
| 238 const char kSOCKSPartialReply1[] = { 0x00 }; | 238 const char kSOCKSPartialReply1[] = { 0x00 }; |
| 239 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 239 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
| 240 | 240 |
| 241 MockWrite data_writes[] = { | 241 MockWrite data_writes[] = { |
| 242 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 242 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
| 243 MockRead data_reads[] = { | 243 MockRead data_reads[] = { |
| 244 MockRead(ASYNC, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), | 244 MockRead(ASYNC, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), |
| 245 MockRead(ASYNC, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; | 245 MockRead(ASYNC, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; |
| 246 CapturingNetLog log(CapturingNetLog::kUnbounded); | 246 CapturingNetLog log; |
| 247 | 247 |
| 248 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 248 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 249 data_writes, arraysize(data_writes), | 249 data_writes, arraysize(data_writes), |
| 250 host_resolver_.get(), | 250 host_resolver_.get(), |
| 251 "localhost", 80, | 251 "localhost", 80, |
| 252 &log)); | 252 &log)); |
| 253 | 253 |
| 254 int rv = user_sock_->Connect(callback_.callback()); | 254 int rv = user_sock_->Connect(callback_.callback()); |
| 255 EXPECT_EQ(ERR_IO_PENDING, rv); | 255 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 256 net::CapturingNetLog::CapturedEntryList entries; | 256 CapturingNetLog::CapturedEntryList entries; |
| 257 log.GetEntries(&entries); | 257 log.GetEntries(&entries); |
| 258 EXPECT_TRUE(LogContainsBeginEvent( | 258 EXPECT_TRUE(LogContainsBeginEvent( |
| 259 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 259 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 260 | 260 |
| 261 rv = callback_.WaitForResult(); | 261 rv = callback_.WaitForResult(); |
| 262 EXPECT_EQ(OK, rv); | 262 EXPECT_EQ(OK, rv); |
| 263 EXPECT_TRUE(user_sock_->IsConnected()); | 263 EXPECT_TRUE(user_sock_->IsConnected()); |
| 264 log.GetEntries(&entries); | 264 log.GetEntries(&entries); |
| 265 EXPECT_TRUE(LogContainsEndEvent( | 265 EXPECT_TRUE(LogContainsEndEvent( |
| 266 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 266 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 267 } | 267 } |
| 268 | 268 |
| 269 // Tests scenario when the client sends the handshake request in | 269 // Tests scenario when the client sends the handshake request in |
| 270 // more than one packet. | 270 // more than one packet. |
| 271 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { | 271 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { |
| 272 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; | 272 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; |
| 273 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; | 273 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; |
| 274 | 274 |
| 275 MockWrite data_writes[] = { | 275 MockWrite data_writes[] = { |
| 276 MockWrite(ASYNC, arraysize(kSOCKSPartialRequest1)), | 276 MockWrite(ASYNC, arraysize(kSOCKSPartialRequest1)), |
| 277 // simulate some empty writes | 277 // simulate some empty writes |
| 278 MockWrite(ASYNC, 0), | 278 MockWrite(ASYNC, 0), |
| 279 MockWrite(ASYNC, 0), | 279 MockWrite(ASYNC, 0), |
| 280 MockWrite(ASYNC, kSOCKSPartialRequest2, | 280 MockWrite(ASYNC, kSOCKSPartialRequest2, |
| 281 arraysize(kSOCKSPartialRequest2)) }; | 281 arraysize(kSOCKSPartialRequest2)) }; |
| 282 MockRead data_reads[] = { | 282 MockRead data_reads[] = { |
| 283 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 283 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
| 284 CapturingNetLog log(CapturingNetLog::kUnbounded); | 284 CapturingNetLog log; |
| 285 | 285 |
| 286 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 286 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 287 data_writes, arraysize(data_writes), | 287 data_writes, arraysize(data_writes), |
| 288 host_resolver_.get(), | 288 host_resolver_.get(), |
| 289 "localhost", 80, | 289 "localhost", 80, |
| 290 &log)); | 290 &log)); |
| 291 | 291 |
| 292 int rv = user_sock_->Connect(callback_.callback()); | 292 int rv = user_sock_->Connect(callback_.callback()); |
| 293 EXPECT_EQ(ERR_IO_PENDING, rv); | 293 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 294 net::CapturingNetLog::CapturedEntryList entries; | 294 CapturingNetLog::CapturedEntryList entries; |
| 295 log.GetEntries(&entries); | 295 log.GetEntries(&entries); |
| 296 EXPECT_TRUE(LogContainsBeginEvent( | 296 EXPECT_TRUE(LogContainsBeginEvent( |
| 297 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 297 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 298 | 298 |
| 299 rv = callback_.WaitForResult(); | 299 rv = callback_.WaitForResult(); |
| 300 EXPECT_EQ(OK, rv); | 300 EXPECT_EQ(OK, rv); |
| 301 EXPECT_TRUE(user_sock_->IsConnected()); | 301 EXPECT_TRUE(user_sock_->IsConnected()); |
| 302 log.GetEntries(&entries); | 302 log.GetEntries(&entries); |
| 303 EXPECT_TRUE(LogContainsEndEvent( | 303 EXPECT_TRUE(LogContainsEndEvent( |
| 304 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 304 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 305 } | 305 } |
| 306 | 306 |
| 307 // 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 |
| 308 // and closes the connection. | 308 // and closes the connection. |
| 309 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { | 309 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { |
| 310 MockWrite data_writes[] = { | 310 MockWrite data_writes[] = { |
| 311 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 311 MockWrite(ASYNC, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
| 312 MockRead data_reads[] = { | 312 MockRead data_reads[] = { |
| 313 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), | 313 MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), |
| 314 // close connection unexpectedly | 314 // close connection unexpectedly |
| 315 MockRead(SYNCHRONOUS, 0) }; | 315 MockRead(SYNCHRONOUS, 0) }; |
| 316 CapturingNetLog log(CapturingNetLog::kUnbounded); | 316 CapturingNetLog log; |
| 317 | 317 |
| 318 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 318 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 319 data_writes, arraysize(data_writes), | 319 data_writes, arraysize(data_writes), |
| 320 host_resolver_.get(), | 320 host_resolver_.get(), |
| 321 "localhost", 80, | 321 "localhost", 80, |
| 322 &log)); | 322 &log)); |
| 323 | 323 |
| 324 int rv = user_sock_->Connect(callback_.callback()); | 324 int rv = user_sock_->Connect(callback_.callback()); |
| 325 EXPECT_EQ(ERR_IO_PENDING, rv); | 325 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 326 net::CapturingNetLog::CapturedEntryList entries; | 326 CapturingNetLog::CapturedEntryList entries; |
| 327 log.GetEntries(&entries); | 327 log.GetEntries(&entries); |
| 328 EXPECT_TRUE(LogContainsBeginEvent( | 328 EXPECT_TRUE(LogContainsBeginEvent( |
| 329 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 329 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 330 | 330 |
| 331 rv = callback_.WaitForResult(); | 331 rv = callback_.WaitForResult(); |
| 332 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); | 332 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); |
| 333 EXPECT_FALSE(user_sock_->IsConnected()); | 333 EXPECT_FALSE(user_sock_->IsConnected()); |
| 334 log.GetEntries(&entries); | 334 log.GetEntries(&entries); |
| 335 EXPECT_TRUE(LogContainsEndEvent( | 335 EXPECT_TRUE(LogContainsEndEvent( |
| 336 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 336 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| 337 } | 337 } |
| 338 | 338 |
| 339 // Tries to connect to an unknown hostname. Should fail rather than | 339 // Tries to connect to an unknown hostname. Should fail rather than |
| 340 // falling back to SOCKS4a. | 340 // falling back to SOCKS4a. |
| 341 TEST_F(SOCKSClientSocketTest, FailedDNS) { | 341 TEST_F(SOCKSClientSocketTest, FailedDNS) { |
| 342 const char hostname[] = "unresolved.ipv4.address"; | 342 const char hostname[] = "unresolved.ipv4.address"; |
| 343 | 343 |
| 344 host_resolver_->rules()->AddSimulatedFailure(hostname); | 344 host_resolver_->rules()->AddSimulatedFailure(hostname); |
| 345 | 345 |
| 346 CapturingNetLog log(CapturingNetLog::kUnbounded); | 346 CapturingNetLog log; |
| 347 | 347 |
| 348 user_sock_.reset(BuildMockSocket(NULL, 0, | 348 user_sock_.reset(BuildMockSocket(NULL, 0, |
| 349 NULL, 0, | 349 NULL, 0, |
| 350 host_resolver_.get(), | 350 host_resolver_.get(), |
| 351 hostname, 80, | 351 hostname, 80, |
| 352 &log)); | 352 &log)); |
| 353 | 353 |
| 354 int rv = user_sock_->Connect(callback_.callback()); | 354 int rv = user_sock_->Connect(callback_.callback()); |
| 355 EXPECT_EQ(ERR_IO_PENDING, rv); | 355 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 356 net::CapturingNetLog::CapturedEntryList entries; | 356 CapturingNetLog::CapturedEntryList entries; |
| 357 log.GetEntries(&entries); | 357 log.GetEntries(&entries); |
| 358 EXPECT_TRUE(LogContainsBeginEvent( | 358 EXPECT_TRUE(LogContainsBeginEvent( |
| 359 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); | 359 entries, 0, NetLog::TYPE_SOCKS_CONNECT)); |
| 360 | 360 |
| 361 rv = callback_.WaitForResult(); | 361 rv = callback_.WaitForResult(); |
| 362 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); | 362 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); |
| 363 EXPECT_FALSE(user_sock_->IsConnected()); | 363 EXPECT_FALSE(user_sock_->IsConnected()); |
| 364 log.GetEntries(&entries); | 364 log.GetEntries(&entries); |
| 365 EXPECT_TRUE(LogContainsEndEvent( | 365 EXPECT_TRUE(LogContainsEndEvent( |
| 366 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); | 366 entries, -1, NetLog::TYPE_SOCKS_CONNECT)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 395 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. | 395 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. |
| 396 user_sock_->Disconnect(); | 396 user_sock_->Disconnect(); |
| 397 | 397 |
| 398 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); | 398 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); |
| 399 | 399 |
| 400 EXPECT_FALSE(user_sock_->IsConnected()); | 400 EXPECT_FALSE(user_sock_->IsConnected()); |
| 401 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); | 401 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); |
| 402 } | 402 } |
| 403 | 403 |
| 404 } // namespace net | 404 } // namespace net |
| OLD | NEW |