blob: edb3c20c76b828f3dec816c8a166796961141adb [file] [log] [blame]
[email protected]03ec25382011-05-27 21:50:281// 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
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/sys_addrinfo.h"
15#include "net/base/test_completion_callback.h"
16#include "net/socket/tcp_server_socket.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19namespace net {
20
21namespace {
22
23// Try binding a socket to loopback interface and verify that we can
24// still connect to a server on the same interface.
25TEST(TCPClientSocketTest, BindLoopbackToLoopback) {
26 IPAddressNumber lo_address;
27 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address));
28
29 TCPServerSocket server(NULL, NetLog::Source());
30 ASSERT_EQ(OK, server.Listen(IPEndPoint(lo_address, 0), 1));
31 IPEndPoint server_address;
32 ASSERT_EQ(OK, server.GetLocalAddress(&server_address));
33
34 TCPClientSocket socket(
35 AddressList::CreateFromIPAddress(server_address.address(),
36 server_address.port()),
37 NULL, NetLog::Source());
38
39 EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0)));
40
41 TestCompletionCallback connect_callback;
42 EXPECT_EQ(ERR_IO_PENDING, socket.Connect(&connect_callback));
43
44 TestCompletionCallback accept_callback;
45 scoped_ptr<StreamSocket> accepted_socket;
46 int result = server.Accept(&accepted_socket, &accept_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
54// Try to bind socket to the loopback interface and connect to an
55// external address, verify that connection fails.
56TEST(TCPClientSocketTest, BindLoopbackToExternal) {
57 IPAddressNumber external_ip;
58 ASSERT_TRUE(ParseIPLiteralToNumber("72.14.213.105", &external_ip));
59 TCPClientSocket socket(AddressList::CreateFromIPAddress(external_ip, 80),
60 NULL, NetLog::Source());
61
62 IPAddressNumber lo_address;
63 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address));
64 EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0)));
65
66 TestCompletionCallback connect_callback;
67 int result = socket.Connect(&connect_callback);
68 if (result == ERR_IO_PENDING)
69 result = connect_callback.WaitForResult();
70
71 // We may get different errors here on different system, but
72 // connect() is not expected to succeed.
73 EXPECT_NE(OK, result);
74}
75
76// Bind a socket to the IPv4 loopback interface and try to connect to
77// the IPv6 loopback interface, verify that connection fails.
78TEST(TCPClientSocketTest, BindLoopbackToIPv6) {
79 IPAddressNumber ipv6_lo_ip;
80 ASSERT_TRUE(ParseIPLiteralToNumber("::1", &ipv6_lo_ip));
81 TCPServerSocket server(NULL, NetLog::Source());
82 int listen_result = server.Listen(IPEndPoint(ipv6_lo_ip, 0), 1);
83 if (listen_result != OK) {
84 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is disabled."
85 " Skipping the test";
86 return;
87 }
88
89 IPEndPoint server_address;
90 ASSERT_EQ(OK, server.GetLocalAddress(&server_address));
91 TCPClientSocket socket(
92 AddressList::CreateFromIPAddress(server_address.address(),
93 server_address.port()),
94 NULL, NetLog::Source());
95
96 IPAddressNumber ipv4_lo_ip;
97 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ipv4_lo_ip));
98 EXPECT_EQ(OK, socket.Bind(IPEndPoint(ipv4_lo_ip, 0)));
99
100 TestCompletionCallback connect_callback;
101 int result = socket.Connect(&connect_callback);
102 if (result == ERR_IO_PENDING)
103 result = connect_callback.WaitForResult();
104
105 EXPECT_NE(OK, result);
106}
107
108} // namespace
109
110} // namespace net