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