| Index: net/base/net_util_unittest.cc
|
| diff --git a/net/base/net_util_unittest.cc b/net/base/net_util_unittest.cc
|
| index 45f08571c41028c5858e506d096626fe08a74b2d..a25903a127005f2d1055e60fa4e725d85f67942a 100644
|
| --- a/net/base/net_util_unittest.cc
|
| +++ b/net/base/net_util_unittest.cc
|
| @@ -17,10 +17,17 @@
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/sys_byteorder.h"
|
| #include "base/time/time.h"
|
| +#include "net/base/ip_endpoint.h"
|
|
|
| #if !defined(OS_NACL) && !defined(OS_WIN)
|
| #include <net/if.h>
|
| #include <netinet/in.h>
|
| +#if defined(OS_MACOSX)
|
| +#include <ifaddrs.h>
|
| +#if !defined(OS_IOS)
|
| +#include <netinet/in_var.h>
|
| +#endif // !OS_IOS
|
| +#endif // OS_MACOSX
|
| #endif // !OS_NACL && !OS_WIN
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "url/gurl.h"
|
| @@ -38,6 +45,11 @@
|
|
|
| #if !defined(OS_WIN)
|
| #include "net/base/net_util_posix.h"
|
| +#if defined(OS_MACOSX)
|
| +#include "net/base/net_util_mac.h"
|
| +#else // OS_MACOSX
|
| +#include "net/base/net_util_linux.h"
|
| +#endif
|
| #endif // !OS_WIN
|
|
|
| using base::ASCIIToUTF16;
|
| @@ -85,6 +97,58 @@ std::string DumpIPNumber(const IPAddressNumber& v) {
|
| return out;
|
| }
|
|
|
| +#if defined(OS_MACOSX)
|
| +class IPAttributesGetterTest : public internal::IPAttributesGetterMac {
|
| + public:
|
| + IPAttributesGetterTest() : native_attributes_(0) {}
|
| + bool IsInitialized() const override { return true; }
|
| + bool GetIPAttributes(const char* ifname,
|
| + const sockaddr* sock_addr,
|
| + int* native_attributes) override {
|
| + *native_attributes = native_attributes_;
|
| + return true;
|
| + }
|
| + void set_native_attributes(int native_attributes) {
|
| + native_attributes_ = native_attributes;
|
| + }
|
| +
|
| + private:
|
| + int native_attributes_;
|
| +};
|
| +
|
| +// Helper function to create a single valid ifaddrs
|
| +bool FillIfaddrs(ifaddrs* interfaces,
|
| + const char* ifname,
|
| + uint flags,
|
| + const IPAddressNumber& ip_address,
|
| + const IPAddressNumber& ip_netmask,
|
| + sockaddr_storage sock_addrs[2]) {
|
| + interfaces->ifa_next = NULL;
|
| + interfaces->ifa_name = const_cast<char*>(ifname);
|
| + interfaces->ifa_flags = flags;
|
| +
|
| + socklen_t sock_len = sizeof(sockaddr_storage);
|
| +
|
| + // Convert to sockaddr for next check.
|
| + if (!IPEndPoint(ip_address, 0)
|
| + .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[0]),
|
| + &sock_len)) {
|
| + return false;
|
| + }
|
| + interfaces->ifa_addr = reinterpret_cast<sockaddr*>(&sock_addrs[0]);
|
| +
|
| + sock_len = sizeof(sockaddr_storage);
|
| + if (!IPEndPoint(ip_netmask, 0)
|
| + .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[1]),
|
| + &sock_len)) {
|
| + return false;
|
| + }
|
| + interfaces->ifa_netmask = reinterpret_cast<sockaddr*>(&sock_addrs[1]);
|
| +
|
| + return true;
|
| +}
|
| +#endif // OS_MACOSX
|
| +
|
| } // anonymous namespace
|
|
|
| TEST(NetUtilTest, GetIdentityFromURL) {
|
| @@ -812,6 +876,18 @@ TEST(NetUtilTest, GetNetworkList) {
|
| }
|
| }
|
|
|
| +static const char ifname_em1[] = "em1";
|
| +static const char ifname_vm[] = "vmnet";
|
| +
|
| +static const unsigned char kIPv6LocalAddr[] = {
|
| + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
|
| +static const unsigned char kIPv6Addr[] =
|
| + {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
|
| + 0xfe, 0xe5, 0x00, 0xc3};
|
| +static const unsigned char kIPv6Netmask[] =
|
| + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00};
|
| +
|
| #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL)
|
|
|
| char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) {
|
| @@ -820,30 +896,24 @@ char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) {
|
| return output;
|
| }
|
|
|
| -static const char ifname_em1[] = "em1";
|
| char* GetInterfaceName(unsigned int interface_index, char* ifname) {
|
| return CopyInterfaceName(ifname_em1, arraysize(ifname_em1), ifname);
|
| }
|
|
|
| -static const char ifname_vm[] = "vmnet";
|
| char* GetInterfaceNameVM(unsigned int interface_index, char* ifname) {
|
| return CopyInterfaceName(ifname_vm, arraysize(ifname_vm), ifname);
|
| }
|
|
|
| TEST(NetUtilTest, GetNetworkListTrimming) {
|
| - NetworkInterfaceList results;
|
| - ::base::hash_set<int> online_links;
|
| - net::internal::AddressTrackerLinux::AddressMap address_map;
|
| -
|
| - const unsigned char kIPv6LocalAddr[] = {
|
| - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
|
| - const unsigned char kIPv6Addr[] =
|
| - {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
|
| - 0xfe, 0xe5, 0x00, 0xc3};
|
| -
|
| IPAddressNumber ipv6_local_address(
|
| kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
|
| IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
|
| + IPAddressNumber ipv6_netmask(kIPv6Netmask,
|
| + kIPv6Netmask + arraysize(kIPv6Netmask));
|
| +
|
| + NetworkInterfaceList results;
|
| + ::base::hash_set<int> online_links;
|
| + net::internal::AddressTrackerLinux::AddressMap address_map;
|
|
|
| // Interface 1 is offline.
|
| struct ifaddrmsg msg = {
|
| @@ -956,7 +1026,101 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| results.clear();
|
| }
|
|
|
| -#endif
|
| +#elif defined(OS_MACOSX)
|
| +
|
| +TEST(NetUtilTest, GetNetworkListTrimming) {
|
| + IPAddressNumber ipv6_local_address(
|
| + kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
|
| + IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
|
| + IPAddressNumber ipv6_netmask(kIPv6Netmask,
|
| + kIPv6Netmask + arraysize(kIPv6Netmask));
|
| +
|
| + NetworkInterfaceList results;
|
| + IPAttributesGetterTest ip_attributes_getter;
|
| + sockaddr_storage addresses[2];
|
| + ifaddrs interface;
|
| +
|
| + // Address of offline links should be ignored.
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_UP, ipv6_address,
|
| + ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| +
|
| + // Local address should be trimmed out.
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING,
|
| + ipv6_local_address, ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| +
|
| + // vmware address should return by default.
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_vm, IFF_RUNNING, ipv6_address,
|
| + ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 1ul);
|
| + EXPECT_EQ(results[0].name, ifname_vm);
|
| + EXPECT_EQ(results[0].network_prefix, 1ul);
|
| + EXPECT_EQ(results[0].address, ipv6_address);
|
| + results.clear();
|
| +
|
| + // vmware address should be trimmed out if policy specified so.
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_vm, IFF_RUNNING, ipv6_address,
|
| + ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| + results.clear();
|
| +
|
| +#if !defined(OS_IOS)
|
| + // Addresses with banned attributes should be ignored.
|
| + ip_attributes_getter.set_native_attributes(IN6_IFF_ANYCAST);
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address,
|
| + ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| + results.clear();
|
| +
|
| + // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and
|
| + // attributes should be translated correctly.
|
| + ip_attributes_getter.set_native_attributes(IN6_IFF_TEMPORARY);
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address,
|
| + ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 1ul);
|
| + EXPECT_EQ(results[0].name, ifname_em1);
|
| + EXPECT_EQ(results[0].network_prefix, 1ul);
|
| + EXPECT_EQ(results[0].address, ipv6_address);
|
| + EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
|
| + results.clear();
|
| +
|
| + // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and
|
| + // attributes should be translated correctly.
|
| + ip_attributes_getter.set_native_attributes(IN6_IFF_DEPRECATED);
|
| + ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address,
|
| + ipv6_netmask, addresses));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
|
| + &ip_attributes_getter));
|
| + EXPECT_EQ(results.size(), 1ul);
|
| + EXPECT_EQ(results[0].name, ifname_em1);
|
| + EXPECT_EQ(results[0].network_prefix, 1ul);
|
| + EXPECT_EQ(results[0].address, ipv6_address);
|
| + EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
|
| + results.clear();
|
| +#endif // !OS_IOS
|
| +}
|
| +
|
| +#endif // !OS_MACOSX && !OS_WIN && !OS_NACL
|
|
|
| namespace {
|
|
|
|
|