diff options
Diffstat (limited to 'webrtc/base/network_unittest.cc')
-rw-r--r-- | webrtc/base/network_unittest.cc | 218 |
1 files changed, 173 insertions, 45 deletions
diff --git a/webrtc/base/network_unittest.cc b/webrtc/base/network_unittest.cc index 436222127e..7dd400b996 100644 --- a/webrtc/base/network_unittest.cc +++ b/webrtc/base/network_unittest.cc @@ -10,16 +10,14 @@ #include "webrtc/base/network.h" +#include "webrtc/base/nethelpers.h" #include "webrtc/base/networkmonitor.h" #include <vector> #if defined(WEBRTC_POSIX) #include <sys/types.h> -#if !defined(WEBRTC_ANDROID) -#include <ifaddrs.h> -#else -#include "webrtc/base/ifaddrs-android.h" -#endif -#endif +#include <net/if.h> +#include "webrtc/base/ifaddrs_converter.h" +#endif // defined(WEBRTC_POSIX) #include "webrtc/base/gunit.h" #if defined(WEBRTC_WIN) #include "webrtc/base/logging.h" // For LOG_GLE @@ -27,6 +25,8 @@ namespace rtc { +namespace { + class FakeNetworkMonitor : public NetworkMonitorBase { public: void Start() override {} @@ -41,6 +41,8 @@ class FakeNetworkMonitorFactory : public NetworkMonitorFactory { } }; +} // namespace + class NetworkTest : public testing::Test, public sigslot::has_slots<> { public: NetworkTest() : callback_called_(false) {} @@ -88,7 +90,51 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> { struct ifaddrs* interfaces, bool include_ignored, NetworkManager::NetworkList* networks) { - network_manager.ConvertIfAddrs(interfaces, include_ignored, networks); + // Use the base IfAddrsConverter for test cases. + rtc::scoped_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter()); + network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(), + include_ignored, networks); + } + + struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string, + uint32_t scope_id) { + struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6; + memset(ipv6_addr, 0, sizeof(struct sockaddr_in6)); + ipv6_addr->sin6_family = AF_INET6; + ipv6_addr->sin6_scope_id = scope_id; + IPAddress ip; + IPFromString(ip_string, &ip); + ipv6_addr->sin6_addr = ip.ipv6_address(); + return ipv6_addr; + } + + // Pointers created here need to be released via ReleaseIfAddrs. + struct ifaddrs* AddIpv6Address(struct ifaddrs* list, + char* if_name, + const std::string& ipv6_address, + const std::string& ipv6_netmask, + uint32_t scope_id) { + struct ifaddrs* if_addr = new struct ifaddrs; + memset(if_addr, 0, sizeof(struct ifaddrs)); + if_addr->ifa_name = if_name; + if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>( + CreateIpv6Addr(ipv6_address, scope_id)); + if_addr->ifa_netmask = + reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0)); + if_addr->ifa_next = list; + if_addr->ifa_flags = IFF_RUNNING; + return if_addr; + } + + void ReleaseIfAddrs(struct ifaddrs* list) { + struct ifaddrs* if_addr = list; + while (if_addr != nullptr) { + struct ifaddrs* next_addr = if_addr->ifa_next; + delete if_addr->ifa_addr; + delete if_addr->ifa_netmask; + delete if_addr; + if_addr = next_addr; + } } #endif // defined(WEBRTC_POSIX) @@ -96,6 +142,12 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> { bool callback_called_; }; +class TestBasicNetworkManager : public BasicNetworkManager { + public: + using BasicNetworkManager::QueryDefaultLocalAddress; + using BasicNetworkManager::set_default_local_addresses; +}; + // Test that the Network ctor works properly. TEST_F(NetworkTest, TestNetworkConstruct) { Network ipv4_network1("test_eth0", "Test Network Adapter 1", @@ -107,26 +159,6 @@ TEST_F(NetworkTest, TestNetworkConstruct) { EXPECT_FALSE(ipv4_network1.ignored()); } -// Tests that our ignore function works properly. -TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresOnlyLoopbackByDefault) { - Network ipv4_network1("test_eth0", "Test Network Adapter 1", - IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET); - Network ipv4_network2("test_wlan0", "Test Network Adapter 2", - IPAddress(0x12345601U), 16, ADAPTER_TYPE_WIFI); - Network ipv4_network3("test_cell0", "Test Network Adapter 3", - IPAddress(0x12345602U), 16, ADAPTER_TYPE_CELLULAR); - Network ipv4_network4("test_vpn0", "Test Network Adapter 4", - IPAddress(0x12345603U), 16, ADAPTER_TYPE_VPN); - Network ipv4_network5("test_lo", "Test Network Adapter 5", - IPAddress(0x12345604U), 16, ADAPTER_TYPE_LOOPBACK); - BasicNetworkManager network_manager; - EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1)); - EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network2)); - EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network3)); - EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network4)); - EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network5)); -} - TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) { Network ipv4_network1("test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET); @@ -137,21 +169,6 @@ TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) { EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2)); } -TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresNetworksAccordingToIgnoreMask) { - Network ipv4_network1("test_eth0", "Test Network Adapter 1", - IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET); - Network ipv4_network2("test_wlan0", "Test Network Adapter 2", - IPAddress(0x12345601U), 16, ADAPTER_TYPE_WIFI); - Network ipv4_network3("test_cell0", "Test Network Adapter 3", - IPAddress(0x12345602U), 16, ADAPTER_TYPE_CELLULAR); - BasicNetworkManager network_manager; - network_manager.set_network_ignore_mask( - ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK | ADAPTER_TYPE_WIFI); - EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network1)); - EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2)); - EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network3)); -} - // TODO(phoglund): Remove when ignore list goes away. TEST_F(NetworkTest, TestIgnoreList) { Network ignore_me("ignore_me", "Ignore me please!", @@ -583,10 +600,13 @@ TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) { } } -// Test that DumpNetworks works. -TEST_F(NetworkTest, TestDumpNetworks) { +// Test that DumpNetworks does not crash. +TEST_F(NetworkTest, TestCreateAndDumpNetworks) { BasicNetworkManager manager; - manager.DumpNetworks(true); + NetworkManager::NetworkList list = GetNetworks(manager, true); + bool changed; + MergeNetworkList(manager, list, &changed); + manager.DumpNetworks(); } // Test that we can toggle IPv6 on and off. @@ -693,6 +713,40 @@ TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) { CallConvertIfAddrs(manager, &list, true, &result); EXPECT_TRUE(result.empty()); } + +// Verify that if there are two addresses on one interface, only one network +// is generated. +TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) { + char if_name[20] = "rmnet0"; + ifaddrs* list = nullptr; + list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1", + "FFFF:FFFF:FFFF:FFFF::", 0); + list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2", + "FFFF:FFFF:FFFF:FFFF::", 0); + NetworkManager::NetworkList result; + BasicNetworkManager manager; + CallConvertIfAddrs(manager, list, true, &result); + EXPECT_EQ(1U, result.size()); + bool changed; + // This ensures we release the objects created in CallConvertIfAddrs. + MergeNetworkList(manager, result, &changed); + ReleaseIfAddrs(list); +} + +TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) { + ifaddrs list; + memset(&list, 0, sizeof(list)); + list.ifa_name = const_cast<char*>("test_iface"); + sockaddr ifa_addr; + sockaddr ifa_netmask; + list.ifa_addr = &ifa_addr; + list.ifa_netmask = &ifa_netmask; + + NetworkManager::NetworkList result; + BasicNetworkManager manager; + CallConvertIfAddrs(manager, &list, true, &result); + EXPECT_TRUE(result.empty()); +} #endif // defined(WEBRTC_POSIX) #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) @@ -776,6 +830,49 @@ TEST_F(NetworkTest, TestMergeNetworkList) { EXPECT_EQ(list2[0]->GetIPs()[1], ip2); } +// Test that MergeNetworkList successfully detects the change if +// a network becomes inactive and then active again. +TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) { + BasicNetworkManager manager; + Network network1("test_wifi", "Test Network Adapter 1", + IPAddress(0x12345600U), 24); + Network network2("test_eth0", "Test Network Adapter 2", + IPAddress(0x00010000U), 16); + network1.AddIP(IPAddress(0x12345678)); + network2.AddIP(IPAddress(0x00010004)); + NetworkManager::NetworkList list; + Network* net1 = new Network(network1); + list.push_back(net1); + bool changed; + MergeNetworkList(manager, list, &changed); + EXPECT_TRUE(changed); + list.clear(); + manager.GetNetworks(&list); + ASSERT_EQ(1U, list.size()); + EXPECT_EQ(net1, list[0]); + + list.clear(); + Network* net2 = new Network(network2); + list.push_back(net2); + MergeNetworkList(manager, list, &changed); + EXPECT_TRUE(changed); + list.clear(); + manager.GetNetworks(&list); + ASSERT_EQ(1U, list.size()); + EXPECT_EQ(net2, list[0]); + + // Now network1 is inactive. Try to merge it again. + list.clear(); + list.push_back(new Network(network1)); + MergeNetworkList(manager, list, &changed); + EXPECT_TRUE(changed); + list.clear(); + manager.GetNetworks(&list); + ASSERT_EQ(1U, list.size()); + EXPECT_TRUE(list[0]->active()); + EXPECT_EQ(net1, list[0]); +} + // Test that the filtering logic follows the defined ruleset in network.h. TEST_F(NetworkTest, TestIPv6Selection) { InterfaceAddress ip; @@ -842,4 +939,35 @@ TEST_F(NetworkTest, TestNetworkMonitoring) { NetworkMonitorFactory::ReleaseFactory(factory); } +TEST_F(NetworkTest, DefaultLocalAddress) { + TestBasicNetworkManager manager; + manager.StartUpdating(); + IPAddress ip; + + // GetDefaultLocalAddress should return false when not set. + EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET, &ip)); + EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); + + // Make sure we can query default local address when an address for such + // address family exists. + std::vector<Network*> networks; + manager.GetNetworks(&networks); + for (auto& network : networks) { + if (network->GetBestIP().family() == AF_INET) { + EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress()); + } else if (network->GetBestIP().family() == AF_INET6) { + EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress()); + } + } + + // GetDefaultLocalAddress should return the valid default address after set. + manager.set_default_local_addresses(GetLoopbackIP(AF_INET), + GetLoopbackIP(AF_INET6)); + EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip)); + EXPECT_EQ(ip, GetLoopbackIP(AF_INET)); + EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); + EXPECT_EQ(ip, GetLoopbackIP(AF_INET6)); + manager.StopUpdating(); +} + } // namespace rtc |