| Index: net/base/net_util_unittest.cc
|
| diff --git a/net/base/net_util_unittest.cc b/net/base/net_util_unittest.cc
|
| index a25903a127005f2d1055e60fa4e725d85f67942a..cb9ec1ffc4d8f96ccdb38906ca2e1e162e053eb3 100644
|
| --- a/net/base/net_util_unittest.cc
|
| +++ b/net/base/net_util_unittest.cc
|
| @@ -36,21 +36,22 @@
|
| #include <iphlpapi.h>
|
| #include <objbase.h>
|
| #include "base/win/windows_version.h"
|
| -#include "net/base/net_util_win.h"
|
| #endif // OS_WIN
|
|
|
| #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN)
|
| #include "net/base/address_tracker_linux.h"
|
| #endif // !OS_MACOSX && !OS_NACL && !OS_WIN
|
|
|
| -#if !defined(OS_WIN)
|
| +#if defined(OS_WIN)
|
| +#include "net/base/net_util_win.h"
|
| +#else // 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
|
| +#endif // OS_MACOSX
|
| +#endif // OS_WIN
|
|
|
| using base::ASCIIToUTF16;
|
| using base::WideToUTF16;
|
| @@ -830,8 +831,8 @@ TEST(NetUtilTest, GetNetworkList) {
|
| }
|
| }
|
| EXPECT_FALSE(all_zeroes);
|
| - EXPECT_GT(it->network_prefix, 1u);
|
| - EXPECT_LE(it->network_prefix, it->address.size() * 8);
|
| + EXPECT_GT(it->prefix_length, 1u);
|
| + EXPECT_LE(it->prefix_length, it->address.size() * 8);
|
|
|
| #if defined(OS_WIN)
|
| // On Windows |name| is NET_LUID.
|
| @@ -877,16 +878,32 @@ TEST(NetUtilTest, GetNetworkList) {
|
| }
|
|
|
| static const char ifname_em1[] = "em1";
|
| +#if defined(OS_WIN)
|
| +static const char ifname_vm[] = "VMnet";
|
| +#else
|
| static const char ifname_vm[] = "vmnet";
|
| +#endif // OS_WIN
|
|
|
| static const unsigned char kIPv6LocalAddr[] = {
|
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
|
| +
|
| +// The following 3 addresses need to be changed together. IPv6Addr is the IPv6
|
| +// address. IPv6Netmask is the mask address with as many leading bits set to 1
|
| +// as the prefix length. IPv6AddrPrefix needs to match IPv6Addr with the same
|
| +// number of bits as the prefix length.
|
| static const unsigned char kIPv6Addr[] =
|
| {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
|
| 0xfe, 0xe5, 0x00, 0xc3};
|
| +#if defined(OS_WIN)
|
| +static const unsigned char kIPv6AddrPrefix[] =
|
| + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00};
|
| +#endif // OS_WIN
|
| +#if defined(OS_MACOSX)
|
| static const unsigned char kIPv6Netmask[] =
|
| {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| 0x00, 0x00, 0x00, 0x00};
|
| +#endif // OS_MACOSX
|
|
|
| #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL)
|
|
|
| @@ -908,8 +925,6 @@ 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;
|
| ::base::hash_set<int> online_links;
|
| @@ -960,7 +975,7 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| GetInterfaceNameVM));
|
| EXPECT_EQ(results.size(), 1ul);
|
| EXPECT_EQ(results[0].name, ifname_vm);
|
| - EXPECT_EQ(results[0].network_prefix, 1ul);
|
| + EXPECT_EQ(results[0].prefix_length, 1ul);
|
| EXPECT_EQ(results[0].address, ipv6_address);
|
| results.clear();
|
|
|
| @@ -1002,7 +1017,7 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| GetInterfaceName));
|
| EXPECT_EQ(results.size(), 1ul);
|
| EXPECT_EQ(results[0].name, ifname_em1);
|
| - EXPECT_EQ(results[0].network_prefix, 1ul);
|
| + EXPECT_EQ(results[0].prefix_length, 1ul);
|
| EXPECT_EQ(results[0].address, ipv6_address);
|
| EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
|
| results.clear();
|
| @@ -1020,7 +1035,7 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| GetInterfaceName));
|
| EXPECT_EQ(results.size(), 1ul);
|
| EXPECT_EQ(results[0].name, ifname_em1);
|
| - EXPECT_EQ(results[0].network_prefix, 1ul);
|
| + EXPECT_EQ(results[0].prefix_length, 1ul);
|
| EXPECT_EQ(results[0].address, ipv6_address);
|
| EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
|
| results.clear();
|
| @@ -1064,7 +1079,7 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| &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].prefix_length, 1ul);
|
| EXPECT_EQ(results[0].address, ipv6_address);
|
| results.clear();
|
|
|
| @@ -1098,7 +1113,7 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| &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].prefix_length, 1ul);
|
| EXPECT_EQ(results[0].address, ipv6_address);
|
| EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
|
| results.clear();
|
| @@ -1113,12 +1128,181 @@ TEST(NetUtilTest, GetNetworkListTrimming) {
|
| &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].prefix_length, 1ul);
|
| EXPECT_EQ(results[0].address, ipv6_address);
|
| EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
|
| results.clear();
|
| #endif // !OS_IOS
|
| }
|
| +#elif defined(OS_WIN) // !OS_MACOSX && !OS_WIN && !OS_NACL
|
| +
|
| +// Helper function to create a valid IP_ADAPTER_ADDRESSES with reasonable
|
| +// default value. The output is the |adapter_address|. All the rests are input
|
| +// to fill the |adapter_address|. |sock_addrs| are temporary storage used by
|
| +// |adapter_address| once the function is returned.
|
| +bool FillAdapterAddress(IP_ADAPTER_ADDRESSES* adapter_address,
|
| + const char* ifname,
|
| + const IPAddressNumber& ip_address,
|
| + const IPAddressNumber& ip_netmask,
|
| + sockaddr_storage sock_addrs[2]) {
|
| + adapter_address->AdapterName = const_cast<char*>(ifname);
|
| + adapter_address->FriendlyName = const_cast<PWCHAR>(L"interface");
|
| + adapter_address->IfType = IF_TYPE_ETHERNET_CSMACD;
|
| + adapter_address->OperStatus = IfOperStatusUp;
|
| + adapter_address->FirstUnicastAddress->DadState = IpDadStatePreferred;
|
| + adapter_address->FirstUnicastAddress->PrefixOrigin = IpPrefixOriginOther;
|
| + adapter_address->FirstUnicastAddress->SuffixOrigin = IpSuffixOriginOther;
|
| + adapter_address->FirstUnicastAddress->PreferredLifetime = 100;
|
| + adapter_address->FirstUnicastAddress->ValidLifetime = 1000;
|
| +
|
| + 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;
|
| + }
|
| + adapter_address->FirstUnicastAddress->Address.lpSockaddr =
|
| + reinterpret_cast<sockaddr*>(&sock_addrs[0]);
|
| + adapter_address->FirstUnicastAddress->Address.iSockaddrLength = sock_len;
|
| + adapter_address->FirstUnicastAddress->OnLinkPrefixLength = 1;
|
| +
|
| + sock_len = sizeof(sockaddr_storage);
|
| + if (!IPEndPoint(ip_netmask, 0)
|
| + .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[1]),
|
| + &sock_len)) {
|
| + return false;
|
| + }
|
| + adapter_address->FirstPrefix->Address.lpSockaddr =
|
| + reinterpret_cast<sockaddr*>(&sock_addrs[1]);
|
| + adapter_address->FirstPrefix->Address.iSockaddrLength = sock_len;
|
| + adapter_address->FirstPrefix->PrefixLength = 1;
|
| +
|
| + DCHECK_EQ(sock_addrs[0].ss_family, sock_addrs[1].ss_family);
|
| + if (sock_addrs[0].ss_family == AF_INET6) {
|
| + adapter_address->Ipv6IfIndex = 0;
|
| + } else {
|
| + DCHECK_EQ(sock_addrs[0].ss_family, AF_INET);
|
| + adapter_address->IfIndex = 0;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +TEST(NetUtilTest, GetNetworkListTrimming) {
|
| + IPAddressNumber ipv6_local_address(
|
| + kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
|
| + IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
|
| + IPAddressNumber ipv6_prefix(kIPv6AddrPrefix,
|
| + kIPv6AddrPrefix + arraysize(kIPv6AddrPrefix));
|
| +
|
| + NetworkInterfaceList results;
|
| + sockaddr_storage addresses[2];
|
| + IP_ADAPTER_ADDRESSES adapter_address = {0};
|
| + IP_ADAPTER_UNICAST_ADDRESS address = {0};
|
| + IP_ADAPTER_PREFIX adapter_prefix = {0};
|
| + adapter_address.FirstUnicastAddress = &address;
|
| + adapter_address.FirstPrefix = &adapter_prefix;
|
| +
|
| + // Address of offline links should be ignored.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
|
| + ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + adapter_address.OperStatus = IfOperStatusDown;
|
| +
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| +
|
| + EXPECT_EQ(results.size(), 0ul);
|
| +
|
| + // Address on loopback interface should be trimmed out.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
|
| + ipv6_local_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + adapter_address.IfType = IF_TYPE_SOFTWARE_LOOPBACK;
|
| +
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| +
|
| + // vmware address should return by default.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_vm /* ifname */,
|
| + ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| + EXPECT_EQ(results.size(), 1ul);
|
| + EXPECT_EQ(results[0].name, ifname_vm);
|
| + EXPECT_EQ(results[0].prefix_length, 1ul);
|
| + EXPECT_EQ(results[0].address, ipv6_address);
|
| + EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_NONE);
|
| + results.clear();
|
| +
|
| + // vmware address should be trimmed out if policy specified so.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_vm /* ifname */,
|
| + ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| + results.clear();
|
| +
|
| + // Addresses with incompleted DAD should be ignored.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
|
| + ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + adapter_address.FirstUnicastAddress->DadState = IpDadStateTentative;
|
| +
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| + EXPECT_EQ(results.size(), 0ul);
|
| + results.clear();
|
| +
|
| + // Addresses with allowed attribute IpSuffixOriginRandom should be returned
|
| + // and attributes should be translated correctly to
|
| + // IP_ADDRESS_ATTRIBUTE_TEMPORARY.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
|
| + ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + adapter_address.FirstUnicastAddress->PrefixOrigin =
|
| + IpPrefixOriginRouterAdvertisement;
|
| + adapter_address.FirstUnicastAddress->SuffixOrigin = IpSuffixOriginRandom;
|
| +
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| + EXPECT_EQ(results.size(), 1ul);
|
| + EXPECT_EQ(results[0].name, ifname_em1);
|
| + EXPECT_EQ(results[0].prefix_length, 1ul);
|
| + EXPECT_EQ(results[0].address, ipv6_address);
|
| + EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
|
| + results.clear();
|
| +
|
| + // Addresses with preferred lifetime 0 should be returned and
|
| + // attributes should be translated correctly to
|
| + // IP_ADDRESS_ATTRIBUTE_DEPRECATED.
|
| + ASSERT_TRUE(FillAdapterAddress(
|
| + &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
|
| + ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
|
| + addresses /* sock_addrs */));
|
| + adapter_address.FirstUnicastAddress->PreferredLifetime = 0;
|
| + adapter_address.FriendlyName = const_cast<PWCHAR>(L"FriendlyInterfaceName");
|
| + EXPECT_TRUE(net::internal::GetNetworkListImpl(
|
| + &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
|
| + EXPECT_EQ(results.size(), 1ul);
|
| + EXPECT_EQ(results[0].friendly_name, "FriendlyInterfaceName");
|
| + EXPECT_EQ(results[0].name, ifname_em1);
|
| + EXPECT_EQ(results[0].prefix_length, 1ul);
|
| + EXPECT_EQ(results[0].address, ipv6_address);
|
| + EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
|
| + results.clear();
|
| +}
|
|
|
| #endif // !OS_MACOSX && !OS_WIN && !OS_NACL
|
|
|
|
|