blob: d172f9261973e939a7c48c8692c4cd96b15e1102 [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:
32 void Start() override {}
33 void Stop() override {}
34};
35
36class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
37 public:
38 FakeNetworkMonitorFactory() {}
39 NetworkMonitorInterface* CreateNetworkMonitor() {
40 return new FakeNetworkMonitor();
41 }
42};
43
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080044} // namespace
45
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000046class NetworkTest : public testing::Test, public sigslot::has_slots<> {
47 public:
48 NetworkTest() : callback_called_(false) {}
49
50 void OnNetworksChanged() {
51 callback_called_ = true;
52 }
53
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +000054 NetworkManager::Stats MergeNetworkList(
55 BasicNetworkManager& network_manager,
56 const NetworkManager::NetworkList& list,
57 bool* changed) {
58 NetworkManager::Stats stats;
59 network_manager.MergeNetworkList(list, changed, &stats);
60 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000061 }
62
63 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
64 const Network& network) {
65 return network_manager.IsIgnoredNetwork(network);
66 }
67
68 NetworkManager::NetworkList GetNetworks(
69 const BasicNetworkManager& network_manager, bool include_ignored) {
70 NetworkManager::NetworkList list;
71 network_manager.CreateNetworks(include_ignored, &list);
72 return list;
73 }
74
honghaiz023f3ef2015-10-19 09:39:32 -070075 NetworkMonitorInterface* GetNetworkMonitor(
76 BasicNetworkManager& network_manager) {
77 return network_manager.network_monitor_.get();
78 }
79 void ClearNetworks(BasicNetworkManager& network_manager) {
80 for (const auto& kv : network_manager.networks_map_) {
81 delete kv.second;
82 }
83 network_manager.networks_.clear();
84 network_manager.networks_map_.clear();
85 }
86
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000087#if defined(WEBRTC_POSIX)
88 // Separated from CreateNetworks for tests.
89 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
90 struct ifaddrs* interfaces,
91 bool include_ignored,
92 NetworkManager::NetworkList* networks) {
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080093 // Use the base IfAddrsConverter for test cases.
94 rtc::scoped_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
95 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
96 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097 }
honghaizdb8cf502015-12-21 13:08:46 -080098
99 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string,
100 uint32_t scope_id) {
101 struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6;
102 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
103 ipv6_addr->sin6_family = AF_INET6;
104 ipv6_addr->sin6_scope_id = scope_id;
105 IPAddress ip;
106 IPFromString(ip_string, &ip);
107 ipv6_addr->sin6_addr = ip.ipv6_address();
108 return ipv6_addr;
109 }
110
111 // Pointers created here need to be released via ReleaseIfAddrs.
112 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
113 char* if_name,
114 const std::string& ipv6_address,
115 const std::string& ipv6_netmask,
116 uint32_t scope_id) {
117 struct ifaddrs* if_addr = new struct ifaddrs;
118 memset(if_addr, 0, sizeof(struct ifaddrs));
119 if_addr->ifa_name = if_name;
120 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
121 CreateIpv6Addr(ipv6_address, scope_id));
122 if_addr->ifa_netmask =
123 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
124 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800125 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 13:08:46 -0800126 return if_addr;
127 }
128
129 void ReleaseIfAddrs(struct ifaddrs* list) {
130 struct ifaddrs* if_addr = list;
131 while (if_addr != nullptr) {
132 struct ifaddrs* next_addr = if_addr->ifa_next;
133 delete if_addr->ifa_addr;
134 delete if_addr->ifa_netmask;
135 delete if_addr;
136 if_addr = next_addr;
137 }
138 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000139#endif // defined(WEBRTC_POSIX)
140
141 protected:
142 bool callback_called_;
143};
144
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800145class TestBasicNetworkManager : public BasicNetworkManager {
146 public:
147 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800148 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800149};
150
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151// Test that the Network ctor works properly.
152TEST_F(NetworkTest, TestNetworkConstruct) {
153 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
154 IPAddress(0x12345600U), 24);
155 EXPECT_EQ("test_eth0", ipv4_network1.name());
156 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
157 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
158 EXPECT_EQ(24, ipv4_network1.prefix_length());
159 EXPECT_FALSE(ipv4_network1.ignored());
160}
161
162// Tests that our ignore function works properly.
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000163TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresOnlyLoopbackByDefault) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000164 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000165 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
166 Network ipv4_network2("test_wlan0", "Test Network Adapter 2",
167 IPAddress(0x12345601U), 16, ADAPTER_TYPE_WIFI);
168 Network ipv4_network3("test_cell0", "Test Network Adapter 3",
169 IPAddress(0x12345602U), 16, ADAPTER_TYPE_CELLULAR);
170 Network ipv4_network4("test_vpn0", "Test Network Adapter 4",
171 IPAddress(0x12345603U), 16, ADAPTER_TYPE_VPN);
172 Network ipv4_network5("test_lo", "Test Network Adapter 5",
173 IPAddress(0x12345604U), 16, ADAPTER_TYPE_LOOPBACK);
174 BasicNetworkManager network_manager;
175 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
176 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network2));
177 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network3));
178 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network4));
179 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network5));
180}
181
182TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
183 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
184 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000185 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000186 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000187 BasicNetworkManager network_manager;
188 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
189 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
190}
191
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000192TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresNetworksAccordingToIgnoreMask) {
193 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
194 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
195 Network ipv4_network2("test_wlan0", "Test Network Adapter 2",
196 IPAddress(0x12345601U), 16, ADAPTER_TYPE_WIFI);
197 Network ipv4_network3("test_cell0", "Test Network Adapter 3",
198 IPAddress(0x12345602U), 16, ADAPTER_TYPE_CELLULAR);
199 BasicNetworkManager network_manager;
200 network_manager.set_network_ignore_mask(
201 ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK | ADAPTER_TYPE_WIFI);
202 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network1));
203 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
204 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network3));
205}
206
207// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000208TEST_F(NetworkTest, TestIgnoreList) {
209 Network ignore_me("ignore_me", "Ignore me please!",
210 IPAddress(0x12345600U), 24);
211 Network include_me("include_me", "Include me please!",
212 IPAddress(0x12345600U), 24);
213 BasicNetworkManager network_manager;
214 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
215 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
216 std::vector<std::string> ignore_list;
217 ignore_list.push_back("ignore_me");
218 network_manager.set_network_ignore_list(ignore_list);
219 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
220 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
221}
222
223// Test is failing on Windows opt: b/11288214
224TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
225 BasicNetworkManager manager;
226 NetworkManager::NetworkList result = GetNetworks(manager, true);
227 // We should be able to bind to any addresses we find.
228 NetworkManager::NetworkList::iterator it;
229 for (it = result.begin();
230 it != result.end();
231 ++it) {
232 sockaddr_storage storage;
233 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000234 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000235 SocketAddress bindaddress(ip, 0);
236 bindaddress.SetScopeID((*it)->scope_id());
237 // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
238 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
239 if (fd > 0) {
240 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
241 EXPECT_GE(ipsize, 0U);
242 int success = ::bind(fd,
243 reinterpret_cast<sockaddr*>(&storage),
244 static_cast<int>(ipsize));
245#if defined(WEBRTC_WIN)
246 if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
247#endif
248 EXPECT_EQ(0, success);
249#if defined(WEBRTC_WIN)
250 closesocket(fd);
251#else
252 close(fd);
253#endif
254 }
255 delete (*it);
256 }
257}
258
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700259// Test StartUpdating() and StopUpdating(). network_permission_state starts with
260// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000261TEST_F(NetworkTest, TestUpdateNetworks) {
262 BasicNetworkManager manager;
263 manager.SignalNetworksChanged.connect(
264 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700265 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
266 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000267 manager.StartUpdating();
268 Thread::Current()->ProcessMessages(0);
269 EXPECT_TRUE(callback_called_);
270 callback_called_ = false;
271 // Callback should be triggered immediately when StartUpdating
272 // is called, after network update signal is already sent.
273 manager.StartUpdating();
274 EXPECT_TRUE(manager.started());
275 Thread::Current()->ProcessMessages(0);
276 EXPECT_TRUE(callback_called_);
277 manager.StopUpdating();
278 EXPECT_TRUE(manager.started());
279 manager.StopUpdating();
guoweisea1012b2015-08-21 09:06:28 -0700280 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
281 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000282 EXPECT_FALSE(manager.started());
283 manager.StopUpdating();
284 EXPECT_FALSE(manager.started());
285 callback_called_ = false;
286 // Callback should be triggered immediately after StartUpdating is called
287 // when start_count_ is reset to 0.
288 manager.StartUpdating();
289 Thread::Current()->ProcessMessages(0);
290 EXPECT_TRUE(callback_called_);
291}
292
293// Verify that MergeNetworkList() merges network lists properly.
294TEST_F(NetworkTest, TestBasicMergeNetworkList) {
295 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
296 IPAddress(0x12345600U), 24);
297 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
298 IPAddress(0x00010000U), 16);
299 ipv4_network1.AddIP(IPAddress(0x12345678));
300 ipv4_network2.AddIP(IPAddress(0x00010004));
301 BasicNetworkManager manager;
302
303 // Add ipv4_network1 to the list of networks.
304 NetworkManager::NetworkList list;
305 list.push_back(new Network(ipv4_network1));
306 bool changed;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000307 NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000308 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000309 EXPECT_EQ(stats.ipv6_network_count, 0);
310 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311 list.clear();
312
313 manager.GetNetworks(&list);
314 EXPECT_EQ(1U, list.size());
315 EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
316 Network* net1 = list[0];
317 list.clear();
318
319 // Replace ipv4_network1 with ipv4_network2.
320 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000321 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000322 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000323 EXPECT_EQ(stats.ipv6_network_count, 0);
324 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000325 list.clear();
326
327 manager.GetNetworks(&list);
328 EXPECT_EQ(1U, list.size());
329 EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
330 Network* net2 = list[0];
331 list.clear();
332
333 // Add Network2 back.
334 list.push_back(new Network(ipv4_network1));
335 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000336 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000337 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000338 EXPECT_EQ(stats.ipv6_network_count, 0);
339 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000340 list.clear();
341
342 // Verify that we get previous instances of Network objects.
343 manager.GetNetworks(&list);
344 EXPECT_EQ(2U, list.size());
345 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
346 (net1 == list[1] && net2 == list[0]));
347 list.clear();
348
349 // Call MergeNetworkList() again and verify that we don't get update
350 // notification.
351 list.push_back(new Network(ipv4_network2));
352 list.push_back(new Network(ipv4_network1));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000353 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000354 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000355 EXPECT_EQ(stats.ipv6_network_count, 0);
356 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000357 list.clear();
358
359 // Verify that we get previous instances of Network objects.
360 manager.GetNetworks(&list);
361 EXPECT_EQ(2U, list.size());
362 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
363 (net1 == list[1] && net2 == list[0]));
364 list.clear();
365}
366
367// Sets up some test IPv6 networks and appends them to list.
368// Four networks are added - public and link local, for two interfaces.
369void SetupNetworks(NetworkManager::NetworkList* list) {
370 IPAddress ip;
371 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000372 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
373 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000374 // First, fake link-locals.
375 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
376 prefix, 64);
377 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000378 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000379 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
380 prefix, 64);
381 ipv6_eth1_linklocalnetwork.AddIP(ip);
382 // Public networks:
383 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
384 prefix = TruncateIP(ip, 64);
385 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
386 prefix, 64);
387 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
388 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
389 prefix = TruncateIP(ip, 64);
390 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
391 prefix, 64);
392 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
393 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
394 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
395 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
396 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
397}
398
399// Test that the basic network merging case works.
400TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
401 BasicNetworkManager manager;
402 manager.SignalNetworksChanged.connect(
403 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
404 NetworkManager::NetworkList original_list;
405 SetupNetworks(&original_list);
406 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000407 NetworkManager::Stats stats =
408 MergeNetworkList(manager, original_list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000409 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000410 EXPECT_EQ(stats.ipv6_network_count, 4);
411 EXPECT_EQ(stats.ipv4_network_count, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000412 NetworkManager::NetworkList list;
413 manager.GetNetworks(&list);
414 EXPECT_EQ(original_list.size(), list.size());
415 // Verify that the original members are in the merged list.
416 for (NetworkManager::NetworkList::iterator it = original_list.begin();
417 it != original_list.end(); ++it) {
418 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
419 }
420}
421
guoweis@webrtc.org2444d962015-01-30 00:09:28 +0000422// Test that no more than manager.max_ipv6_networks() IPv6 networks get
423// returned.
424TEST_F(NetworkTest, TestIPv6MergeNetworkListTrimExcessive) {
425 BasicNetworkManager manager;
426 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
427 &NetworkTest::OnNetworksChanged);
428 NetworkManager::NetworkList original_list;
429
430 // Add twice the allowed number of IPv6 networks.
431 for (int i = 0; i < 2 * manager.max_ipv6_networks(); i++) {
432 // Make a network with different prefix length.
433 IPAddress ip;
434 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
435 IPAddress prefix = TruncateIP(ip, 64 - i);
436 Network* ipv6_network =
437 new Network("test_eth0", "Test Network Adapter 1", prefix, 64 - i);
438 ipv6_network->AddIP(ip);
439 original_list.push_back(ipv6_network);
440 }
441
442 // Add one IPv4 network.
443 Network* ipv4_network = new Network("test_eth0", "Test Network Adapter 1",
444 IPAddress(0x12345600U), 24);
445 ipv4_network->AddIP(IPAddress(0x12345600U));
446 original_list.push_back(ipv4_network);
447
448 bool changed = false;
449 MergeNetworkList(manager, original_list, &changed);
450 EXPECT_TRUE(changed);
451 NetworkManager::NetworkList list;
452 manager.GetNetworks(&list);
453
454 // List size should be the max allowed IPv6 networks plus one IPv4 network.
455 EXPECT_EQ(manager.max_ipv6_networks() + 1, (int)list.size());
456
457 // Verify that the IPv4 network is in the list.
458 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), ipv4_network));
459}
460
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000461// Tests that when two network lists that describe the same set of networks are
462// merged, that the changed callback is not called, and that the original
463// objects remain in the result list.
464TEST_F(NetworkTest, TestNoChangeMerge) {
465 BasicNetworkManager manager;
466 manager.SignalNetworksChanged.connect(
467 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
468 NetworkManager::NetworkList original_list;
469 SetupNetworks(&original_list);
470 bool changed = false;
471 MergeNetworkList(manager, original_list, &changed);
472 EXPECT_TRUE(changed);
473 // Second list that describes the same networks but with new objects.
474 NetworkManager::NetworkList second_list;
475 SetupNetworks(&second_list);
476 changed = false;
477 MergeNetworkList(manager, second_list, &changed);
478 EXPECT_FALSE(changed);
479 NetworkManager::NetworkList resulting_list;
480 manager.GetNetworks(&resulting_list);
481 EXPECT_EQ(original_list.size(), resulting_list.size());
482 // Verify that the original members are in the merged list.
483 for (NetworkManager::NetworkList::iterator it = original_list.begin();
484 it != original_list.end(); ++it) {
485 EXPECT_NE(resulting_list.end(),
486 std::find(resulting_list.begin(), resulting_list.end(), *it));
487 }
488 // Doublecheck that the new networks aren't in the list.
489 for (NetworkManager::NetworkList::iterator it = second_list.begin();
490 it != second_list.end(); ++it) {
491 EXPECT_EQ(resulting_list.end(),
492 std::find(resulting_list.begin(), resulting_list.end(), *it));
493 }
494}
495
496// Test that we can merge a network that is the same as another network but with
497// a different IP. The original network should remain in the list, but have its
498// IP changed.
499TEST_F(NetworkTest, MergeWithChangedIP) {
500 BasicNetworkManager manager;
501 manager.SignalNetworksChanged.connect(
502 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
503 NetworkManager::NetworkList original_list;
504 SetupNetworks(&original_list);
505 // Make a network that we're going to change.
506 IPAddress ip;
507 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
508 IPAddress prefix = TruncateIP(ip, 64);
509 Network* network_to_change = new Network("test_eth0",
510 "Test Network Adapter 1",
511 prefix, 64);
512 Network* changed_network = new Network(*network_to_change);
513 network_to_change->AddIP(ip);
514 IPAddress changed_ip;
515 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
516 changed_network->AddIP(changed_ip);
517 original_list.push_back(network_to_change);
518 bool changed = false;
519 MergeNetworkList(manager, original_list, &changed);
520 NetworkManager::NetworkList second_list;
521 SetupNetworks(&second_list);
522 second_list.push_back(changed_network);
523 changed = false;
524 MergeNetworkList(manager, second_list, &changed);
525 EXPECT_TRUE(changed);
526 NetworkManager::NetworkList list;
527 manager.GetNetworks(&list);
528 EXPECT_EQ(original_list.size(), list.size());
529 // Make sure the original network is still in the merged list.
530 EXPECT_NE(list.end(),
531 std::find(list.begin(), list.end(), network_to_change));
532 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
533}
534
535// Testing a similar case to above, but checking that a network can be updated
536// with additional IPs (not just a replacement).
537TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
538 BasicNetworkManager manager;
539 manager.SignalNetworksChanged.connect(
540 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
541 NetworkManager::NetworkList original_list;
542 SetupNetworks(&original_list);
543 bool changed = false;
544 MergeNetworkList(manager, original_list, &changed);
545 EXPECT_TRUE(changed);
546 IPAddress ip;
547 IPAddress check_ip;
548 IPAddress prefix;
549 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
550 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
551 prefix = TruncateIP(ip, 64);
552 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
553 prefix, 64);
554 // This is the IP that already existed in the public network on eth0.
555 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
556 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
557 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
558 changed = false;
559 MergeNetworkList(manager, original_list, &changed);
560 EXPECT_TRUE(changed);
561 // There should still be four networks.
562 NetworkManager::NetworkList list;
563 manager.GetNetworks(&list);
564 EXPECT_EQ(4U, list.size());
565 // Check the gathered IPs.
566 int matchcount = 0;
567 for (NetworkManager::NetworkList::iterator it = list.begin();
568 it != list.end(); ++it) {
569 if ((*it)->ToString() == original_list[2]->ToString()) {
570 ++matchcount;
571 EXPECT_EQ(1, matchcount);
572 // This should be the same network object as before.
573 EXPECT_EQ((*it), original_list[2]);
574 // But with two addresses now.
575 EXPECT_EQ(2U, (*it)->GetIPs().size());
576 EXPECT_NE((*it)->GetIPs().end(),
577 std::find((*it)->GetIPs().begin(),
578 (*it)->GetIPs().end(),
579 check_ip));
580 EXPECT_NE((*it)->GetIPs().end(),
581 std::find((*it)->GetIPs().begin(),
582 (*it)->GetIPs().end(),
583 ip));
584 } else {
585 // Check the IP didn't get added anywhere it wasn't supposed to.
586 EXPECT_EQ((*it)->GetIPs().end(),
587 std::find((*it)->GetIPs().begin(),
588 (*it)->GetIPs().end(),
589 ip));
590 }
591 }
592}
593
594// Test that merge correctly distinguishes multiple networks on an interface.
595TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
596 BasicNetworkManager manager;
597 manager.SignalNetworksChanged.connect(
598 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
599 NetworkManager::NetworkList original_list;
600 SetupNetworks(&original_list);
601 bool changed = false;
602 MergeNetworkList(manager, original_list, &changed);
603 EXPECT_TRUE(changed);
604 IPAddress ip;
605 IPAddress prefix;
606 // A second network for eth0.
607 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
608 prefix = TruncateIP(ip, 64);
609 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
610 prefix, 64);
611 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
612 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
613 changed = false;
614 MergeNetworkList(manager, original_list, &changed);
615 EXPECT_TRUE(changed);
616 // There should be five networks now.
617 NetworkManager::NetworkList list;
618 manager.GetNetworks(&list);
619 EXPECT_EQ(5U, list.size());
620 // Check the resulting addresses.
621 for (NetworkManager::NetworkList::iterator it = list.begin();
622 it != list.end(); ++it) {
623 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
624 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
625 // Check the new network has 1 IP and that it's the correct one.
626 EXPECT_EQ(1U, (*it)->GetIPs().size());
627 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
628 } else {
629 // Check the IP didn't get added anywhere it wasn't supposed to.
630 EXPECT_EQ((*it)->GetIPs().end(),
631 std::find((*it)->GetIPs().begin(),
632 (*it)->GetIPs().end(),
633 ip));
634 }
635 }
636}
637
honghaizdb8cf502015-12-21 13:08:46 -0800638// Test that DumpNetworks does not crash.
639TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000640 BasicNetworkManager manager;
honghaizdb8cf502015-12-21 13:08:46 -0800641 NetworkManager::NetworkList list = GetNetworks(manager, true);
642 bool changed;
643 MergeNetworkList(manager, list, &changed);
644 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000645}
646
647// Test that we can toggle IPv6 on and off.
minyue5d696482015-08-19 04:42:03 -0700648// Crashes on Linux. See webrtc:4923.
649#if defined(WEBRTC_LINUX)
650#define MAYBE_TestIPv6Toggle DISABLED_TestIPv6Toggle
651#else
652#define MAYBE_TestIPv6Toggle TestIPv6Toggle
653#endif
654TEST_F(NetworkTest, MAYBE_TestIPv6Toggle) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000655 BasicNetworkManager manager;
656 bool ipv6_found = false;
657 NetworkManager::NetworkList list;
658#if !defined(WEBRTC_WIN)
659 // There should be at least one IPv6 network (fe80::/64 should be in there).
660 // TODO(thaloun): Disabling this test on windows for the moment as the test
661 // machines don't seem to have IPv6 installed on them at all.
662 manager.set_ipv6_enabled(true);
663 list = GetNetworks(manager, true);
664 for (NetworkManager::NetworkList::iterator it = list.begin();
665 it != list.end(); ++it) {
666 if ((*it)->prefix().family() == AF_INET6) {
667 ipv6_found = true;
668 break;
669 }
670 }
671 EXPECT_TRUE(ipv6_found);
672 for (NetworkManager::NetworkList::iterator it = list.begin();
673 it != list.end(); ++it) {
674 delete (*it);
675 }
676#endif
677 ipv6_found = false;
678 manager.set_ipv6_enabled(false);
679 list = GetNetworks(manager, true);
680 for (NetworkManager::NetworkList::iterator it = list.begin();
681 it != list.end(); ++it) {
682 if ((*it)->prefix().family() == AF_INET6) {
683 ipv6_found = true;
684 break;
685 }
686 }
687 EXPECT_FALSE(ipv6_found);
688 for (NetworkManager::NetworkList::iterator it = list.begin();
689 it != list.end(); ++it) {
690 delete (*it);
691 }
692}
693
694TEST_F(NetworkTest, TestNetworkListSorting) {
695 BasicNetworkManager manager;
696 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
697 IPAddress(0x12345600U), 24);
698 ipv4_network1.AddIP(IPAddress(0x12345600U));
699
700 IPAddress ip;
701 IPAddress prefix;
702 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
703 prefix = TruncateIP(ip, 64);
704 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
705 prefix, 64);
706 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
707
708 NetworkManager::NetworkList list;
709 list.push_back(new Network(ipv4_network1));
710 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
711 Network* net1 = list[0];
712 Network* net2 = list[1];
713
714 bool changed = false;
715 MergeNetworkList(manager, list, &changed);
716 ASSERT_TRUE(changed);
717 // After sorting IPv6 network should be higher order than IPv4 networks.
718 EXPECT_TRUE(net1->preference() < net2->preference());
719}
720
721TEST_F(NetworkTest, TestNetworkAdapterTypes) {
722 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
723 ADAPTER_TYPE_WIFI);
724 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
725 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
726 ADAPTER_TYPE_ETHERNET);
727 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
728 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
729 ADAPTER_TYPE_CELLULAR);
730 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
731 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
732 ADAPTER_TYPE_VPN);
733 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
734 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
735 ADAPTER_TYPE_UNKNOWN);
736 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
737}
738
739#if defined(WEBRTC_POSIX)
740// Verify that we correctly handle interfaces with no address.
741TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
742 ifaddrs list;
743 memset(&list, 0, sizeof(list));
744 list.ifa_name = const_cast<char*>("test_iface");
745
746 NetworkManager::NetworkList result;
747 BasicNetworkManager manager;
748 CallConvertIfAddrs(manager, &list, true, &result);
749 EXPECT_TRUE(result.empty());
750}
honghaizdb8cf502015-12-21 13:08:46 -0800751
752// Verify that if there are two addresses on one interface, only one network
753// is generated.
754TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
755 char if_name[20] = "rmnet0";
756 ifaddrs* list = nullptr;
757 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
758 "FFFF:FFFF:FFFF:FFFF::", 0);
759 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
760 "FFFF:FFFF:FFFF:FFFF::", 0);
761 NetworkManager::NetworkList result;
762 BasicNetworkManager manager;
763 CallConvertIfAddrs(manager, list, true, &result);
764 EXPECT_EQ(1U, result.size());
765 bool changed;
766 // This ensures we release the objects created in CallConvertIfAddrs.
767 MergeNetworkList(manager, result, &changed);
768 ReleaseIfAddrs(list);
769}
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800770
771TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
772 ifaddrs list;
773 memset(&list, 0, sizeof(list));
774 list.ifa_name = const_cast<char*>("test_iface");
775 sockaddr ifa_addr;
776 sockaddr ifa_netmask;
777 list.ifa_addr = &ifa_addr;
778 list.ifa_netmask = &ifa_netmask;
779
780 NetworkManager::NetworkList result;
781 BasicNetworkManager manager;
782 CallConvertIfAddrs(manager, &list, true, &result);
783 EXPECT_TRUE(result.empty());
784}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000785#endif // defined(WEBRTC_POSIX)
786
787#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
788// If you want to test non-default routes, you can do the following on a linux
789// machine:
790// 1) Load the dummy network driver:
791// sudo modprobe dummy
792// sudo ifconfig dummy0 127.0.0.1
793// 2) Run this test and confirm the output says it found a dummy route (and
794// passes).
795// 3) When done:
796// sudo rmmmod dummy
797TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
798 BasicNetworkManager manager;
799 NetworkManager::NetworkList list;
800 list = GetNetworks(manager, false);
801 bool found_dummy = false;
802 LOG(LS_INFO) << "Looking for dummy network: ";
803 for (NetworkManager::NetworkList::iterator it = list.begin();
804 it != list.end(); ++it) {
805 LOG(LS_INFO) << " Network name: " << (*it)->name();
806 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
807 }
808 for (NetworkManager::NetworkList::iterator it = list.begin();
809 it != list.end(); ++it) {
810 delete (*it);
811 }
812 if (!found_dummy) {
813 LOG(LS_INFO) << "No dummy found, quitting.";
814 return;
815 }
816 LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
817 << "routes.";
818 manager.set_ignore_non_default_routes(true);
819 list = GetNetworks(manager, false);
820 for (NetworkManager::NetworkList::iterator it = list.begin();
821 it != list.end(); ++it) {
822 LOG(LS_INFO) << " Network name: " << (*it)->name();
823 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
824 }
825 for (NetworkManager::NetworkList::iterator it = list.begin();
826 it != list.end(); ++it) {
827 delete (*it);
828 }
829}
830#endif
831
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000832// Test MergeNetworkList successfully combines all IPs for the same
833// prefix/length into a single Network.
834TEST_F(NetworkTest, TestMergeNetworkList) {
835 BasicNetworkManager manager;
836 NetworkManager::NetworkList list;
837
838 // Create 2 IPAddress classes with only last digit different.
839 IPAddress ip1, ip2;
840 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
841 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
842
843 // Create 2 networks with the same prefix and length.
844 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
845 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
846
847 // Add different IP into each.
848 net1->AddIP(ip1);
849 net2->AddIP(ip2);
850
851 list.push_back(net1);
852 list.push_back(net2);
853 bool changed;
854 MergeNetworkList(manager, list, &changed);
855 EXPECT_TRUE(changed);
856
857 NetworkManager::NetworkList list2;
858 manager.GetNetworks(&list2);
859
860 // Make sure the resulted networklist has only 1 element and 2
861 // IPAddresses.
862 EXPECT_EQ(list2.size(), 1uL);
863 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
864 EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
865 EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
866}
867
honghaizdb8cf502015-12-21 13:08:46 -0800868// Test that MergeNetworkList successfully detects the change if
869// a network becomes inactive and then active again.
870TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
871 BasicNetworkManager manager;
872 Network network1("test_wifi", "Test Network Adapter 1",
873 IPAddress(0x12345600U), 24);
874 Network network2("test_eth0", "Test Network Adapter 2",
875 IPAddress(0x00010000U), 16);
876 network1.AddIP(IPAddress(0x12345678));
877 network2.AddIP(IPAddress(0x00010004));
878 NetworkManager::NetworkList list;
879 Network* net1 = new Network(network1);
880 list.push_back(net1);
881 bool changed;
882 MergeNetworkList(manager, list, &changed);
883 EXPECT_TRUE(changed);
884 list.clear();
885 manager.GetNetworks(&list);
886 ASSERT_EQ(1U, list.size());
887 EXPECT_EQ(net1, list[0]);
888
889 list.clear();
890 Network* net2 = new Network(network2);
891 list.push_back(net2);
892 MergeNetworkList(manager, list, &changed);
893 EXPECT_TRUE(changed);
894 list.clear();
895 manager.GetNetworks(&list);
896 ASSERT_EQ(1U, list.size());
897 EXPECT_EQ(net2, list[0]);
898
899 // Now network1 is inactive. Try to merge it again.
900 list.clear();
901 list.push_back(new Network(network1));
902 MergeNetworkList(manager, list, &changed);
903 EXPECT_TRUE(changed);
904 list.clear();
905 manager.GetNetworks(&list);
906 ASSERT_EQ(1U, list.size());
907 EXPECT_TRUE(list[0]->active());
908 EXPECT_EQ(net1, list[0]);
909}
910
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000911// Test that the filtering logic follows the defined ruleset in network.h.
912TEST_F(NetworkTest, TestIPv6Selection) {
913 InterfaceAddress ip;
914 std::string ipstr;
915
916 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
917 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
918
919 // Create a network with this prefix.
920 Network ipv6_network(
921 "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
922
923 // When there is no address added, it should return an unspecified
924 // address.
925 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
926 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
927
928 // Deprecated one should not be returned.
929 ipv6_network.AddIP(ip);
930 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
931
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000932 // Add ULA one. ULA is unique local address which is starting either
933 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000934 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
935 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
936 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000937 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000938
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000939 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000940 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
941 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
942 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000943 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000944
945 // Add global dynamic temporary one.
946 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
947 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
948 ipv6_network.AddIP(ip);
949 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
950}
951
honghaiz023f3ef2015-10-19 09:39:32 -0700952TEST_F(NetworkTest, TestNetworkMonitoring) {
953 BasicNetworkManager manager;
954 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
955 &NetworkTest::OnNetworksChanged);
956 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
957 NetworkMonitorFactory::SetFactory(factory);
958 manager.StartUpdating();
959 NetworkMonitorInterface* network_monitor = GetNetworkMonitor(manager);
960 EXPECT_TRUE_WAIT(callback_called_, 1000);
961 callback_called_ = false;
962
963 // Clear the networks so that there will be network changes below.
964 ClearNetworks(manager);
965 // Network manager is started, so the callback is called when the network
966 // monitor fires the network-change event.
967 network_monitor->OnNetworksChanged();
968 EXPECT_TRUE_WAIT(callback_called_, 1000);
969
970 // Network manager is stopped; the network monitor is removed.
971 manager.StopUpdating();
972 EXPECT_TRUE(GetNetworkMonitor(manager) == nullptr);
973
974 NetworkMonitorFactory::ReleaseFactory(factory);
975}
976
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800977TEST_F(NetworkTest, DefaultLocalAddress) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800978 TestBasicNetworkManager manager;
979 manager.StartUpdating();
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800980 IPAddress ip;
981
982 // GetDefaultLocalAddress should return false when not set.
983 EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET, &ip));
984 EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
985
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);
990 for (auto& network : networks) {
991 if (network->GetBestIP().family() == AF_INET) {
992 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
993 } else if (network->GetBestIP().family() == AF_INET6) {
994 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress());
995 }
996 }
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800997
998 // GetDefaultLocalAddress should return the valid default address after set.
999 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1000 GetLoopbackIP(AF_INET6));
1001 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1002 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1003 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1004 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001005 manager.StopUpdating();
1006}
1007
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001008} // namespace rtc