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 |