summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quiche/common/quiche_ip_address_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quiche/common/quiche_ip_address_test.cc')
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_ip_address_test.cc142
1 files changed, 142 insertions, 0 deletions
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_ip_address_test.cc b/chromium/net/third_party/quiche/src/quiche/common/quiche_ip_address_test.cc
new file mode 100644
index 00000000000..609b6b250fd
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_ip_address_test.cc
@@ -0,0 +1,142 @@
+// Copyright (c) 2019 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 "quiche/common/quiche_ip_address.h"
+
+#include <cstdint>
+
+#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/common/quiche_ip_address_family.h"
+
+namespace quiche {
+namespace test {
+namespace {
+
+TEST(QuicheIpAddressTest, IPv4) {
+ QuicheIpAddress ip_address;
+ EXPECT_FALSE(ip_address.IsInitialized());
+
+ EXPECT_TRUE(ip_address.FromString("127.0.52.223"));
+ EXPECT_TRUE(ip_address.IsInitialized());
+
+ EXPECT_EQ(IpAddressFamily::IP_V4, ip_address.address_family());
+ EXPECT_TRUE(ip_address.IsIPv4());
+ EXPECT_FALSE(ip_address.IsIPv6());
+
+ EXPECT_EQ("127.0.52.223", ip_address.ToString());
+ const in_addr v4_address = ip_address.GetIPv4();
+ const uint8_t* const v4_address_ptr =
+ reinterpret_cast<const uint8_t*>(&v4_address);
+ EXPECT_EQ(127u, *(v4_address_ptr + 0));
+ EXPECT_EQ(0u, *(v4_address_ptr + 1));
+ EXPECT_EQ(52u, *(v4_address_ptr + 2));
+ EXPECT_EQ(223u, *(v4_address_ptr + 3));
+}
+
+TEST(QuicheIpAddressTest, IPv6) {
+ QuicheIpAddress ip_address;
+ EXPECT_FALSE(ip_address.IsInitialized());
+
+ EXPECT_TRUE(ip_address.FromString("fe80::1ff:fe23:4567"));
+ EXPECT_TRUE(ip_address.IsInitialized());
+
+ EXPECT_EQ(IpAddressFamily::IP_V6, ip_address.address_family());
+ EXPECT_FALSE(ip_address.IsIPv4());
+ EXPECT_TRUE(ip_address.IsIPv6());
+
+ EXPECT_EQ("fe80::1ff:fe23:4567", ip_address.ToString());
+ const in6_addr v6_address = ip_address.GetIPv6();
+ const uint16_t* const v6_address_ptr =
+ reinterpret_cast<const uint16_t*>(&v6_address);
+ EXPECT_EQ(0x80feu, *(v6_address_ptr + 0));
+ EXPECT_EQ(0x0000u, *(v6_address_ptr + 1));
+ EXPECT_EQ(0x0000u, *(v6_address_ptr + 2));
+ EXPECT_EQ(0x0000u, *(v6_address_ptr + 3));
+ EXPECT_EQ(0x0000u, *(v6_address_ptr + 4));
+ EXPECT_EQ(0xff01u, *(v6_address_ptr + 5));
+ EXPECT_EQ(0x23feu, *(v6_address_ptr + 6));
+ EXPECT_EQ(0x6745u, *(v6_address_ptr + 7));
+
+ EXPECT_EQ(ip_address, ip_address.Normalized());
+ EXPECT_EQ(ip_address, ip_address.DualStacked());
+}
+
+TEST(QuicheIpAddressTest, FromPackedString) {
+ QuicheIpAddress loopback4, loopback6;
+ const char loopback4_packed[] = "\x7f\0\0\x01";
+ const char loopback6_packed[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01";
+ EXPECT_TRUE(loopback4.FromPackedString(loopback4_packed, 4));
+ EXPECT_TRUE(loopback6.FromPackedString(loopback6_packed, 16));
+ EXPECT_EQ(loopback4, QuicheIpAddress::Loopback4());
+ EXPECT_EQ(loopback6, QuicheIpAddress::Loopback6());
+}
+
+TEST(QuicheIpAddressTest, MappedAddress) {
+ QuicheIpAddress ipv4_address;
+ QuicheIpAddress mapped_address;
+
+ EXPECT_TRUE(ipv4_address.FromString("127.0.0.1"));
+ EXPECT_TRUE(mapped_address.FromString("::ffff:7f00:1"));
+
+ EXPECT_EQ(mapped_address, ipv4_address.DualStacked());
+ EXPECT_EQ(ipv4_address, mapped_address.Normalized());
+}
+
+TEST(QuicheIpAddressTest, Subnets) {
+ struct {
+ const char* address1;
+ const char* address2;
+ int subnet_size;
+ bool same_subnet;
+ } test_cases[] = {
+ {"127.0.0.1", "127.0.0.2", 24, true},
+ {"8.8.8.8", "127.0.0.1", 24, false},
+ {"8.8.8.8", "127.0.0.1", 16, false},
+ {"8.8.8.8", "127.0.0.1", 8, false},
+ {"8.8.8.8", "127.0.0.1", 2, false},
+ {"8.8.8.8", "127.0.0.1", 1, true},
+
+ {"127.0.0.1", "127.0.0.128", 24, true},
+ {"127.0.0.1", "127.0.0.128", 25, false},
+ {"127.0.0.1", "127.0.0.127", 25, true},
+
+ {"127.0.0.1", "127.0.0.0", 30, true},
+ {"127.0.0.1", "127.0.0.1", 30, true},
+ {"127.0.0.1", "127.0.0.2", 30, true},
+ {"127.0.0.1", "127.0.0.3", 30, true},
+ {"127.0.0.1", "127.0.0.4", 30, false},
+
+ {"127.0.0.1", "127.0.0.2", 31, false},
+ {"127.0.0.1", "127.0.0.0", 31, true},
+
+ {"::1", "fe80::1", 8, false},
+ {"::1", "fe80::1", 1, false},
+ {"::1", "fe80::1", 0, true},
+ {"fe80::1", "fe80::2", 126, true},
+ {"fe80::1", "fe80::2", 127, false},
+ };
+
+ for (const auto& test_case : test_cases) {
+ QuicheIpAddress address1, address2;
+ ASSERT_TRUE(address1.FromString(test_case.address1));
+ ASSERT_TRUE(address2.FromString(test_case.address2));
+ EXPECT_EQ(test_case.same_subnet,
+ address1.InSameSubnet(address2, test_case.subnet_size))
+ << "Addresses: " << test_case.address1 << ", " << test_case.address2
+ << "; subnet: /" << test_case.subnet_size;
+ }
+}
+
+TEST(QuicheIpAddress, LoopbackAddresses) {
+ QuicheIpAddress loopback4;
+ QuicheIpAddress loopback6;
+ ASSERT_TRUE(loopback4.FromString("127.0.0.1"));
+ ASSERT_TRUE(loopback6.FromString("::1"));
+ EXPECT_EQ(loopback4, QuicheIpAddress::Loopback4());
+ EXPECT_EQ(loopback6, QuicheIpAddress::Loopback6());
+}
+
+} // namespace
+} // namespace test
+} // namespace quiche