undefined reference to 'folly::threadlocal_detail::StaticMeta<void>::EntryID::kInvalid'
[folly.git] / folly / test / IPAddressTest.cpp
index 952cf4aac902958cd2e688d7ac448e067a03bbb3..ef7885683623c1e0744475949c30c997aabebf53 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2015 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "IPAddressTest.h"
+#include <folly/test/IPAddressTest.h>
 
 #include <gtest/gtest.h>
 
@@ -29,8 +29,8 @@ using namespace std;
 // tests code example
 TEST(IPAddress, CodeExample) {
   EXPECT_EQ(4, sizeof(IPAddressV4));
-  EXPECT_EQ(16, sizeof(IPAddressV6));
-  EXPECT_EQ(20, sizeof(IPAddress));
+  EXPECT_EQ(20, sizeof(IPAddressV6));
+  EXPECT_EQ(24, sizeof(IPAddress));
   IPAddress uninitaddr;
   IPAddress v4addr("192.0.2.129");
   IPAddress v6map("::ffff:192.0.2.129");
@@ -53,6 +53,24 @@ TEST(IPAddress, CodeExample) {
   EXPECT_TRUE(IPAddress::createIPv6(v4addr) == v6map.asV6());
 }
 
+TEST(IPAddress, Scope) {
+  // Test that link-local scope is saved
+  auto str = "fe80::62eb:69ff:fe9b:ba60%eth0";
+  IPAddressV6 a2(str);
+  EXPECT_EQ(str, a2.str());
+
+  sockaddr_in6 sock = a2.toSockAddr();
+  EXPECT_NE(0, sock.sin6_scope_id);
+
+  IPAddress a1(str);
+  EXPECT_EQ(str, a1.str());
+
+  a2.setScopeId(0);
+  EXPECT_NE(a1, a2);
+
+  EXPECT_TRUE(a2 < a1);
+}
+
 TEST(IPAddress, Ordering) {
   IPAddress a1("0.1.1.1");
   IPAddress a2("1.1.1.0");
@@ -272,6 +290,7 @@ TEST(IPAddress, CtorSockaddr) {
   {
     // setup
     sockaddr_in6 addr;
+    memset(&addr, 0, sizeof(addr));
     in6_addr sin_addr;
     ByteArray16 sec{{
       // 2620:0:1cfe:face:b00c::3
@@ -390,6 +409,11 @@ TEST(IPAddress, ToFullyQualifiedLocal) {
   EXPECT_EQ("0000:0000:0000:0000:0000:0000:0000:0001", ip.toFullyQualified())
       << ip;
 }
+TEST(IPAddress, ToFullyQualifiedSize) {
+  auto actual = IPAddressV6::kToFullyQualifiedSize;
+  auto expected = IPAddress("::").toFullyQualified().size();
+  EXPECT_EQ(expected, actual);
+}
 
 // test v4-v6 mapped addresses
 TEST_P(IPAddressMappedTest, MappedEqual) {
@@ -482,7 +506,6 @@ static vector<pair<string, uint8_t> > invalidMasks = {
 };
 TEST(IPAddress, InvalidMask) {
   for (auto& tc : invalidMasks) {
-    uint8_t mask = tc.second;
     auto ip = IPAddress(tc.first);
     EXPECT_THROW(ip.mask(tc.second), IPAddressFormatException);
   }
@@ -671,10 +694,7 @@ TEST_P(IPAddressFlagTest, IsZero) {
 
 TEST_P(IPAddressFlagTest, IsLinkLocal) {
   AddressFlags param = GetParam();
-  if (param.version != 6) {
-    return;
-  }
-  IPAddressV6 addr(param.address);
+  IPAddress addr(param.address);
   EXPECT_EQ(param.isLinkLocal(), addr.isLinkLocal()) << addr;
 }
 
@@ -707,7 +727,7 @@ TEST(IPAddress, SolicitedNodeAddress) {
 TEST_P(IPAddressByteAccessorTest, CheckBytes) {
   auto addrData = GetParam();
   IPAddress ip(addrData.address);
-  auto i = 0;
+  size_t i = 0;
   for (auto byitr = addrData.bytes.begin(); i < ip.byteCount(); ++i, ++byitr) {
     EXPECT_EQ(*byitr, ip.getNthMSByte(i));
     EXPECT_EQ(*byitr, ip.isV4() ?
@@ -731,7 +751,7 @@ TEST_P(IPAddressBitAccessorTest, CheckBits) {
   //We will traverse the IPAddress bits from 0 to bitCount -1
   auto bitr = folly::makeBitIterator(littleEndianAddrData.begin());
   IPAddress ip(addrData.address);
-  for (auto i = 0; i < ip.bitCount(); ++i) {
+  for (size_t i = 0; i < ip.bitCount(); ++i) {
     auto msbIndex = ip.bitCount() - i - 1;
     EXPECT_EQ(*bitr, ip.getNthMSBit(msbIndex));
     EXPECT_EQ(*bitr, ip.isV4() ? ip.asV4().getNthMSBit(msbIndex) :
@@ -794,6 +814,19 @@ TEST(IPAddress, InvalidBBitAccess) {
   EXPECT_THROW(asV6.getNthLSBit(-1), std::invalid_argument);
 }
 
+TEST(IPAddress, StringFormat) {
+  in6_addr a6;
+  for (int i = 0; i < 8; ++i) {
+    a6.s6_addr16[i] = htons(0x0123 + ((i%4) * 0x4444));
+  }
+  EXPECT_EQ("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
+            detail::fastIpv6ToString(a6));
+
+  in_addr a4;
+  a4.s_addr = htonl(0x01020304);
+  EXPECT_EQ("1.2.3.4", detail::fastIpv4ToString(a4));
+}
+
 TEST(IPAddress, LongestCommonPrefix) {
   IPAddress ip10("10.0.0.0");
   IPAddress ip11("11.0.0.0");
@@ -935,13 +968,16 @@ static vector<AddressFlags> flagProvider = {
   AddressFlags("127.0.0.1", 4, IS_LOCAL | IS_PVT_NONROUTE),
   AddressFlags("::1", 6, IS_LOCAL | IS_PVT_NONROUTE),
 
+  // link-local v4
+  AddressFlags("169.254.0.1", 4, IS_LINK_LOCAL | IS_PVT_NONROUTE),
+
   // private v4
   AddressFlags("10.0.0.0", 4, IS_PVT_NONROUTE),
   AddressFlags("10.11.12.13", 4, IS_PVT_NONROUTE),
   AddressFlags("10.255.255.255", 4, IS_PVT_NONROUTE),
-  AddressFlags("127.128.129.200", 4, IS_PVT_NONROUTE),
-  AddressFlags("127.255.255.255", 4, IS_PVT_NONROUTE),
-  AddressFlags("169.254.0.0", 4, IS_PVT_NONROUTE),
+  AddressFlags("127.128.129.200", 4, IS_LOCAL | IS_PVT_NONROUTE),
+  AddressFlags("127.255.255.255", 4, IS_LOCAL | IS_PVT_NONROUTE),
+  AddressFlags("169.254.0.0", 4, IS_LINK_LOCAL | IS_PVT_NONROUTE),
   AddressFlags("192.168.0.0", 4, IS_PVT_NONROUTE),
   AddressFlags("192.168.200.255", 4, IS_PVT_NONROUTE),
   AddressFlags("192.168.255.255", 4, IS_PVT_NONROUTE),