network_interfaces_linux_unittest.cc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/network_interfaces_linux.h"
  5. #include <net/if.h>
  6. #include <netinet/in.h>
  7. #include <ostream>
  8. #include <string>
  9. #include <unordered_set>
  10. #include "base/strings/utf_string_conversions.h"
  11. #include "build/build_config.h"
  12. #include "net/base/address_tracker_linux.h"
  13. #include "net/base/ip_endpoint.h"
  14. #include "net/base/network_interfaces_posix.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. namespace net {
  17. namespace {
  18. static const char kIfnameEm1[] = "em1";
  19. static const char kIfnameVmnet[] = "vmnet";
  20. static const unsigned char kIPv6LocalAddr[] = {0, 0, 0, 0, 0, 0, 0, 0,
  21. 0, 0, 0, 0, 0, 0, 0, 1};
  22. static const unsigned char kIPv6Addr[] = {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04,
  23. 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
  24. 0xfe, 0xe5, 0x00, 0xc3};
  25. char* GetInterfaceName(int interface_index, char* ifname) {
  26. static_assert(std::size(kIfnameEm1) < IF_NAMESIZE, "Invalid interface name");
  27. memcpy(ifname, kIfnameEm1, std::size(kIfnameEm1));
  28. return ifname;
  29. }
  30. char* GetInterfaceNameVM(int interface_index, char* ifname) {
  31. static_assert(std::size(kIfnameVmnet) < IF_NAMESIZE,
  32. "Invalid interface name");
  33. memcpy(ifname, kIfnameVmnet, std::size(kIfnameVmnet));
  34. return ifname;
  35. }
  36. TEST(NetworkInterfacesTest, NetworkListTrimmingLinux) {
  37. IPAddress ipv6_local_address(kIPv6LocalAddr);
  38. IPAddress ipv6_address(kIPv6Addr);
  39. NetworkInterfaceList results;
  40. std::unordered_set<int> online_links;
  41. internal::AddressTrackerLinux::AddressMap address_map;
  42. // Interface 1 is offline.
  43. struct ifaddrmsg msg = {
  44. AF_INET6, // Address type
  45. 1, // Prefix length
  46. IFA_F_TEMPORARY, // Address flags
  47. 0, // Link scope
  48. 1 // Link index
  49. };
  50. // Address of offline links should be ignored.
  51. ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
  52. EXPECT_TRUE(internal::GetNetworkListImpl(
  53. &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  54. address_map, GetInterfaceName));
  55. EXPECT_EQ(results.size(), 0ul);
  56. // Mark interface 1 online.
  57. online_links.insert(1);
  58. // Local address should be trimmed out.
  59. address_map.clear();
  60. ASSERT_TRUE(
  61. address_map.insert(std::make_pair(ipv6_local_address, msg)).second);
  62. EXPECT_TRUE(internal::GetNetworkListImpl(
  63. &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  64. address_map, GetInterfaceName));
  65. EXPECT_EQ(results.size(), 0ul);
  66. // vmware address should return by default.
  67. address_map.clear();
  68. ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
  69. EXPECT_TRUE(internal::GetNetworkListImpl(
  70. &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  71. address_map, GetInterfaceNameVM));
  72. EXPECT_EQ(results.size(), 1ul);
  73. EXPECT_EQ(results[0].name, kIfnameVmnet);
  74. EXPECT_EQ(results[0].prefix_length, 1ul);
  75. EXPECT_EQ(results[0].address, ipv6_address);
  76. results.clear();
  77. // vmware address should be trimmed out if policy specified so.
  78. address_map.clear();
  79. ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
  80. EXPECT_TRUE(internal::GetNetworkListImpl(
  81. &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  82. address_map, GetInterfaceNameVM));
  83. EXPECT_EQ(results.size(), 0ul);
  84. results.clear();
  85. // Addresses with banned attributes should be ignored.
  86. address_map.clear();
  87. msg.ifa_flags = IFA_F_TENTATIVE;
  88. ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
  89. EXPECT_TRUE(internal::GetNetworkListImpl(
  90. &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  91. address_map, GetInterfaceName));
  92. EXPECT_EQ(results.size(), 0ul);
  93. results.clear();
  94. // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and
  95. // attributes should be translated correctly.
  96. address_map.clear();
  97. msg.ifa_flags = IFA_F_TEMPORARY;
  98. ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
  99. EXPECT_TRUE(internal::GetNetworkListImpl(
  100. &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  101. address_map, GetInterfaceName));
  102. EXPECT_EQ(results.size(), 1ul);
  103. EXPECT_EQ(results[0].name, kIfnameEm1);
  104. EXPECT_EQ(results[0].prefix_length, 1ul);
  105. EXPECT_EQ(results[0].address, ipv6_address);
  106. EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
  107. results.clear();
  108. // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and
  109. // attributes should be translated correctly.
  110. address_map.clear();
  111. msg.ifa_flags = IFA_F_DEPRECATED;
  112. ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
  113. EXPECT_TRUE(internal::GetNetworkListImpl(
  114. &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
  115. address_map, GetInterfaceName));
  116. EXPECT_EQ(results.size(), 1ul);
  117. EXPECT_EQ(results[0].name, kIfnameEm1);
  118. EXPECT_EQ(results[0].prefix_length, 1ul);
  119. EXPECT_EQ(results[0].address, ipv6_address);
  120. EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
  121. results.clear();
  122. }
  123. const char kWiFiSSID[] = "TestWiFi";
  124. const char kInterfaceWithDifferentSSID[] = "wlan999";
  125. std::string TestGetInterfaceSSID(const std::string& ifname) {
  126. return (ifname == kInterfaceWithDifferentSSID) ? "AnotherSSID" : kWiFiSSID;
  127. }
  128. TEST(NetworkInterfacesTest, GetWifiSSIDFromInterfaceList) {
  129. NetworkInterfaceList list;
  130. EXPECT_EQ(std::string(), internal::GetWifiSSIDFromInterfaceListInternal(
  131. list, TestGetInterfaceSSID));
  132. NetworkInterface interface1;
  133. interface1.name = "wlan0";
  134. interface1.type = NetworkChangeNotifier::CONNECTION_WIFI;
  135. list.push_back(interface1);
  136. ASSERT_EQ(1u, list.size());
  137. EXPECT_EQ(std::string(kWiFiSSID),
  138. internal::GetWifiSSIDFromInterfaceListInternal(
  139. list, TestGetInterfaceSSID));
  140. NetworkInterface interface2;
  141. interface2.name = "wlan1";
  142. interface2.type = NetworkChangeNotifier::CONNECTION_WIFI;
  143. list.push_back(interface2);
  144. ASSERT_EQ(2u, list.size());
  145. EXPECT_EQ(std::string(kWiFiSSID),
  146. internal::GetWifiSSIDFromInterfaceListInternal(
  147. list, TestGetInterfaceSSID));
  148. NetworkInterface interface3;
  149. interface3.name = kInterfaceWithDifferentSSID;
  150. interface3.type = NetworkChangeNotifier::CONNECTION_WIFI;
  151. list.push_back(interface3);
  152. ASSERT_EQ(3u, list.size());
  153. EXPECT_EQ(std::string(), internal::GetWifiSSIDFromInterfaceListInternal(
  154. list, TestGetInterfaceSSID));
  155. list.pop_back();
  156. NetworkInterface interface4;
  157. interface4.name = "eth0";
  158. interface4.type = NetworkChangeNotifier::CONNECTION_ETHERNET;
  159. list.push_back(interface4);
  160. ASSERT_EQ(3u, list.size());
  161. EXPECT_EQ(std::string(), internal::GetWifiSSIDFromInterfaceListInternal(
  162. list, TestGetInterfaceSSID));
  163. }
  164. } // namespace
  165. } // namespace net