blob: b08d10a74fdb15868b62a9c179034b4ba2afd39e [file] [log] [blame]
// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/base/ip_address.h"
#include <vector>
#include "base/strings/string_number_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
namespace {
// Helper to stringize an IP address (used to define expectations).
std::string DumpIPAddress(const IPAddress& v) {
std::string out;
for (size_t i = 0; i < v.bytes().size(); ++i) {
if (i != 0)
out.append(",");
out.append(base::UintToString(v.bytes()[i]));
}
return out;
}
TEST(IPAddressTest, IsIPVersion) {
uint8_t addr1[4] = {192, 168, 0, 1};
IPAddress ip_address1(addr1);
EXPECT_TRUE(ip_address1.IsIPv4());
EXPECT_FALSE(ip_address1.IsIPv6());
uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98};
IPAddress ip_address2(addr2);
EXPECT_TRUE(ip_address2.IsIPv6());
EXPECT_FALSE(ip_address2.IsIPv4());
IPAddress ip_address3;
EXPECT_FALSE(ip_address3.IsIPv6());
EXPECT_FALSE(ip_address3.IsIPv4());
}
TEST(IPAddressTest, IsValid) {
uint8_t addr1[4] = {192, 168, 0, 1};
IPAddress ip_address1(addr1);
EXPECT_TRUE(ip_address1.IsValid());
EXPECT_FALSE(ip_address1.empty());
uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98};
IPAddress ip_address2(addr2);
EXPECT_TRUE(ip_address2.IsValid());
EXPECT_FALSE(ip_address2.empty());
uint8_t addr3[5] = {0xFE, 0xDC, 0xBA, 0x98};
IPAddress ip_address3(addr3);
EXPECT_FALSE(ip_address3.IsValid());
EXPECT_FALSE(ip_address3.empty());
IPAddress ip_address4;
EXPECT_FALSE(ip_address4.IsValid());
EXPECT_TRUE(ip_address4.empty());
}
TEST(IPAddressTest, IsZero) {
uint8_t address1[4] = {};
IPAddress zero_ipv4_address(address1);
EXPECT_TRUE(zero_ipv4_address.IsZero());
uint8_t address2[4] = {10};
IPAddress non_zero_ipv4_address(address2);
EXPECT_FALSE(non_zero_ipv4_address.IsZero());
uint8_t address3[16] = {};
IPAddress zero_ipv6_address(address3);
EXPECT_TRUE(zero_ipv6_address.IsZero());
uint8_t address4[16] = {10};
IPAddress non_zero_ipv6_address(address4);
EXPECT_FALSE(non_zero_ipv6_address.IsZero());
IPAddress empty_address;
EXPECT_FALSE(empty_address.IsZero());
}
TEST(IPAddressTest, ToString) {
uint8_t addr1[4] = {0, 0, 0, 0};
IPAddress ip_address1(addr1);
EXPECT_EQ("0.0.0.0", ip_address1.ToString());
uint8_t addr2[4] = {192, 168, 0, 1};
IPAddress ip_address2(addr2);
EXPECT_EQ("192.168.0.1", ip_address2.ToString());
uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
IPAddress ip_address3(addr3);
EXPECT_EQ("fedc:ba98::", ip_address3.ToString());
// ToString() shouldn't crash on invalid addresses.
uint8_t addr4[2];
IPAddress ip_address4(addr4);
EXPECT_EQ("", ip_address4.ToString());
IPAddress ip_address5;
EXPECT_EQ("", ip_address5.ToString());
}
// Test that invalid IP literals fail to parse.
TEST(IPAddressTest, AssignFromIPLiteral_FailParse) {
IPAddress address;
EXPECT_FALSE(address.AssignFromIPLiteral("bad value"));
EXPECT_FALSE(address.AssignFromIPLiteral("bad:value"));
EXPECT_FALSE(address.AssignFromIPLiteral(std::string()));
EXPECT_FALSE(address.AssignFromIPLiteral("192.168.0.1:30"));
EXPECT_FALSE(address.AssignFromIPLiteral(" 192.168.0.1 "));
EXPECT_FALSE(address.AssignFromIPLiteral("[::1]"));
}
// Test parsing an IPv4 literal.
TEST(IPAddressTest, AssignFromIPLiteral_IPv4) {
IPAddress address;
EXPECT_TRUE(address.AssignFromIPLiteral("192.168.0.1"));
EXPECT_EQ("192,168,0,1", DumpIPAddress(address));
EXPECT_EQ("192.168.0.1", address.ToString());
}
// Test parsing an IPv6 literal.
TEST(IPAddressTest, AssignFromIPLiteral_IPv6) {
IPAddress address;
EXPECT_TRUE(address.AssignFromIPLiteral("1:abcd::3:4:ff"));
EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address));
EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
}
TEST(IPAddressTest, IsIPv4MappedIPv6) {
IPAddress ipv4_address;
EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("192.168.0.1"));
EXPECT_FALSE(ipv4_address.IsIPv4MappedIPv6());
IPAddress ipv6_address;
EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("::1"));
EXPECT_FALSE(ipv6_address.IsIPv4MappedIPv6());
IPAddress ipv4mapped_address;
EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:0101:1"));
EXPECT_TRUE(ipv4mapped_address.IsIPv4MappedIPv6());
}
TEST(IPAddressTest, IsEqual) {
IPAddress ip_address1;
EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1"));
IPAddress ip_address2;
EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42"));
IPAddress ip_address3;
EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1"));
EXPECT_FALSE(ip_address1 == ip_address2);
EXPECT_TRUE(ip_address1 == ip_address3);
}
TEST(IPAddressTest, LessThan) {
// IPv4 vs IPv6
IPAddress ip_address1;
EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1"));
IPAddress ip_address2;
EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42"));
EXPECT_TRUE(ip_address1 < ip_address2);
EXPECT_FALSE(ip_address2 < ip_address1);
// Compare equivalent addresses.
IPAddress ip_address3;
EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1"));
EXPECT_FALSE(ip_address1 < ip_address3);
EXPECT_FALSE(ip_address3 < ip_address1);
}
TEST(IPAddressTest, IPAddressToStringWithPort) {
IPAddress address1;
EXPECT_TRUE(address1.AssignFromIPLiteral("0.0.0.0"));
EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(address1, 3));
IPAddress address2;
EXPECT_TRUE(address2.AssignFromIPLiteral("192.168.0.1"));
EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address2, 99));
IPAddress address3;
EXPECT_TRUE(address3.AssignFromIPLiteral("fedc:ba98::"));
EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address3, 8080));
// ToString() shouldn't crash on invalid addresses.
IPAddress address4;
EXPECT_EQ("", IPAddressToStringWithPort(address4, 8080));
}
TEST(IPAddressTest, IPAddressToPackedString) {
IPAddress ipv4_address;
EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44"));
std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4);
EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address));
IPAddress ipv6_address;
EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f"));
std::string expected_ipv6_address(
"\x20\x01\x07\x00\x03\x00\x18\x00"
"\x00\x00\x00\x00\x00\x00\x00\x0f",
16);
EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address));
}
TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) {
IPAddress ipv4_address;
EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("192.168.0.1"));
IPAddress ipv6_address = ConvertIPv4ToIPv4MappedIPv6(ipv4_address);
// ::ffff:192.168.0.1
EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString());
}
TEST(IPAddressTest, ConvertIPv4MappedIPv6ToIPv4) {
IPAddress ipv4mapped_address;
EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:c0a8:1"));
IPAddress expected;
EXPECT_TRUE(expected.AssignFromIPLiteral("192.168.0.1"));
IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_address);
EXPECT_EQ(expected, result);
}
} // anonymous namespace
} // namespace net