1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/ip_endpoint.h" 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_number_conversions.h" 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/net_util.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "testing/gtest/include/gtest/gtest.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "testing/platform_test.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN) 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <winsock2.h> 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#elif defined(OS_POSIX) 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <netinet/in.h> 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net { 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace { 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct TestData { 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string host; 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string host_normalized; 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool ipv6; 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPAddressNumber ip_address; 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} tests[] = { 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "127.0.00.1", "127.0.0.1", false}, 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "192.168.1.1", "192.168.1.1", false }, 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "::1", "[::1]", true }, 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "2001:db8:0::42", "[2001:db8::42]", true }, 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenint test_count = ARRAYSIZE_UNSAFE(tests); 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass IPEndPointTest : public PlatformTest { 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SetUp() { 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // This is where we populate the TestData. 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(ParseIPLiteralToNumber(tests[index].host, 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &tests[index].ip_address)); 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 45dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(IPEndPointTest, Constructor) { 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint endpoint; 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(0, endpoint.port()); 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint endpoint(tests[index].ip_address, 80); 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(80, endpoint.port()); 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(tests[index].ip_address, endpoint.address()); 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 56dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(IPEndPointTest, Assignment) { 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint src(tests[index].ip_address, index); 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint dest = src; 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(src.port(), dest.port()); 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(src.address(), dest.address()); 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 66dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(IPEndPointTest, Copy) { 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint src(tests[index].ip_address, index); 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint dest(src); 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(src.port(), dest.port()); 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(src.address(), dest.address()); 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(IPEndPointTest, ToFromSockAddr) { 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint ip_endpoint(tests[index].ip_address, index); 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Convert to a sockaddr. 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen struct sockaddr_storage addr; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t addr_len = sizeof(addr); 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen struct sockaddr* sockaddr = reinterpret_cast<struct sockaddr*>(&addr); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(ip_endpoint.ToSockAddr(sockaddr, &addr_len)); 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Basic verification. 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t expected_size = tests[index].ipv6 ? 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(expected_size, addr_len); 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(ip_endpoint.port(), GetPortFromSockaddr(sockaddr, addr_len)); 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // And convert back to an IPEndPoint. 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint ip_endpoint2; 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(ip_endpoint2.FromSockAddr(sockaddr, addr_len)); 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(ip_endpoint.port(), ip_endpoint2.port()); 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(ip_endpoint.address(), ip_endpoint2.address()); 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(IPEndPointTest, ToSockAddrBufTooSmall) { 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint ip_endpoint(tests[index].ip_address, index); 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen struct sockaddr_storage addr; 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t addr_len = index; // size is too small! 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen struct sockaddr* sockaddr = reinterpret_cast<struct sockaddr*>(&addr); 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint.ToSockAddr(sockaddr, &addr_len)); 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 111dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(IPEndPointTest, Equality) { 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int index = 0; index < test_count; ++index) { 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint src(tests[index].ip_address, index); 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint dest(src); 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(src == dest); 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 119dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(IPEndPointTest, LessThan) { 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Vary by port. 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint ip_endpoint1(tests[0].ip_address, 100); 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPEndPoint ip_endpoint2(tests[0].ip_address, 1000); 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(ip_endpoint1 < ip_endpoint2); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint2 < ip_endpoint1); 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // IPv4 vs IPv6 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_endpoint1 = IPEndPoint(tests[0].ip_address, 81); 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ip_endpoint2 = IPEndPoint(tests[2].ip_address, 80); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(ip_endpoint1 < ip_endpoint2); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint2 < ip_endpoint1); 131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // IPv4 vs IPv4 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_endpoint1 = IPEndPoint(tests[0].ip_address, 81); 134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ip_endpoint2 = IPEndPoint(tests[1].ip_address, 80); 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(ip_endpoint1 < ip_endpoint2); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint2 < ip_endpoint1); 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // IPv6 vs IPv6 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_endpoint1 = IPEndPoint(tests[2].ip_address, 81); 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ip_endpoint2 = IPEndPoint(tests[3].ip_address, 80); 141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(ip_endpoint1 < ip_endpoint2); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint2 < ip_endpoint1); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Compare equivalent endpoints. 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_endpoint1 = IPEndPoint(tests[0].ip_address, 80); 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_endpoint2 = IPEndPoint(tests[0].ip_address, 80); 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint1 < ip_endpoint2); 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(ip_endpoint2 < ip_endpoint1); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(IPEndPointTest, ToString) { 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPEndPoint endpoint; 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, endpoint.port()); 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (int index = 0; index < test_count; ++index) { 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int port = 100 + index; 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPEndPoint endpoint(tests[index].ip_address, port); 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string result = endpoint.ToString(); 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (tests[index].ipv6 && result.empty()) { 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // NetAddressToStringWithPort may fail on systems without IPv6. 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen continue; 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(tests[index].host_normalized + ":" + base::IntToString(port), 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen result); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace 169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace net 171