/*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <folly/test/IPAddressTest.h>
-#include <gtest/gtest.h>
-
#include <folly/Bits.h>
#include <folly/Format.h>
-#include <folly/String.h>
#include <folly/MacAddress.h>
+#include <folly/String.h>
+#include <folly/detail/IPAddressSource.h>
+#include <folly/portability/GTest.h>
using namespace folly;
using namespace std;
EXPECT_EQ(IPAddressV6("::0"), v6);
}
+TEST(IPAddressV4, validate) {
+ EXPECT_TRUE(IPAddressV4::validate("0.0.0.0"));
+ EXPECT_FALSE(IPAddressV4::validate("0.0.0."));
+ EXPECT_TRUE(IPAddressV4::validate("127.127.127.127"));
+}
+
+TEST(IPAddressV6, validate) {
+ EXPECT_TRUE(IPAddressV6::validate("2620:0:1cfe:face:b00c::3"));
+ EXPECT_FALSE(IPAddressV6::validate("0.0.0.0"));
+ EXPECT_TRUE(IPAddressV6::validate("[2620:0:1cfe:face:b00c::3]"));
+ EXPECT_TRUE(IPAddressV6::validate("::ffff:0.1.1.1"));
+ EXPECT_TRUE(IPAddressV6::validate("2620:0000:1cfe:face:b00c:0000:0000:0003"));
+ EXPECT_TRUE(
+ IPAddressV6::validate("2620:0000:1cfe:face:b00c:0000:127.127.127.127"));
+}
+
+TEST(IPAddress, validate) {
+ EXPECT_TRUE(IPAddress::validate("0.0.0.0"));
+ EXPECT_TRUE(IPAddress::validate("::"));
+ EXPECT_FALSE(IPAddress::validate("asdf"));
+}
+
// Test addresses constructed using a in[6]_addr value
TEST_P(IPAddressTest, CtorAddress) {
AddressData param = GetParam();
" - ", addr_1, " - ", addr_10_1_2_3));
}
+TEST(IPaddress, toInverseArpaName) {
+ IPAddressV4 addr_ipv4("10.0.0.1");
+ EXPECT_EQ("1.0.0.10.in-addr.arpa", addr_ipv4.toInverseArpaName());
+ IPAddressV6 addr_ipv6("2620:0000:1cfe:face:b00c:0000:0000:0003");
+ EXPECT_EQ(
+ sformat(
+ "{}.ip6.arpa",
+ "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"),
+ addr_ipv6.toInverseArpaName());
+}
+
// Test that invalid string values are killed
TEST_P(IPAddressCtorTest, InvalidCreation) {
string addr = GetParam();
IPAddressFormatException);
}
+TEST(IPAddressSource, ToHex) {
+ vector<std::uint8_t> data = {{0xff, 0x20, 0x45}};
+ EXPECT_EQ(detail::Bytes::toHex(data.data(), 0), "");
+ EXPECT_EQ(detail::Bytes::toHex(data.data(), 1), "ff");
+ EXPECT_EQ(detail::Bytes::toHex(data.data(), 2), "ff20");
+ EXPECT_EQ(detail::Bytes::toHex(data.data(), 3), "ff2045");
+}
+
// Test toFullyQualified()
TEST(IPAddress, ToFullyQualifiedFb) {
IPAddress ip("2620:0:1cfe:face:b00c::3");
TEST(IPAddress, StringFormat) {
in6_addr a6;
for (int i = 0; i < 8; ++i) {
- a6.s6_addr16[i] = htons(0x0123 + ((i%4) * 0x4444));
+ auto t = htons(0x0123 + ((i % 4) * 0x4444));
+#ifdef _WIN32
+ a6.u.Word[i] = t;
+#else
+ a6.s6_addr16[i] = t;
+#endif
}
EXPECT_EQ("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
detail::fastIpv6ToString(a6));
EXPECT_EQ("1.2.3.4", detail::fastIpv4ToString(a4));
}
+TEST(IPAddress, getMacAddressFromLinkLocal) {
+ IPAddressV6 ip6("fe80::f652:14ff:fec5:74d8");
+ EXPECT_TRUE(ip6.getMacAddressFromLinkLocal().hasValue());
+ EXPECT_EQ("f4:52:14:c5:74:d8", ip6.getMacAddressFromLinkLocal()->toString());
+}
+
+TEST(IPAddress, getMacAddressFromLinkLocal_Negative) {
+ IPAddressV6 no_link_local_ip6("2803:6082:a2:4447::1");
+ EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
+ no_link_local_ip6 = IPAddressV6("fe80::f652:14ff:ccc5:74d8");
+ EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
+ no_link_local_ip6 = IPAddressV6("fe80::f652:14ff:ffc5:74d8");
+ EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
+ no_link_local_ip6 = IPAddressV6("fe81::f652:14ff:ffc5:74d8");
+ EXPECT_FALSE(no_link_local_ip6.getMacAddressFromLinkLocal().hasValue());
+}
+
TEST(IPAddress, LongestCommonPrefix) {
IPAddress ip10("10.0.0.0");
IPAddress ip11("11.0.0.0");