Chromium Code Reviews| 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..a0e39ce918b7ed294612ab52fbeea7bcfe86f62b |
| --- /dev/null |
| +++ b/net/base/ip_address_unittest.cc |
| @@ -0,0 +1,138 @@ |
| +// 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 { |
| + |
| +class IPAddressTest : public testing::Test { |
|
eroman
2015/11/30 22:12:33
Note that this class is a test fixture, however it
martijnc
2015/12/01 22:09:34
Done.
|
| + public: |
| + // Helper to strignize an IP number (used to define expectations). |
|
eroman
2015/11/30 22:12:33
typo: stringize
martijnc
2015/12/01 22:09:34
Done.
|
| + 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]))); |
|
eroman
2015/11/30 22:12:33
I realize this is moving existing code, however ca
martijnc
2015/12/01 22:09:34
Done.
|
| + } |
| + return out; |
| + } |
| + |
| + static IPAddress ArrayToIPAdress(uint8_t address[], size_t length) { |
|
eroman
2015/11/30 22:12:33
How about instead using some template magic:
temp
martijnc
2015/12/01 22:09:34
Done.
|
| + IPAddress ip_address(address, length); |
| + return ip_address; |
| + } |
| +}; |
| + |
| +namespace { |
|
eroman
2015/11/30 22:12:33
Move this up to contain the helper functions above
martijnc
2015/12/01 22:09:34
Done.
|
| + |
| +TEST(IPAddressTest, IsIPVersion) { |
| + uint8_t addr1[4] = {192, 168, 0, 1}; |
| + IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1)); |
| + EXPECT_TRUE(ip_address1.IsIPv4()); |
| + EXPECT_FALSE(ip_address1.IsIPv6()); |
| + |
| + uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98}; |
| + IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2)); |
| + EXPECT_TRUE(ip_address2.IsIPv6()); |
| + EXPECT_FALSE(ip_address2.IsIPv4()); |
| + |
| + IPAddress ip_address3 = IPAddress(); |
| + EXPECT_FALSE(ip_address3.IsIPv6()); |
| + EXPECT_FALSE(ip_address3.IsIPv4()); |
| +} |
| + |
| +TEST(IPAddressTest, ToString) { |
| + 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 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(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, 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); |
| +} |
| + |
| +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); |
| +} |
| + |
| +} // anonymous namespace |
| + |
| +} // namespace net |