Chromium Code Reviews| 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/transport_client_socket_pool.h" | 5 #include "net/socket/transport_client_socket_pool.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/threading/platform_thread.h" | 13 #include "base/threading/platform_thread.h" |
| 14 #include "net/base/ip_endpoint.h" | 14 #include "net/base/ip_endpoint.h" |
| 15 #include "net/base/mock_host_resolver.h" | 15 #include "net/base/mock_host_resolver.h" |
| 16 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
| 17 #include "net/base/net_util.h" | 17 #include "net/base/net_util.h" |
| 18 #include "net/base/sys_addrinfo.h" | |
| 19 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
| 20 #include "net/socket/client_socket_factory.h" | 19 #include "net/socket/client_socket_factory.h" |
| 21 #include "net/socket/client_socket_handle.h" | 20 #include "net/socket/client_socket_handle.h" |
| 22 #include "net/socket/client_socket_pool_histograms.h" | 21 #include "net/socket/client_socket_pool_histograms.h" |
| 23 #include "net/socket/socket_test_util.h" | 22 #include "net/socket/socket_test_util.h" |
| 24 #include "net/socket/ssl_host_info.h" | 23 #include "net/socket/ssl_host_info.h" |
| 25 #include "net/socket/stream_socket.h" | 24 #include "net/socket/stream_socket.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 27 | 26 |
| 28 namespace net { | 27 namespace net { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 } | 65 } |
| 67 virtual bool IsConnectedAndIdle() const { | 66 virtual bool IsConnectedAndIdle() const { |
| 68 return connected_; | 67 return connected_; |
| 69 } | 68 } |
| 70 virtual int GetPeerAddress(AddressList* address) const { | 69 virtual int GetPeerAddress(AddressList* address) const { |
| 71 return ERR_UNEXPECTED; | 70 return ERR_UNEXPECTED; |
| 72 } | 71 } |
| 73 virtual int GetLocalAddress(IPEndPoint* address) const { | 72 virtual int GetLocalAddress(IPEndPoint* address) const { |
| 74 if (!connected_) | 73 if (!connected_) |
| 75 return ERR_SOCKET_NOT_CONNECTED; | 74 return ERR_SOCKET_NOT_CONNECTED; |
| 76 if (addrlist_.head()->ai_family == AF_INET) | 75 if (addrlist_.front().GetFamily() == AF_INET) |
| 77 SetIPv4Address(address); | 76 SetIPv4Address(address); |
| 78 else | 77 else |
| 79 SetIPv6Address(address); | 78 SetIPv6Address(address); |
| 80 return OK; | 79 return OK; |
| 81 } | 80 } |
| 82 virtual const BoundNetLog& NetLog() const { | 81 virtual const BoundNetLog& NetLog() const { |
| 83 return net_log_; | 82 return net_log_; |
| 84 } | 83 } |
| 85 | 84 |
| 86 virtual void SetSubresourceSpeculation() {} | 85 virtual void SetSubresourceSpeculation() {} |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 205 } | 204 } |
| 206 virtual bool IsConnectedAndIdle() const { | 205 virtual bool IsConnectedAndIdle() const { |
| 207 return is_connected_; | 206 return is_connected_; |
| 208 } | 207 } |
| 209 virtual int GetPeerAddress(AddressList* address) const { | 208 virtual int GetPeerAddress(AddressList* address) const { |
| 210 return ERR_UNEXPECTED; | 209 return ERR_UNEXPECTED; |
| 211 } | 210 } |
| 212 virtual int GetLocalAddress(IPEndPoint* address) const { | 211 virtual int GetLocalAddress(IPEndPoint* address) const { |
| 213 if (!is_connected_) | 212 if (!is_connected_) |
| 214 return ERR_SOCKET_NOT_CONNECTED; | 213 return ERR_SOCKET_NOT_CONNECTED; |
| 215 if (addrlist_.head()->ai_family == AF_INET) | 214 if (addrlist_.front().GetFamily() == AF_INET) |
| 216 SetIPv4Address(address); | 215 SetIPv4Address(address); |
| 217 else | 216 else |
| 218 SetIPv6Address(address); | 217 SetIPv6Address(address); |
| 219 return OK; | 218 return OK; |
| 220 } | 219 } |
| 221 virtual const BoundNetLog& NetLog() const { | 220 virtual const BoundNetLog& NetLog() const { |
| 222 return net_log_; | 221 return net_log_; |
| 223 } | 222 } |
| 224 | 223 |
| 225 virtual void SetSubresourceSpeculation() {} | 224 virtual void SetSubresourceSpeculation() {} |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 428 scoped_ptr<ClientSocketPoolHistograms> histograms_; | 427 scoped_ptr<ClientSocketPoolHistograms> histograms_; |
| 429 scoped_ptr<MockHostResolver> host_resolver_; | 428 scoped_ptr<MockHostResolver> host_resolver_; |
| 430 MockClientSocketFactory client_socket_factory_; | 429 MockClientSocketFactory client_socket_factory_; |
| 431 TransportClientSocketPool pool_; | 430 TransportClientSocketPool pool_; |
| 432 ClientSocketPoolTest test_base_; | 431 ClientSocketPoolTest test_base_; |
| 433 }; | 432 }; |
| 434 | 433 |
| 435 TEST(TransportConnectJobTest, MakeAddrListStartWithIPv4) { | 434 TEST(TransportConnectJobTest, MakeAddrListStartWithIPv4) { |
| 436 IPAddressNumber ip_number; | 435 IPAddressNumber ip_number; |
| 437 ASSERT_TRUE(ParseIPLiteralToNumber("192.168.1.1", &ip_number)); | 436 ASSERT_TRUE(ParseIPLiteralToNumber("192.168.1.1", &ip_number)); |
| 438 AddressList addrlist_v4_1 = AddressList::CreateFromIPAddress(ip_number, 80); | 437 IPEndPoint addrlist_v4_1(ip_number, 80); |
| 439 ASSERT_TRUE(ParseIPLiteralToNumber("192.168.1.2", &ip_number)); | 438 ASSERT_TRUE(ParseIPLiteralToNumber("192.168.1.2", &ip_number)); |
| 440 AddressList addrlist_v4_2 = AddressList::CreateFromIPAddress(ip_number, 80); | 439 IPEndPoint addrlist_v4_2(ip_number, 80); |
| 441 ASSERT_TRUE(ParseIPLiteralToNumber("2001:4860:b006::64", &ip_number)); | 440 ASSERT_TRUE(ParseIPLiteralToNumber("2001:4860:b006::64", &ip_number)); |
| 442 AddressList addrlist_v6_1 = AddressList::CreateFromIPAddress(ip_number, 80); | 441 IPEndPoint addrlist_v6_1(ip_number, 80); |
| 443 ASSERT_TRUE(ParseIPLiteralToNumber("2001:4860:b006::66", &ip_number)); | 442 ASSERT_TRUE(ParseIPLiteralToNumber("2001:4860:b006::66", &ip_number)); |
| 444 AddressList addrlist_v6_2 = AddressList::CreateFromIPAddress(ip_number, 80); | 443 IPEndPoint addrlist_v6_2(ip_number, 80); |
| 445 | 444 |
| 446 AddressList addrlist; | 445 AddressList addrlist; |
| 447 const struct addrinfo* ai; | |
| 448 | 446 |
| 449 // Test 1: IPv4 only. Expect no change. | 447 // Test 1: IPv4 only. Expect no change. |
| 450 addrlist = addrlist_v4_1; | 448 addrlist.clear(); |
| 451 addrlist.Append(addrlist_v4_2.head()); | 449 addrlist.push_back(addrlist_v4_1); |
| 452 TransportConnectJob::MakeAddrListStartWithIPv4(&addrlist); | 450 addrlist.push_back(addrlist_v4_2); |
| 453 ai = addrlist.head(); | 451 TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); |
| 454 EXPECT_EQ(AF_INET, ai->ai_family); | 452 ASSERT_EQ(2u, addrlist.size()); |
| 455 ai = ai->ai_next; | 453 EXPECT_EQ(AF_INET, addrlist[0].GetFamily()); |
| 456 EXPECT_EQ(AF_INET, ai->ai_family); | 454 EXPECT_EQ(AF_INET, addrlist[1].GetFamily()); |
| 457 EXPECT_TRUE(ai->ai_next == NULL); | |
| 458 | 455 |
| 459 // Test 2: IPv6 only. Expect no change. | 456 // Test 2: IPv6 only. Expect no change. |
| 460 addrlist = addrlist_v6_1; | 457 addrlist.clear(); |
| 461 addrlist.Append(addrlist_v6_2.head()); | 458 addrlist.push_back(addrlist_v6_1); |
| 462 TransportConnectJob::MakeAddrListStartWithIPv4(&addrlist); | 459 addrlist.push_back(addrlist_v6_2); |
| 463 ai = addrlist.head(); | 460 TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); |
| 464 EXPECT_EQ(AF_INET6, ai->ai_family); | 461 ASSERT_EQ(2u, addrlist.size()); |
| 465 ai = ai->ai_next; | 462 EXPECT_EQ(AF_INET6, addrlist[0].GetFamily()); |
| 466 EXPECT_EQ(AF_INET6, ai->ai_family); | 463 EXPECT_EQ(AF_INET6, addrlist[1].GetFamily()); |
| 467 EXPECT_TRUE(ai->ai_next == NULL); | |
| 468 | 464 |
| 469 // Test 3: IPv4 then IPv6. Expect no change. | 465 // Test 3: IPv4 then IPv6. Expect no change. |
| 470 addrlist = addrlist_v4_1; | 466 addrlist.clear(); |
| 471 addrlist.Append(addrlist_v4_2.head()); | 467 addrlist.push_back(addrlist_v4_1); |
| 472 addrlist.Append(addrlist_v6_1.head()); | 468 addrlist.push_back(addrlist_v4_2); |
| 473 addrlist.Append(addrlist_v6_2.head()); | 469 addrlist.push_back(addrlist_v6_1); |
| 474 TransportConnectJob::MakeAddrListStartWithIPv4(&addrlist); | 470 addrlist.push_back(addrlist_v6_2); |
| 475 ai = addrlist.head(); | 471 TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); |
| 476 EXPECT_EQ(AF_INET, ai->ai_family); | 472 ASSERT_EQ(4u, addrlist.size()); |
| 477 ai = ai->ai_next; | 473 EXPECT_EQ(AF_INET, addrlist[0].GetFamily()); |
| 478 EXPECT_EQ(AF_INET, ai->ai_family); | 474 EXPECT_EQ(AF_INET, addrlist[1].GetFamily()); |
| 479 ai = ai->ai_next; | 475 EXPECT_EQ(AF_INET6, addrlist[2].GetFamily()); |
| 480 EXPECT_EQ(AF_INET6, ai->ai_family); | 476 EXPECT_EQ(AF_INET6, addrlist[3].GetFamily()); |
| 481 ai = ai->ai_next; | |
| 482 EXPECT_EQ(AF_INET6, ai->ai_family); | |
| 483 EXPECT_TRUE(ai->ai_next == NULL); | |
| 484 | 477 |
| 485 // Test 4: IPv6, IPv4, IPv6, IPv4. Expect first IPv6 moved to the end. | 478 // Test 4: IPv6, IPv4, IPv6, IPv4. Expect first IPv6 moved to the end. |
| 486 addrlist = addrlist_v6_1; | 479 addrlist.clear(); |
| 487 addrlist.Append(addrlist_v4_1.head()); | 480 addrlist.push_back(addrlist_v6_1); |
|
eroman
2012/05/04 01:08:41
I very quickly skimmed through this file... will t
| |
| 488 addrlist.Append(addrlist_v6_2.head()); | 481 addrlist.push_back(addrlist_v4_1); |
| 489 addrlist.Append(addrlist_v4_2.head()); | 482 addrlist.push_back(addrlist_v6_2); |
| 490 TransportConnectJob::MakeAddrListStartWithIPv4(&addrlist); | 483 addrlist.push_back(addrlist_v4_2); |
| 491 ai = addrlist.head(); | 484 TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); |
| 492 EXPECT_EQ(AF_INET, ai->ai_family); | 485 ASSERT_EQ(4u, addrlist.size()); |
| 493 ai = ai->ai_next; | 486 EXPECT_EQ(AF_INET, addrlist[0].GetFamily()); |
| 494 EXPECT_EQ(AF_INET6, ai->ai_family); | 487 EXPECT_EQ(AF_INET6, addrlist[1].GetFamily()); |
| 495 ai = ai->ai_next; | 488 EXPECT_EQ(AF_INET, addrlist[2].GetFamily()); |
| 496 EXPECT_EQ(AF_INET, ai->ai_family); | 489 EXPECT_EQ(AF_INET6, addrlist[3].GetFamily()); |
| 497 ai = ai->ai_next; | |
| 498 EXPECT_EQ(AF_INET6, ai->ai_family); | |
| 499 EXPECT_TRUE(ai->ai_next == NULL); | |
| 500 | 490 |
| 501 // Test 5: IPv6, IPv6, IPv4, IPv4. Expect first two IPv6's moved to the end. | 491 // Test 5: IPv6, IPv6, IPv4, IPv4. Expect first two IPv6's moved to the end. |
| 502 addrlist = addrlist_v6_1; | 492 addrlist.clear(); |
| 503 addrlist.Append(addrlist_v6_2.head()); | 493 addrlist.push_back(addrlist_v6_1); |
| 504 addrlist.Append(addrlist_v4_1.head()); | 494 addrlist.push_back(addrlist_v6_2); |
| 505 addrlist.Append(addrlist_v4_2.head()); | 495 addrlist.push_back(addrlist_v4_1); |
| 506 TransportConnectJob::MakeAddrListStartWithIPv4(&addrlist); | 496 addrlist.push_back(addrlist_v4_2); |
| 507 ai = addrlist.head(); | 497 TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); |
| 508 EXPECT_EQ(AF_INET, ai->ai_family); | 498 ASSERT_EQ(4u, addrlist.size()); |
| 509 ai = ai->ai_next; | 499 EXPECT_EQ(AF_INET, addrlist[0].GetFamily()); |
| 510 EXPECT_EQ(AF_INET, ai->ai_family); | 500 EXPECT_EQ(AF_INET, addrlist[1].GetFamily()); |
| 511 ai = ai->ai_next; | 501 EXPECT_EQ(AF_INET6, addrlist[2].GetFamily()); |
| 512 EXPECT_EQ(AF_INET6, ai->ai_family); | 502 EXPECT_EQ(AF_INET6, addrlist[3].GetFamily()); |
| 513 ai = ai->ai_next; | |
| 514 EXPECT_EQ(AF_INET6, ai->ai_family); | |
| 515 EXPECT_TRUE(ai->ai_next == NULL); | |
| 516 } | 503 } |
| 517 | 504 |
| 518 TEST_F(TransportClientSocketPoolTest, Basic) { | 505 TEST_F(TransportClientSocketPoolTest, Basic) { |
| 519 TestCompletionCallback callback; | 506 TestCompletionCallback callback; |
| 520 ClientSocketHandle handle; | 507 ClientSocketHandle handle; |
| 521 int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool_, | 508 int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool_, |
| 522 BoundNetLog()); | 509 BoundNetLog()); |
| 523 EXPECT_EQ(ERR_IO_PENDING, rv); | 510 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 524 EXPECT_FALSE(handle.is_initialized()); | 511 EXPECT_FALSE(handle.is_initialized()); |
| 525 EXPECT_FALSE(handle.socket()); | 512 EXPECT_FALSE(handle.socket()); |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1266 EXPECT_TRUE(handle.socket()); | 1253 EXPECT_TRUE(handle.socket()); |
| 1267 IPEndPoint endpoint; | 1254 IPEndPoint endpoint; |
| 1268 handle.socket()->GetLocalAddress(&endpoint); | 1255 handle.socket()->GetLocalAddress(&endpoint); |
| 1269 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); | 1256 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); |
| 1270 EXPECT_EQ(1, client_socket_factory_.allocation_count()); | 1257 EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
| 1271 } | 1258 } |
| 1272 | 1259 |
| 1273 } // namespace | 1260 } // namespace |
| 1274 | 1261 |
| 1275 } // namespace net | 1262 } // namespace net |
| OLD | NEW |