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