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