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