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 3 // found in the LICENSE file. 4 5 // This file contains some tests for TCPClientSocket. 6 // transport_client_socket_unittest.cc contans some other tests that 7 // are common for TCP and other types of sockets. 8 9 #include "net/socket/tcp_client_socket.h" 10 11 #include "net/base/ip_endpoint.h" 12 #include "net/base/net_errors.h" 13 #include "net/base/net_util.h" 14 #include "net/base/test_completion_callback.h" 15 #include "net/socket/tcp_server_socket.h" 16 #include "testing/gtest/include/gtest/gtest.h" 17 18 namespace net { 19 20 namespace { 21 22 // Try binding a socket to loopback interface and verify that we can 23 // still connect to a server on the same interface. 24 TEST(TCPClientSocketTest, BindLoopbackToLoopback) { 25 IPAddressNumber lo_address; 26 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address)); 27 28 TCPServerSocket server(NULL, NetLog::Source()); 29 ASSERT_EQ(OK, server.Listen(IPEndPoint(lo_address, 0), 1)); 30 IPEndPoint server_address; 31 ASSERT_EQ(OK, server.GetLocalAddress(&server_address)); 32 33 TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source()); 34 35 EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0))); 36 37 IPEndPoint local_address_result; 38 EXPECT_EQ(OK, socket.GetLocalAddress(&local_address_result)); 39 EXPECT_EQ(lo_address, local_address_result.address()); 40 41 TestCompletionCallback connect_callback; 42 EXPECT_EQ(ERR_IO_PENDING, socket.Connect(connect_callback.callback())); 43 44 TestCompletionCallback accept_callback; 45 scoped_ptr<StreamSocket> accepted_socket; 46 int result = server.Accept(&accepted_socket, accept_callback.callback()); 47 if (result == ERR_IO_PENDING) 48 result = accept_callback.WaitForResult(); 49 ASSERT_EQ(OK, result); 50 51 EXPECT_EQ(OK, connect_callback.WaitForResult()); 52 53 EXPECT_TRUE(socket.IsConnected()); 54 socket.Disconnect(); 55 EXPECT_FALSE(socket.IsConnected()); 56 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, 57 socket.GetLocalAddress(&local_address_result)); 58 } 59 60 // Try to bind socket to the loopback interface and connect to an 61 // external address, verify that connection fails. 62 TEST(TCPClientSocketTest, BindLoopbackToExternal) { 63 IPAddressNumber external_ip; 64 ASSERT_TRUE(ParseIPLiteralToNumber("72.14.213.105", &external_ip)); 65 TCPClientSocket socket(AddressList::CreateFromIPAddress(external_ip, 80), 66 NULL, NetLog::Source()); 67 68 IPAddressNumber lo_address; 69 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address)); 70 EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0))); 71 72 TestCompletionCallback connect_callback; 73 int result = socket.Connect(connect_callback.callback()); 74 if (result == ERR_IO_PENDING) 75 result = connect_callback.WaitForResult(); 76 77 // We may get different errors here on different system, but 78 // connect() is not expected to succeed. 79 EXPECT_NE(OK, result); 80 } 81 82 // Bind a socket to the IPv4 loopback interface and try to connect to 83 // the IPv6 loopback interface, verify that connection fails. 84 TEST(TCPClientSocketTest, BindLoopbackToIPv6) { 85 IPAddressNumber ipv6_lo_ip; 86 ASSERT_TRUE(ParseIPLiteralToNumber("::1", &ipv6_lo_ip)); 87 TCPServerSocket server(NULL, NetLog::Source()); 88 int listen_result = server.Listen(IPEndPoint(ipv6_lo_ip, 0), 1); 89 if (listen_result != OK) { 90 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is disabled." 91 " Skipping the test"; 92 return; 93 } 94 95 IPEndPoint server_address; 96 ASSERT_EQ(OK, server.GetLocalAddress(&server_address)); 97 TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source()); 98 99 IPAddressNumber ipv4_lo_ip; 100 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ipv4_lo_ip)); 101 EXPECT_EQ(OK, socket.Bind(IPEndPoint(ipv4_lo_ip, 0))); 102 103 TestCompletionCallback connect_callback; 104 int result = socket.Connect(connect_callback.callback()); 105 if (result == ERR_IO_PENDING) 106 result = connect_callback.WaitForResult(); 107 108 EXPECT_NE(OK, result); 109 } 110 111 } // namespace 112 113 } // namespace net 114