| Index: net/base/ip_address_unittest.cc
|
| diff --git a/net/base/ip_address_unittest.cc b/net/base/ip_address_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..be6df5ef103560f72f0942961e1bb000126338d1
|
| --- /dev/null
|
| +++ b/net/base/ip_address_unittest.cc
|
| @@ -0,0 +1,296 @@
|
| +// 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/format_macros.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "base/strings/stringprintf.h"
|
| +#include "net/base/net_util.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +
|
| +class IPAddressTest : public testing::Test {
|
| + public:
|
| + // Helper to strignize an IP number (used to define expectations).
|
| + static std::string DumpIPAddress(const IPAddress& v) {
|
| + std::string out;
|
| + for (size_t i = 0; i < v.ip_address_.size(); ++i) {
|
| + if (i != 0)
|
| + out.append(",");
|
| + out.append(base::IntToString(static_cast<int>(v.ip_address_[i])));
|
| + }
|
| + return out;
|
| + }
|
| +
|
| + static IPAddress ArrayToIPAdress(uint8_t address[], size_t length) {
|
| + std::vector<unsigned char> vec(address, address + length);
|
| + IPAddress ip_address(vec);
|
| + return ip_address;
|
| + }
|
| +};
|
| +
|
| +namespace {
|
| +
|
| +TEST(IPAddressTest, IPAddressToString) {
|
| + uint8_t addr1[4] = {0, 0, 0, 0};
|
| + IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1));
|
| + EXPECT_EQ("0.0.0.0", ip_address1.ToString());
|
| +
|
| + uint8_t addr2[4] = {192, 168, 0, 1};
|
| + IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2));
|
| + EXPECT_EQ("192.168.0.1", ip_address2.ToString());
|
| +
|
| + uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
|
| + IPAddress ip_address3 = IPAddressTest::ArrayToIPAdress(addr3, sizeof(addr3));
|
| + EXPECT_EQ("fedc:ba98::", ip_address3.ToString());
|
| +}
|
| +
|
| +TEST(IPAddressTest, IPAddressToStringWithPort) {
|
| + uint8_t addr1[4] = {0, 0, 0, 0};
|
| + IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1));
|
| + EXPECT_EQ("0.0.0.0:3", ip_address1.ToStringWithPort(3));
|
| +
|
| + uint8_t addr2[4] = {192, 168, 0, 1};
|
| + IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2));
|
| + EXPECT_EQ("192.168.0.1:99", ip_address2.ToStringWithPort(99));
|
| +
|
| + uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
|
| + IPAddress ip_address3 = IPAddressTest::ArrayToIPAdress(addr3, sizeof(addr3));
|
| + EXPECT_EQ("[fedc:ba98::]:8080", ip_address3.ToStringWithPort(8080));
|
| +}
|
| +
|
| +// Test that invalid IP literals fail to parse.
|
| +TEST(IPAddressTest, FromIPLiteral_FailParse) {
|
| + IPAddress address;
|
| +
|
| + EXPECT_FALSE(IPAddress::FromIPLiteral("bad value", &address));
|
| + EXPECT_FALSE(IPAddress::FromIPLiteral("bad:value", &address));
|
| + EXPECT_FALSE(IPAddress::FromIPLiteral(std::string(), &address));
|
| + EXPECT_FALSE(IPAddress::FromIPLiteral("192.168.0.1:30", &address));
|
| + EXPECT_FALSE(IPAddress::FromIPLiteral(" 192.168.0.1 ", &address));
|
| + EXPECT_FALSE(IPAddress::FromIPLiteral("[::1]", &address));
|
| +}
|
| +
|
| +// Test parsing an IPv4 literal.
|
| +TEST(IPAddressTest, FromIPLiteral_IPv4) {
|
| + IPAddress address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &address));
|
| + EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(address));
|
| + EXPECT_EQ("192.168.0.1", address.ToString());
|
| +}
|
| +
|
| +// Test parsing an IPv6 literal.
|
| +TEST(IPAddressTest, FromIPLiteral_IPv6) {
|
| + IPAddress address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("1:abcd::3:4:ff", &address));
|
| + EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255",
|
| + IPAddressTest::DumpIPAddress(address));
|
| + EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
|
| +}
|
| +
|
| +// Test mapping an IPv4 address to an IPv6 address.
|
| +TEST(IPAddressTest, ConvertIPv4ToIPv6) {
|
| + IPAddress ipv4_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address));
|
| +
|
| + IPAddress ipv6_address = IPAddress::ConvertIPv4ToIPv6(ipv4_address);
|
| +
|
| + // ::ffff:192.168.0.1
|
| + EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
|
| + IPAddressTest::DumpIPAddress(ipv6_address));
|
| + EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString());
|
| +}
|
| +
|
| +TEST(IPAddressTest, FromURLHostname_FailParse) {
|
| + IPAddress address;
|
| +
|
| + EXPECT_FALSE(IPAddress::FromURLHostname("bad value", &address));
|
| + EXPECT_FALSE(IPAddress::FromURLHostname("bad:value", &address));
|
| + EXPECT_FALSE(IPAddress::FromURLHostname(std::string(), &address));
|
| + EXPECT_FALSE(IPAddress::FromURLHostname("192.168.0.1:30", &address));
|
| + EXPECT_FALSE(IPAddress::FromURLHostname(" 192.168.0.1 ", &address));
|
| + EXPECT_FALSE(IPAddress::FromURLHostname("::1", &address));
|
| +}
|
| +
|
| +TEST(IPAddressTest, FromURLHostname_IPv4) {
|
| + IPAddress address;
|
| + EXPECT_TRUE(IPAddress::FromURLHostname("192.168.0.1", &address));
|
| + EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(address));
|
| + EXPECT_EQ("192.168.0.1", address.ToString());
|
| +}
|
| +
|
| +TEST(IPAddressTest, FromURLHostname_IPv6) {
|
| + IPAddress address;
|
| + EXPECT_TRUE(IPAddress::FromURLHostname("[1:abcd::3:4:ff]", &address));
|
| + EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255",
|
| + IPAddressTest::DumpIPAddress(address));
|
| + EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
|
| +}
|
| +
|
| +TEST(IPAddressTest, IsIPv4Mapped) {
|
| + IPAddress ipv4_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address));
|
| + EXPECT_FALSE(ipv4_address.IsIPv4Mapped());
|
| +
|
| + IPAddress ipv6_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv4_address));
|
| + EXPECT_FALSE(ipv6_address.IsIPv4Mapped());
|
| +
|
| + IPAddress ipv4mapped_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address));
|
| + EXPECT_TRUE(ipv4mapped_address.IsIPv4Mapped());
|
| +}
|
| +
|
| +TEST(IPAddressTest, ConvertIPv4MappedToIPv4) {
|
| + IPAddress ipv4mapped_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address));
|
| + IPAddress expected;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("1.1.0.1", &expected));
|
| + IPAddress result = IPAddress::ConvertIPv4MappedToIPv4(ipv4mapped_address);
|
| + EXPECT_EQ(expected.ToString(), result.ToString());
|
| +}
|
| +
|
| +// Test parsing invalid CIDR notation literals.
|
| +TEST(IPAddressTest, FromCIDRBlock_Invalid) {
|
| + const char* const bad_literals[] = {"foobar",
|
| + "",
|
| + "192.168.0.1",
|
| + "::1",
|
| + "/",
|
| + "/1",
|
| + "1",
|
| + "192.168.1.1/-1",
|
| + "192.168.1.1/33",
|
| + "::1/-3",
|
| + "a::3/129",
|
| + "::1/x",
|
| + "192.168.0.1//11"};
|
| +
|
| + for (size_t i = 0; i < arraysize(bad_literals); ++i) {
|
| + IPAddress ip_address;
|
| + size_t prefix_length_in_bits;
|
| +
|
| + EXPECT_FALSE(IPAddress::FromCIDRBlock(bad_literals[i], &ip_address,
|
| + &prefix_length_in_bits));
|
| + }
|
| +}
|
| +
|
| +// Test parsing a valid CIDR notation literal.
|
| +TEST(IPAddressTest, FromCIDRBlock_Valid) {
|
| + IPAddress ip_address;
|
| + size_t prefix_length_in_bits;
|
| +
|
| + EXPECT_TRUE(IPAddress::FromCIDRBlock("192.168.0.1/11", &ip_address,
|
| + &prefix_length_in_bits));
|
| +
|
| + EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(ip_address));
|
| + EXPECT_EQ(11u, prefix_length_in_bits);
|
| +}
|
| +
|
| +TEST(IPAddressTest, MatchesPrefix) {
|
| + struct {
|
| + const char* const cidr_literal;
|
| + const char* const ip_literal;
|
| + bool expected_to_match;
|
| + } tests[] = {
|
| + // IPv4 prefix with IPv4 inputs.
|
| + {"10.10.1.32/27", "10.10.1.44", true},
|
| + {"10.10.1.32/27", "10.10.1.90", false},
|
| + {"10.10.1.32/27", "10.10.1.90", false},
|
| +
|
| + // IPv6 prefix with IPv6 inputs.
|
| + {"2001:db8::/32", "2001:DB8:3:4::5", true},
|
| + {"2001:db8::/32", "2001:c8::", false},
|
| +
|
| + // IPv6 prefix with IPv4 inputs.
|
| + {"2001:db8::/33", "192.168.0.1", false},
|
| + {"::ffff:192.168.0.1/112", "192.168.33.77", true},
|
| +
|
| + // IPv4 prefix with IPv6 inputs.
|
| + {"10.11.33.44/16", "::ffff:0a0b:89", true},
|
| + {"10.11.33.44/16", "::ffff:10.12.33.44", false},
|
| + };
|
| + for (size_t i = 0; i < arraysize(tests); ++i) {
|
| + SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i,
|
| + tests[i].cidr_literal,
|
| + tests[i].ip_literal));
|
| +
|
| + IPAddress ip_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral(tests[i].ip_literal, &ip_address));
|
| +
|
| + IPAddress ip_prefix;
|
| + size_t prefix_length_in_bits;
|
| +
|
| + EXPECT_TRUE(IPAddress::FromCIDRBlock(tests[i].cidr_literal, &ip_prefix,
|
| + &prefix_length_in_bits));
|
| +
|
| + EXPECT_EQ(tests[i].expected_to_match,
|
| + ip_address.MatchesPrefix(ip_prefix, prefix_length_in_bits));
|
| + }
|
| +}
|
| +
|
| +TEST(IPAddressTest, AddressFamily) {
|
| + IPAddress ipv4_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("1.1.0.1", &ipv4_address));
|
| + EXPECT_EQ(ADDRESS_FAMILY_IPV4, ipv4_address.GetAddressFamily());
|
| +
|
| + IPAddress ipv6_address;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv6_address));
|
| + EXPECT_EQ(ADDRESS_FAMILY_IPV6, ipv6_address.GetAddressFamily());
|
| +}
|
| +
|
| +TEST(IPAddressTest, IsEqual) {
|
| + IPAddress ip_address1;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1));
|
| + IPAddress ip_address2;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2));
|
| + IPAddress ip_address3;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3));
|
| +
|
| + EXPECT_FALSE(ip_address1 == ip_address2);
|
| + EXPECT_TRUE(ip_address1 == ip_address3);
|
| +
|
| + EXPECT_TRUE(ip_address1 != ip_address2);
|
| + EXPECT_FALSE(ip_address1 != ip_address3);
|
| +}
|
| +
|
| +TEST(IPAddressTest, LessThan) {
|
| + // IPv4 vs IPv6
|
| + IPAddress ip_address1;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1));
|
| + IPAddress ip_address2;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2));
|
| + EXPECT_TRUE(ip_address1 < ip_address2);
|
| + EXPECT_FALSE(ip_address2 < ip_address1);
|
| +
|
| + // Compare equivalent addresses.
|
| + IPAddress ip_address3;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3));
|
| + EXPECT_FALSE(ip_address1 < ip_address3);
|
| + EXPECT_FALSE(ip_address3 < ip_address1);
|
| +}
|
| +
|
| +TEST(IPAddressTest, MoreThan) {
|
| + // IPv4 vs IPv6
|
| + IPAddress ip_address1;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1));
|
| + IPAddress ip_address2;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2));
|
| + EXPECT_FALSE(ip_address1 > ip_address2);
|
| + EXPECT_TRUE(ip_address2 > ip_address1);
|
| +
|
| + // Compare equivalent addresses.
|
| + IPAddress ip_address3;
|
| + EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3));
|
| + EXPECT_FALSE(ip_address1 > ip_address3);
|
| + EXPECT_FALSE(ip_address3 > ip_address1);
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| +} // namespace net
|
|
|