xref: /aosp_15_r20/external/cronet/net/base/ip_address_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker #include <vector>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/format_macros.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
14*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker using testing::Optional;
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace net {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // Helper to stringize an IP address (used to define expectations).
DumpIPAddress(const IPAddress & v)23*6777b538SAndroid Build Coastguard Worker std::string DumpIPAddress(const IPAddress& v) {
24*6777b538SAndroid Build Coastguard Worker   std::string out;
25*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < v.bytes().size(); ++i) {
26*6777b538SAndroid Build Coastguard Worker     if (i != 0)
27*6777b538SAndroid Build Coastguard Worker       out.append(",");
28*6777b538SAndroid Build Coastguard Worker     out.append(base::NumberToString(v.bytes()[i]));
29*6777b538SAndroid Build Coastguard Worker   }
30*6777b538SAndroid Build Coastguard Worker   return out;
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressBytesTest,ConstructEmpty)33*6777b538SAndroid Build Coastguard Worker TEST(IPAddressBytesTest, ConstructEmpty) {
34*6777b538SAndroid Build Coastguard Worker   IPAddressBytes bytes;
35*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0u, bytes.size());
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressBytesTest,ConstructIPv4)38*6777b538SAndroid Build Coastguard Worker TEST(IPAddressBytesTest, ConstructIPv4) {
39*6777b538SAndroid Build Coastguard Worker   uint8_t data[] = {192, 168, 1, 1};
40*6777b538SAndroid Build Coastguard Worker   IPAddressBytes bytes(data);
41*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::size(data), bytes.size());
42*6777b538SAndroid Build Coastguard Worker   size_t i = 0;
43*6777b538SAndroid Build Coastguard Worker   for (uint8_t byte : bytes)
44*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(data[i++], byte);
45*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::size(data), i);
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressBytesTest,ConstructIPv6)48*6777b538SAndroid Build Coastguard Worker TEST(IPAddressBytesTest, ConstructIPv6) {
49*6777b538SAndroid Build Coastguard Worker   uint8_t data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
50*6777b538SAndroid Build Coastguard Worker   IPAddressBytes bytes(data);
51*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::size(data), bytes.size());
52*6777b538SAndroid Build Coastguard Worker   size_t i = 0;
53*6777b538SAndroid Build Coastguard Worker   for (uint8_t byte : bytes)
54*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(data[i++], byte);
55*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::size(data), i);
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressBytesTest,Assign)58*6777b538SAndroid Build Coastguard Worker TEST(IPAddressBytesTest, Assign) {
59*6777b538SAndroid Build Coastguard Worker   uint8_t data[] = {192, 168, 1, 1};
60*6777b538SAndroid Build Coastguard Worker   IPAddressBytes copy;
61*6777b538SAndroid Build Coastguard Worker   copy.Assign(data);
62*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(IPAddressBytes(data), copy);
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,ConstructIPv4)65*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ConstructIPv4) {
66*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("127.0.0.1", IPAddress::IPv4Localhost().ToString());
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_ctor(192, 168, 1, 1);
69*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192.168.1.1", ipv4_ctor.ToString());
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsIPVersion)72*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsIPVersion) {
73*6777b538SAndroid Build Coastguard Worker   uint8_t addr1[4] = {192, 168, 0, 1};
74*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address1(addr1);
75*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1.IsIPv4());
76*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address1.IsIPv6());
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98};
79*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address2(addr2);
80*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address2.IsIPv6());
81*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address2.IsIPv4());
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address3;
84*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address3.IsIPv6());
85*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address3.IsIPv4());
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsValid)88*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsValid) {
89*6777b538SAndroid Build Coastguard Worker   uint8_t addr1[4] = {192, 168, 0, 1};
90*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address1(addr1);
91*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1.IsValid());
92*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address1.empty());
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   uint8_t addr2[16] = {0xFE, 0xDC, 0xBA, 0x98};
95*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address2(addr2);
96*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address2.IsValid());
97*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address2.empty());
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   uint8_t addr3[5] = {0xFE, 0xDC, 0xBA, 0x98};
100*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address3(addr3);
101*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address3.IsValid());
102*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address3.empty());
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address4;
105*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address4.IsValid());
106*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address4.empty());
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker enum IPAddressReservedResult : bool { NOT_RESERVED = false, RESERVED = true };
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker // Tests for the reserved IPv4 ranges and the (unreserved) blocks in between.
112*6777b538SAndroid Build Coastguard Worker // The reserved ranges are tested by checking the first and last address of each
113*6777b538SAndroid Build Coastguard Worker // range. The unreserved blocks are tested similarly. These tests cover the
114*6777b538SAndroid Build Coastguard Worker // entire IPv4 address range, as well as this range mapped to IPv6.
TEST(IPAddressTest,IsPubliclyRoutableIPv4)115*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsPubliclyRoutableIPv4) {
116*6777b538SAndroid Build Coastguard Worker   struct {
117*6777b538SAndroid Build Coastguard Worker     const char* const address;
118*6777b538SAndroid Build Coastguard Worker     IPAddressReservedResult is_reserved;
119*6777b538SAndroid Build Coastguard Worker   } tests[] = {// 0.0.0.0/8
120*6777b538SAndroid Build Coastguard Worker                {"0.0.0.0", RESERVED},
121*6777b538SAndroid Build Coastguard Worker                {"0.255.255.255", RESERVED},
122*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
123*6777b538SAndroid Build Coastguard Worker                {"1.0.0.0", NOT_RESERVED},
124*6777b538SAndroid Build Coastguard Worker                {"9.255.255.255", NOT_RESERVED},
125*6777b538SAndroid Build Coastguard Worker                // 10.0.0.0/8
126*6777b538SAndroid Build Coastguard Worker                {"10.0.0.0", RESERVED},
127*6777b538SAndroid Build Coastguard Worker                {"10.255.255.255", RESERVED},
128*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
129*6777b538SAndroid Build Coastguard Worker                {"11.0.0.0", NOT_RESERVED},
130*6777b538SAndroid Build Coastguard Worker                {"100.63.255.255", NOT_RESERVED},
131*6777b538SAndroid Build Coastguard Worker                // 100.64.0.0/10
132*6777b538SAndroid Build Coastguard Worker                {"100.64.0.0", RESERVED},
133*6777b538SAndroid Build Coastguard Worker                {"100.127.255.255", RESERVED},
134*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
135*6777b538SAndroid Build Coastguard Worker                {"100.128.0.0", NOT_RESERVED},
136*6777b538SAndroid Build Coastguard Worker                {"126.255.255.255", NOT_RESERVED},
137*6777b538SAndroid Build Coastguard Worker                // 127.0.0.0/8
138*6777b538SAndroid Build Coastguard Worker                {"127.0.0.0", RESERVED},
139*6777b538SAndroid Build Coastguard Worker                {"127.255.255.255", RESERVED},
140*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
141*6777b538SAndroid Build Coastguard Worker                {"128.0.0.0", NOT_RESERVED},
142*6777b538SAndroid Build Coastguard Worker                {"169.253.255.255", NOT_RESERVED},
143*6777b538SAndroid Build Coastguard Worker                // 169.254.0.0/16
144*6777b538SAndroid Build Coastguard Worker                {"169.254.0.0", RESERVED},
145*6777b538SAndroid Build Coastguard Worker                {"169.254.255.255", RESERVED},
146*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
147*6777b538SAndroid Build Coastguard Worker                {"169.255.0.0", NOT_RESERVED},
148*6777b538SAndroid Build Coastguard Worker                {"172.15.255.255", NOT_RESERVED},
149*6777b538SAndroid Build Coastguard Worker                // 172.16.0.0/12
150*6777b538SAndroid Build Coastguard Worker                {"172.16.0.0", RESERVED},
151*6777b538SAndroid Build Coastguard Worker                {"172.31.255.255", RESERVED},
152*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
153*6777b538SAndroid Build Coastguard Worker                {"172.32.0.0", NOT_RESERVED},
154*6777b538SAndroid Build Coastguard Worker                {"191.255.255.255", NOT_RESERVED},
155*6777b538SAndroid Build Coastguard Worker                // 192.0.0.0/24 (including sub ranges)
156*6777b538SAndroid Build Coastguard Worker                {"192.0.0.0", RESERVED},
157*6777b538SAndroid Build Coastguard Worker                {"192.0.0.255", RESERVED},
158*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
159*6777b538SAndroid Build Coastguard Worker                {"192.0.1.0", NOT_RESERVED},
160*6777b538SAndroid Build Coastguard Worker                {"192.0.1.255", NOT_RESERVED},
161*6777b538SAndroid Build Coastguard Worker                // 192.0.2.0/24
162*6777b538SAndroid Build Coastguard Worker                {"192.0.2.0", RESERVED},
163*6777b538SAndroid Build Coastguard Worker                {"192.0.2.255", RESERVED},
164*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
165*6777b538SAndroid Build Coastguard Worker                {"192.0.3.0", NOT_RESERVED},
166*6777b538SAndroid Build Coastguard Worker                {"192.31.195.255", NOT_RESERVED},
167*6777b538SAndroid Build Coastguard Worker                // 192.31.196.0/24
168*6777b538SAndroid Build Coastguard Worker                {"192.31.196.0", NOT_RESERVED},
169*6777b538SAndroid Build Coastguard Worker                {"192.31.196.255", NOT_RESERVED},
170*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
171*6777b538SAndroid Build Coastguard Worker                {"192.32.197.0", NOT_RESERVED},
172*6777b538SAndroid Build Coastguard Worker                {"192.52.192.255", NOT_RESERVED},
173*6777b538SAndroid Build Coastguard Worker                // 192.52.193.0/24
174*6777b538SAndroid Build Coastguard Worker                {"192.52.193.0", NOT_RESERVED},
175*6777b538SAndroid Build Coastguard Worker                {"192.52.193.255", NOT_RESERVED},
176*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
177*6777b538SAndroid Build Coastguard Worker                {"192.52.194.0", NOT_RESERVED},
178*6777b538SAndroid Build Coastguard Worker                {"192.88.98.255", NOT_RESERVED},
179*6777b538SAndroid Build Coastguard Worker                // 192.88.99.0/24
180*6777b538SAndroid Build Coastguard Worker                {"192.88.99.0", RESERVED},
181*6777b538SAndroid Build Coastguard Worker                {"192.88.99.255", RESERVED},
182*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
183*6777b538SAndroid Build Coastguard Worker                {"192.88.100.0", NOT_RESERVED},
184*6777b538SAndroid Build Coastguard Worker                {"192.167.255.255", NOT_RESERVED},
185*6777b538SAndroid Build Coastguard Worker                // 192.168.0.0/16
186*6777b538SAndroid Build Coastguard Worker                {"192.168.0.0", RESERVED},
187*6777b538SAndroid Build Coastguard Worker                {"192.168.255.255", RESERVED},
188*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
189*6777b538SAndroid Build Coastguard Worker                {"192.169.0.0", NOT_RESERVED},
190*6777b538SAndroid Build Coastguard Worker                {"192.175.47.255", NOT_RESERVED},
191*6777b538SAndroid Build Coastguard Worker                // 192.175.48.0/24
192*6777b538SAndroid Build Coastguard Worker                {"192.175.48.0", NOT_RESERVED},
193*6777b538SAndroid Build Coastguard Worker                {"192.175.48.255", NOT_RESERVED},
194*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
195*6777b538SAndroid Build Coastguard Worker                {"192.175.49.0", NOT_RESERVED},
196*6777b538SAndroid Build Coastguard Worker                {"198.17.255.255", NOT_RESERVED},
197*6777b538SAndroid Build Coastguard Worker                // 198.18.0.0/15
198*6777b538SAndroid Build Coastguard Worker                {"198.18.0.0", RESERVED},
199*6777b538SAndroid Build Coastguard Worker                {"198.19.255.255", RESERVED},
200*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
201*6777b538SAndroid Build Coastguard Worker                {"198.20.0.0", NOT_RESERVED},
202*6777b538SAndroid Build Coastguard Worker                {"198.51.99.255", NOT_RESERVED},
203*6777b538SAndroid Build Coastguard Worker                // 198.51.100.0/24
204*6777b538SAndroid Build Coastguard Worker                {"198.51.100.0", RESERVED},
205*6777b538SAndroid Build Coastguard Worker                {"198.51.100.255", RESERVED},
206*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
207*6777b538SAndroid Build Coastguard Worker                {"198.51.101.0", NOT_RESERVED},
208*6777b538SAndroid Build Coastguard Worker                {"203.0.112.255", NOT_RESERVED},
209*6777b538SAndroid Build Coastguard Worker                // 203.0.113.0/24
210*6777b538SAndroid Build Coastguard Worker                {"203.0.113.0", RESERVED},
211*6777b538SAndroid Build Coastguard Worker                {"203.0.113.255", RESERVED},
212*6777b538SAndroid Build Coastguard Worker                // Unreserved block(s)
213*6777b538SAndroid Build Coastguard Worker                {"203.0.114.0", NOT_RESERVED},
214*6777b538SAndroid Build Coastguard Worker                {"223.255.255.255", NOT_RESERVED},
215*6777b538SAndroid Build Coastguard Worker                // 224.0.0.0/8 - 255.0.0.0/8
216*6777b538SAndroid Build Coastguard Worker                {"224.0.0.0", RESERVED},
217*6777b538SAndroid Build Coastguard Worker                {"255.255.255.255", RESERVED}};
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker   for (const auto& test : tests) {
220*6777b538SAndroid Build Coastguard Worker     IPAddress address;
221*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(address.AssignFromIPLiteral(test.address));
222*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(address.IsValid());
223*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(!test.is_reserved, address.IsPubliclyRoutable());
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker     // Check these IPv4 addresses when mapped to IPv6. This verifies we're
226*6777b538SAndroid Build Coastguard Worker     // properly unpacking mapped addresses.
227*6777b538SAndroid Build Coastguard Worker     IPAddress mapped_address = ConvertIPv4ToIPv4MappedIPv6(address);
228*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(!test.is_reserved, mapped_address.IsPubliclyRoutable());
229*6777b538SAndroid Build Coastguard Worker   }
230*6777b538SAndroid Build Coastguard Worker }
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker // Tests for the reserved IPv6 ranges and the (unreserved) blocks in between.
233*6777b538SAndroid Build Coastguard Worker // The reserved ranges are tested by checking the first and last address of each
234*6777b538SAndroid Build Coastguard Worker // range. The unreserved blocks are tested similarly. These tests cover the
235*6777b538SAndroid Build Coastguard Worker // entire IPv6 address range.
TEST(IPAddressTest,IsPubliclyRoutableIPv6)236*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsPubliclyRoutableIPv6) {
237*6777b538SAndroid Build Coastguard Worker   struct {
238*6777b538SAndroid Build Coastguard Worker     const char* const address;
239*6777b538SAndroid Build Coastguard Worker     IPAddressReservedResult is_reserved;
240*6777b538SAndroid Build Coastguard Worker   } tests[] = {// 0000::/8.
241*6777b538SAndroid Build Coastguard Worker                // Skip testing ::ffff:/96 explicitly since it was tested
242*6777b538SAndroid Build Coastguard Worker                // in IsPubliclyRoutableIPv4
243*6777b538SAndroid Build Coastguard Worker                {"0:0:0:0:0:0:0:0", RESERVED},
244*6777b538SAndroid Build Coastguard Worker                {"ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
245*6777b538SAndroid Build Coastguard Worker                // 0100::/8
246*6777b538SAndroid Build Coastguard Worker                {"100:0:0:0:0:0:0:0", RESERVED},
247*6777b538SAndroid Build Coastguard Worker                {"1ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
248*6777b538SAndroid Build Coastguard Worker                // 0200::/7
249*6777b538SAndroid Build Coastguard Worker                {"200:0:0:0:0:0:0:0", RESERVED},
250*6777b538SAndroid Build Coastguard Worker                {"3ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
251*6777b538SAndroid Build Coastguard Worker                // 0400::/6
252*6777b538SAndroid Build Coastguard Worker                {"400:0:0:0:0:0:0:0", RESERVED},
253*6777b538SAndroid Build Coastguard Worker                {"7ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
254*6777b538SAndroid Build Coastguard Worker                // 0800::/5
255*6777b538SAndroid Build Coastguard Worker                {"800:0:0:0:0:0:0:0", RESERVED},
256*6777b538SAndroid Build Coastguard Worker                {"fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
257*6777b538SAndroid Build Coastguard Worker                // 1000::/4
258*6777b538SAndroid Build Coastguard Worker                {"1000:0:0:0:0:0:0:0", RESERVED},
259*6777b538SAndroid Build Coastguard Worker                {"1fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
260*6777b538SAndroid Build Coastguard Worker                // 2000::/3 (Global Unicast)
261*6777b538SAndroid Build Coastguard Worker                {"2000:0:0:0:0:0:0:0", NOT_RESERVED},
262*6777b538SAndroid Build Coastguard Worker                {"3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", NOT_RESERVED},
263*6777b538SAndroid Build Coastguard Worker                // 4000::/3
264*6777b538SAndroid Build Coastguard Worker                {"4000:0:0:0:0:0:0:0", RESERVED},
265*6777b538SAndroid Build Coastguard Worker                {"5fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
266*6777b538SAndroid Build Coastguard Worker                // 6000::/3
267*6777b538SAndroid Build Coastguard Worker                {"6000:0:0:0:0:0:0:0", RESERVED},
268*6777b538SAndroid Build Coastguard Worker                {"7fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
269*6777b538SAndroid Build Coastguard Worker                // 8000::/3
270*6777b538SAndroid Build Coastguard Worker                {"8000:0:0:0:0:0:0:0", RESERVED},
271*6777b538SAndroid Build Coastguard Worker                {"9fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
272*6777b538SAndroid Build Coastguard Worker                // c000::/3
273*6777b538SAndroid Build Coastguard Worker                {"c000:0:0:0:0:0:0:0", RESERVED},
274*6777b538SAndroid Build Coastguard Worker                {"dfff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
275*6777b538SAndroid Build Coastguard Worker                // e000::/4
276*6777b538SAndroid Build Coastguard Worker                {"e000:0:0:0:0:0:0:0", RESERVED},
277*6777b538SAndroid Build Coastguard Worker                {"efff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
278*6777b538SAndroid Build Coastguard Worker                // f000::/5
279*6777b538SAndroid Build Coastguard Worker                {"f000:0:0:0:0:0:0:0", RESERVED},
280*6777b538SAndroid Build Coastguard Worker                {"f7ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
281*6777b538SAndroid Build Coastguard Worker                // f800::/6
282*6777b538SAndroid Build Coastguard Worker                {"f800:0:0:0:0:0:0:0", RESERVED},
283*6777b538SAndroid Build Coastguard Worker                {"fbff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
284*6777b538SAndroid Build Coastguard Worker                // fc00::/7
285*6777b538SAndroid Build Coastguard Worker                {"fc00:0:0:0:0:0:0:0", RESERVED},
286*6777b538SAndroid Build Coastguard Worker                {"fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
287*6777b538SAndroid Build Coastguard Worker                // fe00::/9
288*6777b538SAndroid Build Coastguard Worker                {"fe00:0:0:0:0:0:0:0", RESERVED},
289*6777b538SAndroid Build Coastguard Worker                {"fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
290*6777b538SAndroid Build Coastguard Worker                // fe80::/10
291*6777b538SAndroid Build Coastguard Worker                {"fe80:0:0:0:0:0:0:0", RESERVED},
292*6777b538SAndroid Build Coastguard Worker                {"febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
293*6777b538SAndroid Build Coastguard Worker                // fec0::/10
294*6777b538SAndroid Build Coastguard Worker                {"fec0:0:0:0:0:0:0:0", RESERVED},
295*6777b538SAndroid Build Coastguard Worker                {"feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", RESERVED},
296*6777b538SAndroid Build Coastguard Worker                // ff00::/8 (Multicast)
297*6777b538SAndroid Build Coastguard Worker                {"ff00:0:0:0:0:0:0:0", NOT_RESERVED},
298*6777b538SAndroid Build Coastguard Worker                {"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", NOT_RESERVED}};
299*6777b538SAndroid Build Coastguard Worker 
300*6777b538SAndroid Build Coastguard Worker   IPAddress address;
301*6777b538SAndroid Build Coastguard Worker   for (const auto& test : tests) {
302*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(address.AssignFromIPLiteral(test.address));
303*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(!test.is_reserved, address.IsPubliclyRoutable());
304*6777b538SAndroid Build Coastguard Worker   }
305*6777b538SAndroid Build Coastguard Worker }
306*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsZero)307*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsZero) {
308*6777b538SAndroid Build Coastguard Worker   uint8_t address1[4] = {};
309*6777b538SAndroid Build Coastguard Worker   IPAddress zero_ipv4_address(address1);
310*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(zero_ipv4_address.IsZero());
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker   uint8_t address2[4] = {10};
313*6777b538SAndroid Build Coastguard Worker   IPAddress non_zero_ipv4_address(address2);
314*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(non_zero_ipv4_address.IsZero());
315*6777b538SAndroid Build Coastguard Worker 
316*6777b538SAndroid Build Coastguard Worker   uint8_t address3[16] = {};
317*6777b538SAndroid Build Coastguard Worker   IPAddress zero_ipv6_address(address3);
318*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(zero_ipv6_address.IsZero());
319*6777b538SAndroid Build Coastguard Worker 
320*6777b538SAndroid Build Coastguard Worker   uint8_t address4[16] = {10};
321*6777b538SAndroid Build Coastguard Worker   IPAddress non_zero_ipv6_address(address4);
322*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(non_zero_ipv6_address.IsZero());
323*6777b538SAndroid Build Coastguard Worker 
324*6777b538SAndroid Build Coastguard Worker   IPAddress empty_address;
325*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(empty_address.IsZero());
326*6777b538SAndroid Build Coastguard Worker }
327*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsIPv4Mapped)328*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsIPv4Mapped) {
329*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_address(192, 168, 0, 1);
330*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ipv4_address.IsIPv4MappedIPv6());
331*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
332*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ipv6_address.IsIPv4MappedIPv6());
333*6777b538SAndroid Build Coastguard Worker   IPAddress mapped_address(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 1, 1, 0, 1);
334*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(mapped_address.IsIPv4MappedIPv6());
335*6777b538SAndroid Build Coastguard Worker }
336*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,AllZeros)337*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, AllZeros) {
338*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::AllZeros(0).empty());
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3u, IPAddress::AllZeros(3).size());
341*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::AllZeros(3).IsZero());
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0.0.0.0", IPAddress::IPv4AllZeros().ToString());
344*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("::", IPAddress::IPv6AllZeros().ToString());
345*6777b538SAndroid Build Coastguard Worker }
346*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,ToString)347*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ToString) {
348*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0.0.0.0", IPAddress::IPv4AllZeros().ToString());
349*6777b538SAndroid Build Coastguard Worker 
350*6777b538SAndroid Build Coastguard Worker   IPAddress address(192, 168, 0, 1);
351*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192.168.0.1", address.ToString());
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker   IPAddress address2(0xFE, 0xDC, 0xBA, 0x98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
354*6777b538SAndroid Build Coastguard Worker                      0);
355*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("fedc:ba98::", address2.ToString());
356*6777b538SAndroid Build Coastguard Worker 
357*6777b538SAndroid Build Coastguard Worker   // ToString() shouldn't crash on invalid addresses.
358*6777b538SAndroid Build Coastguard Worker   uint8_t addr4[2];
359*6777b538SAndroid Build Coastguard Worker   IPAddress address4(addr4);
360*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("", address4.ToString());
361*6777b538SAndroid Build Coastguard Worker 
362*6777b538SAndroid Build Coastguard Worker   IPAddress address5;
363*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("", address5.ToString());
364*6777b538SAndroid Build Coastguard Worker }
365*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IPAddressToStringWithPort)366*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IPAddressToStringWithPort) {
367*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0.0.0.0:3",
368*6777b538SAndroid Build Coastguard Worker             IPAddressToStringWithPort(IPAddress::IPv4AllZeros(), 3));
369*6777b538SAndroid Build Coastguard Worker 
370*6777b538SAndroid Build Coastguard Worker   IPAddress address1(192, 168, 0, 1);
371*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address1, 99));
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   IPAddress address2(0xFE, 0xDC, 0xBA, 0x98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
374*6777b538SAndroid Build Coastguard Worker                      0);
375*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address2, 8080));
376*6777b538SAndroid Build Coastguard Worker 
377*6777b538SAndroid Build Coastguard Worker   // IPAddressToStringWithPort() shouldn't crash on invalid addresses.
378*6777b538SAndroid Build Coastguard Worker   uint8_t addr3[2];
379*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("", IPAddressToStringWithPort(IPAddress(addr3), 8080));
380*6777b538SAndroid Build Coastguard Worker }
381*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IPAddressToPackedString)382*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IPAddressToPackedString) {
383*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_address;
384*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44"));
385*6777b538SAndroid Build Coastguard Worker   std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4);
386*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address));
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address;
389*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f"));
390*6777b538SAndroid Build Coastguard Worker   std::string expected_ipv6_address(
391*6777b538SAndroid Build Coastguard Worker       "\x20\x01\x07\x00\x03\x00\x18\x00"
392*6777b538SAndroid Build Coastguard Worker       "\x00\x00\x00\x00\x00\x00\x00\x0f",
393*6777b538SAndroid Build Coastguard Worker       16);
394*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address));
395*6777b538SAndroid Build Coastguard Worker }
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker // Test that invalid IP literals fail to parse.
TEST(IPAddressTest,AssignFromIPLiteral_FailParse)398*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, AssignFromIPLiteral_FailParse) {
399*6777b538SAndroid Build Coastguard Worker   IPAddress address;
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral("bad value"));
402*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral("bad:value"));
403*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral(std::string()));
404*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral("192.168.0.1:30"));
405*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral("  192.168.0.1  "));
406*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral("[::1]"));
407*6777b538SAndroid Build Coastguard Worker }
408*6777b538SAndroid Build Coastguard Worker 
409*6777b538SAndroid Build Coastguard Worker // Test that a failure calling AssignFromIPLiteral() has the sideffect of
410*6777b538SAndroid Build Coastguard Worker // clearing the current value.
TEST(IPAddressTest,AssignFromIPLiteral_ResetOnFailure)411*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, AssignFromIPLiteral_ResetOnFailure) {
412*6777b538SAndroid Build Coastguard Worker   IPAddress address = IPAddress::IPv6Localhost();
413*6777b538SAndroid Build Coastguard Worker 
414*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(address.IsValid());
415*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.empty());
416*6777b538SAndroid Build Coastguard Worker 
417*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.AssignFromIPLiteral("bad value"));
418*6777b538SAndroid Build Coastguard Worker 
419*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(address.IsValid());
420*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(address.empty());
421*6777b538SAndroid Build Coastguard Worker }
422*6777b538SAndroid Build Coastguard Worker 
423*6777b538SAndroid Build Coastguard Worker // Test parsing an IPv4 literal.
TEST(IPAddressTest,AssignFromIPLiteral_IPv4)424*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, AssignFromIPLiteral_IPv4) {
425*6777b538SAndroid Build Coastguard Worker   IPAddress address;
426*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(address.AssignFromIPLiteral("192.168.0.1"));
427*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192,168,0,1", DumpIPAddress(address));
428*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192.168.0.1", address.ToString());
429*6777b538SAndroid Build Coastguard Worker }
430*6777b538SAndroid Build Coastguard Worker 
431*6777b538SAndroid Build Coastguard Worker // Test parsing an IPv6 literal.
TEST(IPAddressTest,AssignFromIPLiteral_IPv6)432*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, AssignFromIPLiteral_IPv6) {
433*6777b538SAndroid Build Coastguard Worker   IPAddress address;
434*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(address.AssignFromIPLiteral("1:abcd::3:4:ff"));
435*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address));
436*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
437*6777b538SAndroid Build Coastguard Worker }
438*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsIPv4MappedIPv6)439*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsIPv4MappedIPv6) {
440*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_address(192, 168, 0, 1);
441*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ipv4_address.IsIPv4MappedIPv6());
442*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address = IPAddress::IPv6Localhost();
443*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ipv6_address.IsIPv4MappedIPv6());
444*6777b538SAndroid Build Coastguard Worker   IPAddress mapped_address(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 1, 1, 0, 1);
445*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(mapped_address.IsIPv4MappedIPv6());
446*6777b538SAndroid Build Coastguard Worker }
447*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsEqual)448*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsEqual) {
449*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address1;
450*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1"));
451*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address2;
452*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42"));
453*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address3;
454*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1"));
455*6777b538SAndroid Build Coastguard Worker 
456*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address1 == ip_address2);
457*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1 == ip_address3);
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,LessThan)460*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, LessThan) {
461*6777b538SAndroid Build Coastguard Worker   // IPv4 vs IPv6
462*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address1;
463*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1"));
464*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address2;
465*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42"));
466*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1 < ip_address2);
467*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address2 < ip_address1);
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker   // Compare equivalent addresses.
470*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address3;
471*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1"));
472*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address1 < ip_address3);
473*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address3 < ip_address1);
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address4;
476*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address4.AssignFromIPLiteral("128.0.0.0"));
477*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ip_address1 < ip_address4);
478*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ip_address4 < ip_address1);
479*6777b538SAndroid Build Coastguard Worker }
480*6777b538SAndroid Build Coastguard Worker 
481*6777b538SAndroid Build Coastguard Worker // Test mapping an IPv4 address to an IPv6 address.
TEST(IPAddressTest,ConvertIPv4ToIPv4MappedIPv6)482*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) {
483*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_address(192, 168, 0, 1);
484*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address = ConvertIPv4ToIPv4MappedIPv6(ipv4_address);
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker   // ::ffff:192.168.0.1
487*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
488*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(ipv6_address));
489*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString());
490*6777b538SAndroid Build Coastguard Worker }
491*6777b538SAndroid Build Coastguard Worker 
492*6777b538SAndroid Build Coastguard Worker // Test reversal of a IPv6 address mapping.
TEST(IPAddressTest,ConvertIPv4MappedIPv6ToIPv4)493*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ConvertIPv4MappedIPv6ToIPv4) {
494*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4mapped_address;
495*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:c0a8:1"));
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker   IPAddress expected(192, 168, 0, 1);
498*6777b538SAndroid Build Coastguard Worker 
499*6777b538SAndroid Build Coastguard Worker   IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_address);
500*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected, result);
501*6777b538SAndroid Build Coastguard Worker }
502*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IPAddressMatchesPrefix)503*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IPAddressMatchesPrefix) {
504*6777b538SAndroid Build Coastguard Worker   struct {
505*6777b538SAndroid Build Coastguard Worker     const char* const cidr_literal;
506*6777b538SAndroid Build Coastguard Worker     size_t prefix_length_in_bits;
507*6777b538SAndroid Build Coastguard Worker     const char* const ip_literal;
508*6777b538SAndroid Build Coastguard Worker     bool expected_to_match;
509*6777b538SAndroid Build Coastguard Worker   } tests[] = {
510*6777b538SAndroid Build Coastguard Worker       // IPv4 prefix with IPv4 inputs.
511*6777b538SAndroid Build Coastguard Worker       {"10.10.1.32", 27, "10.10.1.44", true},
512*6777b538SAndroid Build Coastguard Worker       {"10.10.1.32", 27, "10.10.1.90", false},
513*6777b538SAndroid Build Coastguard Worker       {"10.10.1.32", 27, "10.10.1.90", false},
514*6777b538SAndroid Build Coastguard Worker 
515*6777b538SAndroid Build Coastguard Worker       // IPv6 prefix with IPv6 inputs.
516*6777b538SAndroid Build Coastguard Worker       {"2001:db8::", 32, "2001:DB8:3:4::5", true},
517*6777b538SAndroid Build Coastguard Worker       {"2001:db8::", 32, "2001:c8::", false},
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker       // IPv6 prefix with IPv4 inputs.
520*6777b538SAndroid Build Coastguard Worker       {"2001:db8::", 33, "192.168.0.1", false},
521*6777b538SAndroid Build Coastguard Worker       {"::ffff:192.168.0.1", 112, "192.168.33.77", true},
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker       // IPv4 prefix with IPv6 inputs.
524*6777b538SAndroid Build Coastguard Worker       {"10.11.33.44", 16, "::ffff:0a0b:89", true},
525*6777b538SAndroid Build Coastguard Worker       {"10.11.33.44", 16, "::ffff:10.12.33.44", false},
526*6777b538SAndroid Build Coastguard Worker   };
527*6777b538SAndroid Build Coastguard Worker   for (const auto& test : tests) {
528*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(
529*6777b538SAndroid Build Coastguard Worker         base::StringPrintf("%s, %s", test.cidr_literal, test.ip_literal));
530*6777b538SAndroid Build Coastguard Worker 
531*6777b538SAndroid Build Coastguard Worker     IPAddress ip_address;
532*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(ip_address.AssignFromIPLiteral(test.ip_literal));
533*6777b538SAndroid Build Coastguard Worker 
534*6777b538SAndroid Build Coastguard Worker     IPAddress ip_prefix;
535*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(ip_prefix.AssignFromIPLiteral(test.cidr_literal));
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(test.expected_to_match,
538*6777b538SAndroid Build Coastguard Worker               IPAddressMatchesPrefix(ip_address, ip_prefix,
539*6777b538SAndroid Build Coastguard Worker                                      test.prefix_length_in_bits));
540*6777b538SAndroid Build Coastguard Worker   }
541*6777b538SAndroid Build Coastguard Worker }
542*6777b538SAndroid Build Coastguard Worker 
543*6777b538SAndroid Build Coastguard Worker // Test parsing invalid CIDR notation literals.
TEST(IPAddressTest,ParseCIDRBlock_Invalid)544*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ParseCIDRBlock_Invalid) {
545*6777b538SAndroid Build Coastguard Worker   const char* const bad_literals[] = {"foobar",
546*6777b538SAndroid Build Coastguard Worker                                       "",
547*6777b538SAndroid Build Coastguard Worker                                       "192.168.0.1",
548*6777b538SAndroid Build Coastguard Worker                                       "::1",
549*6777b538SAndroid Build Coastguard Worker                                       "/",
550*6777b538SAndroid Build Coastguard Worker                                       "/1",
551*6777b538SAndroid Build Coastguard Worker                                       "1",
552*6777b538SAndroid Build Coastguard Worker                                       "192.168.1.1/-1",
553*6777b538SAndroid Build Coastguard Worker                                       "192.168.1.1/33",
554*6777b538SAndroid Build Coastguard Worker                                       "::1/-3",
555*6777b538SAndroid Build Coastguard Worker                                       "a::3/129",
556*6777b538SAndroid Build Coastguard Worker                                       "::1/x",
557*6777b538SAndroid Build Coastguard Worker                                       "192.168.0.1//11",
558*6777b538SAndroid Build Coastguard Worker                                       "192.168.1.1/+1",
559*6777b538SAndroid Build Coastguard Worker                                       "192.168.1.1/ +1",
560*6777b538SAndroid Build Coastguard Worker                                       "192.168.1.1/"};
561*6777b538SAndroid Build Coastguard Worker 
562*6777b538SAndroid Build Coastguard Worker   for (auto* bad_literal : bad_literals) {
563*6777b538SAndroid Build Coastguard Worker     IPAddress ip_address;
564*6777b538SAndroid Build Coastguard Worker     size_t prefix_length_in_bits;
565*6777b538SAndroid Build Coastguard Worker 
566*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(
567*6777b538SAndroid Build Coastguard Worker         ParseCIDRBlock(bad_literal, &ip_address, &prefix_length_in_bits));
568*6777b538SAndroid Build Coastguard Worker   }
569*6777b538SAndroid Build Coastguard Worker }
570*6777b538SAndroid Build Coastguard Worker 
571*6777b538SAndroid Build Coastguard Worker // Test parsing a valid CIDR notation literal.
TEST(IPAddressTest,ParseCIDRBlock_Valid)572*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ParseCIDRBlock_Valid) {
573*6777b538SAndroid Build Coastguard Worker   IPAddress ip_address;
574*6777b538SAndroid Build Coastguard Worker   size_t prefix_length_in_bits;
575*6777b538SAndroid Build Coastguard Worker 
576*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
577*6777b538SAndroid Build Coastguard Worker       ParseCIDRBlock("192.168.0.1/11", &ip_address, &prefix_length_in_bits));
578*6777b538SAndroid Build Coastguard Worker 
579*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192,168,0,1", DumpIPAddress(ip_address));
580*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(11u, prefix_length_in_bits);
581*6777b538SAndroid Build Coastguard Worker 
582*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ParseCIDRBlock("::ffff:192.168.0.1/112", &ip_address,
583*6777b538SAndroid Build Coastguard Worker                              &prefix_length_in_bits));
584*6777b538SAndroid Build Coastguard Worker 
585*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
586*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(ip_address));
587*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(112u, prefix_length_in_bits);
588*6777b538SAndroid Build Coastguard Worker }
589*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,ParseURLHostnameToAddress_FailParse)590*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ParseURLHostnameToAddress_FailParse) {
591*6777b538SAndroid Build Coastguard Worker   IPAddress address;
592*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress("bad value", &address));
593*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress("bad:value", &address));
594*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress(std::string(), &address));
595*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress("192.168.0.1:30", &address));
596*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress("  192.168.0.1  ", &address));
597*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress("::1", &address));
598*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ParseURLHostnameToAddress("[192.169.0.1]", &address));
599*6777b538SAndroid Build Coastguard Worker }
600*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,ParseURLHostnameToAddress_IPv4)601*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ParseURLHostnameToAddress_IPv4) {
602*6777b538SAndroid Build Coastguard Worker   IPAddress address;
603*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ParseURLHostnameToAddress("192.168.0.1", &address));
604*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192,168,0,1", DumpIPAddress(address));
605*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("192.168.0.1", address.ToString());
606*6777b538SAndroid Build Coastguard Worker }
607*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,ParseURLHostnameToAddress_IPv6)608*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ParseURLHostnameToAddress_IPv6) {
609*6777b538SAndroid Build Coastguard Worker   IPAddress address;
610*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ParseURLHostnameToAddress("[1:abcd::3:4:ff]", &address));
611*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address));
612*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
613*6777b538SAndroid Build Coastguard Worker }
614*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IPAddressStartsWith)615*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IPAddressStartsWith) {
616*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_address(192, 168, 10, 5);
617*6777b538SAndroid Build Coastguard Worker 
618*6777b538SAndroid Build Coastguard Worker   uint8_t ipv4_prefix1[] = {192, 168, 10};
619*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddressStartsWith(ipv4_address, ipv4_prefix1));
620*6777b538SAndroid Build Coastguard Worker 
621*6777b538SAndroid Build Coastguard Worker   uint8_t ipv4_prefix3[] = {192, 168, 10, 5};
622*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddressStartsWith(ipv4_address, ipv4_prefix3));
623*6777b538SAndroid Build Coastguard Worker 
624*6777b538SAndroid Build Coastguard Worker   uint8_t ipv4_prefix2[] = {192, 168, 10, 10};
625*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddressStartsWith(ipv4_address, ipv4_prefix2));
626*6777b538SAndroid Build Coastguard Worker 
627*6777b538SAndroid Build Coastguard Worker   // Prefix is longer than the address.
628*6777b538SAndroid Build Coastguard Worker   uint8_t ipv4_prefix4[] = {192, 168, 10, 10, 0};
629*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddressStartsWith(ipv4_address, ipv4_prefix4));
630*6777b538SAndroid Build Coastguard Worker 
631*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address;
632*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2a00:1450:400c:c09::64"));
633*6777b538SAndroid Build Coastguard Worker 
634*6777b538SAndroid Build Coastguard Worker   uint8_t ipv6_prefix1[] = {42, 0, 20, 80, 64, 12, 12, 9};
635*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddressStartsWith(ipv6_address, ipv6_prefix1));
636*6777b538SAndroid Build Coastguard Worker 
637*6777b538SAndroid Build Coastguard Worker   uint8_t ipv6_prefix2[] = {41, 0, 20, 80, 64, 12, 12, 9,
638*6777b538SAndroid Build Coastguard Worker                             0,  0, 0,  0,  0,  0,  100};
639*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix2));
640*6777b538SAndroid Build Coastguard Worker 
641*6777b538SAndroid Build Coastguard Worker   uint8_t ipv6_prefix3[] = {42, 0, 20, 80, 64, 12, 12, 9,
642*6777b538SAndroid Build Coastguard Worker                             0,  0, 0,  0,  0,  0,  0,  100};
643*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddressStartsWith(ipv6_address, ipv6_prefix3));
644*6777b538SAndroid Build Coastguard Worker 
645*6777b538SAndroid Build Coastguard Worker   uint8_t ipv6_prefix4[] = {42, 0, 20, 80, 64, 12, 12, 9,
646*6777b538SAndroid Build Coastguard Worker                             0,  0, 0,  0,  0,  0,  0,  0};
647*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix4));
648*6777b538SAndroid Build Coastguard Worker 
649*6777b538SAndroid Build Coastguard Worker   // Prefix is longer than the address.
650*6777b538SAndroid Build Coastguard Worker   uint8_t ipv6_prefix5[] = {42, 0, 20, 80, 64, 12, 12, 9, 0,
651*6777b538SAndroid Build Coastguard Worker                             0,  0, 0,  0,  0,  0,  0,  10};
652*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddressStartsWith(ipv6_address, ipv6_prefix5));
653*6777b538SAndroid Build Coastguard Worker }
654*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsLinkLocal)655*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsLinkLocal) {
656*6777b538SAndroid Build Coastguard Worker   const char* kPositive[] = {
657*6777b538SAndroid Build Coastguard Worker       "169.254.0.0",
658*6777b538SAndroid Build Coastguard Worker       "169.254.100.1",
659*6777b538SAndroid Build Coastguard Worker       "169.254.100.1",
660*6777b538SAndroid Build Coastguard Worker       "::ffff:169.254.0.0",
661*6777b538SAndroid Build Coastguard Worker       "::ffff:169.254.100.1",
662*6777b538SAndroid Build Coastguard Worker       "fe80::1",
663*6777b538SAndroid Build Coastguard Worker       "fe81::1",
664*6777b538SAndroid Build Coastguard Worker   };
665*6777b538SAndroid Build Coastguard Worker 
666*6777b538SAndroid Build Coastguard Worker   for (const char* literal : kPositive) {
667*6777b538SAndroid Build Coastguard Worker     IPAddress ip_address;
668*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(ip_address.AssignFromIPLiteral(literal));
669*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(ip_address.IsLinkLocal()) << literal;
670*6777b538SAndroid Build Coastguard Worker   }
671*6777b538SAndroid Build Coastguard Worker 
672*6777b538SAndroid Build Coastguard Worker   const char* kNegative[] = {
673*6777b538SAndroid Build Coastguard Worker       "170.254.0.0",        "169.255.0.0",        "::169.254.0.0",
674*6777b538SAndroid Build Coastguard Worker       "::fffe:169.254.0.0", "::ffff:169.255.0.0", "fec0::1",
675*6777b538SAndroid Build Coastguard Worker   };
676*6777b538SAndroid Build Coastguard Worker 
677*6777b538SAndroid Build Coastguard Worker   for (const char* literal : kNegative) {
678*6777b538SAndroid Build Coastguard Worker     IPAddress ip_address;
679*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(ip_address.AssignFromIPLiteral(literal));
680*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(ip_address.IsLinkLocal()) << literal;
681*6777b538SAndroid Build Coastguard Worker   }
682*6777b538SAndroid Build Coastguard Worker }
683*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IsUniqueLocalIPv6)684*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IsUniqueLocalIPv6) {
685*6777b538SAndroid Build Coastguard Worker   const char* kPositive[] = {
686*6777b538SAndroid Build Coastguard Worker       "fc00::1",
687*6777b538SAndroid Build Coastguard Worker       "fc80::1",
688*6777b538SAndroid Build Coastguard Worker       "fd00::1",
689*6777b538SAndroid Build Coastguard Worker   };
690*6777b538SAndroid Build Coastguard Worker 
691*6777b538SAndroid Build Coastguard Worker   for (const char* literal : kPositive) {
692*6777b538SAndroid Build Coastguard Worker     IPAddress ip_address;
693*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(ip_address.AssignFromIPLiteral(literal));
694*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(ip_address.IsUniqueLocalIPv6()) << literal;
695*6777b538SAndroid Build Coastguard Worker   }
696*6777b538SAndroid Build Coastguard Worker 
697*6777b538SAndroid Build Coastguard Worker   const char* kNegative[] = {
698*6777b538SAndroid Build Coastguard Worker       "fe00::1",
699*6777b538SAndroid Build Coastguard Worker       "ff00::1",
700*6777b538SAndroid Build Coastguard Worker       "252.0.0.1",
701*6777b538SAndroid Build Coastguard Worker   };
702*6777b538SAndroid Build Coastguard Worker 
703*6777b538SAndroid Build Coastguard Worker   for (const char* literal : kNegative) {
704*6777b538SAndroid Build Coastguard Worker     IPAddress ip_address;
705*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(ip_address.AssignFromIPLiteral(literal));
706*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(ip_address.IsUniqueLocalIPv6()) << literal;
707*6777b538SAndroid Build Coastguard Worker   }
708*6777b538SAndroid Build Coastguard Worker }
709*6777b538SAndroid Build Coastguard Worker 
710*6777b538SAndroid Build Coastguard Worker // Tests extraction of the NAT64 translation prefix.
TEST(IPAddressTest,ExtractPref64FromIpv4onlyArpaAAAA)711*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ExtractPref64FromIpv4onlyArpaAAAA) {
712*6777b538SAndroid Build Coastguard Worker   // Well Known Prefix 64:ff9b::/96.
713*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_WKP_0(0, 100, 255, 155, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0,
714*6777b538SAndroid Build Coastguard Worker                                0, 170);
715*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_WKP_1(0, 100, 255, 155, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0,
716*6777b538SAndroid Build Coastguard Worker                                0, 171);
717*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_WKP_0 =
718*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_WKP_0);
719*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_WKP_1 =
720*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_WKP_1);
721*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k96bit, pref64_length_WKP_0);
722*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k96bit, pref64_length_WKP_1);
723*6777b538SAndroid Build Coastguard Worker 
724*6777b538SAndroid Build Coastguard Worker   // Prefix length 96
725*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_96_0(32, 1, 13, 184, 1, 34, 3, 68, 0, 0, 0, 0, 192, 0,
726*6777b538SAndroid Build Coastguard Worker                               0, 170);
727*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_96_1(32, 1, 13, 184, 1, 34, 3, 68, 0, 0, 0, 0, 192, 0,
728*6777b538SAndroid Build Coastguard Worker                               0, 171);
729*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_96_0 =
730*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_96_0);
731*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_96_1 =
732*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_96_1);
733*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k96bit, pref64_length_96_0);
734*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k96bit, pref64_length_96_1);
735*6777b538SAndroid Build Coastguard Worker 
736*6777b538SAndroid Build Coastguard Worker   // Prefix length 64
737*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_64_0(32, 1, 13, 184, 1, 34, 3, 68, 0, 192, 0, 0, 170,
738*6777b538SAndroid Build Coastguard Worker                               0, 0, 0);
739*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_64_1(32, 1, 13, 184, 1, 34, 3, 68, 0, 192, 0, 0, 171,
740*6777b538SAndroid Build Coastguard Worker                               0, 0, 0);
741*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_64_0 =
742*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_64_0);
743*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_64_1 =
744*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_64_1);
745*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k64bit, pref64_length_64_0);
746*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k64bit, pref64_length_64_1);
747*6777b538SAndroid Build Coastguard Worker 
748*6777b538SAndroid Build Coastguard Worker   // Prefix length 56
749*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_56_0(32, 1, 13, 184, 1, 34, 3, 192, 0, 0, 0, 170, 0, 0,
750*6777b538SAndroid Build Coastguard Worker                               0, 0);
751*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_56_1(32, 1, 13, 184, 1, 34, 3, 192, 0, 0, 0, 171, 0, 0,
752*6777b538SAndroid Build Coastguard Worker                               0, 0);
753*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_56_0 =
754*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_56_0);
755*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_56_1 =
756*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_56_1);
757*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k56bit, pref64_length_56_0);
758*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k56bit, pref64_length_56_1);
759*6777b538SAndroid Build Coastguard Worker 
760*6777b538SAndroid Build Coastguard Worker   // Prefix length 48
761*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_48_0(32, 1, 13, 184, 1, 34, 192, 0, 0, 0, 170, 0, 0, 0,
762*6777b538SAndroid Build Coastguard Worker                               0, 0);
763*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_48_1(32, 1, 13, 184, 1, 34, 192, 0, 0, 0, 171, 0, 0, 0,
764*6777b538SAndroid Build Coastguard Worker                               0, 0);
765*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_48_0 =
766*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_48_0);
767*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_48_1 =
768*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_48_1);
769*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k48bit, pref64_length_48_0);
770*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k48bit, pref64_length_48_1);
771*6777b538SAndroid Build Coastguard Worker 
772*6777b538SAndroid Build Coastguard Worker   // Prefix length 40
773*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_40_0(32, 1, 13, 184, 1, 192, 0, 0, 0, 170, 0, 0, 0, 0,
774*6777b538SAndroid Build Coastguard Worker                               0, 0);
775*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_40_1(32, 1, 13, 184, 1, 192, 0, 0, 0, 171, 0, 0, 0, 0,
776*6777b538SAndroid Build Coastguard Worker                               0, 0);
777*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_40_0 =
778*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_40_0);
779*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_40_1 =
780*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_40_1);
781*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k40bit, pref64_length_40_0);
782*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k40bit, pref64_length_40_1);
783*6777b538SAndroid Build Coastguard Worker 
784*6777b538SAndroid Build Coastguard Worker   // Prefix length 32
785*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_32_0(32, 1, 13, 184, 192, 0, 0, 170, 0, 0, 0, 0, 0, 0,
786*6777b538SAndroid Build Coastguard Worker                               0, 0);
787*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_32_1(32, 1, 13, 184, 192, 0, 0, 171, 0, 0, 0, 0, 0, 0,
788*6777b538SAndroid Build Coastguard Worker                               0, 0);
789*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_32_0 =
790*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_32_0);
791*6777b538SAndroid Build Coastguard Worker   Dns64PrefixLength pref64_length_32_1 =
792*6777b538SAndroid Build Coastguard Worker       ExtractPref64FromIpv4onlyArpaAAAA(ipv6_address_32_1);
793*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k32bit, pref64_length_32_0);
794*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Dns64PrefixLength::k32bit, pref64_length_32_1);
795*6777b538SAndroid Build Coastguard Worker }
796*6777b538SAndroid Build Coastguard Worker 
797*6777b538SAndroid Build Coastguard Worker // Tests mapping an IPv4 address to an IPv6 address.
TEST(IPAddressTest,ConvertIPv4ToIPv4EmbeddedIPv6)798*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, ConvertIPv4ToIPv4EmbeddedIPv6) {
799*6777b538SAndroid Build Coastguard Worker   IPAddress ipv4_address(192, 0, 2, 33);
800*6777b538SAndroid Build Coastguard Worker 
801*6777b538SAndroid Build Coastguard Worker   // Well Known Prefix 64:ff9b::/96.
802*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_WKP(0, 100, 255, 155, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0,
803*6777b538SAndroid Build Coastguard Worker                              0, 170);
804*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_WKP = ConvertIPv4ToIPv4EmbeddedIPv6(
805*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_WKP, Dns64PrefixLength::k96bit);
806*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0,100,255,155,0,0,0,0,0,0,0,0,192,0,2,33",
807*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_WKP));
808*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("64:ff9b::c000:221", converted_ipv6_address_WKP.ToString());
809*6777b538SAndroid Build Coastguard Worker 
810*6777b538SAndroid Build Coastguard Worker   // Prefix length 96
811*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_96(32, 1, 13, 184, 1, 34, 3, 68, 0, 0, 0, 0, 0, 0, 0,
812*6777b538SAndroid Build Coastguard Worker                             0);
813*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_96 = ConvertIPv4ToIPv4EmbeddedIPv6(
814*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_96, Dns64PrefixLength::k96bit);
815*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("32,1,13,184,1,34,3,68,0,0,0,0,192,0,2,33",
816*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_96));
817*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("2001:db8:122:344::c000:221", converted_ipv6_address_96.ToString());
818*6777b538SAndroid Build Coastguard Worker 
819*6777b538SAndroid Build Coastguard Worker   // Prefix length 64
820*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_64(32, 1, 13, 184, 1, 34, 3, 68, 0, 0, 0, 0, 0, 0, 0,
821*6777b538SAndroid Build Coastguard Worker                             0);
822*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_64 = ConvertIPv4ToIPv4EmbeddedIPv6(
823*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_64, Dns64PrefixLength::k64bit);
824*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("32,1,13,184,1,34,3,68,0,192,0,2,33,0,0,0",
825*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_64));
826*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("2001:db8:122:344:c0:2:2100:0",
827*6777b538SAndroid Build Coastguard Worker             converted_ipv6_address_64.ToString());
828*6777b538SAndroid Build Coastguard Worker 
829*6777b538SAndroid Build Coastguard Worker   // Prefix length 56
830*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_56(32, 1, 13, 184, 1, 34, 3, 0, 0, 0, 0, 0, 0, 0, 0,
831*6777b538SAndroid Build Coastguard Worker                             0);
832*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_56 = ConvertIPv4ToIPv4EmbeddedIPv6(
833*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_56, Dns64PrefixLength::k56bit);
834*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("32,1,13,184,1,34,3,192,0,0,2,33,0,0,0,0",
835*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_56));
836*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("2001:db8:122:3c0:0:221::", converted_ipv6_address_56.ToString());
837*6777b538SAndroid Build Coastguard Worker 
838*6777b538SAndroid Build Coastguard Worker   // Prefix length 48
839*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_48(32, 1, 13, 184, 1, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,
840*6777b538SAndroid Build Coastguard Worker                             0);
841*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_48 = ConvertIPv4ToIPv4EmbeddedIPv6(
842*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_48, Dns64PrefixLength::k48bit);
843*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("32,1,13,184,1,34,192,0,0,2,33,0,0,0,0,0",
844*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_48));
845*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("2001:db8:122:c000:2:2100::", converted_ipv6_address_48.ToString());
846*6777b538SAndroid Build Coastguard Worker 
847*6777b538SAndroid Build Coastguard Worker   // Prefix length 40
848*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_40(32, 1, 13, 184, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
849*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_40 = ConvertIPv4ToIPv4EmbeddedIPv6(
850*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_40, Dns64PrefixLength::k40bit);
851*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("32,1,13,184,1,192,0,2,0,33,0,0,0,0,0,0",
852*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_40));
853*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("2001:db8:1c0:2:21::", converted_ipv6_address_40.ToString());
854*6777b538SAndroid Build Coastguard Worker 
855*6777b538SAndroid Build Coastguard Worker   // Prefix length 32
856*6777b538SAndroid Build Coastguard Worker   IPAddress ipv6_address_32(32, 1, 13, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
857*6777b538SAndroid Build Coastguard Worker   IPAddress converted_ipv6_address_32 = ConvertIPv4ToIPv4EmbeddedIPv6(
858*6777b538SAndroid Build Coastguard Worker       ipv4_address, ipv6_address_32, Dns64PrefixLength::k32bit);
859*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("32,1,13,184,192,0,2,33,0,0,0,0,0,0,0,0",
860*6777b538SAndroid Build Coastguard Worker             DumpIPAddress(converted_ipv6_address_32));
861*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("2001:db8:c000:221::", converted_ipv6_address_32.ToString());
862*6777b538SAndroid Build Coastguard Worker }
863*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,RoundtripAddressThroughValue)864*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, RoundtripAddressThroughValue) {
865*6777b538SAndroid Build Coastguard Worker   IPAddress address(1, 2, 3, 4);
866*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(address.IsValid());
867*6777b538SAndroid Build Coastguard Worker 
868*6777b538SAndroid Build Coastguard Worker   base::Value value = address.ToValue();
869*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(IPAddress::FromValue(value), Optional(address));
870*6777b538SAndroid Build Coastguard Worker }
871*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,FromGarbageValue)872*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, FromGarbageValue) {
873*6777b538SAndroid Build Coastguard Worker   base::Value value(123);
874*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddress::FromValue(value).has_value());
875*6777b538SAndroid Build Coastguard Worker }
876*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,FromInvalidValue)877*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, FromInvalidValue) {
878*6777b538SAndroid Build Coastguard Worker   base::Value value("1.2.3.4.5");
879*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(IPAddress::FromValue(value).has_value());
880*6777b538SAndroid Build Coastguard Worker }
881*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IPv4Mask)882*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IPv4Mask) {
883*6777b538SAndroid Build Coastguard Worker   IPAddress mask;
884*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
885*6777b538SAndroid Build Coastguard Worker       IPAddress::CreateIPv4Mask(&mask, IPAddress::kIPv6AddressSize * 8));
886*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
887*6777b538SAndroid Build Coastguard Worker       IPAddress::CreateIPv4Mask(&mask, (IPAddress::kIPv4AddressSize + 1) * 8));
888*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
889*6777b538SAndroid Build Coastguard Worker       IPAddress::CreateIPv4Mask(&mask, IPAddress::kIPv4AddressSize * 8 + 1));
890*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
891*6777b538SAndroid Build Coastguard Worker       IPAddress::CreateIPv4Mask(&mask, IPAddress::kIPv4AddressSize * 8));
892*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.255.255.255", mask.ToString());
893*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 31));
894*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.255.255.254", mask.ToString());
895*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 24));
896*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.255.255.0", mask.ToString());
897*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 23));
898*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.255.254.0", mask.ToString());
899*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 18));
900*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.255.192.0", mask.ToString());
901*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 16));
902*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.255.0.0", mask.ToString());
903*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 8));
904*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("255.0.0.0", mask.ToString());
905*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 1));
906*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("128.0.0.0", mask.ToString());
907*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv4Mask(&mask, 0));
908*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0.0.0.0", mask.ToString());
909*6777b538SAndroid Build Coastguard Worker }
910*6777b538SAndroid Build Coastguard Worker 
TEST(IPAddressTest,IPv6Mask)911*6777b538SAndroid Build Coastguard Worker TEST(IPAddressTest, IPv6Mask) {
912*6777b538SAndroid Build Coastguard Worker   IPAddress mask;
913*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
914*6777b538SAndroid Build Coastguard Worker       IPAddress::CreateIPv6Mask(&mask, (IPAddress::kIPv6AddressSize * 8) + 1));
915*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
916*6777b538SAndroid Build Coastguard Worker       IPAddress::CreateIPv6Mask(&mask, IPAddress::kIPv6AddressSize * 8));
917*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", mask.ToString());
918*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv6Mask(&mask, 112));
919*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:0", mask.ToString());
920*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv6Mask(&mask, 32));
921*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("ffff:ffff::", mask.ToString());
922*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv6Mask(&mask, 1));
923*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("8000::", mask.ToString());
924*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(IPAddress::CreateIPv6Mask(&mask, 0));
925*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("::", mask.ToString());
926*6777b538SAndroid Build Coastguard Worker }
927*6777b538SAndroid Build Coastguard Worker 
928*6777b538SAndroid Build Coastguard Worker }  // anonymous namespace
929*6777b538SAndroid Build Coastguard Worker 
930*6777b538SAndroid Build Coastguard Worker }  // namespace net
931