blob: 7133d8b405df4327db94613ed48fcb9e27e42451 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/base/network.h"
12
Guo-wei Shieh9af97f82015-11-10 14:47:39 -080013#include "webrtc/base/nethelpers.h"
honghaiz023f3ef2015-10-19 09:39:32 -070014#include "webrtc/base/networkmonitor.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015#include <vector>
16#if defined(WEBRTC_POSIX)
17#include <sys/types.h>
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080018#include <net/if.h>
19#include "webrtc/base/ifaddrs_converter.h"
20#endif // defined(WEBRTC_POSIX)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000021#include "webrtc/base/gunit.h"
22#if defined(WEBRTC_WIN)
23#include "webrtc/base/logging.h" // For LOG_GLE
24#endif
25
26namespace rtc {
27
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080028namespace {
29
honghaiz023f3ef2015-10-19 09:39:32 -070030class FakeNetworkMonitor : public NetworkMonitorBase {
31 public:
honghaizcec0a082016-01-15 14:49:09 -080032 void Start() override { started_ = true; }
33 void Stop() override { started_ = false; }
34 bool started() { return started_; }
honghaiza7ad7c32016-02-02 12:54:14 -080035 AdapterType GetAdapterType(const std::string& if_name) override {
36 return ADAPTER_TYPE_UNKNOWN;
37 }
honghaizcec0a082016-01-15 14:49:09 -080038
39 private:
40 bool started_ = false;
honghaiz023f3ef2015-10-19 09:39:32 -070041};
42
43class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
44 public:
45 FakeNetworkMonitorFactory() {}
honghaizcec0a082016-01-15 14:49:09 -080046 NetworkMonitorInterface* CreateNetworkMonitor() override {
honghaiz023f3ef2015-10-19 09:39:32 -070047 return new FakeNetworkMonitor();
48 }
49};
50
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080051} // namespace
52
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000053class NetworkTest : public testing::Test, public sigslot::has_slots<> {
54 public:
55 NetworkTest() : callback_called_(false) {}
56
57 void OnNetworksChanged() {
58 callback_called_ = true;
59 }
60
honghaize3c6c822016-02-17 13:00:28 -080061 void listenToNetworkInactive(BasicNetworkManager& network_manager) {
62 BasicNetworkManager::NetworkList networks;
63 network_manager.GetNetworks(&networks);
64 for (Network* network : networks) {
65 network->SignalInactive.connect(this, &NetworkTest::OnNetworkInactive);
66 }
67 }
68
69 void OnNetworkInactive(const Network* network) { num_networks_inactive_++; }
70
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +000071 NetworkManager::Stats MergeNetworkList(
72 BasicNetworkManager& network_manager,
73 const NetworkManager::NetworkList& list,
74 bool* changed) {
75 NetworkManager::Stats stats;
76 network_manager.MergeNetworkList(list, changed, &stats);
77 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000078 }
79
80 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
81 const Network& network) {
82 return network_manager.IsIgnoredNetwork(network);
83 }
84
85 NetworkManager::NetworkList GetNetworks(
86 const BasicNetworkManager& network_manager, bool include_ignored) {
87 NetworkManager::NetworkList list;
88 network_manager.CreateNetworks(include_ignored, &list);
89 return list;
90 }
91
honghaizcec0a082016-01-15 14:49:09 -080092 FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
93 return static_cast<FakeNetworkMonitor*>(
94 network_manager.network_monitor_.get());
honghaiz023f3ef2015-10-19 09:39:32 -070095 }
96 void ClearNetworks(BasicNetworkManager& network_manager) {
97 for (const auto& kv : network_manager.networks_map_) {
98 delete kv.second;
99 }
100 network_manager.networks_.clear();
101 network_manager.networks_map_.clear();
102 }
103
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000104#if defined(WEBRTC_POSIX)
105 // Separated from CreateNetworks for tests.
106 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
107 struct ifaddrs* interfaces,
108 bool include_ignored,
109 NetworkManager::NetworkList* networks) {
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800110 // Use the base IfAddrsConverter for test cases.
111 rtc::scoped_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
112 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
113 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 }
honghaizdb8cf502015-12-21 13:08:46 -0800115
116 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string,
117 uint32_t scope_id) {
118 struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6;
119 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
120 ipv6_addr->sin6_family = AF_INET6;
121 ipv6_addr->sin6_scope_id = scope_id;
122 IPAddress ip;
123 IPFromString(ip_string, &ip);
124 ipv6_addr->sin6_addr = ip.ipv6_address();
125 return ipv6_addr;
126 }
127
128 // Pointers created here need to be released via ReleaseIfAddrs.
129 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
130 char* if_name,
131 const std::string& ipv6_address,
132 const std::string& ipv6_netmask,
133 uint32_t scope_id) {
134 struct ifaddrs* if_addr = new struct ifaddrs;
135 memset(if_addr, 0, sizeof(struct ifaddrs));
136 if_addr->ifa_name = if_name;
137 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
138 CreateIpv6Addr(ipv6_address, scope_id));
139 if_addr->ifa_netmask =
140 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
141 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800142 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 13:08:46 -0800143 return if_addr;
144 }
145
146 void ReleaseIfAddrs(struct ifaddrs* list) {
147 struct ifaddrs* if_addr = list;
148 while (if_addr != nullptr) {
149 struct ifaddrs* next_addr = if_addr->ifa_next;
150 delete if_addr->ifa_addr;
151 delete if_addr->ifa_netmask;
152 delete if_addr;
153 if_addr = next_addr;
154 }
155 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156#endif // defined(WEBRTC_POSIX)
157
158 protected:
159 bool callback_called_;
honghaize3c6c822016-02-17 13:00:28 -0800160 // Number of networks that become inactive.
161 int num_networks_inactive_ = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000162};
163
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800164class TestBasicNetworkManager : public BasicNetworkManager {
165 public:
166 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800167 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800168};
169
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000170// Test that the Network ctor works properly.
171TEST_F(NetworkTest, TestNetworkConstruct) {
172 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
173 IPAddress(0x12345600U), 24);
174 EXPECT_EQ("test_eth0", ipv4_network1.name());
175 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
176 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
177 EXPECT_EQ(24, ipv4_network1.prefix_length());
178 EXPECT_FALSE(ipv4_network1.ignored());
179}
180
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000181TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
182 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
183 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000184 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000185 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000186 BasicNetworkManager network_manager;
187 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
188 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
189}
190
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000191// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000192TEST_F(NetworkTest, TestIgnoreList) {
193 Network ignore_me("ignore_me", "Ignore me please!",
194 IPAddress(0x12345600U), 24);
195 Network include_me("include_me", "Include me please!",
196 IPAddress(0x12345600U), 24);
197 BasicNetworkManager network_manager;
198 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
199 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
200 std::vector<std::string> ignore_list;
201 ignore_list.push_back("ignore_me");
202 network_manager.set_network_ignore_list(ignore_list);
203 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
204 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
205}
206
207// Test is failing on Windows opt: b/11288214
208TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
209 BasicNetworkManager manager;
210 NetworkManager::NetworkList result = GetNetworks(manager, true);
211 // We should be able to bind to any addresses we find.
212 NetworkManager::NetworkList::iterator it;
213 for (it = result.begin();
214 it != result.end();
215 ++it) {
216 sockaddr_storage storage;
217 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000218 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000219 SocketAddress bindaddress(ip, 0);
220 bindaddress.SetScopeID((*it)->scope_id());
221 // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
222 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
223 if (fd > 0) {
224 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
225 EXPECT_GE(ipsize, 0U);
226 int success = ::bind(fd,
227 reinterpret_cast<sockaddr*>(&storage),
228 static_cast<int>(ipsize));
229#if defined(WEBRTC_WIN)
230 if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
231#endif
232 EXPECT_EQ(0, success);
233#if defined(WEBRTC_WIN)
234 closesocket(fd);
235#else
236 close(fd);
237#endif
238 }
239 delete (*it);
240 }
241}
242
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700243// Test StartUpdating() and StopUpdating(). network_permission_state starts with
244// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000245TEST_F(NetworkTest, TestUpdateNetworks) {
246 BasicNetworkManager manager;
247 manager.SignalNetworksChanged.connect(
248 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700249 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
250 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000251 manager.StartUpdating();
252 Thread::Current()->ProcessMessages(0);
253 EXPECT_TRUE(callback_called_);
254 callback_called_ = false;
255 // Callback should be triggered immediately when StartUpdating
256 // is called, after network update signal is already sent.
257 manager.StartUpdating();
258 EXPECT_TRUE(manager.started());
259 Thread::Current()->ProcessMessages(0);
260 EXPECT_TRUE(callback_called_);
261 manager.StopUpdating();
262 EXPECT_TRUE(manager.started());
263 manager.StopUpdating();
guoweisea1012b2015-08-21 09:06:28 -0700264 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
265 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000266 EXPECT_FALSE(manager.started());
267 manager.StopUpdating();
268 EXPECT_FALSE(manager.started());
269 callback_called_ = false;
270 // Callback should be triggered immediately after StartUpdating is called
271 // when start_count_ is reset to 0.
272 manager.StartUpdating();
273 Thread::Current()->ProcessMessages(0);
274 EXPECT_TRUE(callback_called_);
275}
276
277// Verify that MergeNetworkList() merges network lists properly.
278TEST_F(NetworkTest, TestBasicMergeNetworkList) {
279 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
280 IPAddress(0x12345600U), 24);
281 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
282 IPAddress(0x00010000U), 16);
283 ipv4_network1.AddIP(IPAddress(0x12345678));
284 ipv4_network2.AddIP(IPAddress(0x00010004));
285 BasicNetworkManager manager;
286
287 // Add ipv4_network1 to the list of networks.
288 NetworkManager::NetworkList list;
289 list.push_back(new Network(ipv4_network1));
290 bool changed;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000291 NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000292 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000293 EXPECT_EQ(stats.ipv6_network_count, 0);
294 EXPECT_EQ(stats.ipv4_network_count, 1);
honghaize3c6c822016-02-17 13:00:28 -0800295 listenToNetworkInactive(manager);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000296 list.clear();
297
298 manager.GetNetworks(&list);
299 EXPECT_EQ(1U, list.size());
300 EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
301 Network* net1 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700302 uint16_t net_id1 = net1->id();
303 EXPECT_EQ(1, net_id1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000304 list.clear();
305
306 // Replace ipv4_network1 with ipv4_network2.
307 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000308 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000309 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000310 EXPECT_EQ(stats.ipv6_network_count, 0);
311 EXPECT_EQ(stats.ipv4_network_count, 1);
honghaize3c6c822016-02-17 13:00:28 -0800312 EXPECT_EQ(1, num_networks_inactive_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000313 list.clear();
honghaize3c6c822016-02-17 13:00:28 -0800314 num_networks_inactive_ = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000315
316 manager.GetNetworks(&list);
317 EXPECT_EQ(1U, list.size());
318 EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
319 Network* net2 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700320 uint16_t net_id2 = net2->id();
321 // Network id will increase.
322 EXPECT_LT(net_id1, net_id2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000323 list.clear();
324
325 // Add Network2 back.
326 list.push_back(new Network(ipv4_network1));
327 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000328 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000329 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000330 EXPECT_EQ(stats.ipv6_network_count, 0);
331 EXPECT_EQ(stats.ipv4_network_count, 2);
honghaize3c6c822016-02-17 13:00:28 -0800332 EXPECT_EQ(0, num_networks_inactive_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333 list.clear();
334
335 // Verify that we get previous instances of Network objects.
336 manager.GetNetworks(&list);
337 EXPECT_EQ(2U, list.size());
338 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
339 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700340 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
341 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000342 list.clear();
343
344 // Call MergeNetworkList() again and verify that we don't get update
345 // notification.
346 list.push_back(new Network(ipv4_network2));
347 list.push_back(new Network(ipv4_network1));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000348 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000349 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000350 EXPECT_EQ(stats.ipv6_network_count, 0);
351 EXPECT_EQ(stats.ipv4_network_count, 2);
honghaize3c6c822016-02-17 13:00:28 -0800352 EXPECT_EQ(0, num_networks_inactive_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000353 list.clear();
354
355 // Verify that we get previous instances of Network objects.
356 manager.GetNetworks(&list);
357 EXPECT_EQ(2U, list.size());
358 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
359 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700360 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
361 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000362 list.clear();
363}
364
365// Sets up some test IPv6 networks and appends them to list.
366// Four networks are added - public and link local, for two interfaces.
367void SetupNetworks(NetworkManager::NetworkList* list) {
368 IPAddress ip;
369 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000370 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
371 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000372 // First, fake link-locals.
373 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
374 prefix, 64);
375 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000376 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000377 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
378 prefix, 64);
379 ipv6_eth1_linklocalnetwork.AddIP(ip);
380 // Public networks:
381 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
382 prefix = TruncateIP(ip, 64);
383 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
384 prefix, 64);
385 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
386 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
387 prefix = TruncateIP(ip, 64);
388 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
389 prefix, 64);
390 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
391 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
392 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
393 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
394 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
395}
396
397// Test that the basic network merging case works.
398TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
399 BasicNetworkManager manager;
400 manager.SignalNetworksChanged.connect(
401 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
402 NetworkManager::NetworkList original_list;
403 SetupNetworks(&original_list);
404 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000405 NetworkManager::Stats stats =
406 MergeNetworkList(manager, original_list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000407 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000408 EXPECT_EQ(stats.ipv6_network_count, 4);
409 EXPECT_EQ(stats.ipv4_network_count, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000410 NetworkManager::NetworkList list;
411 manager.GetNetworks(&list);
412 EXPECT_EQ(original_list.size(), list.size());
413 // Verify that the original members are in the merged list.
414 for (NetworkManager::NetworkList::iterator it = original_list.begin();
415 it != original_list.end(); ++it) {
416 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
417 }
418}
419
guoweis@webrtc.org2444d962015-01-30 00:09:28 +0000420// Test that no more than manager.max_ipv6_networks() IPv6 networks get
421// returned.
422TEST_F(NetworkTest, TestIPv6MergeNetworkListTrimExcessive) {
423 BasicNetworkManager manager;
424 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
425 &NetworkTest::OnNetworksChanged);
426 NetworkManager::NetworkList original_list;
427
428 // Add twice the allowed number of IPv6 networks.
429 for (int i = 0; i < 2 * manager.max_ipv6_networks(); i++) {
430 // Make a network with different prefix length.
431 IPAddress ip;
432 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
433 IPAddress prefix = TruncateIP(ip, 64 - i);
434 Network* ipv6_network =
435 new Network("test_eth0", "Test Network Adapter 1", prefix, 64 - i);
436 ipv6_network->AddIP(ip);
437 original_list.push_back(ipv6_network);
438 }
439
440 // Add one IPv4 network.
441 Network* ipv4_network = new Network("test_eth0", "Test Network Adapter 1",
442 IPAddress(0x12345600U), 24);
443 ipv4_network->AddIP(IPAddress(0x12345600U));
444 original_list.push_back(ipv4_network);
445
446 bool changed = false;
447 MergeNetworkList(manager, original_list, &changed);
448 EXPECT_TRUE(changed);
449 NetworkManager::NetworkList list;
450 manager.GetNetworks(&list);
451
452 // List size should be the max allowed IPv6 networks plus one IPv4 network.
453 EXPECT_EQ(manager.max_ipv6_networks() + 1, (int)list.size());
454
455 // Verify that the IPv4 network is in the list.
456 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), ipv4_network));
457}
458
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000459// Tests that when two network lists that describe the same set of networks are
460// merged, that the changed callback is not called, and that the original
461// objects remain in the result list.
462TEST_F(NetworkTest, TestNoChangeMerge) {
463 BasicNetworkManager manager;
464 manager.SignalNetworksChanged.connect(
465 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
466 NetworkManager::NetworkList original_list;
467 SetupNetworks(&original_list);
468 bool changed = false;
469 MergeNetworkList(manager, original_list, &changed);
470 EXPECT_TRUE(changed);
471 // Second list that describes the same networks but with new objects.
472 NetworkManager::NetworkList second_list;
473 SetupNetworks(&second_list);
474 changed = false;
475 MergeNetworkList(manager, second_list, &changed);
476 EXPECT_FALSE(changed);
477 NetworkManager::NetworkList resulting_list;
478 manager.GetNetworks(&resulting_list);
479 EXPECT_EQ(original_list.size(), resulting_list.size());
480 // Verify that the original members are in the merged list.
481 for (NetworkManager::NetworkList::iterator it = original_list.begin();
482 it != original_list.end(); ++it) {
483 EXPECT_NE(resulting_list.end(),
484 std::find(resulting_list.begin(), resulting_list.end(), *it));
485 }
486 // Doublecheck that the new networks aren't in the list.
487 for (NetworkManager::NetworkList::iterator it = second_list.begin();
488 it != second_list.end(); ++it) {
489 EXPECT_EQ(resulting_list.end(),
490 std::find(resulting_list.begin(), resulting_list.end(), *it));
491 }
492}
493
494// Test that we can merge a network that is the same as another network but with
495// a different IP. The original network should remain in the list, but have its
496// IP changed.
497TEST_F(NetworkTest, MergeWithChangedIP) {
498 BasicNetworkManager manager;
499 manager.SignalNetworksChanged.connect(
500 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
501 NetworkManager::NetworkList original_list;
502 SetupNetworks(&original_list);
503 // Make a network that we're going to change.
504 IPAddress ip;
505 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
506 IPAddress prefix = TruncateIP(ip, 64);
507 Network* network_to_change = new Network("test_eth0",
508 "Test Network Adapter 1",
509 prefix, 64);
510 Network* changed_network = new Network(*network_to_change);
511 network_to_change->AddIP(ip);
512 IPAddress changed_ip;
513 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
514 changed_network->AddIP(changed_ip);
515 original_list.push_back(network_to_change);
516 bool changed = false;
517 MergeNetworkList(manager, original_list, &changed);
518 NetworkManager::NetworkList second_list;
519 SetupNetworks(&second_list);
520 second_list.push_back(changed_network);
521 changed = false;
522 MergeNetworkList(manager, second_list, &changed);
523 EXPECT_TRUE(changed);
524 NetworkManager::NetworkList list;
525 manager.GetNetworks(&list);
526 EXPECT_EQ(original_list.size(), list.size());
527 // Make sure the original network is still in the merged list.
528 EXPECT_NE(list.end(),
529 std::find(list.begin(), list.end(), network_to_change));
530 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
531}
532
533// Testing a similar case to above, but checking that a network can be updated
534// with additional IPs (not just a replacement).
535TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
536 BasicNetworkManager manager;
537 manager.SignalNetworksChanged.connect(
538 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
539 NetworkManager::NetworkList original_list;
540 SetupNetworks(&original_list);
541 bool changed = false;
542 MergeNetworkList(manager, original_list, &changed);
543 EXPECT_TRUE(changed);
544 IPAddress ip;
545 IPAddress check_ip;
546 IPAddress prefix;
547 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
548 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
549 prefix = TruncateIP(ip, 64);
550 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
551 prefix, 64);
552 // This is the IP that already existed in the public network on eth0.
553 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
554 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
555 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
556 changed = false;
557 MergeNetworkList(manager, original_list, &changed);
558 EXPECT_TRUE(changed);
559 // There should still be four networks.
560 NetworkManager::NetworkList list;
561 manager.GetNetworks(&list);
562 EXPECT_EQ(4U, list.size());
563 // Check the gathered IPs.
564 int matchcount = 0;
565 for (NetworkManager::NetworkList::iterator it = list.begin();
566 it != list.end(); ++it) {
567 if ((*it)->ToString() == original_list[2]->ToString()) {
568 ++matchcount;
569 EXPECT_EQ(1, matchcount);
570 // This should be the same network object as before.
571 EXPECT_EQ((*it), original_list[2]);
572 // But with two addresses now.
573 EXPECT_EQ(2U, (*it)->GetIPs().size());
574 EXPECT_NE((*it)->GetIPs().end(),
575 std::find((*it)->GetIPs().begin(),
576 (*it)->GetIPs().end(),
577 check_ip));
578 EXPECT_NE((*it)->GetIPs().end(),
579 std::find((*it)->GetIPs().begin(),
580 (*it)->GetIPs().end(),
581 ip));
582 } else {
583 // Check the IP didn't get added anywhere it wasn't supposed to.
584 EXPECT_EQ((*it)->GetIPs().end(),
585 std::find((*it)->GetIPs().begin(),
586 (*it)->GetIPs().end(),
587 ip));
588 }
589 }
590}
591
592// Test that merge correctly distinguishes multiple networks on an interface.
593TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
594 BasicNetworkManager manager;
595 manager.SignalNetworksChanged.connect(
596 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
597 NetworkManager::NetworkList original_list;
598 SetupNetworks(&original_list);
599 bool changed = false;
600 MergeNetworkList(manager, original_list, &changed);
601 EXPECT_TRUE(changed);
602 IPAddress ip;
603 IPAddress prefix;
604 // A second network for eth0.
605 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
606 prefix = TruncateIP(ip, 64);
607 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
608 prefix, 64);
609 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
610 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
611 changed = false;
612 MergeNetworkList(manager, original_list, &changed);
613 EXPECT_TRUE(changed);
614 // There should be five networks now.
615 NetworkManager::NetworkList list;
616 manager.GetNetworks(&list);
617 EXPECT_EQ(5U, list.size());
618 // Check the resulting addresses.
619 for (NetworkManager::NetworkList::iterator it = list.begin();
620 it != list.end(); ++it) {
621 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
622 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
623 // Check the new network has 1 IP and that it's the correct one.
624 EXPECT_EQ(1U, (*it)->GetIPs().size());
625 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
626 } else {
627 // Check the IP didn't get added anywhere it wasn't supposed to.
628 EXPECT_EQ((*it)->GetIPs().end(),
629 std::find((*it)->GetIPs().begin(),
630 (*it)->GetIPs().end(),
631 ip));
632 }
633 }
634}
635
honghaizdb8cf502015-12-21 13:08:46 -0800636// Test that DumpNetworks does not crash.
637TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000638 BasicNetworkManager manager;
honghaizdb8cf502015-12-21 13:08:46 -0800639 NetworkManager::NetworkList list = GetNetworks(manager, true);
640 bool changed;
641 MergeNetworkList(manager, list, &changed);
642 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000643}
644
645// Test that we can toggle IPv6 on and off.
minyue5d696482015-08-19 04:42:03 -0700646// Crashes on Linux. See webrtc:4923.
647#if defined(WEBRTC_LINUX)
648#define MAYBE_TestIPv6Toggle DISABLED_TestIPv6Toggle
649#else
650#define MAYBE_TestIPv6Toggle TestIPv6Toggle
651#endif
652TEST_F(NetworkTest, MAYBE_TestIPv6Toggle) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000653 BasicNetworkManager manager;
654 bool ipv6_found = false;
655 NetworkManager::NetworkList list;
656#if !defined(WEBRTC_WIN)
657 // There should be at least one IPv6 network (fe80::/64 should be in there).
658 // TODO(thaloun): Disabling this test on windows for the moment as the test
659 // machines don't seem to have IPv6 installed on them at all.
660 manager.set_ipv6_enabled(true);
661 list = GetNetworks(manager, true);
662 for (NetworkManager::NetworkList::iterator it = list.begin();
663 it != list.end(); ++it) {
664 if ((*it)->prefix().family() == AF_INET6) {
665 ipv6_found = true;
666 break;
667 }
668 }
669 EXPECT_TRUE(ipv6_found);
670 for (NetworkManager::NetworkList::iterator it = list.begin();
671 it != list.end(); ++it) {
672 delete (*it);
673 }
674#endif
675 ipv6_found = false;
676 manager.set_ipv6_enabled(false);
677 list = GetNetworks(manager, true);
678 for (NetworkManager::NetworkList::iterator it = list.begin();
679 it != list.end(); ++it) {
680 if ((*it)->prefix().family() == AF_INET6) {
681 ipv6_found = true;
682 break;
683 }
684 }
685 EXPECT_FALSE(ipv6_found);
686 for (NetworkManager::NetworkList::iterator it = list.begin();
687 it != list.end(); ++it) {
688 delete (*it);
689 }
690}
691
692TEST_F(NetworkTest, TestNetworkListSorting) {
693 BasicNetworkManager manager;
694 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
695 IPAddress(0x12345600U), 24);
696 ipv4_network1.AddIP(IPAddress(0x12345600U));
697
698 IPAddress ip;
699 IPAddress prefix;
700 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
701 prefix = TruncateIP(ip, 64);
702 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
703 prefix, 64);
704 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
705
706 NetworkManager::NetworkList list;
707 list.push_back(new Network(ipv4_network1));
708 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
709 Network* net1 = list[0];
710 Network* net2 = list[1];
711
712 bool changed = false;
713 MergeNetworkList(manager, list, &changed);
714 ASSERT_TRUE(changed);
715 // After sorting IPv6 network should be higher order than IPv4 networks.
716 EXPECT_TRUE(net1->preference() < net2->preference());
717}
718
719TEST_F(NetworkTest, TestNetworkAdapterTypes) {
720 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
721 ADAPTER_TYPE_WIFI);
722 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
723 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
724 ADAPTER_TYPE_ETHERNET);
725 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
726 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
727 ADAPTER_TYPE_CELLULAR);
728 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
729 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
730 ADAPTER_TYPE_VPN);
731 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
732 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
733 ADAPTER_TYPE_UNKNOWN);
734 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
735}
736
737#if defined(WEBRTC_POSIX)
738// Verify that we correctly handle interfaces with no address.
739TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
740 ifaddrs list;
741 memset(&list, 0, sizeof(list));
742 list.ifa_name = const_cast<char*>("test_iface");
743
744 NetworkManager::NetworkList result;
745 BasicNetworkManager manager;
746 CallConvertIfAddrs(manager, &list, true, &result);
747 EXPECT_TRUE(result.empty());
748}
honghaizdb8cf502015-12-21 13:08:46 -0800749
750// Verify that if there are two addresses on one interface, only one network
751// is generated.
752TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
753 char if_name[20] = "rmnet0";
754 ifaddrs* list = nullptr;
755 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
756 "FFFF:FFFF:FFFF:FFFF::", 0);
757 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
758 "FFFF:FFFF:FFFF:FFFF::", 0);
759 NetworkManager::NetworkList result;
760 BasicNetworkManager manager;
761 CallConvertIfAddrs(manager, list, true, &result);
762 EXPECT_EQ(1U, result.size());
763 bool changed;
764 // This ensures we release the objects created in CallConvertIfAddrs.
765 MergeNetworkList(manager, result, &changed);
766 ReleaseIfAddrs(list);
767}
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800768
769TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
770 ifaddrs list;
771 memset(&list, 0, sizeof(list));
772 list.ifa_name = const_cast<char*>("test_iface");
773 sockaddr ifa_addr;
774 sockaddr ifa_netmask;
775 list.ifa_addr = &ifa_addr;
776 list.ifa_netmask = &ifa_netmask;
777
778 NetworkManager::NetworkList result;
779 BasicNetworkManager manager;
780 CallConvertIfAddrs(manager, &list, true, &result);
781 EXPECT_TRUE(result.empty());
782}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000783#endif // defined(WEBRTC_POSIX)
784
785#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
786// If you want to test non-default routes, you can do the following on a linux
787// machine:
788// 1) Load the dummy network driver:
789// sudo modprobe dummy
790// sudo ifconfig dummy0 127.0.0.1
791// 2) Run this test and confirm the output says it found a dummy route (and
792// passes).
793// 3) When done:
794// sudo rmmmod dummy
795TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
796 BasicNetworkManager manager;
797 NetworkManager::NetworkList list;
798 list = GetNetworks(manager, false);
799 bool found_dummy = false;
800 LOG(LS_INFO) << "Looking for dummy network: ";
801 for (NetworkManager::NetworkList::iterator it = list.begin();
802 it != list.end(); ++it) {
803 LOG(LS_INFO) << " Network name: " << (*it)->name();
804 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
805 }
806 for (NetworkManager::NetworkList::iterator it = list.begin();
807 it != list.end(); ++it) {
808 delete (*it);
809 }
810 if (!found_dummy) {
811 LOG(LS_INFO) << "No dummy found, quitting.";
812 return;
813 }
814 LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
815 << "routes.";
816 manager.set_ignore_non_default_routes(true);
817 list = GetNetworks(manager, false);
818 for (NetworkManager::NetworkList::iterator it = list.begin();
819 it != list.end(); ++it) {
820 LOG(LS_INFO) << " Network name: " << (*it)->name();
821 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
822 }
823 for (NetworkManager::NetworkList::iterator it = list.begin();
824 it != list.end(); ++it) {
825 delete (*it);
826 }
827}
828#endif
829
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000830// Test MergeNetworkList successfully combines all IPs for the same
831// prefix/length into a single Network.
832TEST_F(NetworkTest, TestMergeNetworkList) {
833 BasicNetworkManager manager;
834 NetworkManager::NetworkList list;
835
836 // Create 2 IPAddress classes with only last digit different.
837 IPAddress ip1, ip2;
838 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
839 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
840
841 // Create 2 networks with the same prefix and length.
842 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
843 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
844
845 // Add different IP into each.
846 net1->AddIP(ip1);
847 net2->AddIP(ip2);
848
849 list.push_back(net1);
850 list.push_back(net2);
851 bool changed;
852 MergeNetworkList(manager, list, &changed);
853 EXPECT_TRUE(changed);
854
855 NetworkManager::NetworkList list2;
856 manager.GetNetworks(&list2);
857
858 // Make sure the resulted networklist has only 1 element and 2
859 // IPAddresses.
860 EXPECT_EQ(list2.size(), 1uL);
861 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
862 EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
863 EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
864}
865
honghaizdb8cf502015-12-21 13:08:46 -0800866// Test that MergeNetworkList successfully detects the change if
867// a network becomes inactive and then active again.
868TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
869 BasicNetworkManager manager;
870 Network network1("test_wifi", "Test Network Adapter 1",
871 IPAddress(0x12345600U), 24);
872 Network network2("test_eth0", "Test Network Adapter 2",
873 IPAddress(0x00010000U), 16);
874 network1.AddIP(IPAddress(0x12345678));
875 network2.AddIP(IPAddress(0x00010004));
876 NetworkManager::NetworkList list;
877 Network* net1 = new Network(network1);
878 list.push_back(net1);
879 bool changed;
880 MergeNetworkList(manager, list, &changed);
881 EXPECT_TRUE(changed);
882 list.clear();
883 manager.GetNetworks(&list);
884 ASSERT_EQ(1U, list.size());
885 EXPECT_EQ(net1, list[0]);
886
887 list.clear();
888 Network* net2 = new Network(network2);
889 list.push_back(net2);
890 MergeNetworkList(manager, list, &changed);
891 EXPECT_TRUE(changed);
892 list.clear();
893 manager.GetNetworks(&list);
894 ASSERT_EQ(1U, list.size());
895 EXPECT_EQ(net2, list[0]);
896
897 // Now network1 is inactive. Try to merge it again.
898 list.clear();
899 list.push_back(new Network(network1));
900 MergeNetworkList(manager, list, &changed);
901 EXPECT_TRUE(changed);
902 list.clear();
903 manager.GetNetworks(&list);
904 ASSERT_EQ(1U, list.size());
905 EXPECT_TRUE(list[0]->active());
906 EXPECT_EQ(net1, list[0]);
907}
908
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000909// Test that the filtering logic follows the defined ruleset in network.h.
910TEST_F(NetworkTest, TestIPv6Selection) {
911 InterfaceAddress ip;
912 std::string ipstr;
913
914 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
915 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
916
917 // Create a network with this prefix.
918 Network ipv6_network(
919 "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
920
921 // When there is no address added, it should return an unspecified
922 // address.
923 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
924 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
925
926 // Deprecated one should not be returned.
927 ipv6_network.AddIP(ip);
928 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
929
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000930 // Add ULA one. ULA is unique local address which is starting either
931 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000932 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
933 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
934 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000935 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000936
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000937 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000938 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
939 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
940 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000941 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000942
943 // Add global dynamic temporary one.
944 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
945 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
946 ipv6_network.AddIP(ip);
947 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
948}
949
honghaiz023f3ef2015-10-19 09:39:32 -0700950TEST_F(NetworkTest, TestNetworkMonitoring) {
951 BasicNetworkManager manager;
952 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
953 &NetworkTest::OnNetworksChanged);
954 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
955 NetworkMonitorFactory::SetFactory(factory);
956 manager.StartUpdating();
honghaizcec0a082016-01-15 14:49:09 -0800957 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
958 EXPECT_TRUE(network_monitor && network_monitor->started());
honghaiz023f3ef2015-10-19 09:39:32 -0700959 EXPECT_TRUE_WAIT(callback_called_, 1000);
960 callback_called_ = false;
961
962 // Clear the networks so that there will be network changes below.
963 ClearNetworks(manager);
964 // Network manager is started, so the callback is called when the network
965 // monitor fires the network-change event.
966 network_monitor->OnNetworksChanged();
967 EXPECT_TRUE_WAIT(callback_called_, 1000);
968
honghaizcec0a082016-01-15 14:49:09 -0800969 // Network manager is stopped.
honghaiz023f3ef2015-10-19 09:39:32 -0700970 manager.StopUpdating();
honghaizcec0a082016-01-15 14:49:09 -0800971 EXPECT_FALSE(GetNetworkMonitor(manager)->started());
honghaiz023f3ef2015-10-19 09:39:32 -0700972
973 NetworkMonitorFactory::ReleaseFactory(factory);
974}
975
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800976TEST_F(NetworkTest, DefaultLocalAddress) {
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800977 IPAddress ip;
guoweis56271ed2016-01-15 14:45:06 -0800978 TestBasicNetworkManager manager;
979 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
980 &NetworkTest::OnNetworksChanged);
981 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
982 NetworkMonitorFactory::SetFactory(factory);
983 manager.StartUpdating();
984 EXPECT_TRUE_WAIT(callback_called_, 1000);
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800985
986 // Make sure we can query default local address when an address for such
987 // address family exists.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800988 std::vector<Network*> networks;
989 manager.GetNetworks(&networks);
guoweis56271ed2016-01-15 14:45:06 -0800990 EXPECT_TRUE(!networks.empty());
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800991 for (auto& network : networks) {
992 if (network->GetBestIP().family() == AF_INET) {
993 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
guoweis56271ed2016-01-15 14:45:06 -0800994 } else if (network->GetBestIP().family() == AF_INET6 &&
995 !IPIsLoopback(network->GetBestIP())) {
996 // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
997 // enabled.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800998 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress());
999 }
1000 }
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001001
1002 // GetDefaultLocalAddress should return the valid default address after set.
1003 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1004 GetLoopbackIP(AF_INET6));
1005 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1006 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1007 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1008 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001009 manager.StopUpdating();
1010}
1011
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001012} // namespace rtc