blob: f3193e2b0f3fdd18da34e7358d8be60b1297fc72 [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"
jbauch555604a2016-04-26 03:13:22 -070015#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000016#include <vector>
17#if defined(WEBRTC_POSIX)
18#include <sys/types.h>
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080019#include <net/if.h>
20#include "webrtc/base/ifaddrs_converter.h"
21#endif // defined(WEBRTC_POSIX)
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000022#include "webrtc/base/gunit.h"
23#if defined(WEBRTC_WIN)
24#include "webrtc/base/logging.h" // For LOG_GLE
25#endif
26
27namespace rtc {
28
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080029namespace {
30
honghaiz023f3ef2015-10-19 09:39:32 -070031class FakeNetworkMonitor : public NetworkMonitorBase {
32 public:
honghaizcec0a082016-01-15 14:49:09 -080033 void Start() override { started_ = true; }
34 void Stop() override { started_ = false; }
35 bool started() { return started_; }
honghaiza7ad7c32016-02-02 12:54:14 -080036 AdapterType GetAdapterType(const std::string& if_name) override {
37 return ADAPTER_TYPE_UNKNOWN;
38 }
honghaizcec0a082016-01-15 14:49:09 -080039
40 private:
41 bool started_ = false;
honghaiz023f3ef2015-10-19 09:39:32 -070042};
43
44class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
45 public:
46 FakeNetworkMonitorFactory() {}
honghaizcec0a082016-01-15 14:49:09 -080047 NetworkMonitorInterface* CreateNetworkMonitor() override {
honghaiz023f3ef2015-10-19 09:39:32 -070048 return new FakeNetworkMonitor();
49 }
50};
51
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080052} // namespace
53
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000054class NetworkTest : public testing::Test, public sigslot::has_slots<> {
55 public:
56 NetworkTest() : callback_called_(false) {}
57
58 void OnNetworksChanged() {
59 callback_called_ = true;
60 }
61
honghaize3c6c822016-02-17 13:00:28 -080062 void listenToNetworkInactive(BasicNetworkManager& network_manager) {
63 BasicNetworkManager::NetworkList networks;
64 network_manager.GetNetworks(&networks);
65 for (Network* network : networks) {
66 network->SignalInactive.connect(this, &NetworkTest::OnNetworkInactive);
67 }
68 }
69
70 void OnNetworkInactive(const Network* network) { num_networks_inactive_++; }
71
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +000072 NetworkManager::Stats MergeNetworkList(
73 BasicNetworkManager& network_manager,
74 const NetworkManager::NetworkList& list,
75 bool* changed) {
76 NetworkManager::Stats stats;
77 network_manager.MergeNetworkList(list, changed, &stats);
78 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000079 }
80
81 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
82 const Network& network) {
83 return network_manager.IsIgnoredNetwork(network);
84 }
85
86 NetworkManager::NetworkList GetNetworks(
87 const BasicNetworkManager& network_manager, bool include_ignored) {
88 NetworkManager::NetworkList list;
89 network_manager.CreateNetworks(include_ignored, &list);
90 return list;
91 }
92
honghaizcec0a082016-01-15 14:49:09 -080093 FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
94 return static_cast<FakeNetworkMonitor*>(
95 network_manager.network_monitor_.get());
honghaiz023f3ef2015-10-19 09:39:32 -070096 }
97 void ClearNetworks(BasicNetworkManager& network_manager) {
98 for (const auto& kv : network_manager.networks_map_) {
99 delete kv.second;
100 }
101 network_manager.networks_.clear();
102 network_manager.networks_map_.clear();
103 }
104
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105#if defined(WEBRTC_POSIX)
106 // Separated from CreateNetworks for tests.
107 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
108 struct ifaddrs* interfaces,
109 bool include_ignored,
110 NetworkManager::NetworkList* networks) {
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800111 // Use the base IfAddrsConverter for test cases.
jbauch555604a2016-04-26 03:13:22 -0700112 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800113 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
114 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115 }
honghaizdb8cf502015-12-21 13:08:46 -0800116
117 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string,
118 uint32_t scope_id) {
119 struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6;
120 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
121 ipv6_addr->sin6_family = AF_INET6;
122 ipv6_addr->sin6_scope_id = scope_id;
123 IPAddress ip;
124 IPFromString(ip_string, &ip);
125 ipv6_addr->sin6_addr = ip.ipv6_address();
126 return ipv6_addr;
127 }
128
129 // Pointers created here need to be released via ReleaseIfAddrs.
130 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
131 char* if_name,
132 const std::string& ipv6_address,
133 const std::string& ipv6_netmask,
134 uint32_t scope_id) {
135 struct ifaddrs* if_addr = new struct ifaddrs;
136 memset(if_addr, 0, sizeof(struct ifaddrs));
137 if_addr->ifa_name = if_name;
138 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
139 CreateIpv6Addr(ipv6_address, scope_id));
140 if_addr->ifa_netmask =
141 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
142 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800143 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 13:08:46 -0800144 return if_addr;
145 }
146
147 void ReleaseIfAddrs(struct ifaddrs* list) {
148 struct ifaddrs* if_addr = list;
149 while (if_addr != nullptr) {
150 struct ifaddrs* next_addr = if_addr->ifa_next;
151 delete if_addr->ifa_addr;
152 delete if_addr->ifa_netmask;
153 delete if_addr;
154 if_addr = next_addr;
155 }
156 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000157#endif // defined(WEBRTC_POSIX)
158
159 protected:
160 bool callback_called_;
honghaize3c6c822016-02-17 13:00:28 -0800161 // Number of networks that become inactive.
162 int num_networks_inactive_ = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000163};
164
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800165class TestBasicNetworkManager : public BasicNetworkManager {
166 public:
167 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800168 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800169};
170
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000171// Test that the Network ctor works properly.
172TEST_F(NetworkTest, TestNetworkConstruct) {
173 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
174 IPAddress(0x12345600U), 24);
175 EXPECT_EQ("test_eth0", ipv4_network1.name());
176 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
177 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
178 EXPECT_EQ(24, ipv4_network1.prefix_length());
179 EXPECT_FALSE(ipv4_network1.ignored());
180}
181
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000182TEST_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 +0000192// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000193TEST_F(NetworkTest, TestIgnoreList) {
194 Network ignore_me("ignore_me", "Ignore me please!",
195 IPAddress(0x12345600U), 24);
196 Network include_me("include_me", "Include me please!",
197 IPAddress(0x12345600U), 24);
198 BasicNetworkManager network_manager;
199 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
200 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
201 std::vector<std::string> ignore_list;
202 ignore_list.push_back("ignore_me");
203 network_manager.set_network_ignore_list(ignore_list);
204 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
205 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
206}
207
208// Test is failing on Windows opt: b/11288214
209TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
210 BasicNetworkManager manager;
211 NetworkManager::NetworkList result = GetNetworks(manager, true);
212 // We should be able to bind to any addresses we find.
213 NetworkManager::NetworkList::iterator it;
214 for (it = result.begin();
215 it != result.end();
216 ++it) {
217 sockaddr_storage storage;
218 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000219 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000220 SocketAddress bindaddress(ip, 0);
221 bindaddress.SetScopeID((*it)->scope_id());
222 // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
223 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
224 if (fd > 0) {
225 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
226 EXPECT_GE(ipsize, 0U);
227 int success = ::bind(fd,
228 reinterpret_cast<sockaddr*>(&storage),
229 static_cast<int>(ipsize));
230#if defined(WEBRTC_WIN)
231 if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
232#endif
233 EXPECT_EQ(0, success);
234#if defined(WEBRTC_WIN)
235 closesocket(fd);
236#else
237 close(fd);
238#endif
239 }
240 delete (*it);
241 }
242}
243
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700244// Test StartUpdating() and StopUpdating(). network_permission_state starts with
245// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000246TEST_F(NetworkTest, TestUpdateNetworks) {
247 BasicNetworkManager manager;
248 manager.SignalNetworksChanged.connect(
249 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700250 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
251 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000252 manager.StartUpdating();
253 Thread::Current()->ProcessMessages(0);
254 EXPECT_TRUE(callback_called_);
255 callback_called_ = false;
256 // Callback should be triggered immediately when StartUpdating
257 // is called, after network update signal is already sent.
258 manager.StartUpdating();
259 EXPECT_TRUE(manager.started());
260 Thread::Current()->ProcessMessages(0);
261 EXPECT_TRUE(callback_called_);
262 manager.StopUpdating();
263 EXPECT_TRUE(manager.started());
264 manager.StopUpdating();
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 EXPECT_FALSE(manager.started());
268 manager.StopUpdating();
269 EXPECT_FALSE(manager.started());
270 callback_called_ = false;
271 // Callback should be triggered immediately after StartUpdating is called
272 // when start_count_ is reset to 0.
273 manager.StartUpdating();
274 Thread::Current()->ProcessMessages(0);
275 EXPECT_TRUE(callback_called_);
276}
277
278// Verify that MergeNetworkList() merges network lists properly.
279TEST_F(NetworkTest, TestBasicMergeNetworkList) {
280 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
281 IPAddress(0x12345600U), 24);
282 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
283 IPAddress(0x00010000U), 16);
284 ipv4_network1.AddIP(IPAddress(0x12345678));
285 ipv4_network2.AddIP(IPAddress(0x00010004));
286 BasicNetworkManager manager;
287
288 // Add ipv4_network1 to the list of networks.
289 NetworkManager::NetworkList list;
290 list.push_back(new Network(ipv4_network1));
291 bool changed;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000292 NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000293 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000294 EXPECT_EQ(stats.ipv6_network_count, 0);
295 EXPECT_EQ(stats.ipv4_network_count, 1);
honghaize3c6c822016-02-17 13:00:28 -0800296 listenToNetworkInactive(manager);
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_network1.ToString(), list[0]->ToString());
302 Network* net1 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700303 uint16_t net_id1 = net1->id();
304 EXPECT_EQ(1, net_id1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000305 list.clear();
306
307 // Replace ipv4_network1 with ipv4_network2.
308 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000309 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000310 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000311 EXPECT_EQ(stats.ipv6_network_count, 0);
312 EXPECT_EQ(stats.ipv4_network_count, 1);
honghaize3c6c822016-02-17 13:00:28 -0800313 EXPECT_EQ(1, num_networks_inactive_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000314 list.clear();
honghaize3c6c822016-02-17 13:00:28 -0800315 num_networks_inactive_ = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000316
317 manager.GetNetworks(&list);
318 EXPECT_EQ(1U, list.size());
319 EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
320 Network* net2 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700321 uint16_t net_id2 = net2->id();
322 // Network id will increase.
323 EXPECT_LT(net_id1, net_id2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000324 list.clear();
325
326 // Add Network2 back.
327 list.push_back(new Network(ipv4_network1));
328 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000329 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000330 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000331 EXPECT_EQ(stats.ipv6_network_count, 0);
332 EXPECT_EQ(stats.ipv4_network_count, 2);
honghaize3c6c822016-02-17 13:00:28 -0800333 EXPECT_EQ(0, num_networks_inactive_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000334 list.clear();
335
336 // Verify that we get previous instances of Network objects.
337 manager.GetNetworks(&list);
338 EXPECT_EQ(2U, list.size());
339 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
340 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700341 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
342 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000343 list.clear();
344
345 // Call MergeNetworkList() again and verify that we don't get update
346 // notification.
347 list.push_back(new Network(ipv4_network2));
348 list.push_back(new Network(ipv4_network1));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000349 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000350 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000351 EXPECT_EQ(stats.ipv6_network_count, 0);
352 EXPECT_EQ(stats.ipv4_network_count, 2);
honghaize3c6c822016-02-17 13:00:28 -0800353 EXPECT_EQ(0, num_networks_inactive_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000354 list.clear();
355
356 // Verify that we get previous instances of Network objects.
357 manager.GetNetworks(&list);
358 EXPECT_EQ(2U, list.size());
359 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
360 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700361 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
362 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000363 list.clear();
364}
365
366// Sets up some test IPv6 networks and appends them to list.
367// Four networks are added - public and link local, for two interfaces.
368void SetupNetworks(NetworkManager::NetworkList* list) {
369 IPAddress ip;
370 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000371 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
372 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373 // First, fake link-locals.
374 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
375 prefix, 64);
376 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000377 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000378 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
379 prefix, 64);
380 ipv6_eth1_linklocalnetwork.AddIP(ip);
381 // Public networks:
382 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
383 prefix = TruncateIP(ip, 64);
384 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
385 prefix, 64);
386 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
387 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
388 prefix = TruncateIP(ip, 64);
389 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
390 prefix, 64);
391 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
392 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
393 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
394 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
395 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
396}
397
398// Test that the basic network merging case works.
399TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
400 BasicNetworkManager manager;
401 manager.SignalNetworksChanged.connect(
402 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
403 NetworkManager::NetworkList original_list;
404 SetupNetworks(&original_list);
405 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000406 NetworkManager::Stats stats =
407 MergeNetworkList(manager, original_list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000408 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000409 EXPECT_EQ(stats.ipv6_network_count, 4);
410 EXPECT_EQ(stats.ipv4_network_count, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000411 NetworkManager::NetworkList list;
412 manager.GetNetworks(&list);
413 EXPECT_EQ(original_list.size(), list.size());
414 // Verify that the original members are in the merged list.
415 for (NetworkManager::NetworkList::iterator it = original_list.begin();
416 it != original_list.end(); ++it) {
417 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
418 }
419}
420
guoweis@webrtc.org2444d962015-01-30 00:09:28 +0000421// Test that no more than manager.max_ipv6_networks() IPv6 networks get
422// returned.
423TEST_F(NetworkTest, TestIPv6MergeNetworkListTrimExcessive) {
424 BasicNetworkManager manager;
425 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
426 &NetworkTest::OnNetworksChanged);
427 NetworkManager::NetworkList original_list;
428
429 // Add twice the allowed number of IPv6 networks.
430 for (int i = 0; i < 2 * manager.max_ipv6_networks(); i++) {
431 // Make a network with different prefix length.
432 IPAddress ip;
433 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
434 IPAddress prefix = TruncateIP(ip, 64 - i);
435 Network* ipv6_network =
436 new Network("test_eth0", "Test Network Adapter 1", prefix, 64 - i);
437 ipv6_network->AddIP(ip);
438 original_list.push_back(ipv6_network);
439 }
440
441 // Add one IPv4 network.
442 Network* ipv4_network = new Network("test_eth0", "Test Network Adapter 1",
443 IPAddress(0x12345600U), 24);
444 ipv4_network->AddIP(IPAddress(0x12345600U));
445 original_list.push_back(ipv4_network);
446
447 bool changed = false;
448 MergeNetworkList(manager, original_list, &changed);
449 EXPECT_TRUE(changed);
450 NetworkManager::NetworkList list;
451 manager.GetNetworks(&list);
452
453 // List size should be the max allowed IPv6 networks plus one IPv4 network.
454 EXPECT_EQ(manager.max_ipv6_networks() + 1, (int)list.size());
455
456 // Verify that the IPv4 network is in the list.
457 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), ipv4_network));
458}
459
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000460// Tests that when two network lists that describe the same set of networks are
461// merged, that the changed callback is not called, and that the original
462// objects remain in the result list.
463TEST_F(NetworkTest, TestNoChangeMerge) {
464 BasicNetworkManager manager;
465 manager.SignalNetworksChanged.connect(
466 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
467 NetworkManager::NetworkList original_list;
468 SetupNetworks(&original_list);
469 bool changed = false;
470 MergeNetworkList(manager, original_list, &changed);
471 EXPECT_TRUE(changed);
472 // Second list that describes the same networks but with new objects.
473 NetworkManager::NetworkList second_list;
474 SetupNetworks(&second_list);
475 changed = false;
476 MergeNetworkList(manager, second_list, &changed);
477 EXPECT_FALSE(changed);
478 NetworkManager::NetworkList resulting_list;
479 manager.GetNetworks(&resulting_list);
480 EXPECT_EQ(original_list.size(), resulting_list.size());
481 // Verify that the original members are in the merged list.
482 for (NetworkManager::NetworkList::iterator it = original_list.begin();
483 it != original_list.end(); ++it) {
484 EXPECT_NE(resulting_list.end(),
485 std::find(resulting_list.begin(), resulting_list.end(), *it));
486 }
487 // Doublecheck that the new networks aren't in the list.
488 for (NetworkManager::NetworkList::iterator it = second_list.begin();
489 it != second_list.end(); ++it) {
490 EXPECT_EQ(resulting_list.end(),
491 std::find(resulting_list.begin(), resulting_list.end(), *it));
492 }
493}
494
495// Test that we can merge a network that is the same as another network but with
496// a different IP. The original network should remain in the list, but have its
497// IP changed.
498TEST_F(NetworkTest, MergeWithChangedIP) {
499 BasicNetworkManager manager;
500 manager.SignalNetworksChanged.connect(
501 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
502 NetworkManager::NetworkList original_list;
503 SetupNetworks(&original_list);
504 // Make a network that we're going to change.
505 IPAddress ip;
506 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
507 IPAddress prefix = TruncateIP(ip, 64);
508 Network* network_to_change = new Network("test_eth0",
509 "Test Network Adapter 1",
510 prefix, 64);
511 Network* changed_network = new Network(*network_to_change);
512 network_to_change->AddIP(ip);
513 IPAddress changed_ip;
514 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
515 changed_network->AddIP(changed_ip);
516 original_list.push_back(network_to_change);
517 bool changed = false;
518 MergeNetworkList(manager, original_list, &changed);
519 NetworkManager::NetworkList second_list;
520 SetupNetworks(&second_list);
521 second_list.push_back(changed_network);
522 changed = false;
523 MergeNetworkList(manager, second_list, &changed);
524 EXPECT_TRUE(changed);
525 NetworkManager::NetworkList list;
526 manager.GetNetworks(&list);
527 EXPECT_EQ(original_list.size(), list.size());
528 // Make sure the original network is still in the merged list.
529 EXPECT_NE(list.end(),
530 std::find(list.begin(), list.end(), network_to_change));
531 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
532}
533
534// Testing a similar case to above, but checking that a network can be updated
535// with additional IPs (not just a replacement).
536TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
537 BasicNetworkManager manager;
538 manager.SignalNetworksChanged.connect(
539 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
540 NetworkManager::NetworkList original_list;
541 SetupNetworks(&original_list);
542 bool changed = false;
543 MergeNetworkList(manager, original_list, &changed);
544 EXPECT_TRUE(changed);
545 IPAddress ip;
546 IPAddress check_ip;
547 IPAddress prefix;
548 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
549 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
550 prefix = TruncateIP(ip, 64);
551 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
552 prefix, 64);
553 // This is the IP that already existed in the public network on eth0.
554 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
555 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
556 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
557 changed = false;
558 MergeNetworkList(manager, original_list, &changed);
559 EXPECT_TRUE(changed);
560 // There should still be four networks.
561 NetworkManager::NetworkList list;
562 manager.GetNetworks(&list);
563 EXPECT_EQ(4U, list.size());
564 // Check the gathered IPs.
565 int matchcount = 0;
566 for (NetworkManager::NetworkList::iterator it = list.begin();
567 it != list.end(); ++it) {
568 if ((*it)->ToString() == original_list[2]->ToString()) {
569 ++matchcount;
570 EXPECT_EQ(1, matchcount);
571 // This should be the same network object as before.
572 EXPECT_EQ((*it), original_list[2]);
573 // But with two addresses now.
574 EXPECT_EQ(2U, (*it)->GetIPs().size());
575 EXPECT_NE((*it)->GetIPs().end(),
576 std::find((*it)->GetIPs().begin(),
577 (*it)->GetIPs().end(),
578 check_ip));
579 EXPECT_NE((*it)->GetIPs().end(),
580 std::find((*it)->GetIPs().begin(),
581 (*it)->GetIPs().end(),
582 ip));
583 } else {
584 // Check the IP didn't get added anywhere it wasn't supposed to.
585 EXPECT_EQ((*it)->GetIPs().end(),
586 std::find((*it)->GetIPs().begin(),
587 (*it)->GetIPs().end(),
588 ip));
589 }
590 }
591}
592
593// Test that merge correctly distinguishes multiple networks on an interface.
594TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
595 BasicNetworkManager manager;
596 manager.SignalNetworksChanged.connect(
597 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
598 NetworkManager::NetworkList original_list;
599 SetupNetworks(&original_list);
600 bool changed = false;
601 MergeNetworkList(manager, original_list, &changed);
602 EXPECT_TRUE(changed);
603 IPAddress ip;
604 IPAddress prefix;
605 // A second network for eth0.
606 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
607 prefix = TruncateIP(ip, 64);
608 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
609 prefix, 64);
610 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
611 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
612 changed = false;
613 MergeNetworkList(manager, original_list, &changed);
614 EXPECT_TRUE(changed);
615 // There should be five networks now.
616 NetworkManager::NetworkList list;
617 manager.GetNetworks(&list);
618 EXPECT_EQ(5U, list.size());
619 // Check the resulting addresses.
620 for (NetworkManager::NetworkList::iterator it = list.begin();
621 it != list.end(); ++it) {
622 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
623 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
624 // Check the new network has 1 IP and that it's the correct one.
625 EXPECT_EQ(1U, (*it)->GetIPs().size());
626 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
627 } else {
628 // Check the IP didn't get added anywhere it wasn't supposed to.
629 EXPECT_EQ((*it)->GetIPs().end(),
630 std::find((*it)->GetIPs().begin(),
631 (*it)->GetIPs().end(),
632 ip));
633 }
634 }
635}
636
honghaizdb8cf502015-12-21 13:08:46 -0800637// Test that DumpNetworks does not crash.
638TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000639 BasicNetworkManager manager;
honghaizdb8cf502015-12-21 13:08:46 -0800640 NetworkManager::NetworkList list = GetNetworks(manager, true);
641 bool changed;
642 MergeNetworkList(manager, list, &changed);
643 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000644}
645
646// Test that we can toggle IPv6 on and off.
minyue5d696482015-08-19 04:42:03 -0700647// Crashes on Linux. See webrtc:4923.
648#if defined(WEBRTC_LINUX)
649#define MAYBE_TestIPv6Toggle DISABLED_TestIPv6Toggle
650#else
651#define MAYBE_TestIPv6Toggle TestIPv6Toggle
652#endif
653TEST_F(NetworkTest, MAYBE_TestIPv6Toggle) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000654 BasicNetworkManager manager;
655 bool ipv6_found = false;
656 NetworkManager::NetworkList list;
657#if !defined(WEBRTC_WIN)
658 // There should be at least one IPv6 network (fe80::/64 should be in there).
659 // TODO(thaloun): Disabling this test on windows for the moment as the test
660 // machines don't seem to have IPv6 installed on them at all.
661 manager.set_ipv6_enabled(true);
662 list = GetNetworks(manager, true);
663 for (NetworkManager::NetworkList::iterator it = list.begin();
664 it != list.end(); ++it) {
665 if ((*it)->prefix().family() == AF_INET6) {
666 ipv6_found = true;
667 break;
668 }
669 }
670 EXPECT_TRUE(ipv6_found);
671 for (NetworkManager::NetworkList::iterator it = list.begin();
672 it != list.end(); ++it) {
673 delete (*it);
674 }
675#endif
676 ipv6_found = false;
677 manager.set_ipv6_enabled(false);
678 list = GetNetworks(manager, true);
679 for (NetworkManager::NetworkList::iterator it = list.begin();
680 it != list.end(); ++it) {
681 if ((*it)->prefix().family() == AF_INET6) {
682 ipv6_found = true;
683 break;
684 }
685 }
686 EXPECT_FALSE(ipv6_found);
687 for (NetworkManager::NetworkList::iterator it = list.begin();
688 it != list.end(); ++it) {
689 delete (*it);
690 }
691}
692
693TEST_F(NetworkTest, TestNetworkListSorting) {
694 BasicNetworkManager manager;
695 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
696 IPAddress(0x12345600U), 24);
697 ipv4_network1.AddIP(IPAddress(0x12345600U));
698
699 IPAddress ip;
700 IPAddress prefix;
701 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
702 prefix = TruncateIP(ip, 64);
703 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
704 prefix, 64);
705 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
706
707 NetworkManager::NetworkList list;
708 list.push_back(new Network(ipv4_network1));
709 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
710 Network* net1 = list[0];
711 Network* net2 = list[1];
712
713 bool changed = false;
714 MergeNetworkList(manager, list, &changed);
715 ASSERT_TRUE(changed);
716 // After sorting IPv6 network should be higher order than IPv4 networks.
717 EXPECT_TRUE(net1->preference() < net2->preference());
718}
719
720TEST_F(NetworkTest, TestNetworkAdapterTypes) {
721 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
722 ADAPTER_TYPE_WIFI);
723 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
724 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
725 ADAPTER_TYPE_ETHERNET);
726 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
727 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
728 ADAPTER_TYPE_CELLULAR);
729 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
730 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
731 ADAPTER_TYPE_VPN);
732 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
733 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
734 ADAPTER_TYPE_UNKNOWN);
735 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
736}
737
738#if defined(WEBRTC_POSIX)
739// Verify that we correctly handle interfaces with no address.
740TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
741 ifaddrs list;
742 memset(&list, 0, sizeof(list));
743 list.ifa_name = const_cast<char*>("test_iface");
744
745 NetworkManager::NetworkList result;
746 BasicNetworkManager manager;
747 CallConvertIfAddrs(manager, &list, true, &result);
748 EXPECT_TRUE(result.empty());
749}
honghaizdb8cf502015-12-21 13:08:46 -0800750
751// Verify that if there are two addresses on one interface, only one network
752// is generated.
753TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
754 char if_name[20] = "rmnet0";
755 ifaddrs* list = nullptr;
756 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
757 "FFFF:FFFF:FFFF:FFFF::", 0);
758 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
759 "FFFF:FFFF:FFFF:FFFF::", 0);
760 NetworkManager::NetworkList result;
761 BasicNetworkManager manager;
762 CallConvertIfAddrs(manager, list, true, &result);
763 EXPECT_EQ(1U, result.size());
764 bool changed;
765 // This ensures we release the objects created in CallConvertIfAddrs.
766 MergeNetworkList(manager, result, &changed);
767 ReleaseIfAddrs(list);
768}
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800769
770TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
771 ifaddrs list;
772 memset(&list, 0, sizeof(list));
773 list.ifa_name = const_cast<char*>("test_iface");
774 sockaddr ifa_addr;
775 sockaddr ifa_netmask;
776 list.ifa_addr = &ifa_addr;
777 list.ifa_netmask = &ifa_netmask;
778
779 NetworkManager::NetworkList result;
780 BasicNetworkManager manager;
781 CallConvertIfAddrs(manager, &list, true, &result);
782 EXPECT_TRUE(result.empty());
783}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000784#endif // defined(WEBRTC_POSIX)
785
786#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
787// If you want to test non-default routes, you can do the following on a linux
788// machine:
789// 1) Load the dummy network driver:
790// sudo modprobe dummy
791// sudo ifconfig dummy0 127.0.0.1
792// 2) Run this test and confirm the output says it found a dummy route (and
793// passes).
794// 3) When done:
795// sudo rmmmod dummy
796TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
797 BasicNetworkManager manager;
798 NetworkManager::NetworkList list;
799 list = GetNetworks(manager, false);
800 bool found_dummy = false;
801 LOG(LS_INFO) << "Looking for dummy network: ";
802 for (NetworkManager::NetworkList::iterator it = list.begin();
803 it != list.end(); ++it) {
804 LOG(LS_INFO) << " Network name: " << (*it)->name();
805 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
806 }
807 for (NetworkManager::NetworkList::iterator it = list.begin();
808 it != list.end(); ++it) {
809 delete (*it);
810 }
811 if (!found_dummy) {
812 LOG(LS_INFO) << "No dummy found, quitting.";
813 return;
814 }
815 LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
816 << "routes.";
817 manager.set_ignore_non_default_routes(true);
818 list = GetNetworks(manager, false);
819 for (NetworkManager::NetworkList::iterator it = list.begin();
820 it != list.end(); ++it) {
821 LOG(LS_INFO) << " Network name: " << (*it)->name();
822 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
823 }
824 for (NetworkManager::NetworkList::iterator it = list.begin();
825 it != list.end(); ++it) {
826 delete (*it);
827 }
828}
829#endif
830
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000831// Test MergeNetworkList successfully combines all IPs for the same
832// prefix/length into a single Network.
833TEST_F(NetworkTest, TestMergeNetworkList) {
834 BasicNetworkManager manager;
835 NetworkManager::NetworkList list;
836
837 // Create 2 IPAddress classes with only last digit different.
838 IPAddress ip1, ip2;
839 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
840 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
841
842 // Create 2 networks with the same prefix and length.
843 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
844 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
845
846 // Add different IP into each.
847 net1->AddIP(ip1);
848 net2->AddIP(ip2);
849
850 list.push_back(net1);
851 list.push_back(net2);
852 bool changed;
853 MergeNetworkList(manager, list, &changed);
854 EXPECT_TRUE(changed);
855
856 NetworkManager::NetworkList list2;
857 manager.GetNetworks(&list2);
858
859 // Make sure the resulted networklist has only 1 element and 2
860 // IPAddresses.
861 EXPECT_EQ(list2.size(), 1uL);
862 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
863 EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
864 EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
865}
866
honghaizdb8cf502015-12-21 13:08:46 -0800867// Test that MergeNetworkList successfully detects the change if
868// a network becomes inactive and then active again.
869TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
870 BasicNetworkManager manager;
871 Network network1("test_wifi", "Test Network Adapter 1",
872 IPAddress(0x12345600U), 24);
873 Network network2("test_eth0", "Test Network Adapter 2",
874 IPAddress(0x00010000U), 16);
875 network1.AddIP(IPAddress(0x12345678));
876 network2.AddIP(IPAddress(0x00010004));
877 NetworkManager::NetworkList list;
878 Network* net1 = new Network(network1);
879 list.push_back(net1);
880 bool changed;
881 MergeNetworkList(manager, list, &changed);
882 EXPECT_TRUE(changed);
883 list.clear();
884 manager.GetNetworks(&list);
885 ASSERT_EQ(1U, list.size());
886 EXPECT_EQ(net1, list[0]);
887
888 list.clear();
889 Network* net2 = new Network(network2);
890 list.push_back(net2);
891 MergeNetworkList(manager, list, &changed);
892 EXPECT_TRUE(changed);
893 list.clear();
894 manager.GetNetworks(&list);
895 ASSERT_EQ(1U, list.size());
896 EXPECT_EQ(net2, list[0]);
897
898 // Now network1 is inactive. Try to merge it again.
899 list.clear();
900 list.push_back(new Network(network1));
901 MergeNetworkList(manager, list, &changed);
902 EXPECT_TRUE(changed);
903 list.clear();
904 manager.GetNetworks(&list);
905 ASSERT_EQ(1U, list.size());
906 EXPECT_TRUE(list[0]->active());
907 EXPECT_EQ(net1, list[0]);
908}
909
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000910// Test that the filtering logic follows the defined ruleset in network.h.
911TEST_F(NetworkTest, TestIPv6Selection) {
912 InterfaceAddress ip;
913 std::string ipstr;
914
915 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
916 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
917
918 // Create a network with this prefix.
919 Network ipv6_network(
920 "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
921
922 // When there is no address added, it should return an unspecified
923 // address.
924 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
925 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
926
927 // Deprecated one should not be returned.
928 ipv6_network.AddIP(ip);
929 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
930
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000931 // Add ULA one. ULA is unique local address which is starting either
932 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000933 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
934 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
935 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000936 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000937
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000938 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000939 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
940 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
941 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000942 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000943
944 // Add global dynamic temporary one.
945 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
946 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
947 ipv6_network.AddIP(ip);
948 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
949}
950
honghaiz023f3ef2015-10-19 09:39:32 -0700951TEST_F(NetworkTest, TestNetworkMonitoring) {
952 BasicNetworkManager manager;
953 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
954 &NetworkTest::OnNetworksChanged);
955 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
956 NetworkMonitorFactory::SetFactory(factory);
957 manager.StartUpdating();
honghaizcec0a082016-01-15 14:49:09 -0800958 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
959 EXPECT_TRUE(network_monitor && network_monitor->started());
honghaiz023f3ef2015-10-19 09:39:32 -0700960 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
honghaizcec0a082016-01-15 14:49:09 -0800970 // Network manager is stopped.
honghaiz023f3ef2015-10-19 09:39:32 -0700971 manager.StopUpdating();
honghaizcec0a082016-01-15 14:49:09 -0800972 EXPECT_FALSE(GetNetworkMonitor(manager)->started());
honghaiz023f3ef2015-10-19 09:39:32 -0700973
974 NetworkMonitorFactory::ReleaseFactory(factory);
975}
976
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800977TEST_F(NetworkTest, DefaultLocalAddress) {
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800978 IPAddress ip;
guoweis56271ed2016-01-15 14:45:06 -0800979 TestBasicNetworkManager manager;
980 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
981 &NetworkTest::OnNetworksChanged);
982 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
983 NetworkMonitorFactory::SetFactory(factory);
984 manager.StartUpdating();
985 EXPECT_TRUE_WAIT(callback_called_, 1000);
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800986
987 // Make sure we can query default local address when an address for such
988 // address family exists.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800989 std::vector<Network*> networks;
990 manager.GetNetworks(&networks);
guoweis56271ed2016-01-15 14:45:06 -0800991 EXPECT_TRUE(!networks.empty());
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800992 for (auto& network : networks) {
993 if (network->GetBestIP().family() == AF_INET) {
994 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
guoweis56271ed2016-01-15 14:45:06 -0800995 } else if (network->GetBestIP().family() == AF_INET6 &&
996 !IPIsLoopback(network->GetBestIP())) {
997 // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
998 // enabled.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800999 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress());
1000 }
1001 }
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001002
1003 // GetDefaultLocalAddress should return the valid default address after set.
1004 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1005 GetLoopbackIP(AF_INET6));
1006 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1007 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1008 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1009 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
honghaizaf83fe62016-04-18 14:50:44 -07001010
1011 // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
1012 // default address may be different from the best IP address of any network.
1013 InterfaceAddress ip1;
1014 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
1015 IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
1016 // Create a network with a prefix of ip1.
1017 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
1018 64);
1019 IPAddress ip2;
1020 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
1021 ipv6_network.AddIP(ip1);
1022 ipv6_network.AddIP(ip2);
1023 BasicNetworkManager::NetworkList list(1, new Network(ipv6_network));
1024 bool changed;
1025 MergeNetworkList(manager, list, &changed);
1026 // If the set default address is not in any network, GetDefaultLocalAddress
1027 // should return it.
1028 IPAddress ip3;
1029 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
1030 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
1031 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1032 EXPECT_EQ(ip3, ip);
1033 // If the set default address is in a network, GetDefaultLocalAddress will
1034 // return the best IP in that network.
1035 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1036 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1037 EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1038
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001039 manager.StopUpdating();
1040}
1041
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042} // namespace rtc