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 |