Add toFullyQualifiedAppend() methods
[folly.git] / folly / test / IPAddressTest.cpp
1 /*
2  * Copyright 2017 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <folly/test/IPAddressTest.h>
18
19 #include <folly/Bits.h>
20 #include <folly/Format.h>
21 #include <folly/MacAddress.h>
22 #include <folly/String.h>
23 #include <folly/detail/IPAddressSource.h>
24 #include <folly/portability/GTest.h>
25
26 using namespace folly;
27 using namespace std;
28
29 // tests code example
30 TEST(IPAddress, CodeExample) {
31   EXPECT_EQ(4, sizeof(IPAddressV4));
32   EXPECT_EQ(20, sizeof(IPAddressV6));
33   EXPECT_EQ(24, sizeof(IPAddress));
34   IPAddress uninitaddr;
35   IPAddress v4addr("192.0.2.129");
36   IPAddress v6map("::ffff:192.0.2.129");
37   ASSERT_TRUE(uninitaddr.empty());
38   ASSERT_FALSE(v4addr.empty());
39   ASSERT_FALSE(v6map.empty());
40   EXPECT_TRUE(v4addr.inSubnet("192.0.2.0/24"));
41   EXPECT_TRUE(v4addr.inSubnet(IPAddress("192.0.2.0"), 24));
42   EXPECT_TRUE(v4addr.inSubnet("192.0.2.128/30"));
43   EXPECT_FALSE(v4addr.inSubnet("192.0.2.128/32"));
44   EXPECT_EQ(2164392128, v4addr.asV4().toLong());
45   EXPECT_EQ(3221226113, v4addr.asV4().toLongHBO());
46   ASSERT_FALSE(uninitaddr.isV4());
47   ASSERT_FALSE(uninitaddr.isV6());
48   ASSERT_TRUE(v4addr.isV4());
49   ASSERT_TRUE(v6map.isV6());
50   EXPECT_TRUE(v4addr == v6map);
51   ASSERT_TRUE(v6map.isIPv4Mapped());
52   EXPECT_TRUE(v4addr.asV4() == IPAddress::createIPv4(v6map));
53   EXPECT_TRUE(IPAddress::createIPv6(v4addr) == v6map.asV6());
54 }
55
56 TEST(IPAddress, Scope) {
57   // Test that link-local scope is saved
58   auto str = "fe80::62eb:69ff:fe9b:ba60%eth0";
59   IPAddressV6 a2(str);
60   EXPECT_EQ(str, a2.str());
61
62   sockaddr_in6 sock = a2.toSockAddr();
63   EXPECT_NE(0, sock.sin6_scope_id);
64
65   IPAddress a1(str);
66   EXPECT_EQ(str, a1.str());
67
68   a2.setScopeId(0);
69   EXPECT_NE(a1, a2);
70
71   EXPECT_TRUE(a2 < a1);
72 }
73
74 TEST(IPAddress, Ordering) {
75   IPAddress a1("0.1.1.1");
76   IPAddress a2("1.1.1.0");
77   EXPECT_TRUE(a1 < a2);
78
79   IPAddress b1("::ffff:0.1.1.1");
80   IPAddress b2("::ffff:1.1.1.0");
81   EXPECT_TRUE(b1 < b2);
82 }
83
84 TEST(IPAddress, InvalidAddressFamilyExceptions) {
85   // asV4
86   {
87     IPAddress addr;
88     EXPECT_THROW(addr.asV4(), InvalidAddressFamilyException);
89   }
90   // asV6
91   {
92     IPAddress addr;
93     EXPECT_THROW(addr.asV6(), InvalidAddressFamilyException);
94   }
95   // sockaddr ctor
96   {
97     // setup
98     sockaddr_in addr;
99     addr.sin_family = AF_UNSPEC;
100
101     EXPECT_THROW(IPAddress((sockaddr *)&addr), InvalidAddressFamilyException);
102   }
103 }
104
105 TEST(IPAddress, CreateNetwork) {
106   // test valid IPv4 network
107   {
108     auto net = IPAddress::createNetwork("192.168.0.1/24");
109     ASSERT_TRUE(net.first.isV4());
110     EXPECT_EQ("192.168.0.0", net.first.str());
111     EXPECT_EQ(24, net.second);
112     EXPECT_EQ("192.168.0.0/24", IPAddress::networkToString(net));
113   }
114   // test valid IPv4 network without applying mask
115   {
116     auto net = IPAddress::createNetwork("192.168.0.1/24", -1, false);
117     ASSERT_TRUE(net.first.isV4());
118     EXPECT_EQ("192.168.0.1", net.first.str());
119     EXPECT_EQ(24, net.second);
120     EXPECT_EQ("192.168.0.1/24", IPAddress::networkToString(net));
121   }
122   // test valid IPv6 network
123   {
124     auto net = IPAddress::createNetwork("1999::1/24");
125     ASSERT_TRUE(net.first.isV6());
126     EXPECT_EQ("1999::", net.first.str());
127     EXPECT_EQ(24, net.second);
128     EXPECT_EQ("1999::/24", IPAddress::networkToString(net));
129   }
130   // test valid IPv6 network without applying mask
131   {
132     auto net = IPAddress::createNetwork("1999::1/24", -1, false);
133     ASSERT_TRUE(net.first.isV6());
134     EXPECT_EQ("1999::1", net.first.str());
135     EXPECT_EQ(24, net.second);
136     EXPECT_EQ("1999::1/24", IPAddress::networkToString(net));
137   }
138   // test empty string
139   EXPECT_THROW(IPAddress::createNetwork(""), IPAddressFormatException);
140   // test multi slash string
141   EXPECT_THROW(IPAddress::createNetwork("192.168.0.1/24/36"),
142                                         IPAddressFormatException);
143   // test no slash string with default IPv4
144   {
145     auto net = IPAddress::createNetwork("192.168.0.1");
146     ASSERT_TRUE(net.first.isV4());
147     EXPECT_EQ("192.168.0.1", net.first.str());
148     EXPECT_EQ(32, net.second);  // auto-detected
149     net = IPAddress::createNetwork("192.168.0.1", -1, false);
150     ASSERT_TRUE(net.first.isV4());
151     EXPECT_EQ("192.168.0.1", net.first.str());
152     EXPECT_EQ(32, net.second);
153   }
154   // test no slash string with default IPv6
155   {
156     auto net = IPAddress::createNetwork("1999::1");
157     ASSERT_TRUE(net.first.isV6());
158     EXPECT_EQ("1999::1", net.first.str());
159     EXPECT_EQ(128, net.second);
160   }
161   // test no slash string with invalid default
162   EXPECT_THROW(IPAddress::createNetwork("192.168.0.1", 33),
163                IPAddressFormatException);
164
165 }
166
167 // test assignment operators
168 TEST(IPAddress, Assignment) {
169   static const string kIPv4Addr = "69.63.189.16";
170   static const string kIPv6Addr = "2620:0:1cfe:face:b00c::3";
171
172   // Test assigning IPAddressV6 addr to IPAddress (was V4)
173   {
174     IPAddress addr(kIPv4Addr);
175     IPAddressV6 addrV6 = IPAddress(kIPv6Addr).asV6();
176     EXPECT_TRUE(addr.isV4());
177     EXPECT_EQ(kIPv4Addr, addr.str());
178     addr = addrV6;
179     EXPECT_TRUE(addr.isV6());
180     EXPECT_EQ(kIPv6Addr, addr.str());
181   }
182   // Test assigning IPAddressV4 addr to IPAddress (was V6)
183   {
184     IPAddress addr(kIPv6Addr);
185     IPAddressV4 addrV4 = IPAddress(kIPv4Addr).asV4();
186     EXPECT_TRUE(addr.isV6());
187     EXPECT_EQ(kIPv6Addr, addr.str());
188     addr = addrV4;
189     EXPECT_TRUE(addr.isV4());
190     EXPECT_EQ(kIPv4Addr, addr.str());
191   }
192   // Test assigning IPAddress(v6) to IPAddress (was v4)
193   {
194     IPAddress addr(kIPv4Addr);
195     IPAddress addrV6 = IPAddress(kIPv6Addr);
196     EXPECT_TRUE(addr.isV4());
197     EXPECT_EQ(kIPv4Addr, addr.str());
198     addr = addrV6;
199     EXPECT_TRUE(addr.isV6());
200     EXPECT_EQ(kIPv6Addr, addr.str());
201   }
202   // Test assigning IPAddress(v4) to IPAddress (was v6)
203   {
204     IPAddress addr(kIPv6Addr);
205     IPAddress addrV4 = IPAddress(kIPv4Addr);
206     EXPECT_TRUE(addr.isV6());
207     EXPECT_EQ(kIPv6Addr, addr.str());
208     addr = addrV4;
209     EXPECT_TRUE(addr.isV4());
210     EXPECT_EQ(kIPv4Addr, addr.str());
211   }
212 }
213
214 // Test the default constructors
215 TEST(IPAddress, CtorDefault) {
216   IPAddressV4 v4;
217   EXPECT_EQ(IPAddressV4("0.0.0.0"), v4);
218   IPAddressV6 v6;
219   EXPECT_EQ(IPAddressV6("::0"), v6);
220 }
221
222 TEST(IPAddressV4, validate) {
223   EXPECT_TRUE(IPAddressV4::validate("0.0.0.0"));
224   EXPECT_FALSE(IPAddressV4::validate("0.0.0."));
225   EXPECT_TRUE(IPAddressV4::validate("127.127.127.127"));
226 }
227
228 TEST(IPAddressV6, validate) {
229   EXPECT_TRUE(IPAddressV6::validate("2620:0:1cfe:face:b00c::3"));
230   EXPECT_FALSE(IPAddressV6::validate("0.0.0.0"));
231   EXPECT_TRUE(IPAddressV6::validate("[2620:0:1cfe:face:b00c::3]"));
232   EXPECT_TRUE(IPAddressV6::validate("::ffff:0.1.1.1"));
233   EXPECT_TRUE(IPAddressV6::validate("2620:0000:1cfe:face:b00c:0000:0000:0003"));
234   EXPECT_TRUE(
235       IPAddressV6::validate("2620:0000:1cfe:face:b00c:0000:127.127.127.127"));
236 }
237
238 TEST(IPAddress, validate) {
239   EXPECT_TRUE(IPAddress::validate("0.0.0.0"));
240   EXPECT_TRUE(IPAddress::validate("::"));
241   EXPECT_FALSE(IPAddress::validate("asdf"));
242 }
243
244 // Test addresses constructed using a in[6]_addr value
245 TEST_P(IPAddressTest, CtorAddress) {
246   AddressData param = GetParam();
247   IPAddress strAddr(param.address);
248   IPAddress address;
249
250   if (param.version == 4) {
251     in_addr v4addr = detail::Bytes::mkAddress4(&param.bytes[0]);
252     address = IPAddress(v4addr);
253   } else {
254     in6_addr v6addr = detail::Bytes::mkAddress6(&param.bytes[0]);
255     address = IPAddress(v6addr);
256   }
257   ExpectIsValid(address);
258   EXPECT_EQ(strAddr, address);
259 }
260
261 // Test addresses constructed using a binary address
262 TEST_P(IPAddressTest, CtorBinary) {
263   AddressData param = GetParam();
264   IPAddress address;
265
266   if (param.version == 4) {
267     in_addr v4addr = AddressData::parseAddress4(param.address);
268     address = IPAddress::fromBinary(ByteRange((unsigned char*)&v4addr, 4));
269   } else {
270     in6_addr v6addr = AddressData::parseAddress6(param.address);
271     address = IPAddress::fromBinary(ByteRange((unsigned char*)&v6addr, 16));
272   }
273
274   ExpectIsValid(address);
275   EXPECT_EQ(IPAddress(param.address), address);
276 }
277
278 // Test addresses constructed using a string
279 TEST_P(IPAddressTest, CtorString) {
280   AddressData param = GetParam();
281   IPAddress address(param.address);
282
283   ExpectIsValid(address);
284
285   // Test the direct version-specific constructor
286   if (param.version == 4) {
287     IPAddressV4 v4(param.address);
288     ExpectIsValid(IPAddress(v4));
289     EXPECT_THROW(IPAddressV6 v6(param.address), IPAddressFormatException);
290   } else if (param.version == 6) {
291     IPAddressV6 v6(param.address);
292     ExpectIsValid(IPAddress(v6));
293     EXPECT_THROW(IPAddressV4 v4(param.address), IPAddressFormatException);
294   }
295 }
296
297 TEST(IPAddress, CtorSockaddr) {
298   // test v4 address
299   {
300     // setup
301     sockaddr_in addr;
302     in_addr sin_addr;
303     sin_addr.s_addr = htonl(2122547223);
304     addr.sin_family = AF_INET;
305     addr.sin_addr = sin_addr;
306
307     IPAddress ipAddr((sockaddr *)&addr);
308     EXPECT_TRUE(ipAddr.isV4());
309     EXPECT_EQ("126.131.128.23", ipAddr.str());
310   }
311   // test v6 address
312   {
313     // setup
314     sockaddr_in6 addr;
315     memset(&addr, 0, sizeof(addr));
316     in6_addr sin_addr;
317     ByteArray16 sec{{
318       // 2620:0:1cfe:face:b00c::3
319       38,32,0,0,28,254,250,206,176,12,0,0,0,0,0,3
320     }};
321     std::memcpy(sin_addr.s6_addr, sec.data(), 16);
322     addr.sin6_family = AF_INET6;
323     addr.sin6_addr = sin_addr;
324
325     IPAddress ipAddr((sockaddr *)&addr);
326     EXPECT_TRUE(ipAddr.isV6());
327     EXPECT_EQ("2620:0:1cfe:face:b00c::3", ipAddr.str());
328   }
329   // test nullptr exception
330   {
331     sockaddr *addr = nullptr;
332     EXPECT_THROW(IPAddress((const sockaddr*)addr), IPAddressFormatException);
333   }
334   // test invalid family exception
335   {
336     // setup
337     sockaddr_in addr;
338     in_addr sin_addr;
339     sin_addr.s_addr = htonl(2122547223);
340     addr.sin_family = AF_UNSPEC;
341     addr.sin_addr = sin_addr;
342
343     EXPECT_THROW(IPAddress((sockaddr *)&addr), IPAddressFormatException);
344   }
345 }
346
347 TEST(IPAddress, ToSockaddrStorage) {
348   // test v4 address
349   {
350     string strAddr("126.131.128.23");
351     IPAddress addr(strAddr);
352     sockaddr_storage out;
353
354     ASSERT_TRUE(addr.isV4()); // test invariant
355     EXPECT_GT(addr.toSockaddrStorage(&out), 0);
356
357     IPAddress sockAddr((sockaddr*)&out);
358     ASSERT_TRUE(sockAddr.isV4());
359     EXPECT_EQ(strAddr, sockAddr.str());
360   }
361   // test v6 address
362   {
363     string strAddr("2620:0:1cfe:face:b00c::3");
364     IPAddress addr(strAddr);
365     sockaddr_storage out;
366
367     ASSERT_TRUE(addr.isV6()); // test invariant
368     EXPECT_GT(addr.toSockaddrStorage(&out), 0);
369
370     IPAddress sockAddr((sockaddr*)&out);
371     ASSERT_TRUE(sockAddr.isV6());
372     EXPECT_EQ(strAddr, sockAddr.str());
373   }
374   // test nullptr exception
375   {
376     sockaddr_storage *out = nullptr;
377     IPAddress addr("127.0.0.1");
378     EXPECT_THROW(addr.toSockaddrStorage(out), IPAddressFormatException);
379   }
380   // test invalid family exception
381   {
382     IPAddress addr;
383     sockaddr_storage out;
384     ASSERT_EQ(AF_UNSPEC, addr.family());
385     EXPECT_THROW(addr.toSockaddrStorage(&out), InvalidAddressFamilyException);
386   }
387 }
388
389 TEST(IPAddress, ToString) {
390   // Test with IPAddressV4
391   IPAddressV4 addr_10_0_0_1("10.0.0.1");
392   EXPECT_EQ("10.0.0.1", folly::to<string>(addr_10_0_0_1));
393   // Test with IPAddressV6
394   IPAddressV6 addr_1("::1");
395   EXPECT_EQ("::1", folly::to<string>(addr_1));
396   // Test with IPAddress, both V4 and V6
397   IPAddress addr_10_1_2_3("10.1.2.3");
398   EXPECT_EQ("10.1.2.3", folly::to<string>(addr_10_1_2_3));
399   IPAddress addr_1_2_3("1:2::3");
400   EXPECT_EQ("1:2::3", folly::to<string>(addr_1_2_3));
401
402   // Test a combination of all the above arguments
403   EXPECT_EQ("1:2::3 - 10.0.0.1 - ::1 - 10.1.2.3",
404             folly::to<string>(addr_1_2_3, " - ", addr_10_0_0_1,
405                               " - ", addr_1, " - ", addr_10_1_2_3));
406 }
407
408 TEST(IPaddress, toInverseArpaName) {
409   IPAddressV4 addr_ipv4("10.0.0.1");
410   EXPECT_EQ("1.0.0.10.in-addr.arpa", addr_ipv4.toInverseArpaName());
411   IPAddressV6 addr_ipv6("2620:0000:1cfe:face:b00c:0000:0000:0003");
412   EXPECT_EQ(
413       sformat(
414           "{}.ip6.arpa",
415           "3.0.0.0.0.0.0.0.0.0.0.0.c.0.0.b.e.c.a.f.e.f.c.1.0.0.0.0.0.2.6.2"),
416       addr_ipv6.toInverseArpaName());
417 }
418
419 TEST(IPaddress, fromInverseArpaName) {
420   EXPECT_EQ(
421       IPAddressV4("10.0.0.1"),
422       IPAddressV4::fromInverseArpaName("1.0.0.10.in-addr.arpa"));
423   EXPECT_EQ(
424       IPAddressV6("2620:0000:1cfe:face:b00c:0000:0000:0003"),
425       IPAddressV6::fromInverseArpaName(sformat(
426           "{}.ip6.arpa",
427           "3.0.0.0.0.0.0.0.0.0.0.0.c.0.0.b.e.c.a.f.e.f.c.1.0.0.0.0.0.2.6.2")));
428 }
429
430 // Test that invalid string values are killed
431 TEST_P(IPAddressCtorTest, InvalidCreation) {
432   string addr = GetParam();
433   EXPECT_THROW(IPAddress((const string)addr), IPAddressFormatException)
434       << "IPAddress(" << addr << ") "
435       << "should have thrown an IPAddressFormatException";
436 }
437
438 // Test that invalid binary values throw an exception
439 TEST_P(IPAddressCtorBinaryTest, InvalidBinary) {
440   auto bin = GetParam();
441   EXPECT_THROW(IPAddress::fromBinary(ByteRange(&bin[0], bin.size())),
442                IPAddressFormatException);
443 }
444
445 TEST(IPAddressSource, ToHex) {
446   vector<std::uint8_t> data = {{0xff, 0x20, 0x45}};
447   EXPECT_EQ(detail::Bytes::toHex(data.data(), 0), "");
448   EXPECT_EQ(detail::Bytes::toHex(data.data(), 1), "ff");
449   EXPECT_EQ(detail::Bytes::toHex(data.data(), 2), "ff20");
450   EXPECT_EQ(detail::Bytes::toHex(data.data(), 3), "ff2045");
451 }
452
453 // Test toFullyQualified()
454 TEST(IPAddress, ToFullyQualifiedFb) {
455   IPAddress ip("2620:0:1cfe:face:b00c::3");
456   EXPECT_EQ("2620:0000:1cfe:face:b00c:0000:0000:0003", ip.toFullyQualified())
457       << ip;
458 }
459 TEST(IPAddress, ToFullyQualifiedLocal) {
460   IPAddress ip("::1");
461   EXPECT_EQ("0000:0000:0000:0000:0000:0000:0000:0001", ip.toFullyQualified())
462       << ip;
463 }
464 TEST(IPAddress, ToFullyQualifiedAppendV6) {
465   IPAddress ip("2620:0:1cfe:face:b00c::3");
466   std::string result;
467   ip.toFullyQualifiedAppend(result);
468   EXPECT_EQ("2620:0000:1cfe:face:b00c:0000:0000:0003", result) << ip;
469 }
470 TEST(IPAddress, ToFullyQualifiedAppendV4) {
471   IPAddress ip("127.0.0.1");
472   std::string result;
473   ip.toFullyQualifiedAppend(result);
474   EXPECT_EQ("127.0.0.1", result) << ip;
475 }
476 TEST(IPAddress, ToFullyQualifiedSizeV6) {
477   auto actual = IPAddressV6::kToFullyQualifiedSize;
478   auto expected = IPAddress("::").toFullyQualified().size();
479   EXPECT_EQ(expected, actual);
480 }
481 TEST(IPAddress, MaxToFullyQualifiedSizeV4) {
482   auto actual = IPAddressV4::kMaxToFullyQualifiedSize;
483   auto expected = IPAddress("255.255.255.255").toFullyQualified().size();
484   EXPECT_EQ(expected, actual);
485 }
486
487 // test v4-v6 mapped addresses
488 TEST_P(IPAddressMappedTest, MappedEqual) {
489   auto param = GetParam();
490   string mappedIp = param.first;
491   string otherIp = param.second;
492
493   auto mapped = IPAddress(mappedIp);
494   auto expected = IPAddress(otherIp);
495
496   EXPECT_EQ(expected, mapped);
497
498   IPAddress v6addr;
499   if (mapped.isV4()) {
500     v6addr = mapped.asV4().createIPv6();
501   } else if (expected.isV4()) {
502     v6addr = expected.asV4().createIPv6();
503   }
504   EXPECT_TRUE(v6addr.isV6());
505   EXPECT_TRUE(mapped == v6addr);
506   EXPECT_TRUE(expected == v6addr);
507 }
508
509 // Test subnet mask calculations
510 TEST_P(IPAddressMaskTest, Masks) {
511   auto param = GetParam();
512
513   IPAddress ip(param.address);
514   IPAddress masked = ip.mask(param.mask);
515   EXPECT_EQ(param.subnet, masked.str())
516       << param.address << "/" << folly::to<std::string>(param.mask) << " -> "
517       << param.subnet;
518 }
519
520 // Test inSubnet calculations
521 TEST_P(IPAddressMaskTest, InSubnet) {
522   auto param = GetParam();
523
524   IPAddress ip(param.address);
525   IPAddress subnet(param.subnet);
526   EXPECT_TRUE(ip.inSubnet(subnet, param.mask));
527 }
528
529 // Test boundary conditions for subnet calculations
530 TEST_P(IPAddressMaskBoundaryTest, NonMaskedSubnet) {
531   auto param = GetParam();
532   IPAddress ip(param.address);
533   IPAddress subnet(param.subnet);
534   EXPECT_EQ(param.inSubnet, ip.inSubnet(subnet, param.mask));
535 }
536
537 TEST(IPAddress, UnitializedEqual) {
538   IPAddress addrEmpty;
539   IPAddress ip4("127.0.0.1");
540   EXPECT_FALSE(addrEmpty == ip4);
541   EXPECT_FALSE(ip4 == addrEmpty);
542   IPAddress ip6("::1");
543   EXPECT_FALSE(addrEmpty == ip6);
544   EXPECT_FALSE(ip6 == addrEmpty);
545   IPAddress ip6Map("::ffff:192.0.2.129");
546   EXPECT_FALSE(addrEmpty == ip6Map);
547   EXPECT_FALSE(ip6Map == addrEmpty);
548   IPAddress ip4Zero("0.0.0.0");
549   EXPECT_FALSE(addrEmpty == ip4Zero);
550   EXPECT_FALSE(ip4Zero == addrEmpty);
551   IPAddress ip6Zero("::");
552   EXPECT_FALSE(addrEmpty == ip6Zero);
553   EXPECT_FALSE(ip6Zero == addrEmpty);
554   EXPECT_EQ(addrEmpty, addrEmpty);
555 }
556
557 // Test subnet calcs with 6to4 addresses
558 TEST(IPAddress, InSubnetWith6to4) {
559   auto ip = IPAddress("2002:c000:022a::"); // 192.0.2.42
560   auto subnet = IPAddress("192.0.0.0");
561   EXPECT_TRUE(ip.inSubnet(subnet, 16));
562
563   auto ip2 = IPAddress("192.0.0.1");
564   auto subnet2 = IPAddress("2002:c000:0000::"); // 192.0.0.0
565   EXPECT_TRUE(ip2.inSubnet(subnet2, 14));
566
567   auto ip3 = IPAddress("2002:c000:022a::"); // 192.0.2.42
568   auto subnet3 = IPAddress("2002:c000:0000::"); // 192.0.0.0
569   EXPECT_TRUE(ip3.inSubnet(subnet3, 16));
570 }
571
572 static const vector<string> ipv4Strs = {
573   "127.0.0.1",
574   "198.168.0.1",
575   "8.8.0.0",
576 };
577 TEST(IPAddress, getIPv6For6To4) {
578   for (auto ipv4Str : ipv4Strs) {
579     auto ip = IPAddress(ipv4Str);
580     EXPECT_TRUE(ip.isV4());
581     IPAddressV4 ipv4 = ip.asV4();
582     auto ipv6 = ipv4.getIPv6For6To4();
583     EXPECT_EQ(ipv6.type(), IPAddressV6::Type::T6TO4);
584     auto ipv4New = ipv6.getIPv4For6To4();
585     EXPECT_TRUE(ipv4Str.compare(ipv4New.str()) == 0);
586   }
587 }
588
589 static const vector<pair<string, uint8_t> > invalidMasks = {
590   {"127.0.0.1", 33},
591   {"::1", 129},
592 };
593 TEST(IPAddress, InvalidMask) {
594   for (auto& tc : invalidMasks) {
595     auto ip = IPAddress(tc.first);
596     EXPECT_THROW(ip.mask(tc.second), IPAddressFormatException);
597   }
598 }
599
600 static const vector<pair<string, IPAddressV6::Type> > v6types = {
601   {"::1", IPAddressV6::Type::NORMAL},
602   {"2620:0:1cfe:face:b00c::3", IPAddressV6::Type::NORMAL},
603   {"2001:0000:4136:e378:8000:63bf:3fff:fdd2", IPAddressV6::Type::TEREDO},
604   {"2002:c000:022a::", IPAddressV6::Type::T6TO4},
605 };
606 TEST(IPAddress, V6Types) {
607   auto mkName = [&](const IPAddressV6::Type t) -> string {
608     switch (t) {
609       case IPAddressV6::Type::TEREDO:
610         return "teredo";
611       case IPAddressV6::Type::T6TO4:
612         return "6to4";
613       default:
614         return "default";
615     }
616   };
617
618   for (auto& tc : v6types) {
619     auto ip = IPAddress(tc.first);
620     EXPECT_TRUE(ip.isV6());
621     IPAddressV6 ipv6 = ip.asV6();
622     EXPECT_EQ(tc.second, ipv6.type())
623         << "expected " << mkName(tc.second) << ", got " << mkName(ipv6.type());
624     switch (tc.second) {
625       case IPAddressV6::Type::TEREDO:
626         EXPECT_TRUE(ipv6.isTeredo()) << "isTeredo was false";
627         EXPECT_FALSE(ipv6.is6To4()) << "is6To4 was true";
628         break;
629       case IPAddressV6::Type::T6TO4:
630         EXPECT_TRUE(ipv6.is6To4()) << "is6To4 was false";
631         EXPECT_FALSE(ipv6.isTeredo()) << "isTeredo was true";
632         break;
633       case IPAddressV6::Type::NORMAL:
634         EXPECT_FALSE(ipv6.is6To4()) << "is6To4 was true";
635         EXPECT_FALSE(ipv6.isTeredo()) << "isTeredo was true";
636         break;
637       default:
638         throw std::range_error("Invalid expected type: " +
639                                folly::to<std::string>(tc.second));
640     }
641   }
642 }
643
644 static const vector<pair<string, uint32_t> > provideToLong = {
645   {"0.0.0.0", 0},
646   {"10.0.0.0", 167772160},
647   {"126.131.128.23", 2122547223},
648   {"192.168.0.0", 3232235520},
649 };
650 TEST(IPAddress, ToLong) {
651   for (auto& tc : provideToLong) {
652     auto ip = IPAddress(tc.first);
653     EXPECT_TRUE(ip.isV4());
654     IPAddressV4 ipv4 = ip.asV4();
655     EXPECT_EQ(tc.second, ipv4.toLongHBO());
656
657     auto ip2 = IPAddress::fromLongHBO(tc.second);
658     EXPECT_TRUE(ip2.isV4());
659     EXPECT_TRUE(tc.first.compare(ip2.str()) == 0);
660     EXPECT_EQ(tc.second, ip2.asV4().toLongHBO());
661
662     auto nla = htonl(tc.second);
663     auto ip3 = IPAddress::fromLong(nla);
664     EXPECT_TRUE(ip3.isV4());
665     EXPECT_TRUE(tc.first.compare(ip3.str()) == 0);
666     EXPECT_EQ(nla, ip3.asV4().toLong());
667   }
668 }
669
670 TEST(IPAddress, fromBinaryV4) {
671   for (auto& tc : provideToLong) {
672     SCOPED_TRACE(tc.first);
673     union {
674       uint8_t u8[4];
675       uint32_t u32;
676     } data;
677     data.u32 = Endian::big(tc.second);
678     ByteRange bytes(data.u8, 4);
679
680     auto fromBin = IPAddressV4::fromBinary(bytes);
681     IPAddressV4 fromStr(tc.first);
682     EXPECT_EQ(fromStr, fromBin);
683
684     IPAddressV4 addr2("0.0.0.0");
685     addr2 = IPAddressV4::fromBinary(bytes);
686     EXPECT_EQ(fromStr, addr2);
687
688     IPAddress genericAddr = IPAddress::fromBinary(bytes);
689     ASSERT_TRUE(genericAddr.isV4());
690     EXPECT_EQ(fromStr, genericAddr.asV4());
691     EXPECT_EQ(ByteRange(genericAddr.bytes(), genericAddr.byteCount()), bytes);
692   }
693
694   uint8_t data[20];
695   EXPECT_THROW(IPAddressV4::fromBinary(ByteRange(data, 3)),
696                IPAddressFormatException);
697   EXPECT_THROW(IPAddressV4::fromBinary(ByteRange(data, 16)),
698                IPAddressFormatException);
699   EXPECT_THROW(IPAddressV4::fromBinary(ByteRange(data, 20)),
700                IPAddressFormatException);
701 }
702
703 TEST(IPAddress, toBinaryV4) {
704   for (auto& tc : provideToLong) {
705     SCOPED_TRACE(tc.first);
706     union {
707       uint8_t u8[4];
708       uint32_t u32;
709     } data;
710     data.u32 = Endian::big(tc.second);
711     ByteRange bytes(data.u8, 4);
712
713     auto fromBin = IPAddressV4::fromBinary(bytes);
714     auto toBin = fromBin.toBinary();
715     EXPECT_EQ(bytes, toBin);
716   }
717 }
718
719 static const vector<pair<string, vector<uint8_t> > > provideBinary16Bytes = {
720   {"::0",
721     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
722      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
723   {"1::2",
724     {0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
725      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
726   {"fe80::0012:34ff:fe56:78ab",
727     {0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728      0x00, 0x12, 0x34, 0xff, 0xfe, 0x56, 0x78, 0xab}},
729   {"2001:db8:1234:5678:90ab:cdef:8765:4321",
730     {0x20, 0x01, 0x0d, 0xb8, 0x12, 0x34, 0x56, 0x78,
731      0x90, 0xab, 0xcd, 0xef, 0x87, 0x65, 0x43, 0x21}},
732   {"::ffff:0:c0a8:1",
733     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
734      0xff, 0xff, 0x00, 0x00, 0xc0, 0xa8, 0x00, 0x01}},
735 };
736
737 TEST(IPAddress, fromBinaryV6) {
738   for (auto& tc : provideBinary16Bytes) {
739     SCOPED_TRACE(tc.first);
740     ByteRange bytes(&tc.second.front(), tc.second.size());
741
742     auto fromBin = IPAddressV6::fromBinary(bytes);
743     IPAddressV6 fromStr(tc.first);
744     EXPECT_EQ(fromStr, fromBin);
745
746     IPAddressV6 addr2("::0");
747     addr2 = IPAddressV6::fromBinary(bytes);
748     EXPECT_EQ(fromStr, addr2);
749
750     IPAddress genericAddr = IPAddress::fromBinary(bytes);
751     ASSERT_TRUE(genericAddr.isV6());
752     EXPECT_EQ(fromStr, genericAddr.asV6());
753     EXPECT_EQ(ByteRange(genericAddr.bytes(), genericAddr.byteCount()), bytes);
754   }
755
756   uint8_t data[20];
757   EXPECT_THROW(IPAddressV6::fromBinary(ByteRange(data, 3)),
758                IPAddressFormatException);
759   EXPECT_THROW(IPAddressV6::fromBinary(ByteRange(data, 4)),
760                IPAddressFormatException);
761   EXPECT_THROW(IPAddressV6::fromBinary(ByteRange(data, 20)),
762                IPAddressFormatException);
763 }
764
765 TEST(IPAddress, toBinaryV6) {
766   for (auto& tc : provideBinary16Bytes) {
767     SCOPED_TRACE(tc.first);
768     ByteRange bytes(&tc.second.front(), tc.second.size());
769
770     auto fromBin = IPAddressV6::fromBinary(bytes);
771     auto toBin = fromBin.toBinary();
772     EXPECT_EQ(bytes, toBin);
773   }
774 }
775
776 TEST_P(IPAddressFlagTest, IsLoopback) {
777   AddressFlags param = GetParam();
778   IPAddress addr(param.address);
779
780   EXPECT_EQ(param.version, addr.version());
781   EXPECT_EQ(param.isLoopback(), addr.isLoopback());
782 }
783
784 TEST_P(IPAddressFlagTest, IsPrivate) {
785   AddressFlags param = GetParam();
786   IPAddress addr(param.address);
787
788   EXPECT_EQ(param.version, addr.version());
789   EXPECT_EQ(param.isPrivate(), addr.isPrivate()) << addr;
790 }
791
792 TEST_P(IPAddressFlagTest, IsNonroutable) {
793   AddressFlags param = GetParam();
794   IPAddress addr(param.address);
795
796   EXPECT_EQ(param.version, addr.version());
797   EXPECT_EQ(param.isNonroutable(), addr.isNonroutable()) << addr;
798 }
799
800 TEST_P(IPAddressFlagTest, IsZero) {
801   AddressFlags param = GetParam();
802   IPAddress addr(param.address);
803
804   EXPECT_EQ(param.version, addr.version());
805   EXPECT_EQ(param.isZero(), addr.isZero()) << addr;
806 }
807
808 TEST_P(IPAddressFlagTest, IsLinkLocal) {
809   AddressFlags param = GetParam();
810   IPAddress addr(param.address);
811   EXPECT_EQ(param.isLinkLocal(), addr.isLinkLocal()) << addr;
812 }
813
814 TEST(IPAddress, CreateLinkLocal) {
815   IPAddressV6 addr(IPAddressV6::LINK_LOCAL, MacAddress("00:05:73:f9:46:fc"));
816   EXPECT_EQ(IPAddressV6("fe80::0205:73ff:fef9:46fc"), addr);
817
818   addr = IPAddressV6(IPAddressV6::LINK_LOCAL, MacAddress("02:00:00:12:34:56"));
819   EXPECT_EQ(IPAddressV6("fe80::ff:fe12:3456"), addr);
820 }
821
822 TEST_P(IPAddressFlagTest, IsLinkLocalBroadcast) {
823   AddressFlags param = GetParam();
824   IPAddress addr(param.address);
825   EXPECT_EQ(param.version, addr.version());
826   EXPECT_EQ(param.isLinkLocalBroadcast(), addr.isLinkLocalBroadcast());
827 }
828
829 TEST(IPAddress, SolicitedNodeAddress) {
830   // An example from RFC 4291 section 2.7.1
831   EXPECT_EQ(IPAddressV6("ff02::1:ff0e:8c6c"),
832             IPAddressV6("4037::01:800:200e:8c6c").getSolicitedNodeAddress());
833
834   // An example from wikipedia
835   // (http://en.wikipedia.org/wiki/Solicited-node_multicast_address)
836   EXPECT_EQ(IPAddressV6("ff02::1:ff28:9c5a"),
837             IPAddressV6("fe80::2aa:ff:fe28:9c5a").getSolicitedNodeAddress());
838 }
839
840 TEST_P(IPAddressByteAccessorTest, CheckBytes) {
841   auto addrData = GetParam();
842   IPAddress ip(addrData.address);
843   size_t i = 0;
844   for (auto byitr = addrData.bytes.begin(); i < ip.byteCount(); ++i, ++byitr) {
845     EXPECT_EQ(*byitr, ip.getNthMSByte(i));
846     EXPECT_EQ(*byitr, ip.isV4() ?
847           ip.asV4().getNthMSByte(i) : ip.asV6().getNthMSByte(i));
848   }
849   i = 0;
850   for (auto byritr = addrData.bytes.rbegin(); i < ip.byteCount(); ++i,
851       ++byritr) {
852     EXPECT_EQ(*byritr, ip.getNthLSByte(i));
853     EXPECT_EQ(*byritr, ip.isV4() ?
854         ip.asV4().getNthLSByte(i) : ip.asV6().getNthLSByte(i));
855   }
856 }
857
858 TEST_P(IPAddressBitAccessorTest, CheckBits) {
859   auto addrData = GetParam();
860   auto littleEndianAddrData = addrData.bytes;
861   //IPAddress stores address data in n/w byte order.
862   reverse(littleEndianAddrData.begin(), littleEndianAddrData.end());
863   //Bit iterator goes from LSBit to MSBit
864   //We will traverse the IPAddress bits from 0 to bitCount -1
865   auto bitr = folly::makeBitIterator(littleEndianAddrData.begin());
866   IPAddress ip(addrData.address);
867   for (size_t i = 0; i < ip.bitCount(); ++i) {
868     auto msbIndex = ip.bitCount() - i - 1;
869     EXPECT_EQ(*bitr, ip.getNthMSBit(msbIndex));
870     EXPECT_EQ(*bitr, ip.isV4() ? ip.asV4().getNthMSBit(msbIndex) :
871           ip.asV6().getNthMSBit(msbIndex));
872     EXPECT_EQ(*bitr, ip.getNthLSBit(i));
873     EXPECT_EQ(*bitr, ip.isV4() ? ip.asV4().getNthLSBit(i) :
874         ip.asV6().getNthLSBit(i));
875     ++bitr;
876   }
877 }
878
879 TEST(IPAddress, InvalidByteAccess) {
880   IPAddress ip4("10.10.10.10");
881   //MSByte, LSByte accessors are 0 indexed
882   EXPECT_THROW(ip4.getNthMSByte(ip4.byteCount()), std::invalid_argument);
883   EXPECT_THROW(ip4.getNthLSByte(ip4.byteCount()), std::invalid_argument);
884   EXPECT_THROW(ip4.getNthMSByte(-1), std::invalid_argument);
885   EXPECT_THROW(ip4.getNthLSByte(-1), std::invalid_argument);
886   auto asV4 = ip4.asV4();
887   EXPECT_THROW(asV4.getNthMSByte(asV4.byteCount()), std::invalid_argument);
888   EXPECT_THROW(asV4.getNthLSByte(asV4.byteCount()), std::invalid_argument);
889   EXPECT_THROW(asV4.getNthMSByte(-1), std::invalid_argument);
890   EXPECT_THROW(asV4.getNthLSByte(-1), std::invalid_argument);
891
892   IPAddress ip6("2620:0:1cfe:face:b00c::3");
893   EXPECT_THROW(ip6.getNthMSByte(ip6.byteCount()), std::invalid_argument);
894   EXPECT_THROW(ip6.getNthLSByte(ip6.byteCount()), std::invalid_argument);
895   EXPECT_THROW(ip6.getNthMSByte(-1), std::invalid_argument);
896   EXPECT_THROW(ip6.getNthLSByte(-1), std::invalid_argument);
897   auto asV6 = ip6.asV6();
898   EXPECT_THROW(asV6.getNthMSByte(asV6.byteCount()), std::invalid_argument);
899   EXPECT_THROW(asV6.getNthLSByte(asV6.byteCount()), std::invalid_argument);
900   EXPECT_THROW(asV6.getNthMSByte(-1), std::invalid_argument);
901   EXPECT_THROW(asV6.getNthLSByte(-1), std::invalid_argument);
902
903 }
904
905 TEST(IPAddress, InvalidBBitAccess) {
906   IPAddress ip4("10.10.10.10");
907   //MSByte, LSByte accessors are 0 indexed
908   EXPECT_THROW(ip4.getNthMSBit(ip4.bitCount()), std::invalid_argument);
909   EXPECT_THROW(ip4.getNthLSBit(ip4.bitCount()), std::invalid_argument);
910   EXPECT_THROW(ip4.getNthMSBit(-1), std::invalid_argument);
911   EXPECT_THROW(ip4.getNthLSBit(-1), std::invalid_argument);
912   auto asV4 = ip4.asV4();
913   EXPECT_THROW(asV4.getNthMSBit(asV4.bitCount()), std::invalid_argument);
914   EXPECT_THROW(asV4.getNthLSBit(asV4.bitCount()), std::invalid_argument);
915   EXPECT_THROW(asV4.getNthMSBit(-1), std::invalid_argument);
916   EXPECT_THROW(asV4.getNthLSBit(-1), std::invalid_argument);
917
918   IPAddress ip6("2620:0:1cfe:face:b00c::3");
919   EXPECT_THROW(ip6.getNthMSBit(ip6.bitCount()), std::invalid_argument);
920   EXPECT_THROW(ip6.getNthLSBit(ip6.bitCount()), std::invalid_argument);
921   EXPECT_THROW(ip6.getNthMSBit(-1), std::invalid_argument);
922   EXPECT_THROW(ip6.getNthLSBit(-1), std::invalid_argument);
923   auto asV6 = ip6.asV6();
924   EXPECT_THROW(asV6.getNthMSBit(asV6.bitCount()), std::invalid_argument);
925   EXPECT_THROW(asV6.getNthLSBit(asV6.bitCount()), std::invalid_argument);
926   EXPECT_THROW(asV6.getNthMSBit(-1), std::invalid_argument);
927   EXPECT_THROW(asV6.getNthLSBit(-1), std::invalid_argument);
928 }
929
930 TEST(IPAddress, StringFormat) {
931   in6_addr a6;
932   for (int i = 0; i < 8; ++i) {
933     auto t = htons(0x0123 + ((i % 4) * 0x4444));
934 #ifdef _WIN32
935     a6.u.Word[i] = t;
936 #else
937     a6.s6_addr16[i] = t;
938 #endif
939   }
940   EXPECT_EQ("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
941             detail::fastIpv6ToString(a6));
942
943   in_addr a4;
944   a4.s_addr = htonl(0x01020304);
945   EXPECT_EQ("1.2.3.4", detail::fastIpv4ToString(a4));
946 }
947
948 TEST(IPAddress, getMacAddressFromLinkLocal) {
949   IPAddressV6 ip6("fe80::f652:14ff:fec5:74d8");
950   EXPECT_TRUE(ip6.getMacAddressFromLinkLocal().hasValue());
951   EXPECT_EQ("f4:52:14:c5:74:d8", ip6.getMacAddressFromLinkLocal()->toString());
952 }
953
954 TEST(IPAddress, getMacAddressFromLinkLocal_Negative) {
955   IPAddressV6 no_link_local_ip6("2803:6082:a2:4447::1");
956   EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
957   no_link_local_ip6 = IPAddressV6("fe80::f652:14ff:ccc5:74d8");
958   EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
959   no_link_local_ip6 = IPAddressV6("fe80::f652:14ff:ffc5:74d8");
960   EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
961   no_link_local_ip6 = IPAddressV6("fe81::f652:14ff:ffc5:74d8");
962   EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
963 }
964
965 TEST(IPAddress, LongestCommonPrefix) {
966   IPAddress ip10("10.0.0.0");
967   IPAddress ip11("11.0.0.0");
968   IPAddress ip12("12.0.0.0");
969   IPAddress ip128("128.0.0.0");
970   IPAddress ip10dot10("10.10.0.0");
971   auto prefix = IPAddress::longestCommonPrefix({ip10, 8}, {ip128, 8});
972   auto prefix4 = IPAddressV4::longestCommonPrefix({ip10.asV4(), 8},
973                                                   {ip128.asV4(), 8});
974   // No bits match b/w 128/8 and 10/8
975   EXPECT_EQ(IPAddress("0.0.0.0"), prefix.first);
976   EXPECT_EQ(0, prefix.second);
977   EXPECT_EQ(IPAddressV4("0.0.0.0"), prefix4.first);
978   EXPECT_EQ(0, prefix4.second);
979
980   prefix = IPAddress::longestCommonPrefix({ip10, 8}, {ip10dot10, 16});
981   prefix4 = IPAddressV4::longestCommonPrefix({ip10.asV4(), 8},
982                                              {ip10dot10.asV4(), 16});
983   // Between 10/8 and 10.10/16, 10/8 is the longest common match
984   EXPECT_EQ(ip10, prefix.first);
985   EXPECT_EQ(8, prefix.second);
986   EXPECT_EQ(ip10.asV4(), prefix4.first);
987   EXPECT_EQ(8, prefix4.second);
988
989   prefix = IPAddress::longestCommonPrefix({ip11, 8}, {ip12, 8});
990   prefix4 = IPAddressV4::longestCommonPrefix({ip11.asV4(), 8},
991                                              {ip12.asV4(), 8});
992   // 12 = 1100, 11 = 1011, longest match - 1000 = 8
993   EXPECT_EQ(IPAddress("8.0.0.0"), prefix.first);
994   EXPECT_EQ(5, prefix.second);
995   EXPECT_EQ(IPAddressV4("8.0.0.0"), prefix4.first);
996   EXPECT_EQ(5, prefix4.second);
997
998   // Between 128/1 and 128/2, longest match 128/1
999   prefix = IPAddress::longestCommonPrefix({ip128, 1}, {ip128, 2});
1000   prefix4 = IPAddressV4::longestCommonPrefix({ip128.asV4(), 1},
1001                                              {ip128.asV4(), 2});
1002   EXPECT_EQ(ip128, prefix.first);
1003   EXPECT_EQ(1, prefix.second);
1004   EXPECT_EQ(ip128.asV4(), prefix4.first);
1005   EXPECT_EQ(1, prefix4.second);
1006
1007   IPAddress ip6("2620:0:1cfe:face:b00c::3");
1008   prefix = IPAddress::longestCommonPrefix({ip6, ip6.bitCount()},
1009                                           {ip6, ip6.bitCount()});
1010   auto prefix6 = IPAddressV6::longestCommonPrefix(
1011     {ip6.asV6(), IPAddressV6::bitCount()},
1012     {ip6.asV6(), IPAddressV6::bitCount()});
1013   // Longest common b/w me and myself is myself
1014   EXPECT_EQ(ip6, prefix.first);
1015   EXPECT_EQ(ip6.bitCount(), prefix.second);
1016   EXPECT_EQ(ip6.asV6(), prefix6.first);
1017   EXPECT_EQ(ip6.asV6().bitCount(), prefix6.second);
1018
1019   IPAddress ip6Zero("::");
1020   prefix = IPAddress::longestCommonPrefix({ip6, ip6.bitCount()}, {ip6Zero, 0});
1021   prefix6 = IPAddressV6::longestCommonPrefix(
1022     {ip6.asV6(), IPAddressV6::bitCount()},
1023     {ip6Zero.asV6(), 0});
1024   // Longest common b/w :: (ipv6 equivalent of 0/0) is ::
1025   EXPECT_EQ(ip6Zero, prefix.first);
1026   EXPECT_EQ(0, prefix.second);
1027
1028   // Exceptional cases
1029   EXPECT_THROW(IPAddress::longestCommonPrefix({ip10, 8}, {ip6, 128}),
1030                std::invalid_argument);
1031   EXPECT_THROW(IPAddress::longestCommonPrefix({ip10, ip10.bitCount() + 1},
1032                                               {ip10, 8}),
1033                std::invalid_argument);
1034   EXPECT_THROW(IPAddressV4::longestCommonPrefix(
1035                  {ip10.asV4(), IPAddressV4::bitCount() + 1},
1036                  {ip10.asV4(), 8}),
1037                std::invalid_argument);
1038   EXPECT_THROW(IPAddress::longestCommonPrefix({ip6, ip6.bitCount() + 1},
1039                                               {ip6, ip6.bitCount()}),
1040                std::invalid_argument);
1041   EXPECT_THROW(IPAddressV6::longestCommonPrefix(
1042                  {ip6.asV6(), IPAddressV6::bitCount() + 1},
1043                  {ip6.asV6(), IPAddressV6::bitCount()}),
1044                std::invalid_argument);
1045
1046 }
1047
1048 static const vector<AddressData> validAddressProvider = {
1049   AddressData("127.0.0.1", {127,0,0,1}, 4),
1050   AddressData("69.63.189.16", {69,63,189,16}, 4),
1051   AddressData("0.0.0.0", {0,0,0,0}, 4),
1052   AddressData("::1",
1053               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 6),
1054   AddressData("2620:0:1cfe:face:b00c::3",
1055               {38,32,0,0,28,254,250,206,176,12,0,0,0,0,0,3}, 6),
1056 };
1057
1058 static const vector<string> invalidAddressProvider = {
1059   "",
1060   "foo",
1061   "1.1.1.256",
1062   "1",
1063   ":1",
1064   "127.0.0.1,127.0.0.1",
1065   "[1234]",
1066 };
1067
1068 static const vector<ByteVector> invalidBinaryProvider = {
1069   {0x31, 0x32, 0x37, 0x2e, 0x30, 0x30, 0x2e, 0x30, 0x2e, 0x31},
1070   // foo
1071   {0x66, 0x6f, 0x6f},
1072   {0x00},
1073   {0x00, 0x00},
1074   {0x00, 0x00, 0x00},
1075   {0x00, 0x00, 0x00, 0x00, 0x00},
1076   {0xff},
1077 };
1078
1079 static const uint8_t IS_LOCAL = AddressFlags::IS_LOCAL;
1080 static const uint8_t IS_NONROUTABLE = AddressFlags::IS_NONROUTABLE;
1081 static const uint8_t IS_PRIVATE = AddressFlags::IS_PRIVATE;
1082 static const uint8_t IS_ZERO = AddressFlags::IS_ZERO;
1083 static const uint8_t IS_LINK_LOCAL =
1084   AddressFlags::IS_LINK_LOCAL | IS_NONROUTABLE;
1085 static const uint8_t IS_PVT_NONROUTE = IS_NONROUTABLE | IS_PRIVATE;
1086 static const uint8_t IS_MULTICAST = AddressFlags::IS_MULTICAST;
1087 static const uint8_t IS_LINK_LOCAL_BROADCAST =
1088 AddressFlags::IS_LINK_LOCAL_BROADCAST;
1089
1090 static vector<AddressFlags> flagProvider = {
1091   // public v4
1092   AddressFlags("69.63.176.1", 4, 0),
1093   AddressFlags("128.12.65.3", 4, 0),
1094   AddressFlags("192.0.1.0", 4, 0),
1095   AddressFlags("198.51.101.0", 4, 0),
1096   AddressFlags("203.0.114.0", 4, 0),
1097   AddressFlags("128.12.64.115", 4, 0),
1098
1099   // public v6
1100   AddressFlags("2620:0:1cfe:face:b00c::3", 6, 0),
1101
1102   // localhost
1103   AddressFlags("127.0.0.1", 4, IS_LOCAL | IS_PVT_NONROUTE),
1104   AddressFlags("::1", 6, IS_LOCAL | IS_PVT_NONROUTE),
1105
1106   // link-local v4
1107   AddressFlags("169.254.0.1", 4, IS_LINK_LOCAL | IS_PVT_NONROUTE),
1108
1109   // private v4
1110   AddressFlags("10.0.0.0", 4, IS_PVT_NONROUTE),
1111   AddressFlags("10.11.12.13", 4, IS_PVT_NONROUTE),
1112   AddressFlags("10.255.255.255", 4, IS_PVT_NONROUTE),
1113   AddressFlags("127.128.129.200", 4, IS_LOCAL | IS_PVT_NONROUTE),
1114   AddressFlags("127.255.255.255", 4, IS_LOCAL | IS_PVT_NONROUTE),
1115   AddressFlags("169.254.0.0", 4, IS_LINK_LOCAL | IS_PVT_NONROUTE),
1116   AddressFlags("192.168.0.0", 4, IS_PVT_NONROUTE),
1117   AddressFlags("192.168.200.255", 4, IS_PVT_NONROUTE),
1118   AddressFlags("192.168.255.255", 4, IS_PVT_NONROUTE),
1119
1120   // private v6
1121   AddressFlags("fd01:1637:1c56:66af::", 6, IS_PVT_NONROUTE),
1122
1123   // non routable v4
1124   AddressFlags("0.0.0.0", 4, IS_NONROUTABLE | IS_ZERO),
1125   AddressFlags("0.255.255.255", 4, IS_NONROUTABLE),
1126   AddressFlags("192.0.0.0", 4, IS_NONROUTABLE),
1127   AddressFlags("192.0.2.0", 4, IS_NONROUTABLE),
1128   AddressFlags("198.18.0.0", 4, IS_NONROUTABLE),
1129   AddressFlags("198.19.255.255", 4, IS_NONROUTABLE),
1130   AddressFlags("198.51.100.0", 4, IS_NONROUTABLE),
1131   AddressFlags("198.51.100.255", 4, IS_NONROUTABLE),
1132   AddressFlags("203.0.113.0", 4, IS_NONROUTABLE),
1133   AddressFlags("203.0.113.255", 4, IS_NONROUTABLE),
1134   AddressFlags("224.0.0.0", 4, IS_NONROUTABLE | IS_MULTICAST),
1135   AddressFlags("240.0.0.0", 4, IS_NONROUTABLE),
1136   AddressFlags("224.0.0.0", 4, IS_NONROUTABLE),
1137   // v4 link local broadcast
1138   AddressFlags("255.255.255.255", 4, IS_NONROUTABLE | IS_LINK_LOCAL_BROADCAST),
1139
1140   // non routable v6
1141   AddressFlags("1999::1", 6, IS_NONROUTABLE),
1142   AddressFlags("0::0", 6, IS_NONROUTABLE | IS_ZERO),
1143   AddressFlags("0::0:0", 6, IS_NONROUTABLE | IS_ZERO),
1144   AddressFlags("0:0:0::0", 6, IS_NONROUTABLE | IS_ZERO),
1145
1146   // link-local v6
1147   AddressFlags("fe80::0205:73ff:fef9:46fc", 6, IS_LINK_LOCAL),
1148   AddressFlags("fe80::0012:34ff:fe56:7890", 6, IS_LINK_LOCAL),
1149
1150   // multicast v4
1151   AddressFlags("224.0.0.1", 4, IS_MULTICAST | IS_NONROUTABLE) ,
1152   AddressFlags("224.0.0.251", 4, IS_MULTICAST | IS_NONROUTABLE),
1153   AddressFlags("239.12.34.56", 4, IS_MULTICAST | IS_NONROUTABLE),
1154
1155   // multicast v6
1156   AddressFlags("ff00::", 6, IS_MULTICAST | IS_NONROUTABLE),
1157   AddressFlags("ff02:ffff::1", 6, IS_MULTICAST | IS_NONROUTABLE),
1158   AddressFlags("ff02::101", 6, IS_MULTICAST | IS_NONROUTABLE),
1159   AddressFlags("ff0e::101", 6, IS_MULTICAST),
1160   // v6 link local broadcast
1161   AddressFlags("ff02::1", 6, IS_NONROUTABLE | IS_LINK_LOCAL_BROADCAST),
1162 };
1163
1164 static const vector<pair<string, string> > mapProvider = {
1165   {"::ffff:192.0.2.128", "192.0.2.128"},
1166   {"192.0.2.128", "::ffff:192.0.2.128"},
1167   {"::FFFF:129.144.52.38", "129.144.52.38"},
1168   {"129.144.52.38", "::FFFF:129.144.52.38"},
1169   {"0:0:0:0:0:FFFF:222.1.41.90", "222.1.41.90"},
1170   {"::FFFF:222.1.41.90", "222.1.41.90"},
1171 };
1172
1173 static const vector<MaskData> masksProvider = {
1174   MaskData("255.255.255.255", 1, "128.0.0.0"),
1175   MaskData("255.255.255.255", 2, "192.0.0.0"),
1176   MaskData("192.0.2.42", 16, "192.0.0.0"),
1177   MaskData("255.255.255.255", 24, "255.255.255.0"),
1178   MaskData("255.255.255.255", 32, "255.255.255.255"),
1179   MaskData("10.10.10.10", 0, "0.0.0.0"),
1180   MaskData("::1", 64, "::"),
1181   MaskData("2620:0:1cfe:face:b00c::3", 1, "::"),
1182   MaskData("2620:0:1cfe:face:b00c::3", 3, "2000::"),
1183   MaskData("2620:0:1cfe:face:b00c::3", 6, "2400::"),
1184   MaskData("2620:0:1cfe:face:b00c::3", 7, "2600::"),
1185   MaskData("2620:0:1cfe:face:b00c::3", 11, "2620::"),
1186   MaskData("2620:0:1cfe:face:b00c::3", 36, "2620:0:1000::"),
1187   MaskData("2620:0:1cfe:face:b00c::3", 37, "2620:0:1800::"),
1188   MaskData("2620:0:1cfe:face:b00c::3", 38, "2620:0:1c00::"),
1189   MaskData("2620:0:1cfe:face:b00c::3", 41, "2620:0:1c80::"),
1190   MaskData("2620:0:1cfe:face:b00c::3", 42, "2620:0:1cc0::"),
1191   MaskData("2620:0:1cfe:face:b00c::3", 43, "2620:0:1ce0::"),
1192   MaskData("2620:0:1cfe:face:b00c::3", 44, "2620:0:1cf0::"),
1193   MaskData("2620:0:1cfe:face:b00c::3", 45, "2620:0:1cf8::"),
1194   MaskData("2620:0:1cfe:face:b00c::3", 46, "2620:0:1cfc::"),
1195   MaskData("2620:0:1cfe:face:b00c::3", 47, "2620:0:1cfe::"),
1196   MaskData("2620:0:1cfe:face:b00c::3", 49, "2620:0:1cfe:8000::"),
1197   MaskData("2620:0:1cfe:face:b00c::3", 50, "2620:0:1cfe:c000::"),
1198   MaskData("2620:0:1cfe:face:b00c::3", 51, "2620:0:1cfe:e000::"),
1199   MaskData("2620:0:1cfe:face:b00c::3", 52, "2620:0:1cfe:f000::"),
1200   MaskData("2620:0:1cfe:face:b00c::3", 53, "2620:0:1cfe:f800::"),
1201   MaskData("2620:0:1cfe:face:b00c::3", 55, "2620:0:1cfe:fa00::"),
1202   MaskData("2620:0:1cfe:face:b00c::3", 57, "2620:0:1cfe:fa80::"),
1203   MaskData("2620:0:1cfe:face:b00c::3", 58, "2620:0:1cfe:fac0::"),
1204   MaskData("2620:0:1cfe:face:b00c::3", 61, "2620:0:1cfe:fac8::"),
1205   MaskData("2620:0:1cfe:face:b00c::3", 62, "2620:0:1cfe:facc::"),
1206   MaskData("2620:0:1cfe:face:b00c::3", 63, "2620:0:1cfe:face::"),
1207   MaskData("2620:0:1cfe:face:b00c::3", 65, "2620:0:1cfe:face:8000::"),
1208   MaskData("2620:0:1cfe:face:b00c::3", 67, "2620:0:1cfe:face:a000::"),
1209   MaskData("2620:0:1cfe:face:b00c::3", 68, "2620:0:1cfe:face:b000::"),
1210   MaskData("2620:0:1cfe:face:b00c::3", 77, "2620:0:1cfe:face:b008::"),
1211   MaskData("2620:0:1cfe:face:b00c::3", 78, "2620:0:1cfe:face:b00c::"),
1212   MaskData("2620:0:1cfe:face:b00c::3", 127, "2620:0:1cfe:face:b00c::2"),
1213   MaskData("2620:0:1cfe:face:b00c::3", 128, "2620:0:1cfe:face:b00c::3"),
1214   MaskData("2620:0:1cfe:face:b00c::3", 0, "::")
1215 };
1216
1217 static const vector<MaskBoundaryData> maskBoundaryProvider = {
1218   MaskBoundaryData("10.1.1.1", 24, "10.1.1.1", true),
1219   MaskBoundaryData("10.1.1.1", 8, "10.1.2.3", true),
1220   MaskBoundaryData("2620:0:1cfe:face:b00c::1", 48, "2620:0:1cfe::", true),
1221   // addresses that are NOT in the same subnet once mask is applied
1222   MaskBoundaryData("10.1.1.1", 24, "10.1.2.1", false),
1223   MaskBoundaryData("10.1.1.1", 16, "10.2.3.4", false),
1224   MaskBoundaryData("2620:0:1cfe:face:b00c::1", 48, "2620:0:1cfc::", false),
1225 };
1226
1227 INSTANTIATE_TEST_CASE_P(IPAddress,
1228                         IPAddressTest,
1229                         ::testing::ValuesIn(validAddressProvider));
1230 INSTANTIATE_TEST_CASE_P(IPAddress,
1231                         IPAddressFlagTest,
1232                         ::testing::ValuesIn(flagProvider));
1233 INSTANTIATE_TEST_CASE_P(IPAddress,
1234                         IPAddressMappedTest,
1235                         ::testing::ValuesIn(mapProvider));
1236 INSTANTIATE_TEST_CASE_P(IPAddress,
1237                         IPAddressCtorTest,
1238                         ::testing::ValuesIn(invalidAddressProvider));
1239 INSTANTIATE_TEST_CASE_P(IPAddress,
1240                         IPAddressCtorBinaryTest,
1241                         ::testing::ValuesIn(invalidBinaryProvider));
1242 INSTANTIATE_TEST_CASE_P(IPAddress,
1243                         IPAddressMaskTest,
1244                         ::testing::ValuesIn(masksProvider));
1245 INSTANTIATE_TEST_CASE_P(IPAddress,
1246                         IPAddressMaskBoundaryTest,
1247                         ::testing::ValuesIn(maskBoundaryProvider));
1248 INSTANTIATE_TEST_CASE_P(IPAddress,
1249                         IPAddressByteAccessorTest,
1250                         ::testing::ValuesIn(validAddressProvider));
1251 INSTANTIATE_TEST_CASE_P(IPAddress,
1252                         IPAddressBitAccessorTest,
1253                         ::testing::ValuesIn(validAddressProvider));