OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2015 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 #include "net/base/ip_address.h" |
| 6 |
| 7 #include <vector> |
| 8 |
| 9 #include "base/format_macros.h" |
| 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/stringprintf.h" |
| 12 #include "net/base/net_util.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 |
| 15 namespace net { |
| 16 |
| 17 class IPAddressTest : public testing::Test { |
| 18 public: |
| 19 // Helper to strignize an IP number (used to define expectations). |
| 20 static std::string DumpIPAddress(const IPAddress& v) { |
| 21 std::string out; |
| 22 for (size_t i = 0; i < v.ip_address_.size(); ++i) { |
| 23 if (i != 0) |
| 24 out.append(","); |
| 25 out.append(base::IntToString(static_cast<int>(v.ip_address_[i]))); |
| 26 } |
| 27 return out; |
| 28 } |
| 29 |
| 30 static IPAddress ArrayToIPAdress(uint8_t address[], size_t length) { |
| 31 std::vector<unsigned char> vec(address, address + length); |
| 32 IPAddress ip_address(vec); |
| 33 return ip_address; |
| 34 } |
| 35 }; |
| 36 |
| 37 namespace { |
| 38 |
| 39 TEST(IPAddressTest, IPAddressToString) { |
| 40 uint8_t addr1[4] = {0, 0, 0, 0}; |
| 41 IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1)); |
| 42 EXPECT_EQ("0.0.0.0", ip_address1.ToString()); |
| 43 |
| 44 uint8_t addr2[4] = {192, 168, 0, 1}; |
| 45 IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2)); |
| 46 EXPECT_EQ("192.168.0.1", ip_address2.ToString()); |
| 47 |
| 48 uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; |
| 49 IPAddress ip_address3 = IPAddressTest::ArrayToIPAdress(addr3, sizeof(addr3)); |
| 50 EXPECT_EQ("fedc:ba98::", ip_address3.ToString()); |
| 51 } |
| 52 |
| 53 TEST(IPAddressTest, IPAddressToStringWithPort) { |
| 54 uint8_t addr1[4] = {0, 0, 0, 0}; |
| 55 IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1)); |
| 56 EXPECT_EQ("0.0.0.0:3", ip_address1.ToStringWithPort(3)); |
| 57 |
| 58 uint8_t addr2[4] = {192, 168, 0, 1}; |
| 59 IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2)); |
| 60 EXPECT_EQ("192.168.0.1:99", ip_address2.ToStringWithPort(99)); |
| 61 |
| 62 uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; |
| 63 IPAddress ip_address3 = IPAddressTest::ArrayToIPAdress(addr3, sizeof(addr3)); |
| 64 EXPECT_EQ("[fedc:ba98::]:8080", ip_address3.ToStringWithPort(8080)); |
| 65 } |
| 66 |
| 67 // Test that invalid IP literals fail to parse. |
| 68 TEST(IPAddressTest, FromIPLiteral_FailParse) { |
| 69 IPAddress address; |
| 70 |
| 71 EXPECT_FALSE(IPAddress::FromIPLiteral("bad value", &address)); |
| 72 EXPECT_FALSE(IPAddress::FromIPLiteral("bad:value", &address)); |
| 73 EXPECT_FALSE(IPAddress::FromIPLiteral(std::string(), &address)); |
| 74 EXPECT_FALSE(IPAddress::FromIPLiteral("192.168.0.1:30", &address)); |
| 75 EXPECT_FALSE(IPAddress::FromIPLiteral(" 192.168.0.1 ", &address)); |
| 76 EXPECT_FALSE(IPAddress::FromIPLiteral("[::1]", &address)); |
| 77 } |
| 78 |
| 79 // Test parsing an IPv4 literal. |
| 80 TEST(IPAddressTest, FromIPLiteral_IPv4) { |
| 81 IPAddress address; |
| 82 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &address)); |
| 83 EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(address)); |
| 84 EXPECT_EQ("192.168.0.1", address.ToString()); |
| 85 } |
| 86 |
| 87 // Test parsing an IPv6 literal. |
| 88 TEST(IPAddressTest, FromIPLiteral_IPv6) { |
| 89 IPAddress address; |
| 90 EXPECT_TRUE(IPAddress::FromIPLiteral("1:abcd::3:4:ff", &address)); |
| 91 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", |
| 92 IPAddressTest::DumpIPAddress(address)); |
| 93 EXPECT_EQ("1:abcd::3:4:ff", address.ToString()); |
| 94 } |
| 95 |
| 96 // Test mapping an IPv4 address to an IPv6 address. |
| 97 TEST(IPAddressTest, ConvertIPv4ToIPv6) { |
| 98 IPAddress ipv4_address; |
| 99 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address)); |
| 100 |
| 101 IPAddress ipv6_address = IPAddress::ConvertIPv4ToIPv6(ipv4_address); |
| 102 |
| 103 // ::ffff:192.168.0.1 |
| 104 EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1", |
| 105 IPAddressTest::DumpIPAddress(ipv6_address)); |
| 106 EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString()); |
| 107 } |
| 108 |
| 109 TEST(IPAddressTest, FromURLHostname_FailParse) { |
| 110 IPAddress address; |
| 111 |
| 112 EXPECT_FALSE(IPAddress::FromURLHostname("bad value", &address)); |
| 113 EXPECT_FALSE(IPAddress::FromURLHostname("bad:value", &address)); |
| 114 EXPECT_FALSE(IPAddress::FromURLHostname(std::string(), &address)); |
| 115 EXPECT_FALSE(IPAddress::FromURLHostname("192.168.0.1:30", &address)); |
| 116 EXPECT_FALSE(IPAddress::FromURLHostname(" 192.168.0.1 ", &address)); |
| 117 EXPECT_FALSE(IPAddress::FromURLHostname("::1", &address)); |
| 118 } |
| 119 |
| 120 TEST(IPAddressTest, FromURLHostname_IPv4) { |
| 121 IPAddress address; |
| 122 EXPECT_TRUE(IPAddress::FromURLHostname("192.168.0.1", &address)); |
| 123 EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(address)); |
| 124 EXPECT_EQ("192.168.0.1", address.ToString()); |
| 125 } |
| 126 |
| 127 TEST(IPAddressTest, FromURLHostname_IPv6) { |
| 128 IPAddress address; |
| 129 EXPECT_TRUE(IPAddress::FromURLHostname("[1:abcd::3:4:ff]", &address)); |
| 130 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", |
| 131 IPAddressTest::DumpIPAddress(address)); |
| 132 EXPECT_EQ("1:abcd::3:4:ff", address.ToString()); |
| 133 } |
| 134 |
| 135 TEST(IPAddressTest, IsIPv4Mapped) { |
| 136 IPAddress ipv4_address; |
| 137 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address)); |
| 138 EXPECT_FALSE(ipv4_address.IsIPv4Mapped()); |
| 139 |
| 140 IPAddress ipv6_address; |
| 141 EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv4_address)); |
| 142 EXPECT_FALSE(ipv6_address.IsIPv4Mapped()); |
| 143 |
| 144 IPAddress ipv4mapped_address; |
| 145 EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address)); |
| 146 EXPECT_TRUE(ipv4mapped_address.IsIPv4Mapped()); |
| 147 } |
| 148 |
| 149 TEST(IPAddressTest, ConvertIPv4MappedToIPv4) { |
| 150 IPAddress ipv4mapped_address; |
| 151 EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address)); |
| 152 IPAddress expected; |
| 153 EXPECT_TRUE(IPAddress::FromIPLiteral("1.1.0.1", &expected)); |
| 154 IPAddress result = IPAddress::ConvertIPv4MappedToIPv4(ipv4mapped_address); |
| 155 EXPECT_EQ(expected.ToString(), result.ToString()); |
| 156 } |
| 157 |
| 158 // Test parsing invalid CIDR notation literals. |
| 159 TEST(IPAddressTest, FromCIDRBlock_Invalid) { |
| 160 const char* const bad_literals[] = {"foobar", |
| 161 "", |
| 162 "192.168.0.1", |
| 163 "::1", |
| 164 "/", |
| 165 "/1", |
| 166 "1", |
| 167 "192.168.1.1/-1", |
| 168 "192.168.1.1/33", |
| 169 "::1/-3", |
| 170 "a::3/129", |
| 171 "::1/x", |
| 172 "192.168.0.1//11"}; |
| 173 |
| 174 for (size_t i = 0; i < arraysize(bad_literals); ++i) { |
| 175 IPAddress ip_address; |
| 176 size_t prefix_length_in_bits; |
| 177 |
| 178 EXPECT_FALSE(IPAddress::FromCIDRBlock(bad_literals[i], &ip_address, |
| 179 &prefix_length_in_bits)); |
| 180 } |
| 181 } |
| 182 |
| 183 // Test parsing a valid CIDR notation literal. |
| 184 TEST(IPAddressTest, FromCIDRBlock_Valid) { |
| 185 IPAddress ip_address; |
| 186 size_t prefix_length_in_bits; |
| 187 |
| 188 EXPECT_TRUE(IPAddress::FromCIDRBlock("192.168.0.1/11", &ip_address, |
| 189 &prefix_length_in_bits)); |
| 190 |
| 191 EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(ip_address)); |
| 192 EXPECT_EQ(11u, prefix_length_in_bits); |
| 193 } |
| 194 |
| 195 TEST(IPAddressTest, MatchesPrefix) { |
| 196 struct { |
| 197 const char* const cidr_literal; |
| 198 const char* const ip_literal; |
| 199 bool expected_to_match; |
| 200 } tests[] = { |
| 201 // IPv4 prefix with IPv4 inputs. |
| 202 {"10.10.1.32/27", "10.10.1.44", true}, |
| 203 {"10.10.1.32/27", "10.10.1.90", false}, |
| 204 {"10.10.1.32/27", "10.10.1.90", false}, |
| 205 |
| 206 // IPv6 prefix with IPv6 inputs. |
| 207 {"2001:db8::/32", "2001:DB8:3:4::5", true}, |
| 208 {"2001:db8::/32", "2001:c8::", false}, |
| 209 |
| 210 // IPv6 prefix with IPv4 inputs. |
| 211 {"2001:db8::/33", "192.168.0.1", false}, |
| 212 {"::ffff:192.168.0.1/112", "192.168.33.77", true}, |
| 213 |
| 214 // IPv4 prefix with IPv6 inputs. |
| 215 {"10.11.33.44/16", "::ffff:0a0b:89", true}, |
| 216 {"10.11.33.44/16", "::ffff:10.12.33.44", false}, |
| 217 }; |
| 218 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 219 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i, |
| 220 tests[i].cidr_literal, |
| 221 tests[i].ip_literal)); |
| 222 |
| 223 IPAddress ip_address; |
| 224 EXPECT_TRUE(IPAddress::FromIPLiteral(tests[i].ip_literal, &ip_address)); |
| 225 |
| 226 IPAddress ip_prefix; |
| 227 size_t prefix_length_in_bits; |
| 228 |
| 229 EXPECT_TRUE(IPAddress::FromCIDRBlock(tests[i].cidr_literal, &ip_prefix, |
| 230 &prefix_length_in_bits)); |
| 231 |
| 232 EXPECT_EQ(tests[i].expected_to_match, |
| 233 ip_address.MatchesPrefix(ip_prefix, prefix_length_in_bits)); |
| 234 } |
| 235 } |
| 236 |
| 237 TEST(IPAddressTest, AddressFamily) { |
| 238 IPAddress ipv4_address; |
| 239 EXPECT_TRUE(IPAddress::FromIPLiteral("1.1.0.1", &ipv4_address)); |
| 240 EXPECT_EQ(ADDRESS_FAMILY_IPV4, ipv4_address.GetAddressFamily()); |
| 241 |
| 242 IPAddress ipv6_address; |
| 243 EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv6_address)); |
| 244 EXPECT_EQ(ADDRESS_FAMILY_IPV6, ipv6_address.GetAddressFamily()); |
| 245 } |
| 246 |
| 247 TEST(IPAddressTest, IsEqual) { |
| 248 IPAddress ip_address1; |
| 249 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1)); |
| 250 IPAddress ip_address2; |
| 251 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2)); |
| 252 IPAddress ip_address3; |
| 253 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3)); |
| 254 |
| 255 EXPECT_FALSE(ip_address1 == ip_address2); |
| 256 EXPECT_TRUE(ip_address1 == ip_address3); |
| 257 |
| 258 EXPECT_TRUE(ip_address1 != ip_address2); |
| 259 EXPECT_FALSE(ip_address1 != ip_address3); |
| 260 } |
| 261 |
| 262 TEST(IPAddressTest, LessThan) { |
| 263 // IPv4 vs IPv6 |
| 264 IPAddress ip_address1; |
| 265 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1)); |
| 266 IPAddress ip_address2; |
| 267 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2)); |
| 268 EXPECT_TRUE(ip_address1 < ip_address2); |
| 269 EXPECT_FALSE(ip_address2 < ip_address1); |
| 270 |
| 271 // Compare equivalent addresses. |
| 272 IPAddress ip_address3; |
| 273 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3)); |
| 274 EXPECT_FALSE(ip_address1 < ip_address3); |
| 275 EXPECT_FALSE(ip_address3 < ip_address1); |
| 276 } |
| 277 |
| 278 TEST(IPAddressTest, MoreThan) { |
| 279 // IPv4 vs IPv6 |
| 280 IPAddress ip_address1; |
| 281 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1)); |
| 282 IPAddress ip_address2; |
| 283 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2)); |
| 284 EXPECT_FALSE(ip_address1 > ip_address2); |
| 285 EXPECT_TRUE(ip_address2 > ip_address1); |
| 286 |
| 287 // Compare equivalent addresses. |
| 288 IPAddress ip_address3; |
| 289 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3)); |
| 290 EXPECT_FALSE(ip_address1 > ip_address3); |
| 291 EXPECT_FALSE(ip_address3 > ip_address1); |
| 292 } |
| 293 |
| 294 } // anonymous namespace |
| 295 |
| 296 } // namespace net |
OLD | NEW |