blob: ce19120fe12c81b47169e6ae55870846e0798313 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
2 * libjingle
wu@webrtc.org78187522013-10-07 23:32:02 +00003 * Copyright 2004 Google Inc. All rights reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00004 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "talk/base/network.h"
29
30#include <vector>
31#if defined(POSIX)
32#include <sys/types.h>
33#ifndef ANDROID
34#include <ifaddrs.h>
35#else
36#include "talk/base/ifaddrs-android.h"
37#endif
38#endif
39#include "talk/base/gunit.h"
wu@webrtc.org78187522013-10-07 23:32:02 +000040#ifdef WIN32
41#include "talk/base/logging.h" // For LOG_GLE
42#endif
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043
44namespace talk_base {
45
46class NetworkTest : public testing::Test, public sigslot::has_slots<> {
47 public:
48 NetworkTest() : callback_called_(false) {}
49
50 void OnNetworksChanged() {
51 callback_called_ = true;
52 }
53
54 void MergeNetworkList(BasicNetworkManager& network_manager,
55 const NetworkManager::NetworkList& list,
56 bool* changed ) {
57 network_manager.MergeNetworkList(list, changed);
58 }
59
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +000060 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
61 const Network& network) {
62 return network_manager.IsIgnoredNetwork(network);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 }
64
65 NetworkManager::NetworkList GetNetworks(
66 const BasicNetworkManager& network_manager, bool include_ignored) {
67 NetworkManager::NetworkList list;
68 network_manager.CreateNetworks(include_ignored, &list);
69 return list;
70 }
71
72#if defined(POSIX)
73 // Separated from CreateNetworks for tests.
74 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
75 struct ifaddrs* interfaces,
76 bool include_ignored,
77 NetworkManager::NetworkList* networks) {
78 network_manager.ConvertIfAddrs(interfaces, include_ignored, networks);
79 }
80#endif // defined(POSIX)
81
82 protected:
83 bool callback_called_;
84};
85
86// Test that the Network ctor works properly.
87TEST_F(NetworkTest, TestNetworkConstruct) {
88 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
89 IPAddress(0x12345600U), 24);
90 EXPECT_EQ("test_eth0", ipv4_network1.name());
91 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
92 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
93 EXPECT_EQ(24, ipv4_network1.prefix_length());
94 EXPECT_FALSE(ipv4_network1.ignored());
95}
96
97// Tests that our ignore function works properly.
98TEST_F(NetworkTest, TestNetworkIgnore) {
99 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
100 IPAddress(0x12345600U), 24);
101 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
102 IPAddress(0x00010000U), 16);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000103 BasicNetworkManager network_manager;
104 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
105 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
106}
107
108TEST_F(NetworkTest, TestIgnoreList) {
109 Network ignore_me("ignore_me", "Ignore me please!",
110 IPAddress(0x12345600U), 24);
111 Network include_me("include_me", "Include me please!",
112 IPAddress(0x12345600U), 24);
113 BasicNetworkManager network_manager;
114 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
115 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
116 std::vector<std::string> ignore_list;
117 ignore_list.push_back("ignore_me");
118 network_manager.set_network_ignore_list(ignore_list);
119 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
120 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121}
122
123TEST_F(NetworkTest, TestCreateNetworks) {
124 BasicNetworkManager manager;
125 NetworkManager::NetworkList result = GetNetworks(manager, true);
126 // We should be able to bind to any addresses we find.
127 NetworkManager::NetworkList::iterator it;
128 for (it = result.begin();
129 it != result.end();
130 ++it) {
131 sockaddr_storage storage;
132 memset(&storage, 0, sizeof(storage));
133 IPAddress ip = (*it)->ip();
134 SocketAddress bindaddress(ip, 0);
135 bindaddress.SetScopeID((*it)->scope_id());
wu@webrtc.org78187522013-10-07 23:32:02 +0000136 // TODO(thaloun): Use talk_base::AsyncSocket once it supports IPv6.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
138 if (fd > 0) {
139 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
140 EXPECT_GE(ipsize, 0U);
141 int success = ::bind(fd,
142 reinterpret_cast<sockaddr*>(&storage),
143 static_cast<int>(ipsize));
wu@webrtc.org78187522013-10-07 23:32:02 +0000144#ifdef WIN32
145 if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
146#endif
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147 EXPECT_EQ(0, success);
148#ifdef WIN32
149 closesocket(fd);
150#else
151 close(fd);
152#endif
153 }
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000154 delete (*it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155 }
156}
157
158// Test that UpdateNetworks succeeds.
159TEST_F(NetworkTest, TestUpdateNetworks) {
160 BasicNetworkManager manager;
161 manager.SignalNetworksChanged.connect(
162 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
163 manager.StartUpdating();
164 Thread::Current()->ProcessMessages(0);
165 EXPECT_TRUE(callback_called_);
166 callback_called_ = false;
167 // Callback should be triggered immediately when StartUpdating
168 // is called, after network update signal is already sent.
169 manager.StartUpdating();
170 EXPECT_TRUE(manager.started());
171 Thread::Current()->ProcessMessages(0);
172 EXPECT_TRUE(callback_called_);
173 manager.StopUpdating();
174 EXPECT_TRUE(manager.started());
175 manager.StopUpdating();
176 EXPECT_FALSE(manager.started());
177 manager.StopUpdating();
178 EXPECT_FALSE(manager.started());
179 callback_called_ = false;
180 // Callback should be triggered immediately after StartUpdating is called
181 // when start_count_ is reset to 0.
182 manager.StartUpdating();
183 Thread::Current()->ProcessMessages(0);
184 EXPECT_TRUE(callback_called_);
185}
186
187// Verify that MergeNetworkList() merges network lists properly.
188TEST_F(NetworkTest, TestBasicMergeNetworkList) {
189 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
190 IPAddress(0x12345600U), 24);
191 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
192 IPAddress(0x00010000U), 16);
193 ipv4_network1.AddIP(IPAddress(0x12345678));
194 ipv4_network2.AddIP(IPAddress(0x00010004));
195 BasicNetworkManager manager;
196
197 // Add ipv4_network1 to the list of networks.
198 NetworkManager::NetworkList list;
199 list.push_back(new Network(ipv4_network1));
200 bool changed;
201 MergeNetworkList(manager, list, &changed);
202 EXPECT_TRUE(changed);
203 list.clear();
204
205 manager.GetNetworks(&list);
206 EXPECT_EQ(1U, list.size());
207 EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
208 Network* net1 = list[0];
209 list.clear();
210
211 // Replace ipv4_network1 with ipv4_network2.
212 list.push_back(new Network(ipv4_network2));
213 MergeNetworkList(manager, list, &changed);
214 EXPECT_TRUE(changed);
215 list.clear();
216
217 manager.GetNetworks(&list);
218 EXPECT_EQ(1U, list.size());
219 EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
220 Network* net2 = list[0];
221 list.clear();
222
223 // Add Network2 back.
224 list.push_back(new Network(ipv4_network1));
225 list.push_back(new Network(ipv4_network2));
226 MergeNetworkList(manager, list, &changed);
227 EXPECT_TRUE(changed);
228 list.clear();
229
230 // Verify that we get previous instances of Network objects.
231 manager.GetNetworks(&list);
232 EXPECT_EQ(2U, list.size());
233 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
234 (net1 == list[1] && net2 == list[0]));
235 list.clear();
236
237 // Call MergeNetworkList() again and verify that we don't get update
238 // notification.
239 list.push_back(new Network(ipv4_network2));
240 list.push_back(new Network(ipv4_network1));
241 MergeNetworkList(manager, list, &changed);
242 EXPECT_FALSE(changed);
243 list.clear();
244
245 // Verify that we get previous instances of Network objects.
246 manager.GetNetworks(&list);
247 EXPECT_EQ(2U, list.size());
248 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
249 (net1 == list[1] && net2 == list[0]));
250 list.clear();
251}
252
253// Sets up some test IPv6 networks and appends them to list.
254// Four networks are added - public and link local, for two interfaces.
255void SetupNetworks(NetworkManager::NetworkList* list) {
256 IPAddress ip;
257 IPAddress prefix;
258 EXPECT_TRUE(IPFromString("fe80::1234:5678:abcd:ef12", &ip));
259 EXPECT_TRUE(IPFromString("fe80::", &prefix));
260 // First, fake link-locals.
261 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
262 prefix, 64);
263 ipv6_eth0_linklocalnetwork.AddIP(ip);
264 EXPECT_TRUE(IPFromString("fe80::5678:abcd:ef12:3456", &ip));
265 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
266 prefix, 64);
267 ipv6_eth1_linklocalnetwork.AddIP(ip);
268 // Public networks:
269 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
270 prefix = TruncateIP(ip, 64);
271 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
272 prefix, 64);
273 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
274 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
275 prefix = TruncateIP(ip, 64);
276 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
277 prefix, 64);
278 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
279 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
280 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
281 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
282 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
283}
284
285// Test that the basic network merging case works.
286TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
287 BasicNetworkManager manager;
288 manager.SignalNetworksChanged.connect(
289 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
290 NetworkManager::NetworkList original_list;
291 SetupNetworks(&original_list);
292 bool changed = false;
293 MergeNetworkList(manager, original_list, &changed);
294 EXPECT_TRUE(changed);
295 NetworkManager::NetworkList list;
296 manager.GetNetworks(&list);
297 EXPECT_EQ(original_list.size(), list.size());
298 // Verify that the original members are in the merged list.
299 for (NetworkManager::NetworkList::iterator it = original_list.begin();
300 it != original_list.end(); ++it) {
301 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
302 }
303}
304
305// Tests that when two network lists that describe the same set of networks are
306// merged, that the changed callback is not called, and that the original
307// objects remain in the result list.
308TEST_F(NetworkTest, TestNoChangeMerge) {
309 BasicNetworkManager manager;
310 manager.SignalNetworksChanged.connect(
311 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
312 NetworkManager::NetworkList original_list;
313 SetupNetworks(&original_list);
314 bool changed = false;
315 MergeNetworkList(manager, original_list, &changed);
316 EXPECT_TRUE(changed);
317 // Second list that describes the same networks but with new objects.
318 NetworkManager::NetworkList second_list;
319 SetupNetworks(&second_list);
320 changed = false;
321 MergeNetworkList(manager, second_list, &changed);
322 EXPECT_FALSE(changed);
323 NetworkManager::NetworkList resulting_list;
324 manager.GetNetworks(&resulting_list);
325 EXPECT_EQ(original_list.size(), resulting_list.size());
326 // Verify that the original members are in the merged list.
327 for (NetworkManager::NetworkList::iterator it = original_list.begin();
328 it != original_list.end(); ++it) {
329 EXPECT_NE(resulting_list.end(),
330 std::find(resulting_list.begin(), resulting_list.end(), *it));
331 }
332 // Doublecheck that the new networks aren't in the list.
333 for (NetworkManager::NetworkList::iterator it = second_list.begin();
334 it != second_list.end(); ++it) {
335 EXPECT_EQ(resulting_list.end(),
336 std::find(resulting_list.begin(), resulting_list.end(), *it));
337 }
338}
339
340// Test that we can merge a network that is the same as another network but with
341// a different IP. The original network should remain in the list, but have its
342// IP changed.
343TEST_F(NetworkTest, MergeWithChangedIP) {
344 BasicNetworkManager manager;
345 manager.SignalNetworksChanged.connect(
346 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
347 NetworkManager::NetworkList original_list;
348 SetupNetworks(&original_list);
349 // Make a network that we're going to change.
350 IPAddress ip;
351 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
352 IPAddress prefix = TruncateIP(ip, 64);
353 Network* network_to_change = new Network("test_eth0",
354 "Test Network Adapter 1",
355 prefix, 64);
356 Network* changed_network = new Network(*network_to_change);
357 network_to_change->AddIP(ip);
358 IPAddress changed_ip;
359 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
360 changed_network->AddIP(changed_ip);
361 original_list.push_back(network_to_change);
362 bool changed = false;
363 MergeNetworkList(manager, original_list, &changed);
364 NetworkManager::NetworkList second_list;
365 SetupNetworks(&second_list);
366 second_list.push_back(changed_network);
367 changed = false;
368 MergeNetworkList(manager, second_list, &changed);
369 EXPECT_TRUE(changed);
370 NetworkManager::NetworkList list;
371 manager.GetNetworks(&list);
372 EXPECT_EQ(original_list.size(), list.size());
373 // Make sure the original network is still in the merged list.
374 EXPECT_NE(list.end(),
375 std::find(list.begin(), list.end(), network_to_change));
376 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
377}
378
379// Testing a similar case to above, but checking that a network can be updated
380// with additional IPs (not just a replacement).
381TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
382 BasicNetworkManager manager;
383 manager.SignalNetworksChanged.connect(
384 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
385 NetworkManager::NetworkList original_list;
386 SetupNetworks(&original_list);
387 bool changed = false;
388 MergeNetworkList(manager, original_list, &changed);
389 EXPECT_TRUE(changed);
390 IPAddress ip;
391 IPAddress check_ip;
392 IPAddress prefix;
393 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
394 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
395 prefix = TruncateIP(ip, 64);
396 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
397 prefix, 64);
398 // This is the IP that already existed in the public network on eth0.
399 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
400 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
401 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
402 changed = false;
403 MergeNetworkList(manager, original_list, &changed);
404 EXPECT_TRUE(changed);
405 // There should still be four networks.
406 NetworkManager::NetworkList list;
407 manager.GetNetworks(&list);
408 EXPECT_EQ(4U, list.size());
409 // Check the gathered IPs.
410 int matchcount = 0;
411 for (NetworkManager::NetworkList::iterator it = list.begin();
412 it != list.end(); ++it) {
413 if ((*it)->ToString() == original_list[2]->ToString()) {
414 ++matchcount;
415 EXPECT_EQ(1, matchcount);
416 // This should be the same network object as before.
417 EXPECT_EQ((*it), original_list[2]);
418 // But with two addresses now.
419 EXPECT_EQ(2U, (*it)->GetIPs().size());
420 EXPECT_NE((*it)->GetIPs().end(),
421 std::find((*it)->GetIPs().begin(),
422 (*it)->GetIPs().end(),
423 check_ip));
424 EXPECT_NE((*it)->GetIPs().end(),
425 std::find((*it)->GetIPs().begin(),
426 (*it)->GetIPs().end(),
427 ip));
428 } else {
429 // Check the IP didn't get added anywhere it wasn't supposed to.
430 EXPECT_EQ((*it)->GetIPs().end(),
431 std::find((*it)->GetIPs().begin(),
432 (*it)->GetIPs().end(),
433 ip));
434 }
435 }
436}
437
438// Test that merge correctly distinguishes multiple networks on an interface.
439TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
440 BasicNetworkManager manager;
441 manager.SignalNetworksChanged.connect(
442 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
443 NetworkManager::NetworkList original_list;
444 SetupNetworks(&original_list);
445 bool changed = false;
446 MergeNetworkList(manager, original_list, &changed);
447 EXPECT_TRUE(changed);
448 IPAddress ip;
449 IPAddress prefix;
450 // A second network for eth0.
451 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
452 prefix = TruncateIP(ip, 64);
453 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
454 prefix, 64);
455 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
456 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
457 changed = false;
458 MergeNetworkList(manager, original_list, &changed);
459 EXPECT_TRUE(changed);
460 // There should be five networks now.
461 NetworkManager::NetworkList list;
462 manager.GetNetworks(&list);
463 EXPECT_EQ(5U, list.size());
464 // Check the resulting addresses.
465 for (NetworkManager::NetworkList::iterator it = list.begin();
466 it != list.end(); ++it) {
467 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
468 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
469 // Check the new network has 1 IP and that it's the correct one.
470 EXPECT_EQ(1U, (*it)->GetIPs().size());
471 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
472 } else {
473 // Check the IP didn't get added anywhere it wasn't supposed to.
474 EXPECT_EQ((*it)->GetIPs().end(),
475 std::find((*it)->GetIPs().begin(),
476 (*it)->GetIPs().end(),
477 ip));
478 }
479 }
480}
481
482// Test that DumpNetworks works.
483TEST_F(NetworkTest, TestDumpNetworks) {
484 BasicNetworkManager manager;
485 manager.DumpNetworks(true);
486}
487
488// Test that we can toggle IPv6 on and off.
489TEST_F(NetworkTest, TestIPv6Toggle) {
490 BasicNetworkManager manager;
491 bool ipv6_found = false;
492 NetworkManager::NetworkList list;
493#ifndef WIN32
494 // There should be at least one IPv6 network (fe80::/64 should be in there).
wu@webrtc.org78187522013-10-07 23:32:02 +0000495 // TODO(thaloun): Disabling this test on windows for the moment as the test
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 // machines don't seem to have IPv6 installed on them at all.
497 manager.set_ipv6_enabled(true);
498 list = GetNetworks(manager, true);
499 for (NetworkManager::NetworkList::iterator it = list.begin();
500 it != list.end(); ++it) {
501 if ((*it)->prefix().family() == AF_INET6) {
502 ipv6_found = true;
503 break;
504 }
505 }
506 EXPECT_TRUE(ipv6_found);
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000507 for (NetworkManager::NetworkList::iterator it = list.begin();
508 it != list.end(); ++it) {
509 delete (*it);
510 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511#endif
512 ipv6_found = false;
513 manager.set_ipv6_enabled(false);
514 list = GetNetworks(manager, true);
515 for (NetworkManager::NetworkList::iterator it = list.begin();
516 it != list.end(); ++it) {
517 if ((*it)->prefix().family() == AF_INET6) {
518 ipv6_found = true;
519 break;
520 }
521 }
522 EXPECT_FALSE(ipv6_found);
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000523 for (NetworkManager::NetworkList::iterator it = list.begin();
524 it != list.end(); ++it) {
525 delete (*it);
526 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527}
528
529#if defined(POSIX)
530// Verify that we correctly handle interfaces with no address.
531TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
532 ifaddrs list;
533 memset(&list, 0, sizeof(list));
534 list.ifa_name = const_cast<char*>("test_iface");
535
536 NetworkManager::NetworkList result;
537 BasicNetworkManager manager;
538 CallConvertIfAddrs(manager, &list, true, &result);
539 EXPECT_TRUE(result.empty());
540}
541#endif // defined(POSIX)
542
wu@webrtc.org78187522013-10-07 23:32:02 +0000543#if defined(LINUX)
544// If you want to test non-default routes, you can do the following on a linux
545// machine:
546// 1) Load the dummy network driver:
547// sudo modprobe dummy
548// sudo ifconfig dummy0 127.0.0.1
549// 2) Run this test and confirm the output says it found a dummy route (and
550// passes).
551// 3) When done:
552// sudo rmmmod dummy
553TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
554 BasicNetworkManager manager;
555 NetworkManager::NetworkList list;
556 list = GetNetworks(manager, false);
557 bool found_dummy = false;
558 LOG(LS_INFO) << "Looking for dummy network: ";
559 for (NetworkManager::NetworkList::iterator it = list.begin();
560 it != list.end(); ++it) {
561 LOG(LS_INFO) << " Network name: " << (*it)->name();
562 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
563 }
564 for (NetworkManager::NetworkList::iterator it = list.begin();
565 it != list.end(); ++it) {
566 delete (*it);
567 }
568 if (!found_dummy) {
569 LOG(LS_INFO) << "No dummy found, quitting.";
570 return;
571 }
572 LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
573 << "routes.";
574 manager.set_ignore_non_default_routes(true);
575 list = GetNetworks(manager, false);
576 for (NetworkManager::NetworkList::iterator it = list.begin();
577 it != list.end(); ++it) {
578 LOG(LS_INFO) << " Network name: " << (*it)->name();
579 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
580 }
581 for (NetworkManager::NetworkList::iterator it = list.begin();
582 it != list.end(); ++it) {
583 delete (*it);
584 }
585}
586#endif
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587
588} // namespace talk_base