1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/network.h" 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 139af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh#include "webrtc/base/nethelpers.h" 14023f3ef0296511f12897c503d6fc2ed063712474honghaiz#include "webrtc/base/networkmonitor.h" 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <vector> 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <sys/types.h> 189faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh#include <net/if.h> 199faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh#include "webrtc/base/ifaddrs_converter.h" 209faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh#endif // defined(WEBRTC_POSIX) 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/gunit.h" 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN) 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h" // For LOG_GLE 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 289faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shiehnamespace { 299faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh 30023f3ef0296511f12897c503d6fc2ed063712474honghaizclass FakeNetworkMonitor : public NetworkMonitorBase { 31023f3ef0296511f12897c503d6fc2ed063712474honghaiz public: 32023f3ef0296511f12897c503d6fc2ed063712474honghaiz void Start() override {} 33023f3ef0296511f12897c503d6fc2ed063712474honghaiz void Stop() override {} 34023f3ef0296511f12897c503d6fc2ed063712474honghaiz}; 35023f3ef0296511f12897c503d6fc2ed063712474honghaiz 36023f3ef0296511f12897c503d6fc2ed063712474honghaizclass FakeNetworkMonitorFactory : public NetworkMonitorFactory { 37023f3ef0296511f12897c503d6fc2ed063712474honghaiz public: 38023f3ef0296511f12897c503d6fc2ed063712474honghaiz FakeNetworkMonitorFactory() {} 39023f3ef0296511f12897c503d6fc2ed063712474honghaiz NetworkMonitorInterface* CreateNetworkMonitor() { 40023f3ef0296511f12897c503d6fc2ed063712474honghaiz return new FakeNetworkMonitor(); 41023f3ef0296511f12897c503d6fc2ed063712474honghaiz } 42023f3ef0296511f12897c503d6fc2ed063712474honghaiz}; 43023f3ef0296511f12897c503d6fc2ed063712474honghaiz 449faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh} // namespace 459faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass NetworkTest : public testing::Test, public sigslot::has_slots<> { 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkTest() : callback_called_(false) {} 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void OnNetworksChanged() { 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org callback_called_ = true; 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 54a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org NetworkManager::Stats MergeNetworkList( 55a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org BasicNetworkManager& network_manager, 56a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org const NetworkManager::NetworkList& list, 57a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org bool* changed) { 58a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org NetworkManager::Stats stats; 59a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org network_manager.MergeNetworkList(list, changed, &stats); 60a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org return stats; 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool IsIgnoredNetwork(BasicNetworkManager& network_manager, 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const Network& network) { 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return network_manager.IsIgnoredNetwork(network); 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList GetNetworks( 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const BasicNetworkManager& network_manager, bool include_ignored) { 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org network_manager.CreateNetworks(include_ignored, &list); 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return list; 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 75023f3ef0296511f12897c503d6fc2ed063712474honghaiz NetworkMonitorInterface* GetNetworkMonitor( 76023f3ef0296511f12897c503d6fc2ed063712474honghaiz BasicNetworkManager& network_manager) { 77023f3ef0296511f12897c503d6fc2ed063712474honghaiz return network_manager.network_monitor_.get(); 78023f3ef0296511f12897c503d6fc2ed063712474honghaiz } 79023f3ef0296511f12897c503d6fc2ed063712474honghaiz void ClearNetworks(BasicNetworkManager& network_manager) { 80023f3ef0296511f12897c503d6fc2ed063712474honghaiz for (const auto& kv : network_manager.networks_map_) { 81023f3ef0296511f12897c503d6fc2ed063712474honghaiz delete kv.second; 82023f3ef0296511f12897c503d6fc2ed063712474honghaiz } 83023f3ef0296511f12897c503d6fc2ed063712474honghaiz network_manager.networks_.clear(); 84023f3ef0296511f12897c503d6fc2ed063712474honghaiz network_manager.networks_map_.clear(); 85023f3ef0296511f12897c503d6fc2ed063712474honghaiz } 86023f3ef0296511f12897c503d6fc2ed063712474honghaiz 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Separated from CreateNetworks for tests. 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static void CallConvertIfAddrs(const BasicNetworkManager& network_manager, 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct ifaddrs* interfaces, 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool include_ignored, 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList* networks) { 939faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh // Use the base IfAddrsConverter for test cases. 949faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh rtc::scoped_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter()); 959faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(), 969faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh include_ignored, networks); 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 98db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 99db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string, 100db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz uint32_t scope_id) { 101db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6; 102db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz memset(ipv6_addr, 0, sizeof(struct sockaddr_in6)); 103db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ipv6_addr->sin6_family = AF_INET6; 104db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ipv6_addr->sin6_scope_id = scope_id; 105db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz IPAddress ip; 106db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz IPFromString(ip_string, &ip); 107db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ipv6_addr->sin6_addr = ip.ipv6_address(); 108db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz return ipv6_addr; 109db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz } 110db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 111db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz // Pointers created here need to be released via ReleaseIfAddrs. 112db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz struct ifaddrs* AddIpv6Address(struct ifaddrs* list, 113db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz char* if_name, 114db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz const std::string& ipv6_address, 115db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz const std::string& ipv6_netmask, 116db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz uint32_t scope_id) { 117db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz struct ifaddrs* if_addr = new struct ifaddrs; 118db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz memset(if_addr, 0, sizeof(struct ifaddrs)); 119db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz if_addr->ifa_name = if_name; 120db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>( 121db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz CreateIpv6Addr(ipv6_address, scope_id)); 122db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz if_addr->ifa_netmask = 123db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0)); 124db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz if_addr->ifa_next = list; 1259faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh if_addr->ifa_flags = IFF_RUNNING; 126db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz return if_addr; 127db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz } 128db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 129db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz void ReleaseIfAddrs(struct ifaddrs* list) { 130db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz struct ifaddrs* if_addr = list; 131db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz while (if_addr != nullptr) { 132db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz struct ifaddrs* next_addr = if_addr->ifa_next; 133db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz delete if_addr->ifa_addr; 134db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz delete if_addr->ifa_netmask; 135db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz delete if_addr; 136db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz if_addr = next_addr; 137db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz } 138db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz } 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // defined(WEBRTC_POSIX) 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool callback_called_; 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1459af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shiehclass TestBasicNetworkManager : public BasicNetworkManager { 1469af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh public: 1479af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh using BasicNetworkManager::QueryDefaultLocalAddress; 148a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh using BasicNetworkManager::set_default_local_addresses; 1499af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh}; 1509af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that the Network ctor works properly. 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkConstruct) { 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv4_network1("test_eth0", "Test Network Adapter 1", 154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress(0x12345600U), 24); 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ("test_eth0", ipv4_network1.name()); 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description()); 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix()); 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(24, ipv4_network1.prefix_length()); 159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(ipv4_network1.ignored()); 160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 162006521d5bdc29677c710b53c31b937cdc0bb4941phoglund@webrtc.orgTEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) { 163006521d5bdc29677c710b53c31b937cdc0bb4941phoglund@webrtc.org Network ipv4_network1("test_eth0", "Test Network Adapter 1", 164006521d5bdc29677c710b53c31b937cdc0bb4941phoglund@webrtc.org IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET); 165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv4_network2("test_eth1", "Test Network Adapter 2", 166006521d5bdc29677c710b53c31b937cdc0bb4941phoglund@webrtc.org IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET); 167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager network_manager; 168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1)); 169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2)); 170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 172006521d5bdc29677c710b53c31b937cdc0bb4941phoglund@webrtc.org// TODO(phoglund): Remove when ignore list goes away. 173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestIgnoreList) { 174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ignore_me("ignore_me", "Ignore me please!", 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress(0x12345600U), 24); 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network include_me("include_me", "Include me please!", 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress(0x12345600U), 24); 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager network_manager; 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me)); 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me)); 181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::vector<std::string> ignore_list; 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ignore_list.push_back("ignore_me"); 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org network_manager.set_network_ignore_list(ignore_list); 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me)); 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me)); 186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test is failing on Windows opt: b/11288214 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, DISABLED_TestCreateNetworks) { 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList result = GetNetworks(manager, true); 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // We should be able to bind to any addresses we find. 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList::iterator it; 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (it = result.begin(); 195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != result.end(); 196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ++it) { 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sockaddr_storage storage; 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memset(&storage, 0, sizeof(storage)); 199369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org IPAddress ip = (*it)->GetBestIP(); 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress bindaddress(ip, 0); 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bindaddress.SetScopeID((*it)->scope_id()); 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6. 203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP)); 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (fd > 0) { 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t ipsize = bindaddress.ToSockAddrStorage(&storage); 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_GE(ipsize, 0U); 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int success = ::bind(fd, 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org reinterpret_cast<sockaddr*>(&storage), 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<int>(ipsize)); 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN) 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (success) LOG_GLE(LS_ERROR) << "Socket bind failed."; 212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, success); 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN) 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org closesocket(fd); 216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#else 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org close(fd); 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete (*it); 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 22447872ec90c99ce9c37fb37a8f623ce0e65a32f61Guo-wei Shieh// Test StartUpdating() and StopUpdating(). network_permission_state starts with 22547872ec90c99ce9c37fb37a8f623ce0e65a32f61Guo-wei Shieh// ALLOWED. 226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestUpdateNetworks) { 227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.SignalNetworksChanged.connect( 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged); 230ea1012b2a41b1b56fe7366792f10390639d82495guoweis EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED, 231ea1012b2a41b1b56fe7366792f10390639d82495guoweis manager.enumeration_permission()); 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.StartUpdating(); 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->ProcessMessages(0); 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(callback_called_); 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org callback_called_ = false; 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Callback should be triggered immediately when StartUpdating 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // is called, after network update signal is already sent. 238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.StartUpdating(); 239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(manager.started()); 240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->ProcessMessages(0); 241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(callback_called_); 242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.StopUpdating(); 243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(manager.started()); 244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.StopUpdating(); 245ea1012b2a41b1b56fe7366792f10390639d82495guoweis EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED, 246ea1012b2a41b1b56fe7366792f10390639d82495guoweis manager.enumeration_permission()); 247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(manager.started()); 248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.StopUpdating(); 249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(manager.started()); 250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org callback_called_ = false; 251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Callback should be triggered immediately after StartUpdating is called 252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // when start_count_ is reset to 0. 253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.StartUpdating(); 254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->ProcessMessages(0); 255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(callback_called_); 256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Verify that MergeNetworkList() merges network lists properly. 259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestBasicMergeNetworkList) { 260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv4_network1("test_eth0", "Test Network Adapter 1", 261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress(0x12345600U), 24); 262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv4_network2("test_eth1", "Test Network Adapter 2", 263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress(0x00010000U), 16); 264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv4_network1.AddIP(IPAddress(0x12345678)); 265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv4_network2.AddIP(IPAddress(0x00010004)); 266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Add ipv4_network1 to the list of networks. 269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network1)); 271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed; 272a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed); 273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 274a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv6_network_count, 0); 275a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv4_network_count, 1); 276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 277f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 278f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 279f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1U, list.size()); 280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString()); 281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network* net1 = list[0]; 282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Replace ipv4_network1 with ipv4_network2. 285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network2)); 286a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org stats = MergeNetworkList(manager, list, &changed); 287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 288a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv6_network_count, 0); 289a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv4_network_count, 1); 290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1U, list.size()); 294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString()); 295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network* net2 = list[0]; 296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Add Network2 back. 299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network1)); 300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network2)); 301a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org stats = MergeNetworkList(manager, list, &changed); 302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 303a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv6_network_count, 0); 304a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv4_network_count, 2); 305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 306f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Verify that we get previous instances of Network objects. 308f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 309f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(2U, list.size()); 310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE((net1 == list[0] && net2 == list[1]) || 311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (net1 == list[1] && net2 == list[0])); 312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Call MergeNetworkList() again and verify that we don't get update 315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // notification. 316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network2)); 317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network1)); 318a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org stats = MergeNetworkList(manager, list, &changed); 319f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(changed); 320a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv6_network_count, 0); 321a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv4_network_count, 2); 322f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Verify that we get previous instances of Network objects. 325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(2U, list.size()); 327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE((net1 == list[0] && net2 == list[1]) || 328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (net1 == list[1] && net2 == list[0])); 329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.clear(); 330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Sets up some test IPv6 networks and appends them to list. 333f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Four networks are added - public and link local, for two interfaces. 334f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid SetupNetworks(NetworkManager::NetworkList* list) { 335f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress ip; 336f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress prefix; 337bbce5efaa6155f31366cdd07c24197a0ae5f671eguoweis@webrtc.org EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip)); 338bbce5efaa6155f31366cdd07c24197a0ae5f671eguoweis@webrtc.org EXPECT_TRUE(IPFromString("abcd::", &prefix)); 339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // First, fake link-locals. 340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1", 341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth0_linklocalnetwork.AddIP(ip); 343bbce5efaa6155f31366cdd07c24197a0ae5f671eguoweis@webrtc.org EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip)); 344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2", 345f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 346f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth1_linklocalnetwork.AddIP(ip); 347f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Public networks: 348f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip)); 349f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix = TruncateIP(ip, 64); 350f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1", 351f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 352f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth0_publicnetwork1_ip1.AddIP(ip); 353f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip)); 354f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix = TruncateIP(ip, 64); 355f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1", 356f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 357f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth1_publicnetwork1_ip1.AddIP(ip); 358f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list->push_back(new Network(ipv6_eth0_linklocalnetwork)); 359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list->push_back(new Network(ipv6_eth1_linklocalnetwork)); 360f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1)); 361f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1)); 362f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 363f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 364f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that the basic network merging case works. 365f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestIPv6MergeNetworkList) { 366f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 367f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.SignalNetworksChanged.connect( 368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged); 369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList original_list; 370f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&original_list); 371f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed = false; 372a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org NetworkManager::Stats stats = 373a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org MergeNetworkList(manager, original_list, &changed); 374f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 375a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv6_network_count, 4); 376a094cac11f9f0436b3ea4410dca18c3b78356019guoweis@webrtc.org EXPECT_EQ(stats.ipv4_network_count, 0); 377f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 378f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 379f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(original_list.size(), list.size()); 380f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Verify that the original members are in the merged list. 381f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = original_list.begin(); 382f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != original_list.end(); ++it) { 383f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it)); 384f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 385f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 3872444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org// Test that no more than manager.max_ipv6_networks() IPv6 networks get 3882444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org// returned. 3892444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.orgTEST_F(NetworkTest, TestIPv6MergeNetworkListTrimExcessive) { 3902444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org BasicNetworkManager manager; 3912444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this), 3922444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org &NetworkTest::OnNetworksChanged); 3932444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org NetworkManager::NetworkList original_list; 3942444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org 3952444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org // Add twice the allowed number of IPv6 networks. 3962444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org for (int i = 0; i < 2 * manager.max_ipv6_networks(); i++) { 3972444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org // Make a network with different prefix length. 3982444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org IPAddress ip; 3992444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip)); 4002444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org IPAddress prefix = TruncateIP(ip, 64 - i); 4012444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org Network* ipv6_network = 4022444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org new Network("test_eth0", "Test Network Adapter 1", prefix, 64 - i); 4032444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org ipv6_network->AddIP(ip); 4042444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org original_list.push_back(ipv6_network); 4052444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org } 4062444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org 4072444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org // Add one IPv4 network. 4082444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org Network* ipv4_network = new Network("test_eth0", "Test Network Adapter 1", 4092444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org IPAddress(0x12345600U), 24); 4102444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org ipv4_network->AddIP(IPAddress(0x12345600U)); 4112444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org original_list.push_back(ipv4_network); 4122444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org 4132444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org bool changed = false; 4142444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org MergeNetworkList(manager, original_list, &changed); 4152444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org EXPECT_TRUE(changed); 4162444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org NetworkManager::NetworkList list; 4172444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org manager.GetNetworks(&list); 4182444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org 4192444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org // List size should be the max allowed IPv6 networks plus one IPv4 network. 4202444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org EXPECT_EQ(manager.max_ipv6_networks() + 1, (int)list.size()); 4212444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org 4222444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org // Verify that the IPv4 network is in the list. 4232444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org EXPECT_NE(list.end(), std::find(list.begin(), list.end(), ipv4_network)); 4242444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org} 4252444d9605abad5874f9ca3515c58b1a41901bdc1guoweis@webrtc.org 426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Tests that when two network lists that describe the same set of networks are 427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// merged, that the changed callback is not called, and that the original 428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// objects remain in the result list. 429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestNoChangeMerge) { 430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.SignalNetworksChanged.connect( 432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged); 433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList original_list; 434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&original_list); 435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed = false; 436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, original_list, &changed); 437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Second list that describes the same networks but with new objects. 439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList second_list; 440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&second_list); 441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org changed = false; 442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, second_list, &changed); 443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(changed); 444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList resulting_list; 445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&resulting_list); 446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(original_list.size(), resulting_list.size()); 447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Verify that the original members are in the merged list. 448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = original_list.begin(); 449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != original_list.end(); ++it) { 450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(resulting_list.end(), 451f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find(resulting_list.begin(), resulting_list.end(), *it)); 452f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 453f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Doublecheck that the new networks aren't in the list. 454f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = second_list.begin(); 455f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != second_list.end(); ++it) { 456f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(resulting_list.end(), 457f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find(resulting_list.begin(), resulting_list.end(), *it)); 458f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 459f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 460f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 461f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that we can merge a network that is the same as another network but with 462f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// a different IP. The original network should remain in the list, but have its 463f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// IP changed. 464f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, MergeWithChangedIP) { 465f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 466f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.SignalNetworksChanged.connect( 467f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged); 468f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList original_list; 469f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&original_list); 470f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make a network that we're going to change. 471f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress ip; 472f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip)); 473f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress prefix = TruncateIP(ip, 64); 474f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network* network_to_change = new Network("test_eth0", 475f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "Test Network Adapter 1", 476f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 477f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network* changed_network = new Network(*network_to_change); 478f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org network_to_change->AddIP(ip); 479f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress changed_ip; 480f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip)); 481f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org changed_network->AddIP(changed_ip); 482f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org original_list.push_back(network_to_change); 483f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed = false; 484f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, original_list, &changed); 485f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList second_list; 486f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&second_list); 487f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org second_list.push_back(changed_network); 488f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org changed = false; 489f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, second_list, &changed); 490f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 491f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 492f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 493f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(original_list.size(), list.size()); 494f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make sure the original network is still in the merged list. 495f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(list.end(), 496f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find(list.begin(), list.end(), network_to_change)); 497f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0)); 498f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 499f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 500f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Testing a similar case to above, but checking that a network can be updated 501f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// with additional IPs (not just a replacement). 502f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestMultipleIPMergeNetworkList) { 503f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 504f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.SignalNetworksChanged.connect( 505f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged); 506f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList original_list; 507f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&original_list); 508f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed = false; 509f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, original_list, &changed); 510f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 511f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress ip; 512f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress check_ip; 513f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress prefix; 514f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64). 515f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip)); 516f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix = TruncateIP(ip, 64); 517f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1", 518f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 519f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // This is the IP that already existed in the public network on eth0. 520f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip)); 521f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth0_publicnetwork1_ip2.AddIP(ip); 522f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2)); 523f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org changed = false; 524f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, original_list, &changed); 525f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 526f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // There should still be four networks. 527f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 528f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 529f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(4U, list.size()); 530f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check the gathered IPs. 531f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int matchcount = 0; 532f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 533f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 534f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if ((*it)->ToString() == original_list[2]->ToString()) { 535f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ++matchcount; 536f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, matchcount); 537f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // This should be the same network object as before. 538f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ((*it), original_list[2]); 539f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // But with two addresses now. 540f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(2U, (*it)->GetIPs().size()); 541f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE((*it)->GetIPs().end(), 542f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find((*it)->GetIPs().begin(), 543f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (*it)->GetIPs().end(), 544f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org check_ip)); 545f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE((*it)->GetIPs().end(), 546f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find((*it)->GetIPs().begin(), 547f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (*it)->GetIPs().end(), 548f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ip)); 549f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 550f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check the IP didn't get added anywhere it wasn't supposed to. 551f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ((*it)->GetIPs().end(), 552f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find((*it)->GetIPs().begin(), 553f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (*it)->GetIPs().end(), 554f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ip)); 555f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 556f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 557f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 558f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 559f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that merge correctly distinguishes multiple networks on an interface. 560f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) { 561f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 562f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.SignalNetworksChanged.connect( 563f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged); 564f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList original_list; 565f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetupNetworks(&original_list); 566f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed = false; 567f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, original_list, &changed); 568f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 569f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress ip; 570f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress prefix; 571f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // A second network for eth0. 572f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip)); 573f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix = TruncateIP(ip, 64); 574f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1", 575f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 576f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth0_publicnetwork2_ip1.AddIP(ip); 577f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1)); 578f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org changed = false; 579f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, original_list, &changed); 580f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(changed); 581f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // There should be five networks now. 582f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 583f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.GetNetworks(&list); 584f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(5U, list.size()); 585f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check the resulting addresses. 586f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 587f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 588f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() && 589f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) { 590f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check the new network has 1 IP and that it's the correct one. 591f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1U, (*it)->GetIPs().size()); 592f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ip, (*it)->GetIPs().at(0)); 593f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 594f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check the IP didn't get added anywhere it wasn't supposed to. 595f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ((*it)->GetIPs().end(), 596f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::find((*it)->GetIPs().begin(), 597f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (*it)->GetIPs().end(), 598f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ip)); 599f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 600f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 601f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 602f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 603db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz// Test that DumpNetworks does not crash. 604db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaizTEST_F(NetworkTest, TestCreateAndDumpNetworks) { 605f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 606db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz NetworkManager::NetworkList list = GetNetworks(manager, true); 607db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz bool changed; 608db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz MergeNetworkList(manager, list, &changed); 609db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz manager.DumpNetworks(); 610f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 611f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 612f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that we can toggle IPv6 on and off. 6135d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923. 6145d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX) 6155d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestIPv6Toggle DISABLED_TestIPv6Toggle 6165d69648782de066a55e4b1ff8dc77e146cc354efminyue#else 6175d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestIPv6Toggle TestIPv6Toggle 6185d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif 6195d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(NetworkTest, MAYBE_TestIPv6Toggle) { 620f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 621f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool ipv6_found = false; 622f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 623f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if !defined(WEBRTC_WIN) 624f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // There should be at least one IPv6 network (fe80::/64 should be in there). 625f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // TODO(thaloun): Disabling this test on windows for the moment as the test 626f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // machines don't seem to have IPv6 installed on them at all. 627f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.set_ipv6_enabled(true); 628f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list = GetNetworks(manager, true); 629f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 630f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 631f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if ((*it)->prefix().family() == AF_INET6) { 632f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_found = true; 633f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 634f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 635f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 636f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(ipv6_found); 637f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 638f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 639f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete (*it); 640f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 641f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 642f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_found = false; 643f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.set_ipv6_enabled(false); 644f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list = GetNetworks(manager, true); 645f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 646f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 647f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if ((*it)->prefix().family() == AF_INET6) { 648f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_found = true; 649f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 650f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 651f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 652f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(ipv6_found); 653f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 654f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 655f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete (*it); 656f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 657f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 658f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 659f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkListSorting) { 660f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 661f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv4_network1("test_eth0", "Test Network Adapter 1", 662f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress(0x12345600U), 24); 663f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv4_network1.AddIP(IPAddress(0x12345600U)); 664f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 665f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress ip; 666f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress prefix; 667f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip)); 668f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix = TruncateIP(ip, 64); 669f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2", 670f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org prefix, 64); 671f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ipv6_eth1_publicnetwork1_ip1.AddIP(ip); 672f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 673f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 674f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv4_network1)); 675f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1)); 676f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network* net1 = list[0]; 677f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network* net2 = list[1]; 678f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 679f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool changed = false; 680f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MergeNetworkList(manager, list, &changed); 681f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(changed); 682f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // After sorting IPv6 network should be higher order than IPv4 networks. 683f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(net1->preference() < net2->preference()); 684f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 685f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 686f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkAdapterTypes) { 687f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24, 688f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADAPTER_TYPE_WIFI); 689f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type()); 690f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24, 691f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADAPTER_TYPE_ETHERNET); 692f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type()); 693f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24, 694f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADAPTER_TYPE_CELLULAR); 695f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type()); 696f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24, 697f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADAPTER_TYPE_VPN); 698f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type()); 699f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24, 700f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADAPTER_TYPE_UNKNOWN); 701f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type()); 702f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 703f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 704f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 705f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Verify that we correctly handle interfaces with no address. 706f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestConvertIfAddrsNoAddress) { 707f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ifaddrs list; 708f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memset(&list, 0, sizeof(list)); 709f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list.ifa_name = const_cast<char*>("test_iface"); 710f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 711f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList result; 712f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 713f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CallConvertIfAddrs(manager, &list, true, &result); 714f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(result.empty()); 715f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 716db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 717db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz// Verify that if there are two addresses on one interface, only one network 718db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz// is generated. 719db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaizTEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) { 720db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz char if_name[20] = "rmnet0"; 721db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ifaddrs* list = nullptr; 722db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1", 723db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz "FFFF:FFFF:FFFF:FFFF::", 0); 724db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2", 725db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz "FFFF:FFFF:FFFF:FFFF::", 0); 726db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz NetworkManager::NetworkList result; 727db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz BasicNetworkManager manager; 728db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz CallConvertIfAddrs(manager, list, true, &result); 729db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_EQ(1U, result.size()); 730db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz bool changed; 731db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz // This ensures we release the objects created in CallConvertIfAddrs. 732db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz MergeNetworkList(manager, result, &changed); 733db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ReleaseIfAddrs(list); 734db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz} 7359faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh 7369faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei ShiehTEST_F(NetworkTest, TestConvertIfAddrsNotRunning) { 7379faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh ifaddrs list; 7389faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh memset(&list, 0, sizeof(list)); 7399faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh list.ifa_name = const_cast<char*>("test_iface"); 7409faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh sockaddr ifa_addr; 7419faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh sockaddr ifa_netmask; 7429faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh list.ifa_addr = &ifa_addr; 7439faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh list.ifa_netmask = &ifa_netmask; 7449faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh 7459faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh NetworkManager::NetworkList result; 7469faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh BasicNetworkManager manager; 7479faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh CallConvertIfAddrs(manager, &list, true, &result); 7489faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh EXPECT_TRUE(result.empty()); 7499faf154960767e96afdf8a280a0a5c6c7e402f67Guo-wei Shieh} 750f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // defined(WEBRTC_POSIX) 751f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 752f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) 753f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// If you want to test non-default routes, you can do the following on a linux 754f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// machine: 755f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 1) Load the dummy network driver: 756f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// sudo modprobe dummy 757f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// sudo ifconfig dummy0 127.0.0.1 758f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 2) Run this test and confirm the output says it found a dummy route (and 759f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// passes). 760f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 3) When done: 761f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// sudo rmmmod dummy 762f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) { 763f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicNetworkManager manager; 764f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org NetworkManager::NetworkList list; 765f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list = GetNetworks(manager, false); 766f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool found_dummy = false; 767f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Looking for dummy network: "; 768f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 769f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 770f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << " Network name: " << (*it)->name(); 771f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org found_dummy |= (*it)->name().find("dummy0") != std::string::npos; 772f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 773f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 774f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 775f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete (*it); 776f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 777f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!found_dummy) { 778f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "No dummy found, quitting."; 779f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; 780f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 781f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Found dummy, running again while ignoring non-default " 782f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << "routes."; 783f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org manager.set_ignore_non_default_routes(true); 784f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org list = GetNetworks(manager, false); 785f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 786f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 787f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << " Network name: " << (*it)->name(); 788f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos); 789f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 790f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (NetworkManager::NetworkList::iterator it = list.begin(); 791f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org it != list.end(); ++it) { 792f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete (*it); 793f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 794f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 795f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 796f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 7974bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org// Test MergeNetworkList successfully combines all IPs for the same 7984bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org// prefix/length into a single Network. 7994bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.orgTEST_F(NetworkTest, TestMergeNetworkList) { 8004bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org BasicNetworkManager manager; 8014bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org NetworkManager::NetworkList list; 8024bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 8034bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org // Create 2 IPAddress classes with only last digit different. 8044bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org IPAddress ip1, ip2; 8054bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1)); 8064bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2)); 8074bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 8084bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org // Create 2 networks with the same prefix and length. 8094bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64); 8104bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64); 8114bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 8124bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org // Add different IP into each. 8134bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org net1->AddIP(ip1); 8144bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org net2->AddIP(ip2); 8154bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 8164bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org list.push_back(net1); 8174bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org list.push_back(net2); 8184bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org bool changed; 8194bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org MergeNetworkList(manager, list, &changed); 8204bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_TRUE(changed); 8214bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 8224bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org NetworkManager::NetworkList list2; 8234bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org manager.GetNetworks(&list2); 8244bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 8254bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org // Make sure the resulted networklist has only 1 element and 2 8264bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org // IPAddresses. 8274bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_EQ(list2.size(), 1uL); 8284bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_EQ(list2[0]->GetIPs().size(), 2uL); 8294bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_EQ(list2[0]->GetIPs()[0], ip1); 8304bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org EXPECT_EQ(list2[0]->GetIPs()[1], ip2); 8314bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org} 8324bbd3c83a80e99c86ece75847c67970de46ff138guoweis@webrtc.org 833db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz// Test that MergeNetworkList successfully detects the change if 834db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz// a network becomes inactive and then active again. 835db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaizTEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) { 836db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz BasicNetworkManager manager; 837db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz Network network1("test_wifi", "Test Network Adapter 1", 838db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz IPAddress(0x12345600U), 24); 839db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz Network network2("test_eth0", "Test Network Adapter 2", 840db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz IPAddress(0x00010000U), 16); 841db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz network1.AddIP(IPAddress(0x12345678)); 842db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz network2.AddIP(IPAddress(0x00010004)); 843db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz NetworkManager::NetworkList list; 844db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz Network* net1 = new Network(network1); 845db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.push_back(net1); 846db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz bool changed; 847db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz MergeNetworkList(manager, list, &changed); 848db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_TRUE(changed); 849db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.clear(); 850db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz manager.GetNetworks(&list); 851db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ASSERT_EQ(1U, list.size()); 852db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_EQ(net1, list[0]); 853db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 854db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.clear(); 855db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz Network* net2 = new Network(network2); 856db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.push_back(net2); 857db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz MergeNetworkList(manager, list, &changed); 858db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_TRUE(changed); 859db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.clear(); 860db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz manager.GetNetworks(&list); 861db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ASSERT_EQ(1U, list.size()); 862db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_EQ(net2, list[0]); 863db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 864db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz // Now network1 is inactive. Try to merge it again. 865db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.clear(); 866db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.push_back(new Network(network1)); 867db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz MergeNetworkList(manager, list, &changed); 868db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_TRUE(changed); 869db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz list.clear(); 870db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz manager.GetNetworks(&list); 871db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz ASSERT_EQ(1U, list.size()); 872db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_TRUE(list[0]->active()); 873db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz EXPECT_EQ(net1, list[0]); 874db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz} 875db8cf50c5994a1ca37f85d7ea17cadb96c1fb93ahonghaiz 876369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org// Test that the filtering logic follows the defined ruleset in network.h. 877369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.orgTEST_F(NetworkTest, TestIPv6Selection) { 878369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org InterfaceAddress ip; 879369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org std::string ipstr; 880369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 881369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3"; 882369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip)); 883369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 884369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org // Create a network with this prefix. 885369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org Network ipv6_network( 886369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64); 887369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 888369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org // When there is no address added, it should return an unspecified 889369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org // address. 890369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress()); 891369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP())); 892369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 893369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org // Deprecated one should not be returned. 894369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipv6_network.AddIP(ip); 895369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress()); 896369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 89707dcf60ee0ccbaaeefba0ca77d88c00e3442f7c3aluebs@webrtc.org // Add ULA one. ULA is unique local address which is starting either 89807dcf60ee0ccbaaeefba0ca77d88c00e3442f7c3aluebs@webrtc.org // with 0xfc or 0xfd. 899369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4"; 900369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip)); 901369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipv6_network.AddIP(ip); 90207dcf60ee0ccbaaeefba0ca77d88c00e3442f7c3aluebs@webrtc.org EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip)); 903369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 90407dcf60ee0ccbaaeefba0ca77d88c00e3442f7c3aluebs@webrtc.org // Add global one. 905369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5"; 906369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip)); 907369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipv6_network.AddIP(ip); 90807dcf60ee0ccbaaeefba0ca77d88c00e3442f7c3aluebs@webrtc.org EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip)); 909369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 910369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org // Add global dynamic temporary one. 911369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6"; 912369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip)); 913369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org ipv6_network.AddIP(ip); 914369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip)); 915369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org} 916369a637ac8032b3e41fd2b4f2f6b2ef49a447f02guoweis@webrtc.org 917023f3ef0296511f12897c503d6fc2ed063712474honghaizTEST_F(NetworkTest, TestNetworkMonitoring) { 918023f3ef0296511f12897c503d6fc2ed063712474honghaiz BasicNetworkManager manager; 919023f3ef0296511f12897c503d6fc2ed063712474honghaiz manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this), 920023f3ef0296511f12897c503d6fc2ed063712474honghaiz &NetworkTest::OnNetworksChanged); 921023f3ef0296511f12897c503d6fc2ed063712474honghaiz FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory(); 922023f3ef0296511f12897c503d6fc2ed063712474honghaiz NetworkMonitorFactory::SetFactory(factory); 923023f3ef0296511f12897c503d6fc2ed063712474honghaiz manager.StartUpdating(); 924023f3ef0296511f12897c503d6fc2ed063712474honghaiz NetworkMonitorInterface* network_monitor = GetNetworkMonitor(manager); 925023f3ef0296511f12897c503d6fc2ed063712474honghaiz EXPECT_TRUE_WAIT(callback_called_, 1000); 926023f3ef0296511f12897c503d6fc2ed063712474honghaiz callback_called_ = false; 927023f3ef0296511f12897c503d6fc2ed063712474honghaiz 928023f3ef0296511f12897c503d6fc2ed063712474honghaiz // Clear the networks so that there will be network changes below. 929023f3ef0296511f12897c503d6fc2ed063712474honghaiz ClearNetworks(manager); 930023f3ef0296511f12897c503d6fc2ed063712474honghaiz // Network manager is started, so the callback is called when the network 931023f3ef0296511f12897c503d6fc2ed063712474honghaiz // monitor fires the network-change event. 932023f3ef0296511f12897c503d6fc2ed063712474honghaiz network_monitor->OnNetworksChanged(); 933023f3ef0296511f12897c503d6fc2ed063712474honghaiz EXPECT_TRUE_WAIT(callback_called_, 1000); 934023f3ef0296511f12897c503d6fc2ed063712474honghaiz 935023f3ef0296511f12897c503d6fc2ed063712474honghaiz // Network manager is stopped; the network monitor is removed. 936023f3ef0296511f12897c503d6fc2ed063712474honghaiz manager.StopUpdating(); 937023f3ef0296511f12897c503d6fc2ed063712474honghaiz EXPECT_TRUE(GetNetworkMonitor(manager) == nullptr); 938023f3ef0296511f12897c503d6fc2ed063712474honghaiz 939023f3ef0296511f12897c503d6fc2ed063712474honghaiz NetworkMonitorFactory::ReleaseFactory(factory); 940023f3ef0296511f12897c503d6fc2ed063712474honghaiz} 941023f3ef0296511f12897c503d6fc2ed063712474honghaiz 942a34c39e549f384585730d0247d8b912419772b74Guo-wei ShiehTEST_F(NetworkTest, DefaultLocalAddress) { 9439af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh TestBasicNetworkManager manager; 9449af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh manager.StartUpdating(); 945a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh IPAddress ip; 946a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh 947a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh // GetDefaultLocalAddress should return false when not set. 948a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET, &ip)); 949a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); 950a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh 951a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh // Make sure we can query default local address when an address for such 952a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh // address family exists. 9539af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh std::vector<Network*> networks; 9549af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh manager.GetNetworks(&networks); 9559af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh for (auto& network : networks) { 9569af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh if (network->GetBestIP().family() == AF_INET) { 9579af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress()); 9589af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh } else if (network->GetBestIP().family() == AF_INET6) { 9599af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress()); 9609af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh } 9619af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh } 962a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh 963a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh // GetDefaultLocalAddress should return the valid default address after set. 964a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh manager.set_default_local_addresses(GetLoopbackIP(AF_INET), 965a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh GetLoopbackIP(AF_INET6)); 966a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip)); 967a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh EXPECT_EQ(ip, GetLoopbackIP(AF_INET)); 968a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); 969a34c39e549f384585730d0247d8b912419772b74Guo-wei Shieh EXPECT_EQ(ip, GetLoopbackIP(AF_INET6)); 9709af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh manager.StopUpdating(); 9719af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh} 9729af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh 973f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 974