blob: f0f196ff5798e37c8a774b9c4cfe09594a32e360 [file] [log] [blame]
bncf98d2192019-04-30 12:17:21 -07001// Copyright (c) 2019 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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/platform/api/quic_ip_address.h"
bncf98d2192019-04-30 12:17:21 -07006
7#include <cstdint>
8
QUICHE team5be974e2020-12-29 18:35:24 -05009#include "quic/platform/api/quic_test.h"
bncf98d2192019-04-30 12:17:21 -070010
11namespace quic {
12namespace test {
13namespace {
14
15TEST(QuicIpAddressTest, IPv4) {
16 QuicIpAddress ip_address;
17 EXPECT_FALSE(ip_address.IsInitialized());
18
19 EXPECT_TRUE(ip_address.FromString("127.0.52.223"));
20 EXPECT_TRUE(ip_address.IsInitialized());
21
22 EXPECT_EQ(IpAddressFamily::IP_V4, ip_address.address_family());
23 EXPECT_TRUE(ip_address.IsIPv4());
24 EXPECT_FALSE(ip_address.IsIPv6());
25
26 EXPECT_EQ("127.0.52.223", ip_address.ToString());
27 const in_addr v4_address = ip_address.GetIPv4();
28 const uint8_t* const v4_address_ptr =
29 reinterpret_cast<const uint8_t*>(&v4_address);
30 EXPECT_EQ(127u, *(v4_address_ptr + 0));
31 EXPECT_EQ(0u, *(v4_address_ptr + 1));
32 EXPECT_EQ(52u, *(v4_address_ptr + 2));
33 EXPECT_EQ(223u, *(v4_address_ptr + 3));
34}
35
36TEST(QuicIpAddressTest, IPv6) {
37 QuicIpAddress ip_address;
38 EXPECT_FALSE(ip_address.IsInitialized());
39
40 EXPECT_TRUE(ip_address.FromString("fe80::1ff:fe23:4567"));
41 EXPECT_TRUE(ip_address.IsInitialized());
42
43 EXPECT_EQ(IpAddressFamily::IP_V6, ip_address.address_family());
44 EXPECT_FALSE(ip_address.IsIPv4());
45 EXPECT_TRUE(ip_address.IsIPv6());
46
47 EXPECT_EQ("fe80::1ff:fe23:4567", ip_address.ToString());
48 const in6_addr v6_address = ip_address.GetIPv6();
49 const uint16_t* const v6_address_ptr =
50 reinterpret_cast<const uint16_t*>(&v6_address);
51 EXPECT_EQ(0x80feu, *(v6_address_ptr + 0));
52 EXPECT_EQ(0x0000u, *(v6_address_ptr + 1));
53 EXPECT_EQ(0x0000u, *(v6_address_ptr + 2));
54 EXPECT_EQ(0x0000u, *(v6_address_ptr + 3));
55 EXPECT_EQ(0x0000u, *(v6_address_ptr + 4));
56 EXPECT_EQ(0xff01u, *(v6_address_ptr + 5));
57 EXPECT_EQ(0x23feu, *(v6_address_ptr + 6));
58 EXPECT_EQ(0x6745u, *(v6_address_ptr + 7));
vasilvv0dfdc0b2019-06-05 21:14:45 -070059
60 EXPECT_EQ(ip_address, ip_address.Normalized());
61 EXPECT_EQ(ip_address, ip_address.DualStacked());
62}
63
64TEST(QuicIpAddressTest, FromPackedString) {
65 QuicIpAddress loopback4, loopback6;
66 const char loopback4_packed[] = "\x7f\0\0\x01";
67 const char loopback6_packed[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01";
68 EXPECT_TRUE(loopback4.FromPackedString(loopback4_packed, 4));
69 EXPECT_TRUE(loopback6.FromPackedString(loopback6_packed, 16));
70 EXPECT_EQ(loopback4, QuicIpAddress::Loopback4());
71 EXPECT_EQ(loopback6, QuicIpAddress::Loopback6());
72}
73
74TEST(QuicIpAddressTest, MappedAddress) {
75 QuicIpAddress ipv4_address;
76 QuicIpAddress mapped_address;
77
78 EXPECT_TRUE(ipv4_address.FromString("127.0.0.1"));
79 EXPECT_TRUE(mapped_address.FromString("::ffff:7f00:1"));
80
81 EXPECT_EQ(mapped_address, ipv4_address.DualStacked());
82 EXPECT_EQ(ipv4_address, mapped_address.Normalized());
83}
84
85TEST(QuicIpAddressTest, Subnets) {
86 struct {
87 const char* address1;
88 const char* address2;
89 int subnet_size;
90 bool same_subnet;
91 } test_cases[] = {
92 {"127.0.0.1", "127.0.0.2", 24, true},
93 {"8.8.8.8", "127.0.0.1", 24, false},
94 {"8.8.8.8", "127.0.0.1", 16, false},
95 {"8.8.8.8", "127.0.0.1", 8, false},
96 {"8.8.8.8", "127.0.0.1", 2, false},
97 {"8.8.8.8", "127.0.0.1", 1, true},
98
99 {"127.0.0.1", "127.0.0.128", 24, true},
100 {"127.0.0.1", "127.0.0.128", 25, false},
101 {"127.0.0.1", "127.0.0.127", 25, true},
102
103 {"127.0.0.1", "127.0.0.0", 30, true},
104 {"127.0.0.1", "127.0.0.1", 30, true},
105 {"127.0.0.1", "127.0.0.2", 30, true},
106 {"127.0.0.1", "127.0.0.3", 30, true},
107 {"127.0.0.1", "127.0.0.4", 30, false},
108
109 {"127.0.0.1", "127.0.0.2", 31, false},
110 {"127.0.0.1", "127.0.0.0", 31, true},
111
112 {"::1", "fe80::1", 8, false},
113 {"::1", "fe80::1", 1, false},
114 {"::1", "fe80::1", 0, true},
115 {"fe80::1", "fe80::2", 126, true},
116 {"fe80::1", "fe80::2", 127, false},
117 };
118
119 for (const auto& test_case : test_cases) {
120 QuicIpAddress address1, address2;
121 ASSERT_TRUE(address1.FromString(test_case.address1));
122 ASSERT_TRUE(address2.FromString(test_case.address2));
123 EXPECT_EQ(test_case.same_subnet,
124 address1.InSameSubnet(address2, test_case.subnet_size))
125 << "Addresses: " << test_case.address1 << ", " << test_case.address2
126 << "; subnet: /" << test_case.subnet_size;
127 }
128}
129
130TEST(QuicIpAddress, LoopbackAddresses) {
131 QuicIpAddress loopback4;
132 QuicIpAddress loopback6;
133 ASSERT_TRUE(loopback4.FromString("127.0.0.1"));
134 ASSERT_TRUE(loopback6.FromString("::1"));
135 EXPECT_EQ(loopback4, QuicIpAddress::Loopback4());
136 EXPECT_EQ(loopback6, QuicIpAddress::Loopback6());
bncf98d2192019-04-30 12:17:21 -0700137}
138
139} // namespace
140} // namespace test
141} // namespace quic