blob: d12a1eb8f4bb5c0efdfd66b2dc006b8255b4b5a5 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
2 * libjingle
3 * Copyright 2004--2011, Google Inc.
4 *
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"
40
41namespace talk_base {
42
43class NetworkTest : public testing::Test, public sigslot::has_slots<> {
44 public:
45 NetworkTest() : callback_called_(false) {}
46
47 void OnNetworksChanged() {
48 callback_called_ = true;
49 }
50
51 void MergeNetworkList(BasicNetworkManager& network_manager,
52 const NetworkManager::NetworkList& list,
53 bool* changed ) {
54 network_manager.MergeNetworkList(list, changed);
55 }
56
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +000057 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
58 const Network& network) {
59 return network_manager.IsIgnoredNetwork(network);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 }
61
62 NetworkManager::NetworkList GetNetworks(
63 const BasicNetworkManager& network_manager, bool include_ignored) {
64 NetworkManager::NetworkList list;
65 network_manager.CreateNetworks(include_ignored, &list);
66 return list;
67 }
68
69#if defined(POSIX)
70 // Separated from CreateNetworks for tests.
71 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
72 struct ifaddrs* interfaces,
73 bool include_ignored,
74 NetworkManager::NetworkList* networks) {
75 network_manager.ConvertIfAddrs(interfaces, include_ignored, networks);
76 }
77#endif // defined(POSIX)
78
79 protected:
80 bool callback_called_;
81};
82
83// Test that the Network ctor works properly.
84TEST_F(NetworkTest, TestNetworkConstruct) {
85 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
86 IPAddress(0x12345600U), 24);
87 EXPECT_EQ("test_eth0", ipv4_network1.name());
88 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
89 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
90 EXPECT_EQ(24, ipv4_network1.prefix_length());
91 EXPECT_FALSE(ipv4_network1.ignored());
92}
93
94// Tests that our ignore function works properly.
95TEST_F(NetworkTest, TestNetworkIgnore) {
96 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
97 IPAddress(0x12345600U), 24);
98 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
99 IPAddress(0x00010000U), 16);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +0000100 BasicNetworkManager network_manager;
101 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
102 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
103}
104
105TEST_F(NetworkTest, TestIgnoreList) {
106 Network ignore_me("ignore_me", "Ignore me please!",
107 IPAddress(0x12345600U), 24);
108 Network include_me("include_me", "Include me please!",
109 IPAddress(0x12345600U), 24);
110 BasicNetworkManager network_manager;
111 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
112 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
113 std::vector<std::string> ignore_list;
114 ignore_list.push_back("ignore_me");
115 network_manager.set_network_ignore_list(ignore_list);
116 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
117 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118}
119
120TEST_F(NetworkTest, TestCreateNetworks) {
121 BasicNetworkManager manager;
122 NetworkManager::NetworkList result = GetNetworks(manager, true);
123 // We should be able to bind to any addresses we find.
124 NetworkManager::NetworkList::iterator it;
125 for (it = result.begin();
126 it != result.end();
127 ++it) {
128 sockaddr_storage storage;
129 memset(&storage, 0, sizeof(storage));
130 IPAddress ip = (*it)->ip();
131 SocketAddress bindaddress(ip, 0);
132 bindaddress.SetScopeID((*it)->scope_id());
133 // TODO: Make this use talk_base::AsyncSocket once it supports IPv6.
134 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
135 if (fd > 0) {
136 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
137 EXPECT_GE(ipsize, 0U);
138 int success = ::bind(fd,
139 reinterpret_cast<sockaddr*>(&storage),
140 static_cast<int>(ipsize));
141 EXPECT_EQ(0, success);
142#ifdef WIN32
143 closesocket(fd);
144#else
145 close(fd);
146#endif
147 }
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000148 delete (*it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 }
150}
151
152// Test that UpdateNetworks succeeds.
153TEST_F(NetworkTest, TestUpdateNetworks) {
154 BasicNetworkManager manager;
155 manager.SignalNetworksChanged.connect(
156 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
157 manager.StartUpdating();
158 Thread::Current()->ProcessMessages(0);
159 EXPECT_TRUE(callback_called_);
160 callback_called_ = false;
161 // Callback should be triggered immediately when StartUpdating
162 // is called, after network update signal is already sent.
163 manager.StartUpdating();
164 EXPECT_TRUE(manager.started());
165 Thread::Current()->ProcessMessages(0);
166 EXPECT_TRUE(callback_called_);
167 manager.StopUpdating();
168 EXPECT_TRUE(manager.started());
169 manager.StopUpdating();
170 EXPECT_FALSE(manager.started());
171 manager.StopUpdating();
172 EXPECT_FALSE(manager.started());
173 callback_called_ = false;
174 // Callback should be triggered immediately after StartUpdating is called
175 // when start_count_ is reset to 0.
176 manager.StartUpdating();
177 Thread::Current()->ProcessMessages(0);
178 EXPECT_TRUE(callback_called_);
179}
180
181// Verify that MergeNetworkList() merges network lists properly.
182TEST_F(NetworkTest, TestBasicMergeNetworkList) {
183 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
184 IPAddress(0x12345600U), 24);
185 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
186 IPAddress(0x00010000U), 16);
187 ipv4_network1.AddIP(IPAddress(0x12345678));
188 ipv4_network2.AddIP(IPAddress(0x00010004));
189 BasicNetworkManager manager;
190
191 // Add ipv4_network1 to the list of networks.
192 NetworkManager::NetworkList list;
193 list.push_back(new Network(ipv4_network1));
194 bool changed;
195 MergeNetworkList(manager, list, &changed);
196 EXPECT_TRUE(changed);
197 list.clear();
198
199 manager.GetNetworks(&list);
200 EXPECT_EQ(1U, list.size());
201 EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
202 Network* net1 = list[0];
203 list.clear();
204
205 // Replace ipv4_network1 with ipv4_network2.
206 list.push_back(new Network(ipv4_network2));
207 MergeNetworkList(manager, list, &changed);
208 EXPECT_TRUE(changed);
209 list.clear();
210
211 manager.GetNetworks(&list);
212 EXPECT_EQ(1U, list.size());
213 EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
214 Network* net2 = list[0];
215 list.clear();
216
217 // Add Network2 back.
218 list.push_back(new Network(ipv4_network1));
219 list.push_back(new Network(ipv4_network2));
220 MergeNetworkList(manager, list, &changed);
221 EXPECT_TRUE(changed);
222 list.clear();
223
224 // Verify that we get previous instances of Network objects.
225 manager.GetNetworks(&list);
226 EXPECT_EQ(2U, list.size());
227 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
228 (net1 == list[1] && net2 == list[0]));
229 list.clear();
230
231 // Call MergeNetworkList() again and verify that we don't get update
232 // notification.
233 list.push_back(new Network(ipv4_network2));
234 list.push_back(new Network(ipv4_network1));
235 MergeNetworkList(manager, list, &changed);
236 EXPECT_FALSE(changed);
237 list.clear();
238
239 // Verify that we get previous instances of Network objects.
240 manager.GetNetworks(&list);
241 EXPECT_EQ(2U, list.size());
242 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
243 (net1 == list[1] && net2 == list[0]));
244 list.clear();
245}
246
247// Sets up some test IPv6 networks and appends them to list.
248// Four networks are added - public and link local, for two interfaces.
249void SetupNetworks(NetworkManager::NetworkList* list) {
250 IPAddress ip;
251 IPAddress prefix;
252 EXPECT_TRUE(IPFromString("fe80::1234:5678:abcd:ef12", &ip));
253 EXPECT_TRUE(IPFromString("fe80::", &prefix));
254 // First, fake link-locals.
255 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
256 prefix, 64);
257 ipv6_eth0_linklocalnetwork.AddIP(ip);
258 EXPECT_TRUE(IPFromString("fe80::5678:abcd:ef12:3456", &ip));
259 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
260 prefix, 64);
261 ipv6_eth1_linklocalnetwork.AddIP(ip);
262 // Public networks:
263 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
264 prefix = TruncateIP(ip, 64);
265 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
266 prefix, 64);
267 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
268 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
269 prefix = TruncateIP(ip, 64);
270 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
271 prefix, 64);
272 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
273 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
274 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
275 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
276 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
277}
278
279// Test that the basic network merging case works.
280TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
281 BasicNetworkManager manager;
282 manager.SignalNetworksChanged.connect(
283 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
284 NetworkManager::NetworkList original_list;
285 SetupNetworks(&original_list);
286 bool changed = false;
287 MergeNetworkList(manager, original_list, &changed);
288 EXPECT_TRUE(changed);
289 NetworkManager::NetworkList list;
290 manager.GetNetworks(&list);
291 EXPECT_EQ(original_list.size(), list.size());
292 // Verify that the original members are in the merged list.
293 for (NetworkManager::NetworkList::iterator it = original_list.begin();
294 it != original_list.end(); ++it) {
295 EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
296 }
297}
298
299// Tests that when two network lists that describe the same set of networks are
300// merged, that the changed callback is not called, and that the original
301// objects remain in the result list.
302TEST_F(NetworkTest, TestNoChangeMerge) {
303 BasicNetworkManager manager;
304 manager.SignalNetworksChanged.connect(
305 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
306 NetworkManager::NetworkList original_list;
307 SetupNetworks(&original_list);
308 bool changed = false;
309 MergeNetworkList(manager, original_list, &changed);
310 EXPECT_TRUE(changed);
311 // Second list that describes the same networks but with new objects.
312 NetworkManager::NetworkList second_list;
313 SetupNetworks(&second_list);
314 changed = false;
315 MergeNetworkList(manager, second_list, &changed);
316 EXPECT_FALSE(changed);
317 NetworkManager::NetworkList resulting_list;
318 manager.GetNetworks(&resulting_list);
319 EXPECT_EQ(original_list.size(), resulting_list.size());
320 // Verify that the original members are in the merged list.
321 for (NetworkManager::NetworkList::iterator it = original_list.begin();
322 it != original_list.end(); ++it) {
323 EXPECT_NE(resulting_list.end(),
324 std::find(resulting_list.begin(), resulting_list.end(), *it));
325 }
326 // Doublecheck that the new networks aren't in the list.
327 for (NetworkManager::NetworkList::iterator it = second_list.begin();
328 it != second_list.end(); ++it) {
329 EXPECT_EQ(resulting_list.end(),
330 std::find(resulting_list.begin(), resulting_list.end(), *it));
331 }
332}
333
334// Test that we can merge a network that is the same as another network but with
335// a different IP. The original network should remain in the list, but have its
336// IP changed.
337TEST_F(NetworkTest, MergeWithChangedIP) {
338 BasicNetworkManager manager;
339 manager.SignalNetworksChanged.connect(
340 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
341 NetworkManager::NetworkList original_list;
342 SetupNetworks(&original_list);
343 // Make a network that we're going to change.
344 IPAddress ip;
345 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
346 IPAddress prefix = TruncateIP(ip, 64);
347 Network* network_to_change = new Network("test_eth0",
348 "Test Network Adapter 1",
349 prefix, 64);
350 Network* changed_network = new Network(*network_to_change);
351 network_to_change->AddIP(ip);
352 IPAddress changed_ip;
353 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
354 changed_network->AddIP(changed_ip);
355 original_list.push_back(network_to_change);
356 bool changed = false;
357 MergeNetworkList(manager, original_list, &changed);
358 NetworkManager::NetworkList second_list;
359 SetupNetworks(&second_list);
360 second_list.push_back(changed_network);
361 changed = false;
362 MergeNetworkList(manager, second_list, &changed);
363 EXPECT_TRUE(changed);
364 NetworkManager::NetworkList list;
365 manager.GetNetworks(&list);
366 EXPECT_EQ(original_list.size(), list.size());
367 // Make sure the original network is still in the merged list.
368 EXPECT_NE(list.end(),
369 std::find(list.begin(), list.end(), network_to_change));
370 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
371}
372
373// Testing a similar case to above, but checking that a network can be updated
374// with additional IPs (not just a replacement).
375TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
376 BasicNetworkManager manager;
377 manager.SignalNetworksChanged.connect(
378 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
379 NetworkManager::NetworkList original_list;
380 SetupNetworks(&original_list);
381 bool changed = false;
382 MergeNetworkList(manager, original_list, &changed);
383 EXPECT_TRUE(changed);
384 IPAddress ip;
385 IPAddress check_ip;
386 IPAddress prefix;
387 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
388 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
389 prefix = TruncateIP(ip, 64);
390 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
391 prefix, 64);
392 // This is the IP that already existed in the public network on eth0.
393 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
394 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
395 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
396 changed = false;
397 MergeNetworkList(manager, original_list, &changed);
398 EXPECT_TRUE(changed);
399 // There should still be four networks.
400 NetworkManager::NetworkList list;
401 manager.GetNetworks(&list);
402 EXPECT_EQ(4U, list.size());
403 // Check the gathered IPs.
404 int matchcount = 0;
405 for (NetworkManager::NetworkList::iterator it = list.begin();
406 it != list.end(); ++it) {
407 if ((*it)->ToString() == original_list[2]->ToString()) {
408 ++matchcount;
409 EXPECT_EQ(1, matchcount);
410 // This should be the same network object as before.
411 EXPECT_EQ((*it), original_list[2]);
412 // But with two addresses now.
413 EXPECT_EQ(2U, (*it)->GetIPs().size());
414 EXPECT_NE((*it)->GetIPs().end(),
415 std::find((*it)->GetIPs().begin(),
416 (*it)->GetIPs().end(),
417 check_ip));
418 EXPECT_NE((*it)->GetIPs().end(),
419 std::find((*it)->GetIPs().begin(),
420 (*it)->GetIPs().end(),
421 ip));
422 } else {
423 // Check the IP didn't get added anywhere it wasn't supposed to.
424 EXPECT_EQ((*it)->GetIPs().end(),
425 std::find((*it)->GetIPs().begin(),
426 (*it)->GetIPs().end(),
427 ip));
428 }
429 }
430}
431
432// Test that merge correctly distinguishes multiple networks on an interface.
433TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
434 BasicNetworkManager manager;
435 manager.SignalNetworksChanged.connect(
436 static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
437 NetworkManager::NetworkList original_list;
438 SetupNetworks(&original_list);
439 bool changed = false;
440 MergeNetworkList(manager, original_list, &changed);
441 EXPECT_TRUE(changed);
442 IPAddress ip;
443 IPAddress prefix;
444 // A second network for eth0.
445 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
446 prefix = TruncateIP(ip, 64);
447 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
448 prefix, 64);
449 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
450 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
451 changed = false;
452 MergeNetworkList(manager, original_list, &changed);
453 EXPECT_TRUE(changed);
454 // There should be five networks now.
455 NetworkManager::NetworkList list;
456 manager.GetNetworks(&list);
457 EXPECT_EQ(5U, list.size());
458 // Check the resulting addresses.
459 for (NetworkManager::NetworkList::iterator it = list.begin();
460 it != list.end(); ++it) {
461 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
462 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
463 // Check the new network has 1 IP and that it's the correct one.
464 EXPECT_EQ(1U, (*it)->GetIPs().size());
465 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
466 } else {
467 // Check the IP didn't get added anywhere it wasn't supposed to.
468 EXPECT_EQ((*it)->GetIPs().end(),
469 std::find((*it)->GetIPs().begin(),
470 (*it)->GetIPs().end(),
471 ip));
472 }
473 }
474}
475
476// Test that DumpNetworks works.
477TEST_F(NetworkTest, TestDumpNetworks) {
478 BasicNetworkManager manager;
479 manager.DumpNetworks(true);
480}
481
482// Test that we can toggle IPv6 on and off.
483TEST_F(NetworkTest, TestIPv6Toggle) {
484 BasicNetworkManager manager;
485 bool ipv6_found = false;
486 NetworkManager::NetworkList list;
487#ifndef WIN32
488 // There should be at least one IPv6 network (fe80::/64 should be in there).
489 // TODO: Disabling this test on windows for the moment as the test
490 // machines don't seem to have IPv6 installed on them at all.
491 manager.set_ipv6_enabled(true);
492 list = GetNetworks(manager, true);
493 for (NetworkManager::NetworkList::iterator it = list.begin();
494 it != list.end(); ++it) {
495 if ((*it)->prefix().family() == AF_INET6) {
496 ipv6_found = true;
497 break;
498 }
499 }
500 EXPECT_TRUE(ipv6_found);
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000501 for (NetworkManager::NetworkList::iterator it = list.begin();
502 it != list.end(); ++it) {
503 delete (*it);
504 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505#endif
506 ipv6_found = false;
507 manager.set_ipv6_enabled(false);
508 list = GetNetworks(manager, true);
509 for (NetworkManager::NetworkList::iterator it = list.begin();
510 it != list.end(); ++it) {
511 if ((*it)->prefix().family() == AF_INET6) {
512 ipv6_found = true;
513 break;
514 }
515 }
516 EXPECT_FALSE(ipv6_found);
henrike@webrtc.org723d6832013-07-12 16:04:50 +0000517 for (NetworkManager::NetworkList::iterator it = list.begin();
518 it != list.end(); ++it) {
519 delete (*it);
520 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521}
522
523#if defined(POSIX)
524// Verify that we correctly handle interfaces with no address.
525TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
526 ifaddrs list;
527 memset(&list, 0, sizeof(list));
528 list.ifa_name = const_cast<char*>("test_iface");
529
530 NetworkManager::NetworkList result;
531 BasicNetworkManager manager;
532 CallConvertIfAddrs(manager, &list, true, &result);
533 EXPECT_TRUE(result.empty());
534}
535#endif // defined(POSIX)
536
537
538} // namespace talk_base