Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/ip_address.h" | 5 #include "net/base/ip_address.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/format_macros.h" | |
| 9 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/stringprintf.h" | |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 13 |
| 12 namespace net { | 14 namespace net { |
| 13 | 15 |
| 14 namespace { | 16 namespace { |
| 15 | 17 |
| 16 // Helper to stringize an IP address (used to define expectations). | 18 // Helper to stringize an IP address (used to define expectations). |
| 17 std::string DumpIPAddress(const IPAddress& v) { | 19 std::string DumpIPAddress(const IPAddress& v) { |
| 18 std::string out; | 20 std::string out; |
| 19 for (size_t i = 0; i < v.bytes().size(); ++i) { | 21 for (size_t i = 0; i < v.bytes().size(); ++i) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 uint8_t addr3[5] = {0xFE, 0xDC, 0xBA, 0x98}; | 70 uint8_t addr3[5] = {0xFE, 0xDC, 0xBA, 0x98}; |
| 69 IPAddress ip_address3(addr3); | 71 IPAddress ip_address3(addr3); |
| 70 EXPECT_FALSE(ip_address3.IsValid()); | 72 EXPECT_FALSE(ip_address3.IsValid()); |
| 71 EXPECT_FALSE(ip_address3.empty()); | 73 EXPECT_FALSE(ip_address3.empty()); |
| 72 | 74 |
| 73 IPAddress ip_address4; | 75 IPAddress ip_address4; |
| 74 EXPECT_FALSE(ip_address4.IsValid()); | 76 EXPECT_FALSE(ip_address4.IsValid()); |
| 75 EXPECT_TRUE(ip_address4.empty()); | 77 EXPECT_TRUE(ip_address4.empty()); |
| 76 } | 78 } |
| 77 | 79 |
| 80 TEST(IPAddressTest, IsReserved) { | |
|
martijnc
2016/04/11 22:02:09
Added these tests, the IPv6 addresses are from [1]
eroman
2016/04/13 01:36:21
Agreed, thanks!
I have some suggestions on the IP
| |
| 81 struct { | |
| 82 const char* const address; | |
| 83 bool is_reserved; | |
| 84 } tests[] = {{"10.10.10.10", true}, | |
| 85 {"9.9.255.255", false}, | |
| 86 {"127.0.0.1", true}, | |
| 87 {"128.0.0.1", false}, | |
| 88 {"198.18.0.0", true}, | |
| 89 {"198.18.255.255", true}, | |
| 90 {"198.17.255.255", false}, | |
| 91 {"198.19.255.255", true}, | |
| 92 {"198.20.0.0", false}, | |
| 93 {"0000::", true}, | |
| 94 {"FFC0:ba98:7654:3210:FEDC:BA98:7654:3210", false}, | |
| 95 {"2000:ba98:7654:2301:EFCD:BA98:7654:3210", false}, | |
| 96 {"::192.9.5.5", true}, | |
| 97 {"FEED::BEEF", true}}; | |
| 98 | |
| 99 IPAddress address; | |
| 100 for (const auto& test : tests) { | |
| 101 EXPECT_TRUE(address.AssignFromIPLiteral(test.address)); | |
| 102 EXPECT_EQ(test.is_reserved, address.IsReserved()); | |
| 103 } | |
| 104 } | |
| 105 | |
| 78 TEST(IPAddressTest, IsZero) { | 106 TEST(IPAddressTest, IsZero) { |
| 79 uint8_t address1[4] = {}; | 107 uint8_t address1[4] = {}; |
| 80 IPAddress zero_ipv4_address(address1); | 108 IPAddress zero_ipv4_address(address1); |
| 81 EXPECT_TRUE(zero_ipv4_address.IsZero()); | 109 EXPECT_TRUE(zero_ipv4_address.IsZero()); |
| 82 | 110 |
| 83 uint8_t address2[4] = {10}; | 111 uint8_t address2[4] = {10}; |
| 84 IPAddress non_zero_ipv4_address(address2); | 112 IPAddress non_zero_ipv4_address(address2); |
| 85 EXPECT_FALSE(non_zero_ipv4_address.IsZero()); | 113 EXPECT_FALSE(non_zero_ipv4_address.IsZero()); |
| 86 | 114 |
| 87 uint8_t address3[16] = {}; | 115 uint8_t address3[16] = {}; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 245 IPAddress ipv4mapped_address; | 273 IPAddress ipv4mapped_address; |
| 246 EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:c0a8:1")); | 274 EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:c0a8:1")); |
| 247 | 275 |
| 248 IPAddress expected; | 276 IPAddress expected; |
| 249 EXPECT_TRUE(expected.AssignFromIPLiteral("192.168.0.1")); | 277 EXPECT_TRUE(expected.AssignFromIPLiteral("192.168.0.1")); |
| 250 | 278 |
| 251 IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_address); | 279 IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_address); |
| 252 EXPECT_EQ(expected, result); | 280 EXPECT_EQ(expected, result); |
| 253 } | 281 } |
| 254 | 282 |
| 283 TEST(IPAddressTest, IPAddressMatchesPrefix) { | |
|
martijnc
2016/04/11 22:02:09
Tests from net/base/ip_address_number_unittest.cc.
| |
| 284 struct { | |
| 285 const char* const cidr_literal; | |
| 286 size_t prefix_length_in_bits; | |
| 287 const char* const ip_literal; | |
| 288 bool expected_to_match; | |
| 289 } tests[] = { | |
| 290 // IPv4 prefix with IPv4 inputs. | |
| 291 {"10.10.1.32", 27, "10.10.1.44", true}, | |
| 292 {"10.10.1.32", 27, "10.10.1.90", false}, | |
| 293 {"10.10.1.32", 27, "10.10.1.90", false}, | |
| 294 | |
| 295 // IPv6 prefix with IPv6 inputs. | |
| 296 {"2001:db8::", 32, "2001:DB8:3:4::5", true}, | |
| 297 {"2001:db8::", 32, "2001:c8::", false}, | |
| 298 | |
| 299 // IPv6 prefix with IPv4 inputs. | |
| 300 {"2001:db8::", 33, "192.168.0.1", false}, | |
| 301 {"::ffff:192.168.0.1", 112, "192.168.33.77", true}, | |
| 302 | |
| 303 // IPv4 prefix with IPv6 inputs. | |
| 304 {"10.11.33.44", 16, "::ffff:0a0b:89", true}, | |
| 305 {"10.11.33.44", 16, "::ffff:10.12.33.44", false}, | |
| 306 }; | |
| 307 for (size_t i = 0; i < arraysize(tests); ++i) { | |
| 308 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i, | |
| 309 tests[i].cidr_literal, | |
| 310 tests[i].ip_literal)); | |
| 311 | |
| 312 IPAddress ip_address; | |
| 313 EXPECT_TRUE(ip_address.AssignFromIPLiteral(tests[i].ip_literal)); | |
| 314 | |
| 315 IPAddress ip_prefix; | |
| 316 EXPECT_TRUE(ip_prefix.AssignFromIPLiteral(tests[i].cidr_literal)); | |
| 317 | |
| 318 EXPECT_EQ(tests[i].expected_to_match, | |
| 319 IPAddressMatchesPrefix(ip_address, ip_prefix, | |
| 320 tests[i].prefix_length_in_bits)); | |
| 321 } | |
| 322 } | |
| 323 | |
| 255 // Test parsing invalid CIDR notation literals. | 324 // Test parsing invalid CIDR notation literals. |
| 256 TEST(IPAddressTest, ParseCIDRBlock_Invalid) { | 325 TEST(IPAddressTest, ParseCIDRBlock_Invalid) { |
| 257 const char* const bad_literals[] = {"foobar", | 326 const char* const bad_literals[] = {"foobar", |
| 258 "", | 327 "", |
| 259 "192.168.0.1", | 328 "192.168.0.1", |
| 260 "::1", | 329 "::1", |
| 261 "/", | 330 "/", |
| 262 "/1", | 331 "/1", |
| 263 "1", | 332 "1", |
| 264 "192.168.1.1/-1", | 333 "192.168.1.1/-1", |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 360 | 429 |
| 361 // Prefix is longer than the address. | 430 // Prefix is longer than the address. |
| 362 uint8_t ipv6_prefix5[] = {42, 0, 20, 80, 64, 12, 12, 9, 0, | 431 uint8_t ipv6_prefix5[] = {42, 0, 20, 80, 64, 12, 12, 9, 0, |
| 363 0, 0, 0, 0, 0, 0, 0, 10}; | 432 0, 0, 0, 0, 0, 0, 0, 10}; |
| 364 EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix5)); | 433 EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix5)); |
| 365 } | 434 } |
| 366 | 435 |
| 367 } // anonymous namespace | 436 } // anonymous namespace |
| 368 | 437 |
| 369 } // namespace net | 438 } // namespace net |
| OLD | NEW |