blob: 6d920e0a507a0fa25cea656025e81376fa2459cb [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
13#include <vector>
14#if defined(WEBRTC_POSIX)
15#include <sys/types.h>
16#if !defined(WEBRTC_ANDROID)
17#include <ifaddrs.h>
18#else
19#include "webrtc/base/ifaddrs-android.h"
20#endif
21#endif
22#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
29class NetworkTest : public testing::Test, public sigslot::has_slots<> {
30 public:
31 NetworkTest() : callback_called_(false) {}
32
33 void OnNetworksChanged() {
34 callback_called_ = true;
35 }
36
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +000037 NetworkManager::Stats MergeNetworkList(
38 BasicNetworkManager& network_manager,
39 const NetworkManager::NetworkList& list,
40 bool* changed) {
41 NetworkManager::Stats stats;
42 network_manager.MergeNetworkList(list, changed, &stats);
43 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000044 }
45
46 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
47 const Network& network) {
48 return network_manager.IsIgnoredNetwork(network);
49 }
50
51 NetworkManager::NetworkList GetNetworks(
52 const BasicNetworkManager& network_manager, bool include_ignored) {
53 NetworkManager::NetworkList list;
54 network_manager.CreateNetworks(include_ignored, &list);
55 return list;
56 }
57
58#if defined(WEBRTC_POSIX)
59 // Separated from CreateNetworks for tests.
60 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
61 struct ifaddrs* interfaces,
62 bool include_ignored,
63 NetworkManager::NetworkList* networks) {
64 network_manager.ConvertIfAddrs(interfaces, include_ignored, networks);
65 }
66#endif // defined(WEBRTC_POSIX)
67
68 protected:
69 bool callback_called_;
70};
71
72// Test that the Network ctor works properly.
73TEST_F(NetworkTest, TestNetworkConstruct) {
74 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
75 IPAddress(0x12345600U), 24);
76 EXPECT_EQ("test_eth0", ipv4_network1.name());
77 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
78 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
79 EXPECT_EQ(24, ipv4_network1.prefix_length());
80 EXPECT_FALSE(ipv4_network1.ignored());
81}
82
83// Tests that our ignore function works properly.
phoglund@webrtc.org006521d2015-02-12 09:23:59 +000084TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresOnlyLoopbackByDefault) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000085 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +000086 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
87 Network ipv4_network2("test_wlan0", "Test Network Adapter 2",
88 IPAddress(0x12345601U), 16, ADAPTER_TYPE_WIFI);
89 Network ipv4_network3("test_cell0", "Test Network Adapter 3",
90 IPAddress(0x12345602U), 16, ADAPTER_TYPE_CELLULAR);
91 Network ipv4_network4("test_vpn0", "Test Network Adapter 4",
92 IPAddress(0x12345603U), 16, ADAPTER_TYPE_VPN);
93 Network ipv4_network5("test_lo", "Test Network Adapter 5",
94 IPAddress(0x12345604U), 16, ADAPTER_TYPE_LOOPBACK);
95 BasicNetworkManager network_manager;
96 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
97 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network2));
98 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network3));
99 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network4));
100 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network5));
101}
102
103TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
104 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
105 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000106 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000107 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000108 BasicNetworkManager network_manager;
109 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
110 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
111}
112
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000113TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresNetworksAccordingToIgnoreMask) {
114 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
115 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
116 Network ipv4_network2("test_wlan0", "Test Network Adapter 2",
117 IPAddress(0x12345601U), 16, ADAPTER_TYPE_WIFI);
118 Network ipv4_network3("test_cell0", "Test Network Adapter 3",
119 IPAddress(0x12345602U), 16, ADAPTER_TYPE_CELLULAR);
120 BasicNetworkManager network_manager;
121 network_manager.set_network_ignore_mask(
122 ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK | ADAPTER_TYPE_WIFI);
123 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network1));
124 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
125 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network3));
126}
127
128// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000129TEST_F(NetworkTest, TestIgnoreList) {
130 Network ignore_me("ignore_me", "Ignore me please!",
131 IPAddress(0x12345600U), 24);
132 Network include_me("include_me", "Include me please!",
133 IPAddress(0x12345600U), 24);
134 BasicNetworkManager network_manager;
135 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
136 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
137 std::vector<std::string> ignore_list;
138 ignore_list.push_back("ignore_me");
139 network_manager.set_network_ignore_list(ignore_list);
140 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
141 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
142}
143
144// Test is failing on Windows opt: b/11288214
145TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
146 BasicNetworkManager manager;
147 NetworkManager::NetworkList result = GetNetworks(manager, true);
148 // We should be able to bind to any addresses we find.
149 NetworkManager::NetworkList::iterator it;
150 for (it = result.begin();
151 it != result.end();
152 ++it) {
153 sockaddr_storage storage;
154 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000155 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156 SocketAddress bindaddress(ip, 0);
157 bindaddress.SetScopeID((*it)->scope_id());
158 // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
159 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
160 if (fd > 0) {
161 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
162 EXPECT_GE(ipsize, 0U);
163 int success = ::bind(fd,
164 reinterpret_cast<sockaddr*>(&storage),
165 static_cast<int>(ipsize));
166#if defined(WEBRTC_WIN)
167 if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
168#endif
169 EXPECT_EQ(0, success);
170#if defined(WEBRTC_WIN)
171 closesocket(fd);
172#else
173 close(fd);
174#endif
175 }
176 delete (*it);
177 }
178}
179
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700180// Test StartUpdating() and StopUpdating(). network_permission_state starts with
181// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000182TEST_F(NetworkTest, TestUpdateNetworks) {
183 BasicNetworkManager manager;
184 manager.SignalNetworksChanged.connect(
185 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700186 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
187 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000188 manager.StartUpdating();
189 Thread::Current()->ProcessMessages(0);
190 EXPECT_TRUE(callback_called_);
191 callback_called_ = false;
192 // Callback should be triggered immediately when StartUpdating
193 // is called, after network update signal is already sent.
194 manager.StartUpdating();
195 EXPECT_TRUE(manager.started());
196 Thread::Current()->ProcessMessages(0);
197 EXPECT_TRUE(callback_called_);
198 manager.StopUpdating();
199 EXPECT_TRUE(manager.started());
200 manager.StopUpdating();
guoweisea1012b2015-08-21 09:06:28 -0700201 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
202 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000203 EXPECT_FALSE(manager.started());
204 manager.StopUpdating();
205 EXPECT_FALSE(manager.started());
206 callback_called_ = false;
207 // Callback should be triggered immediately after StartUpdating is called
208 // when start_count_ is reset to 0.
209 manager.StartUpdating();
210 Thread::Current()->ProcessMessages(0);
211 EXPECT_TRUE(callback_called_);
212}
213
214// Verify that MergeNetworkList() merges network lists properly.
215TEST_F(NetworkTest, TestBasicMergeNetworkList) {
216 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
217 IPAddress(0x12345600U), 24);
218 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
219 IPAddress(0x00010000U), 16);
220 ipv4_network1.AddIP(IPAddress(0x12345678));
221 ipv4_network2.AddIP(IPAddress(0x00010004));
222 BasicNetworkManager manager;
223
224 // Add ipv4_network1 to the list of networks.
225 NetworkManager::NetworkList list;
226 list.push_back(new Network(ipv4_network1));
227 bool changed;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000228 NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000230 EXPECT_EQ(stats.ipv6_network_count, 0);
231 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000232 list.clear();
233
234 manager.GetNetworks(&list);
235 EXPECT_EQ(1U, list.size());
236 EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
237 Network* net1 = list[0];
238 list.clear();
239
240 // Replace ipv4_network1 with ipv4_network2.
241 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000242 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000243 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000244 EXPECT_EQ(stats.ipv6_network_count, 0);
245 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000246 list.clear();
247
248 manager.GetNetworks(&list);
249 EXPECT_EQ(1U, list.size());
250 EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
251 Network* net2 = list[0];
252 list.clear();
253
254 // Add Network2 back.
255 list.push_back(new Network(ipv4_network1));
256 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000257 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000258 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000259 EXPECT_EQ(stats.ipv6_network_count, 0);
260 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000261 list.clear();
262
263 // Verify that we get previous instances of Network objects.
264 manager.GetNetworks(&list);
265 EXPECT_EQ(2U, list.size());
266 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
267 (net1 == list[1] && net2 == list[0]));
268 list.clear();
269
270 // Call MergeNetworkList() again and verify that we don't get update
271 // notification.
272 list.push_back(new Network(ipv4_network2));
273 list.push_back(new Network(ipv4_network1));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000274 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000275 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000276 EXPECT_EQ(stats.ipv6_network_count, 0);
277 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000278 list.clear();
279
280 // Verify that we get previous instances of Network objects.
281 manager.GetNetworks(&list);
282 EXPECT_EQ(2U, list.size());
283 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
284 (net1 == list[1] && net2 == list[0]));
285 list.clear();
286}
287
288// Sets up some test IPv6 networks and appends them to list.
289// Four networks are added - public and link local, for two interfaces.
290void SetupNetworks(NetworkManager::NetworkList* list) {
291 IPAddress ip;
292 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000293 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
294 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000295 // First, fake link-locals.
296 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
297 prefix, 64);
298 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000299 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
301 prefix, 64);
302 ipv6_eth1_linklocalnetwork.AddIP(ip);
303 // Public networks:
304 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
305 prefix = TruncateIP(ip, 64);
306 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
307 prefix, 64);
308 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
309 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
310 prefix = TruncateIP(ip, 64);
311 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
312 prefix, 64);
313 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
314 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
315 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
316 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
317 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
318}
319
320// Test that the basic network merging case works.
321TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
322 BasicNetworkManager manager;
323 manager.SignalNetworksChanged.connect(
324 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
325 NetworkManager::NetworkList original_list;
326 SetupNetworks(&original_list);
327 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000328 NetworkManager::Stats stats =
329 MergeNetworkList(manager, original_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, 4);
332 EXPECT_EQ(stats.ipv4_network_count, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333 NetworkManager::NetworkList list;
334 manager.GetNetworks(&list);
335 EXPECT_EQ(original_list.size(), list.size());
336 // Verify that the original members are in the merged list.
337 for (NetworkManager::NetworkList::iterator it = original_list.begin();
338 it != original_list.end(); ++it) {
339 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
340 }
341}
342
guoweis@webrtc.org2444d962015-01-30 00:09:28 +0000343// Test that no more than manager.max_ipv6_networks() IPv6 networks get
344// returned.
345TEST_F(NetworkTest, TestIPv6MergeNetworkListTrimExcessive) {
346 BasicNetworkManager manager;
347 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
348 &NetworkTest::OnNetworksChanged);
349 NetworkManager::NetworkList original_list;
350
351 // Add twice the allowed number of IPv6 networks.
352 for (int i = 0; i < 2 * manager.max_ipv6_networks(); i++) {
353 // Make a network with different prefix length.
354 IPAddress ip;
355 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
356 IPAddress prefix = TruncateIP(ip, 64 - i);
357 Network* ipv6_network =
358 new Network("test_eth0", "Test Network Adapter 1", prefix, 64 - i);
359 ipv6_network->AddIP(ip);
360 original_list.push_back(ipv6_network);
361 }
362
363 // Add one IPv4 network.
364 Network* ipv4_network = new Network("test_eth0", "Test Network Adapter 1",
365 IPAddress(0x12345600U), 24);
366 ipv4_network->AddIP(IPAddress(0x12345600U));
367 original_list.push_back(ipv4_network);
368
369 bool changed = false;
370 MergeNetworkList(manager, original_list, &changed);
371 EXPECT_TRUE(changed);
372 NetworkManager::NetworkList list;
373 manager.GetNetworks(&list);
374
375 // List size should be the max allowed IPv6 networks plus one IPv4 network.
376 EXPECT_EQ(manager.max_ipv6_networks() + 1, (int)list.size());
377
378 // Verify that the IPv4 network is in the list.
379 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), ipv4_network));
380}
381
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000382// Tests that when two network lists that describe the same set of networks are
383// merged, that the changed callback is not called, and that the original
384// objects remain in the result list.
385TEST_F(NetworkTest, TestNoChangeMerge) {
386 BasicNetworkManager manager;
387 manager.SignalNetworksChanged.connect(
388 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
389 NetworkManager::NetworkList original_list;
390 SetupNetworks(&original_list);
391 bool changed = false;
392 MergeNetworkList(manager, original_list, &changed);
393 EXPECT_TRUE(changed);
394 // Second list that describes the same networks but with new objects.
395 NetworkManager::NetworkList second_list;
396 SetupNetworks(&second_list);
397 changed = false;
398 MergeNetworkList(manager, second_list, &changed);
399 EXPECT_FALSE(changed);
400 NetworkManager::NetworkList resulting_list;
401 manager.GetNetworks(&resulting_list);
402 EXPECT_EQ(original_list.size(), resulting_list.size());
403 // Verify that the original members are in the merged list.
404 for (NetworkManager::NetworkList::iterator it = original_list.begin();
405 it != original_list.end(); ++it) {
406 EXPECT_NE(resulting_list.end(),
407 std::find(resulting_list.begin(), resulting_list.end(), *it));
408 }
409 // Doublecheck that the new networks aren't in the list.
410 for (NetworkManager::NetworkList::iterator it = second_list.begin();
411 it != second_list.end(); ++it) {
412 EXPECT_EQ(resulting_list.end(),
413 std::find(resulting_list.begin(), resulting_list.end(), *it));
414 }
415}
416
417// Test that we can merge a network that is the same as another network but with
418// a different IP. The original network should remain in the list, but have its
419// IP changed.
420TEST_F(NetworkTest, MergeWithChangedIP) {
421 BasicNetworkManager manager;
422 manager.SignalNetworksChanged.connect(
423 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
424 NetworkManager::NetworkList original_list;
425 SetupNetworks(&original_list);
426 // Make a network that we're going to change.
427 IPAddress ip;
428 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
429 IPAddress prefix = TruncateIP(ip, 64);
430 Network* network_to_change = new Network("test_eth0",
431 "Test Network Adapter 1",
432 prefix, 64);
433 Network* changed_network = new Network(*network_to_change);
434 network_to_change->AddIP(ip);
435 IPAddress changed_ip;
436 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
437 changed_network->AddIP(changed_ip);
438 original_list.push_back(network_to_change);
439 bool changed = false;
440 MergeNetworkList(manager, original_list, &changed);
441 NetworkManager::NetworkList second_list;
442 SetupNetworks(&second_list);
443 second_list.push_back(changed_network);
444 changed = false;
445 MergeNetworkList(manager, second_list, &changed);
446 EXPECT_TRUE(changed);
447 NetworkManager::NetworkList list;
448 manager.GetNetworks(&list);
449 EXPECT_EQ(original_list.size(), list.size());
450 // Make sure the original network is still in the merged list.
451 EXPECT_NE(list.end(),
452 std::find(list.begin(), list.end(), network_to_change));
453 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
454}
455
456// Testing a similar case to above, but checking that a network can be updated
457// with additional IPs (not just a replacement).
458TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
459 BasicNetworkManager manager;
460 manager.SignalNetworksChanged.connect(
461 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
462 NetworkManager::NetworkList original_list;
463 SetupNetworks(&original_list);
464 bool changed = false;
465 MergeNetworkList(manager, original_list, &changed);
466 EXPECT_TRUE(changed);
467 IPAddress ip;
468 IPAddress check_ip;
469 IPAddress prefix;
470 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
471 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
472 prefix = TruncateIP(ip, 64);
473 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
474 prefix, 64);
475 // This is the IP that already existed in the public network on eth0.
476 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
477 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
478 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
479 changed = false;
480 MergeNetworkList(manager, original_list, &changed);
481 EXPECT_TRUE(changed);
482 // There should still be four networks.
483 NetworkManager::NetworkList list;
484 manager.GetNetworks(&list);
485 EXPECT_EQ(4U, list.size());
486 // Check the gathered IPs.
487 int matchcount = 0;
488 for (NetworkManager::NetworkList::iterator it = list.begin();
489 it != list.end(); ++it) {
490 if ((*it)->ToString() == original_list[2]->ToString()) {
491 ++matchcount;
492 EXPECT_EQ(1, matchcount);
493 // This should be the same network object as before.
494 EXPECT_EQ((*it), original_list[2]);
495 // But with two addresses now.
496 EXPECT_EQ(2U, (*it)->GetIPs().size());
497 EXPECT_NE((*it)->GetIPs().end(),
498 std::find((*it)->GetIPs().begin(),
499 (*it)->GetIPs().end(),
500 check_ip));
501 EXPECT_NE((*it)->GetIPs().end(),
502 std::find((*it)->GetIPs().begin(),
503 (*it)->GetIPs().end(),
504 ip));
505 } else {
506 // Check the IP didn't get added anywhere it wasn't supposed to.
507 EXPECT_EQ((*it)->GetIPs().end(),
508 std::find((*it)->GetIPs().begin(),
509 (*it)->GetIPs().end(),
510 ip));
511 }
512 }
513}
514
515// Test that merge correctly distinguishes multiple networks on an interface.
516TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
517 BasicNetworkManager manager;
518 manager.SignalNetworksChanged.connect(
519 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
520 NetworkManager::NetworkList original_list;
521 SetupNetworks(&original_list);
522 bool changed = false;
523 MergeNetworkList(manager, original_list, &changed);
524 EXPECT_TRUE(changed);
525 IPAddress ip;
526 IPAddress prefix;
527 // A second network for eth0.
528 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
529 prefix = TruncateIP(ip, 64);
530 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
531 prefix, 64);
532 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
533 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
534 changed = false;
535 MergeNetworkList(manager, original_list, &changed);
536 EXPECT_TRUE(changed);
537 // There should be five networks now.
538 NetworkManager::NetworkList list;
539 manager.GetNetworks(&list);
540 EXPECT_EQ(5U, list.size());
541 // Check the resulting addresses.
542 for (NetworkManager::NetworkList::iterator it = list.begin();
543 it != list.end(); ++it) {
544 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
545 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
546 // Check the new network has 1 IP and that it's the correct one.
547 EXPECT_EQ(1U, (*it)->GetIPs().size());
548 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
549 } else {
550 // Check the IP didn't get added anywhere it wasn't supposed to.
551 EXPECT_EQ((*it)->GetIPs().end(),
552 std::find((*it)->GetIPs().begin(),
553 (*it)->GetIPs().end(),
554 ip));
555 }
556 }
557}
558
559// Test that DumpNetworks works.
560TEST_F(NetworkTest, TestDumpNetworks) {
561 BasicNetworkManager manager;
562 manager.DumpNetworks(true);
563}
564
565// Test that we can toggle IPv6 on and off.
minyue5d696482015-08-19 04:42:03 -0700566// Crashes on Linux. See webrtc:4923.
567#if defined(WEBRTC_LINUX)
568#define MAYBE_TestIPv6Toggle DISABLED_TestIPv6Toggle
569#else
570#define MAYBE_TestIPv6Toggle TestIPv6Toggle
571#endif
572TEST_F(NetworkTest, MAYBE_TestIPv6Toggle) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000573 BasicNetworkManager manager;
574 bool ipv6_found = false;
575 NetworkManager::NetworkList list;
576#if !defined(WEBRTC_WIN)
577 // There should be at least one IPv6 network (fe80::/64 should be in there).
578 // TODO(thaloun): Disabling this test on windows for the moment as the test
579 // machines don't seem to have IPv6 installed on them at all.
580 manager.set_ipv6_enabled(true);
581 list = GetNetworks(manager, true);
582 for (NetworkManager::NetworkList::iterator it = list.begin();
583 it != list.end(); ++it) {
584 if ((*it)->prefix().family() == AF_INET6) {
585 ipv6_found = true;
586 break;
587 }
588 }
589 EXPECT_TRUE(ipv6_found);
590 for (NetworkManager::NetworkList::iterator it = list.begin();
591 it != list.end(); ++it) {
592 delete (*it);
593 }
594#endif
595 ipv6_found = false;
596 manager.set_ipv6_enabled(false);
597 list = GetNetworks(manager, true);
598 for (NetworkManager::NetworkList::iterator it = list.begin();
599 it != list.end(); ++it) {
600 if ((*it)->prefix().family() == AF_INET6) {
601 ipv6_found = true;
602 break;
603 }
604 }
605 EXPECT_FALSE(ipv6_found);
606 for (NetworkManager::NetworkList::iterator it = list.begin();
607 it != list.end(); ++it) {
608 delete (*it);
609 }
610}
611
612TEST_F(NetworkTest, TestNetworkListSorting) {
613 BasicNetworkManager manager;
614 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
615 IPAddress(0x12345600U), 24);
616 ipv4_network1.AddIP(IPAddress(0x12345600U));
617
618 IPAddress ip;
619 IPAddress prefix;
620 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
621 prefix = TruncateIP(ip, 64);
622 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
623 prefix, 64);
624 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
625
626 NetworkManager::NetworkList list;
627 list.push_back(new Network(ipv4_network1));
628 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
629 Network* net1 = list[0];
630 Network* net2 = list[1];
631
632 bool changed = false;
633 MergeNetworkList(manager, list, &changed);
634 ASSERT_TRUE(changed);
635 // After sorting IPv6 network should be higher order than IPv4 networks.
636 EXPECT_TRUE(net1->preference() < net2->preference());
637}
638
639TEST_F(NetworkTest, TestNetworkAdapterTypes) {
640 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
641 ADAPTER_TYPE_WIFI);
642 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
643 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
644 ADAPTER_TYPE_ETHERNET);
645 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
646 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
647 ADAPTER_TYPE_CELLULAR);
648 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
649 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
650 ADAPTER_TYPE_VPN);
651 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
652 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
653 ADAPTER_TYPE_UNKNOWN);
654 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
655}
656
657#if defined(WEBRTC_POSIX)
658// Verify that we correctly handle interfaces with no address.
659TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
660 ifaddrs list;
661 memset(&list, 0, sizeof(list));
662 list.ifa_name = const_cast<char*>("test_iface");
663
664 NetworkManager::NetworkList result;
665 BasicNetworkManager manager;
666 CallConvertIfAddrs(manager, &list, true, &result);
667 EXPECT_TRUE(result.empty());
668}
669#endif // defined(WEBRTC_POSIX)
670
671#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
672// If you want to test non-default routes, you can do the following on a linux
673// machine:
674// 1) Load the dummy network driver:
675// sudo modprobe dummy
676// sudo ifconfig dummy0 127.0.0.1
677// 2) Run this test and confirm the output says it found a dummy route (and
678// passes).
679// 3) When done:
680// sudo rmmmod dummy
681TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
682 BasicNetworkManager manager;
683 NetworkManager::NetworkList list;
684 list = GetNetworks(manager, false);
685 bool found_dummy = false;
686 LOG(LS_INFO) << "Looking for dummy network: ";
687 for (NetworkManager::NetworkList::iterator it = list.begin();
688 it != list.end(); ++it) {
689 LOG(LS_INFO) << " Network name: " << (*it)->name();
690 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
691 }
692 for (NetworkManager::NetworkList::iterator it = list.begin();
693 it != list.end(); ++it) {
694 delete (*it);
695 }
696 if (!found_dummy) {
697 LOG(LS_INFO) << "No dummy found, quitting.";
698 return;
699 }
700 LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
701 << "routes.";
702 manager.set_ignore_non_default_routes(true);
703 list = GetNetworks(manager, false);
704 for (NetworkManager::NetworkList::iterator it = list.begin();
705 it != list.end(); ++it) {
706 LOG(LS_INFO) << " Network name: " << (*it)->name();
707 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
708 }
709 for (NetworkManager::NetworkList::iterator it = list.begin();
710 it != list.end(); ++it) {
711 delete (*it);
712 }
713}
714#endif
715
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000716// Test MergeNetworkList successfully combines all IPs for the same
717// prefix/length into a single Network.
718TEST_F(NetworkTest, TestMergeNetworkList) {
719 BasicNetworkManager manager;
720 NetworkManager::NetworkList list;
721
722 // Create 2 IPAddress classes with only last digit different.
723 IPAddress ip1, ip2;
724 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
725 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
726
727 // Create 2 networks with the same prefix and length.
728 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
729 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
730
731 // Add different IP into each.
732 net1->AddIP(ip1);
733 net2->AddIP(ip2);
734
735 list.push_back(net1);
736 list.push_back(net2);
737 bool changed;
738 MergeNetworkList(manager, list, &changed);
739 EXPECT_TRUE(changed);
740
741 NetworkManager::NetworkList list2;
742 manager.GetNetworks(&list2);
743
744 // Make sure the resulted networklist has only 1 element and 2
745 // IPAddresses.
746 EXPECT_EQ(list2.size(), 1uL);
747 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
748 EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
749 EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
750}
751
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000752// Test that the filtering logic follows the defined ruleset in network.h.
753TEST_F(NetworkTest, TestIPv6Selection) {
754 InterfaceAddress ip;
755 std::string ipstr;
756
757 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
758 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
759
760 // Create a network with this prefix.
761 Network ipv6_network(
762 "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
763
764 // When there is no address added, it should return an unspecified
765 // address.
766 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
767 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
768
769 // Deprecated one should not be returned.
770 ipv6_network.AddIP(ip);
771 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
772
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000773 // Add ULA one. ULA is unique local address which is starting either
774 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000775 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
776 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
777 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000778 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000779
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000780 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000781 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
782 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
783 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000784 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000785
786 // Add global dynamic temporary one.
787 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
788 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
789 ipv6_network.AddIP(ip);
790 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
791}
792
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000793} // namespace rtc