Index: net/base/net_util_unittest.cc |
diff --git a/net/base/net_util_unittest.cc b/net/base/net_util_unittest.cc |
index 4883ff2807b83a187d6ce951f8ed81cd6659da44..45f08571c41028c5858e506d096626fe08a74b2d 100644 |
--- a/net/base/net_util_unittest.cc |
+++ b/net/base/net_util_unittest.cc |
@@ -17,6 +17,11 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "base/sys_byteorder.h" |
#include "base/time/time.h" |
+ |
+#if !defined(OS_NACL) && !defined(OS_WIN) |
+#include <net/if.h> |
+#include <netinet/in.h> |
+#endif // !OS_NACL && !OS_WIN |
#include "testing/gtest/include/gtest/gtest.h" |
#include "url/gurl.h" |
@@ -25,10 +30,16 @@ |
#include <objbase.h> |
#include "base/win/windows_version.h" |
#include "net/base/net_util_win.h" |
-#elif !defined(OS_ANDROID) |
-#include <net/if.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) |
+#include "net/base/net_util_posix.h" |
+#endif // !OS_WIN |
+ |
using base::ASCIIToUTF16; |
using base::WideToUTF16; |
@@ -801,6 +812,152 @@ TEST(NetUtilTest, GetNetworkList) { |
} |
} |
+#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL) |
+ |
+char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) { |
+ EXPECT_LT(ifname_size, IF_NAMESIZE); |
+ memcpy(output, ifname, ifname_size); |
+ 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)); |
+ |
+ // Interface 1 is offline. |
+ struct ifaddrmsg msg = { |
+ AF_INET6, |
+ 1, /* prefix length */ |
+ IFA_F_TEMPORARY, /* address flags */ |
+ 0, /* link scope */ |
+ 1 /* link index */ |
+ }; |
+ |
+ // Address of offline links should be ignored. |
+ ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceName)); |
+ EXPECT_EQ(results.size(), 0ul); |
+ |
+ // Mark interface 1 online. |
+ online_links.insert(1); |
+ |
+ // Local address should be trimmed out. |
+ address_map.clear(); |
+ ASSERT_TRUE( |
+ address_map.insert(std::make_pair(ipv6_local_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceName)); |
+ EXPECT_EQ(results.size(), 0ul); |
+ |
+ // vmware address should return by default. |
+ address_map.clear(); |
+ ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceNameVM)); |
+ 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. |
+ address_map.clear(); |
+ ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceNameVM)); |
+ EXPECT_EQ(results.size(), 0ul); |
+ results.clear(); |
+ |
+ // Addresses with banned attributes should be ignored. |
+ address_map.clear(); |
+ msg.ifa_flags = IFA_F_TENTATIVE; |
+ ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceName)); |
+ EXPECT_EQ(results.size(), 0ul); |
+ results.clear(); |
+ |
+ // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and |
+ // attributes should be translated correctly. |
+ address_map.clear(); |
+ msg.ifa_flags = IFA_F_TEMPORARY; |
+ ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceName)); |
+ 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. |
+ address_map.clear(); |
+ msg.ifa_flags = IFA_F_DEPRECATED; |
+ ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second); |
+ EXPECT_TRUE( |
+ net::internal::GetNetworkListImpl(&results, |
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, |
+ online_links, |
+ address_map, |
+ GetInterfaceName)); |
+ 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 |
+ |
namespace { |
#if defined(OS_WIN) |