blob: dc979ae5fdcbd5bd001899f24d567ce61217fa46 [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 Shiehba9ab4c2015-08-18 15:54:14 -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);
Guo-wei Shiehba9ab4c2015-08-18 15:54:14 -0700186 EXPECT_EQ(manager.enumeration_permission(),
187 NetworkManager::kEnumerationAllowed);
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();
Guo-wei Shiehba9ab4c2015-08-18 15:54:14 -0700201 EXPECT_EQ(manager.enumeration_permission(),
202 NetworkManager::kEnumerationAllowed);
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.
566TEST_F(NetworkTest, TestIPv6Toggle) {
567 BasicNetworkManager manager;
568 bool ipv6_found = false;
569 NetworkManager::NetworkList list;
570#if !defined(WEBRTC_WIN)
571 // There should be at least one IPv6 network (fe80::/64 should be in there).
572 // TODO(thaloun): Disabling this test on windows for the moment as the test
573 // machines don't seem to have IPv6 installed on them at all.
574 manager.set_ipv6_enabled(true);
575 list = GetNetworks(manager, true);
576 for (NetworkManager::NetworkList::iterator it = list.begin();
577 it != list.end(); ++it) {
578 if ((*it)->prefix().family() == AF_INET6) {
579 ipv6_found = true;
580 break;
581 }
582 }
583 EXPECT_TRUE(ipv6_found);
584 for (NetworkManager::NetworkList::iterator it = list.begin();
585 it != list.end(); ++it) {
586 delete (*it);
587 }
588#endif
589 ipv6_found = false;
590 manager.set_ipv6_enabled(false);
591 list = GetNetworks(manager, true);
592 for (NetworkManager::NetworkList::iterator it = list.begin();
593 it != list.end(); ++it) {
594 if ((*it)->prefix().family() == AF_INET6) {
595 ipv6_found = true;
596 break;
597 }
598 }
599 EXPECT_FALSE(ipv6_found);
600 for (NetworkManager::NetworkList::iterator it = list.begin();
601 it != list.end(); ++it) {
602 delete (*it);
603 }
604}
605
606TEST_F(NetworkTest, TestNetworkListSorting) {
607 BasicNetworkManager manager;
608 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
609 IPAddress(0x12345600U), 24);
610 ipv4_network1.AddIP(IPAddress(0x12345600U));
611
612 IPAddress ip;
613 IPAddress prefix;
614 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
615 prefix = TruncateIP(ip, 64);
616 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
617 prefix, 64);
618 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
619
620 NetworkManager::NetworkList list;
621 list.push_back(new Network(ipv4_network1));
622 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
623 Network* net1 = list[0];
624 Network* net2 = list[1];
625
626 bool changed = false;
627 MergeNetworkList(manager, list, &changed);
628 ASSERT_TRUE(changed);
629 // After sorting IPv6 network should be higher order than IPv4 networks.
630 EXPECT_TRUE(net1->preference() < net2->preference());
631}
632
633TEST_F(NetworkTest, TestNetworkAdapterTypes) {
634 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
635 ADAPTER_TYPE_WIFI);
636 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
637 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
638 ADAPTER_TYPE_ETHERNET);
639 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
640 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
641 ADAPTER_TYPE_CELLULAR);
642 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
643 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
644 ADAPTER_TYPE_VPN);
645 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
646 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
647 ADAPTER_TYPE_UNKNOWN);
648 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
649}
650
651#if defined(WEBRTC_POSIX)
652// Verify that we correctly handle interfaces with no address.
653TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
654 ifaddrs list;
655 memset(&list, 0, sizeof(list));
656 list.ifa_name = const_cast<char*>("test_iface");
657
658 NetworkManager::NetworkList result;
659 BasicNetworkManager manager;
660 CallConvertIfAddrs(manager, &list, true, &result);
661 EXPECT_TRUE(result.empty());
662}
663#endif // defined(WEBRTC_POSIX)
664
665#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
666// If you want to test non-default routes, you can do the following on a linux
667// machine:
668// 1) Load the dummy network driver:
669// sudo modprobe dummy
670// sudo ifconfig dummy0 127.0.0.1
671// 2) Run this test and confirm the output says it found a dummy route (and
672// passes).
673// 3) When done:
674// sudo rmmmod dummy
675TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
676 BasicNetworkManager manager;
677 NetworkManager::NetworkList list;
678 list = GetNetworks(manager, false);
679 bool found_dummy = false;
680 LOG(LS_INFO) << "Looking for dummy network: ";
681 for (NetworkManager::NetworkList::iterator it = list.begin();
682 it != list.end(); ++it) {
683 LOG(LS_INFO) << " Network name: " << (*it)->name();
684 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
685 }
686 for (NetworkManager::NetworkList::iterator it = list.begin();
687 it != list.end(); ++it) {
688 delete (*it);
689 }
690 if (!found_dummy) {
691 LOG(LS_INFO) << "No dummy found, quitting.";
692 return;
693 }
694 LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
695 << "routes.";
696 manager.set_ignore_non_default_routes(true);
697 list = GetNetworks(manager, false);
698 for (NetworkManager::NetworkList::iterator it = list.begin();
699 it != list.end(); ++it) {
700 LOG(LS_INFO) << " Network name: " << (*it)->name();
701 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
702 }
703 for (NetworkManager::NetworkList::iterator it = list.begin();
704 it != list.end(); ++it) {
705 delete (*it);
706 }
707}
708#endif
709
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000710// Test MergeNetworkList successfully combines all IPs for the same
711// prefix/length into a single Network.
712TEST_F(NetworkTest, TestMergeNetworkList) {
713 BasicNetworkManager manager;
714 NetworkManager::NetworkList list;
715
716 // Create 2 IPAddress classes with only last digit different.
717 IPAddress ip1, ip2;
718 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
719 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
720
721 // Create 2 networks with the same prefix and length.
722 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
723 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
724
725 // Add different IP into each.
726 net1->AddIP(ip1);
727 net2->AddIP(ip2);
728
729 list.push_back(net1);
730 list.push_back(net2);
731 bool changed;
732 MergeNetworkList(manager, list, &changed);
733 EXPECT_TRUE(changed);
734
735 NetworkManager::NetworkList list2;
736 manager.GetNetworks(&list2);
737
738 // Make sure the resulted networklist has only 1 element and 2
739 // IPAddresses.
740 EXPECT_EQ(list2.size(), 1uL);
741 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
742 EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
743 EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
744}
745
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000746// Test that the filtering logic follows the defined ruleset in network.h.
747TEST_F(NetworkTest, TestIPv6Selection) {
748 InterfaceAddress ip;
749 std::string ipstr;
750
751 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
752 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
753
754 // Create a network with this prefix.
755 Network ipv6_network(
756 "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
757
758 // When there is no address added, it should return an unspecified
759 // address.
760 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
761 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
762
763 // Deprecated one should not be returned.
764 ipv6_network.AddIP(ip);
765 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
766
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000767 // Add ULA one. ULA is unique local address which is starting either
768 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000769 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
770 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
771 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000772 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000773
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +0000774 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000775 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
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
780 // Add global dynamic temporary one.
781 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
782 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
783 ipv6_network.AddIP(ip);
784 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
785}
786
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000787} // namespace rtc