blob: b35b9f4cb656782d1cde9648c77e2b16a91daeb0 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "rtc_base/network.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000012
oprypin1ea631f2017-08-18 00:15:19 -070013#include <stdlib.h>
14
jbauch555604a2016-04-26 03:13:22 -070015#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000016#include <vector>
oprypin1ea631f2017-08-18 00:15:19 -070017
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/net_helpers.h"
20#include "rtc_base/network_monitor.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000021#if defined(WEBRTC_POSIX)
Henrik Kjellander00725112017-06-30 15:14:45 +020022#include <net/if.h>
Yves Gerey665174f2018-06-19 15:03:05 +020023#include <sys/types.h>
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "rtc_base/ifaddrs_converter.h"
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080025#endif // defined(WEBRTC_POSIX)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "rtc_base/gunit.h"
Steve Anton2acd1632019-03-25 13:48:30 -070027#include "test/gmock.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000028#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 11:09:25 +010029#include "rtc_base/logging.h" // For RTC_LOG_GLE
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000030#endif
31
Steve Anton2acd1632019-03-25 13:48:30 -070032using ::testing::Contains;
33using ::testing::Not;
34using ::testing::UnorderedElementsAre;
35using ::testing::UnorderedElementsAreArray;
36
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037namespace rtc {
38
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080039namespace {
40
honghaiz023f3ef2015-10-19 09:39:32 -070041class FakeNetworkMonitor : public NetworkMonitorBase {
42 public:
honghaizcec0a082016-01-15 14:49:09 -080043 void Start() override { started_ = true; }
44 void Stop() override { started_ = false; }
45 bool started() { return started_; }
honghaiza7ad7c32016-02-02 12:54:14 -080046 AdapterType GetAdapterType(const std::string& if_name) override {
Honghai Zhang351d77b2016-05-20 15:08:29 -070047 // Note that the name matching rules are different from the
48 // GetAdapterTypeFromName in NetworkManager.
49 if (if_name.find("wifi") == 0) {
50 return ADAPTER_TYPE_WIFI;
51 }
52 if (if_name.find("cellular") == 0) {
53 return ADAPTER_TYPE_CELLULAR;
54 }
honghaiza7ad7c32016-02-02 12:54:14 -080055 return ADAPTER_TYPE_UNKNOWN;
56 }
honghaizcec0a082016-01-15 14:49:09 -080057
58 private:
59 bool started_ = false;
honghaiz023f3ef2015-10-19 09:39:32 -070060};
61
62class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
63 public:
64 FakeNetworkMonitorFactory() {}
honghaizcec0a082016-01-15 14:49:09 -080065 NetworkMonitorInterface* CreateNetworkMonitor() override {
honghaiz023f3ef2015-10-19 09:39:32 -070066 return new FakeNetworkMonitor();
67 }
68};
69
Qingsi Wang10a0e512018-05-16 13:37:03 -070070bool SameNameAndPrefix(const rtc::Network& a, const rtc::Network& b) {
71 if (a.name() != b.name()) {
72 RTC_LOG(INFO) << "Different interface names.";
73 return false;
74 }
75 if (a.prefix_length() != b.prefix_length() || a.prefix() != b.prefix()) {
76 RTC_LOG(INFO) << "Different IP prefixes.";
77 return false;
78 }
79 return true;
80}
81
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080082} // namespace
83
Mirko Bonadei6a489f22019-04-09 15:11:12 +020084class NetworkTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000085 public:
86 NetworkTest() : callback_called_(false) {}
87
Yves Gerey665174f2018-06-19 15:03:05 +020088 void OnNetworksChanged() { callback_called_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +000090 NetworkManager::Stats MergeNetworkList(
91 BasicNetworkManager& network_manager,
92 const NetworkManager::NetworkList& list,
93 bool* changed) {
94 NetworkManager::Stats stats;
95 network_manager.MergeNetworkList(list, changed, &stats);
96 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097 }
98
99 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
100 const Network& network) {
101 return network_manager.IsIgnoredNetwork(network);
102 }
103
104 NetworkManager::NetworkList GetNetworks(
Yves Gerey665174f2018-06-19 15:03:05 +0200105 const BasicNetworkManager& network_manager,
106 bool include_ignored) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107 NetworkManager::NetworkList list;
108 network_manager.CreateNetworks(include_ignored, &list);
109 return list;
110 }
111
honghaizcec0a082016-01-15 14:49:09 -0800112 FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
113 return static_cast<FakeNetworkMonitor*>(
114 network_manager.network_monitor_.get());
honghaiz023f3ef2015-10-19 09:39:32 -0700115 }
116 void ClearNetworks(BasicNetworkManager& network_manager) {
117 for (const auto& kv : network_manager.networks_map_) {
118 delete kv.second;
119 }
120 network_manager.networks_.clear();
121 network_manager.networks_map_.clear();
122 }
123
Honghai Zhang351d77b2016-05-20 15:08:29 -0700124 AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
125 BasicNetworkManager::NetworkList list;
126 network_manager.GetNetworks(&list);
nissec16fa5e2017-02-07 07:18:43 -0800127 RTC_CHECK_EQ(1, list.size());
Honghai Zhang351d77b2016-05-20 15:08:29 -0700128 return list[0]->type();
129 }
130
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000131#if defined(WEBRTC_POSIX)
132 // Separated from CreateNetworks for tests.
133 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
134 struct ifaddrs* interfaces,
135 bool include_ignored,
136 NetworkManager::NetworkList* networks) {
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800137 // Use the base IfAddrsConverter for test cases.
jbauch555604a2016-04-26 03:13:22 -0700138 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800139 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
140 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000141 }
honghaizdb8cf502015-12-21 13:08:46 -0800142
143 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string,
144 uint32_t scope_id) {
Yves Gerey665174f2018-06-19 15:03:05 +0200145 struct sockaddr_in6* ipv6_addr =
146 static_cast<struct sockaddr_in6*>(malloc(sizeof(struct sockaddr_in6)));
honghaizdb8cf502015-12-21 13:08:46 -0800147 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
148 ipv6_addr->sin6_family = AF_INET6;
149 ipv6_addr->sin6_scope_id = scope_id;
150 IPAddress ip;
151 IPFromString(ip_string, &ip);
152 ipv6_addr->sin6_addr = ip.ipv6_address();
153 return ipv6_addr;
154 }
155
156 // Pointers created here need to be released via ReleaseIfAddrs.
157 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
158 char* if_name,
159 const std::string& ipv6_address,
160 const std::string& ipv6_netmask,
161 uint32_t scope_id) {
162 struct ifaddrs* if_addr = new struct ifaddrs;
163 memset(if_addr, 0, sizeof(struct ifaddrs));
164 if_addr->ifa_name = if_name;
165 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
166 CreateIpv6Addr(ipv6_address, scope_id));
167 if_addr->ifa_netmask =
168 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
169 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800170 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 13:08:46 -0800171 return if_addr;
172 }
173
Honghai Zhang351d77b2016-05-20 15:08:29 -0700174 struct ifaddrs* InstallIpv6Network(char* if_name,
175 const std::string& ipv6_address,
176 const std::string& ipv6_mask,
177 BasicNetworkManager& network_manager) {
178 ifaddrs* addr_list = nullptr;
179 addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
180 NetworkManager::NetworkList result;
181 bool changed;
182 NetworkManager::Stats stats;
183 CallConvertIfAddrs(network_manager, addr_list, true, &result);
184 network_manager.MergeNetworkList(result, &changed, &stats);
185 return addr_list;
186 }
187
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800188 struct sockaddr_in* CreateIpv4Addr(const std::string& ip_string) {
189 struct sockaddr_in* ipv4_addr =
190 static_cast<struct sockaddr_in*>(malloc(sizeof(struct sockaddr_in)));
191 memset(ipv4_addr, 0, sizeof(struct sockaddr_in));
192 ipv4_addr->sin_family = AF_INET;
193 IPAddress ip;
194 IPFromString(ip_string, &ip);
195 ipv4_addr->sin_addr = ip.ipv4_address();
196 return ipv4_addr;
197 }
198
199 // Pointers created here need to be released via ReleaseIfAddrs.
200 struct ifaddrs* AddIpv4Address(struct ifaddrs* list,
201 char* if_name,
202 const std::string& ipv4_address,
203 const std::string& ipv4_netmask) {
204 struct ifaddrs* if_addr = new struct ifaddrs;
205 memset(if_addr, 0, sizeof(struct ifaddrs));
206 if_addr->ifa_name = if_name;
207 if_addr->ifa_addr =
208 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_address));
209 if_addr->ifa_netmask =
210 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_netmask));
211 if_addr->ifa_next = list;
212 if_addr->ifa_flags = IFF_RUNNING;
213 return if_addr;
214 }
215
216 struct ifaddrs* InstallIpv4Network(char* if_name,
217 const std::string& ipv4_address,
218 const std::string& ipv4_mask,
219 BasicNetworkManager& network_manager) {
220 ifaddrs* addr_list = nullptr;
221 addr_list = AddIpv4Address(addr_list, if_name, ipv4_address, ipv4_mask);
222 NetworkManager::NetworkList result;
223 bool changed;
224 NetworkManager::Stats stats;
225 CallConvertIfAddrs(network_manager, addr_list, true, &result);
226 network_manager.MergeNetworkList(result, &changed, &stats);
227 return addr_list;
228 }
229
honghaizdb8cf502015-12-21 13:08:46 -0800230 void ReleaseIfAddrs(struct ifaddrs* list) {
231 struct ifaddrs* if_addr = list;
232 while (if_addr != nullptr) {
233 struct ifaddrs* next_addr = if_addr->ifa_next;
oprypin1ea631f2017-08-18 00:15:19 -0700234 free(if_addr->ifa_addr);
235 free(if_addr->ifa_netmask);
honghaizdb8cf502015-12-21 13:08:46 -0800236 delete if_addr;
237 if_addr = next_addr;
238 }
239 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000240#endif // defined(WEBRTC_POSIX)
241
242 protected:
243 bool callback_called_;
244};
245
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800246class TestBasicNetworkManager : public BasicNetworkManager {
247 public:
248 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800249 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800250};
251
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000252// Test that the Network ctor works properly.
253TEST_F(NetworkTest, TestNetworkConstruct) {
254 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
255 IPAddress(0x12345600U), 24);
256 EXPECT_EQ("test_eth0", ipv4_network1.name());
257 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
258 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
259 EXPECT_EQ(24, ipv4_network1.prefix_length());
260 EXPECT_FALSE(ipv4_network1.ignored());
261}
262
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000263TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
264 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
265 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000266 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000267 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000268 BasicNetworkManager network_manager;
269 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
270 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
271}
272
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000273// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000274TEST_F(NetworkTest, TestIgnoreList) {
Yves Gerey665174f2018-06-19 15:03:05 +0200275 Network ignore_me("ignore_me", "Ignore me please!", IPAddress(0x12345600U),
276 24);
277 Network include_me("include_me", "Include me please!", IPAddress(0x12345600U),
278 24);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000279 BasicNetworkManager network_manager;
280 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
281 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
282 std::vector<std::string> ignore_list;
283 ignore_list.push_back("ignore_me");
284 network_manager.set_network_ignore_list(ignore_list);
285 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
286 EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
287}
288
289// Test is failing on Windows opt: b/11288214
290TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
291 BasicNetworkManager manager;
292 NetworkManager::NetworkList result = GetNetworks(manager, true);
293 // We should be able to bind to any addresses we find.
294 NetworkManager::NetworkList::iterator it;
Yves Gerey665174f2018-06-19 15:03:05 +0200295 for (it = result.begin(); it != result.end(); ++it) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000296 sockaddr_storage storage;
297 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000298 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000299 SocketAddress bindaddress(ip, 0);
300 bindaddress.SetScopeID((*it)->scope_id());
301 // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
302 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
303 if (fd > 0) {
304 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
305 EXPECT_GE(ipsize, 0U);
Yves Gerey665174f2018-06-19 15:03:05 +0200306 int success = ::bind(fd, reinterpret_cast<sockaddr*>(&storage),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000307 static_cast<int>(ipsize));
308#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 11:09:25 +0100309 if (success)
310 RTC_LOG_GLE(LS_ERROR) << "Socket bind failed.";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311#endif
312 EXPECT_EQ(0, success);
313#if defined(WEBRTC_WIN)
314 closesocket(fd);
315#else
316 close(fd);
317#endif
318 }
319 delete (*it);
320 }
321}
322
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700323// Test StartUpdating() and StopUpdating(). network_permission_state starts with
324// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000325TEST_F(NetworkTest, TestUpdateNetworks) {
326 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200327 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
328 &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700329 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
330 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000331 manager.StartUpdating();
332 Thread::Current()->ProcessMessages(0);
333 EXPECT_TRUE(callback_called_);
334 callback_called_ = false;
335 // Callback should be triggered immediately when StartUpdating
336 // is called, after network update signal is already sent.
337 manager.StartUpdating();
338 EXPECT_TRUE(manager.started());
339 Thread::Current()->ProcessMessages(0);
340 EXPECT_TRUE(callback_called_);
341 manager.StopUpdating();
342 EXPECT_TRUE(manager.started());
343 manager.StopUpdating();
guoweisea1012b2015-08-21 09:06:28 -0700344 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
345 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000346 EXPECT_FALSE(manager.started());
347 manager.StopUpdating();
348 EXPECT_FALSE(manager.started());
349 callback_called_ = false;
350 // Callback should be triggered immediately after StartUpdating is called
351 // when start_count_ is reset to 0.
352 manager.StartUpdating();
353 Thread::Current()->ProcessMessages(0);
354 EXPECT_TRUE(callback_called_);
355}
356
357// Verify that MergeNetworkList() merges network lists properly.
358TEST_F(NetworkTest, TestBasicMergeNetworkList) {
359 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
360 IPAddress(0x12345600U), 24);
361 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
362 IPAddress(0x00010000U), 16);
363 ipv4_network1.AddIP(IPAddress(0x12345678));
364 ipv4_network2.AddIP(IPAddress(0x00010004));
365 BasicNetworkManager manager;
366
367 // Add ipv4_network1 to the list of networks.
368 NetworkManager::NetworkList list;
369 list.push_back(new Network(ipv4_network1));
370 bool changed;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000371 NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000372 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000373 EXPECT_EQ(stats.ipv6_network_count, 0);
374 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000375 list.clear();
376
377 manager.GetNetworks(&list);
378 EXPECT_EQ(1U, list.size());
Qingsi Wang10a0e512018-05-16 13:37:03 -0700379 EXPECT_TRUE(SameNameAndPrefix(ipv4_network1, *list[0]));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000380 Network* net1 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700381 uint16_t net_id1 = net1->id();
382 EXPECT_EQ(1, net_id1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000383 list.clear();
384
385 // Replace ipv4_network1 with ipv4_network2.
386 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000387 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000388 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000389 EXPECT_EQ(stats.ipv6_network_count, 0);
390 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000391 list.clear();
392
393 manager.GetNetworks(&list);
394 EXPECT_EQ(1U, list.size());
Qingsi Wang10a0e512018-05-16 13:37:03 -0700395 EXPECT_TRUE(SameNameAndPrefix(ipv4_network2, *list[0]));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000396 Network* net2 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700397 uint16_t net_id2 = net2->id();
398 // Network id will increase.
399 EXPECT_LT(net_id1, net_id2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400 list.clear();
401
402 // Add Network2 back.
403 list.push_back(new Network(ipv4_network1));
404 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000405 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000406 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000407 EXPECT_EQ(stats.ipv6_network_count, 0);
408 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000409 list.clear();
410
411 // Verify that we get previous instances of Network objects.
412 manager.GetNetworks(&list);
413 EXPECT_EQ(2U, list.size());
414 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
415 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700416 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
417 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000418 list.clear();
419
420 // Call MergeNetworkList() again and verify that we don't get update
421 // notification.
422 list.push_back(new Network(ipv4_network2));
423 list.push_back(new Network(ipv4_network1));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000424 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000425 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000426 EXPECT_EQ(stats.ipv6_network_count, 0);
427 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000428 list.clear();
429
430 // Verify that we get previous instances of Network objects.
431 manager.GetNetworks(&list);
432 EXPECT_EQ(2U, list.size());
433 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
434 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700435 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
436 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000437 list.clear();
438}
439
440// Sets up some test IPv6 networks and appends them to list.
441// Four networks are added - public and link local, for two interfaces.
442void SetupNetworks(NetworkManager::NetworkList* list) {
443 IPAddress ip;
444 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000445 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
446 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000447 // First, fake link-locals.
448 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
449 prefix, 64);
450 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000451 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000452 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
453 prefix, 64);
454 ipv6_eth1_linklocalnetwork.AddIP(ip);
455 // Public networks:
456 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
457 prefix = TruncateIP(ip, 64);
458 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
459 prefix, 64);
460 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
461 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
462 prefix = TruncateIP(ip, 64);
463 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
464 prefix, 64);
465 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
466 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
467 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
468 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
469 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
470}
471
472// Test that the basic network merging case works.
473TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
474 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200475 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
476 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000477 NetworkManager::NetworkList original_list;
478 SetupNetworks(&original_list);
479 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000480 NetworkManager::Stats stats =
481 MergeNetworkList(manager, original_list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000482 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000483 EXPECT_EQ(stats.ipv6_network_count, 4);
484 EXPECT_EQ(stats.ipv4_network_count, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000485 NetworkManager::NetworkList list;
486 manager.GetNetworks(&list);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000487 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700488 EXPECT_THAT(list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000489}
490
491// Tests that when two network lists that describe the same set of networks are
492// merged, that the changed callback is not called, and that the original
493// objects remain in the result list.
494TEST_F(NetworkTest, TestNoChangeMerge) {
495 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200496 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
497 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000498 NetworkManager::NetworkList original_list;
499 SetupNetworks(&original_list);
500 bool changed = false;
501 MergeNetworkList(manager, original_list, &changed);
502 EXPECT_TRUE(changed);
503 // Second list that describes the same networks but with new objects.
504 NetworkManager::NetworkList second_list;
505 SetupNetworks(&second_list);
506 changed = false;
507 MergeNetworkList(manager, second_list, &changed);
508 EXPECT_FALSE(changed);
509 NetworkManager::NetworkList resulting_list;
510 manager.GetNetworks(&resulting_list);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000511 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700512 EXPECT_THAT(resulting_list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000513 // Doublecheck that the new networks aren't in the list.
Steve Anton2acd1632019-03-25 13:48:30 -0700514 for (const Network* network : second_list) {
515 EXPECT_THAT(resulting_list, Not(Contains(network)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000516 }
517}
518
519// Test that we can merge a network that is the same as another network but with
520// a different IP. The original network should remain in the list, but have its
521// IP changed.
522TEST_F(NetworkTest, MergeWithChangedIP) {
523 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200524 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
525 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000526 NetworkManager::NetworkList original_list;
527 SetupNetworks(&original_list);
528 // Make a network that we're going to change.
529 IPAddress ip;
530 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
531 IPAddress prefix = TruncateIP(ip, 64);
Yves Gerey665174f2018-06-19 15:03:05 +0200532 Network* network_to_change =
533 new Network("test_eth0", "Test Network Adapter 1", prefix, 64);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000534 Network* changed_network = new Network(*network_to_change);
535 network_to_change->AddIP(ip);
536 IPAddress changed_ip;
537 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
538 changed_network->AddIP(changed_ip);
539 original_list.push_back(network_to_change);
540 bool changed = false;
541 MergeNetworkList(manager, original_list, &changed);
542 NetworkManager::NetworkList second_list;
543 SetupNetworks(&second_list);
544 second_list.push_back(changed_network);
545 changed = false;
546 MergeNetworkList(manager, second_list, &changed);
547 EXPECT_TRUE(changed);
548 NetworkManager::NetworkList list;
549 manager.GetNetworks(&list);
550 EXPECT_EQ(original_list.size(), list.size());
551 // Make sure the original network is still in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700552 EXPECT_THAT(list, Contains(network_to_change));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000553 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
554}
555
556// Testing a similar case to above, but checking that a network can be updated
557// with additional IPs (not just a replacement).
558TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
559 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200560 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
561 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000562 NetworkManager::NetworkList original_list;
563 SetupNetworks(&original_list);
564 bool changed = false;
565 MergeNetworkList(manager, original_list, &changed);
566 EXPECT_TRUE(changed);
567 IPAddress ip;
568 IPAddress check_ip;
569 IPAddress prefix;
570 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
571 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
572 prefix = TruncateIP(ip, 64);
573 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
574 prefix, 64);
575 // This is the IP that already existed in the public network on eth0.
576 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
577 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
578 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
579 changed = false;
580 MergeNetworkList(manager, original_list, &changed);
581 EXPECT_TRUE(changed);
582 // There should still be four networks.
583 NetworkManager::NetworkList list;
584 manager.GetNetworks(&list);
585 EXPECT_EQ(4U, list.size());
586 // Check the gathered IPs.
587 int matchcount = 0;
588 for (NetworkManager::NetworkList::iterator it = list.begin();
589 it != list.end(); ++it) {
Qingsi Wang10a0e512018-05-16 13:37:03 -0700590 if (SameNameAndPrefix(**it, *original_list[2])) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000591 ++matchcount;
592 EXPECT_EQ(1, matchcount);
593 // This should be the same network object as before.
594 EXPECT_EQ((*it), original_list[2]);
595 // But with two addresses now.
Steve Anton2acd1632019-03-25 13:48:30 -0700596 EXPECT_THAT((*it)->GetIPs(),
597 UnorderedElementsAre(InterfaceAddress(check_ip),
598 InterfaceAddress(ip)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000599 } else {
600 // Check the IP didn't get added anywhere it wasn't supposed to.
Steve Anton2acd1632019-03-25 13:48:30 -0700601 EXPECT_THAT((*it)->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000602 }
603 }
604}
605
606// Test that merge correctly distinguishes multiple networks on an interface.
607TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
608 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200609 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
610 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000611 NetworkManager::NetworkList original_list;
612 SetupNetworks(&original_list);
613 bool changed = false;
614 MergeNetworkList(manager, original_list, &changed);
615 EXPECT_TRUE(changed);
616 IPAddress ip;
617 IPAddress prefix;
618 // A second network for eth0.
619 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
620 prefix = TruncateIP(ip, 64);
621 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
622 prefix, 64);
623 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
624 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
625 changed = false;
626 MergeNetworkList(manager, original_list, &changed);
627 EXPECT_TRUE(changed);
628 // There should be five networks now.
629 NetworkManager::NetworkList list;
630 manager.GetNetworks(&list);
631 EXPECT_EQ(5U, list.size());
632 // Check the resulting addresses.
633 for (NetworkManager::NetworkList::iterator it = list.begin();
634 it != list.end(); ++it) {
635 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
636 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
637 // Check the new network has 1 IP and that it's the correct one.
638 EXPECT_EQ(1U, (*it)->GetIPs().size());
639 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
640 } else {
641 // Check the IP didn't get added anywhere it wasn't supposed to.
Steve Anton2acd1632019-03-25 13:48:30 -0700642 EXPECT_THAT((*it)->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000643 }
644 }
645}
646
honghaizdb8cf502015-12-21 13:08:46 -0800647// Test that DumpNetworks does not crash.
648TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000649 BasicNetworkManager manager;
honghaizdb8cf502015-12-21 13:08:46 -0800650 NetworkManager::NetworkList list = GetNetworks(manager, true);
651 bool changed;
652 MergeNetworkList(manager, list, &changed);
653 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000654}
655
Mirko Bonadei44f0f872019-01-20 18:16:42 +0100656TEST_F(NetworkTest, TestIPv6Toggle) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000657 BasicNetworkManager manager;
658 bool ipv6_found = false;
659 NetworkManager::NetworkList list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000660 list = GetNetworks(manager, true);
661 for (NetworkManager::NetworkList::iterator it = list.begin();
662 it != list.end(); ++it) {
663 if ((*it)->prefix().family() == AF_INET6) {
664 ipv6_found = true;
665 break;
666 }
667 }
668 EXPECT_TRUE(ipv6_found);
669 for (NetworkManager::NetworkList::iterator it = list.begin();
670 it != list.end(); ++it) {
671 delete (*it);
672 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000673}
674
deadbeef3427f532017-07-26 16:09:33 -0700675// Test that when network interfaces are sorted and given preference values,
676// IPv6 comes first.
677TEST_F(NetworkTest, IPv6NetworksPreferredOverIPv4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000678 BasicNetworkManager manager;
679 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
680 IPAddress(0x12345600U), 24);
681 ipv4_network1.AddIP(IPAddress(0x12345600U));
682
683 IPAddress ip;
684 IPAddress prefix;
685 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
686 prefix = TruncateIP(ip, 64);
687 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
688 prefix, 64);
689 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
690
691 NetworkManager::NetworkList list;
692 list.push_back(new Network(ipv4_network1));
693 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
694 Network* net1 = list[0];
695 Network* net2 = list[1];
696
697 bool changed = false;
698 MergeNetworkList(manager, list, &changed);
699 ASSERT_TRUE(changed);
700 // After sorting IPv6 network should be higher order than IPv4 networks.
701 EXPECT_TRUE(net1->preference() < net2->preference());
702}
703
deadbeef3427f532017-07-26 16:09:33 -0700704// When two interfaces are equivalent in everything but name, they're expected
705// to be preference-ordered by name. For example, "eth0" before "eth1".
706TEST_F(NetworkTest, NetworksSortedByInterfaceName) {
707 BasicNetworkManager manager;
708 Network* eth0 = new Network("test_eth0", "Test Network Adapter 1",
709 IPAddress(0x65432100U), 24);
710 eth0->AddIP(IPAddress(0x65432100U));
711 Network* eth1 = new Network("test_eth1", "Test Network Adapter 2",
712 IPAddress(0x12345600U), 24);
713 eth1->AddIP(IPAddress(0x12345600U));
714 NetworkManager::NetworkList list;
715 // Add them to the list in the opposite of the expected sorted order, to
716 // ensure sorting actually occurs.
717 list.push_back(eth1);
718 list.push_back(eth0);
719
720 bool changed = false;
721 MergeNetworkList(manager, list, &changed);
722 ASSERT_TRUE(changed);
723 // "test_eth0" should be preferred over "test_eth1".
724 EXPECT_TRUE(eth0->preference() > eth1->preference());
725}
726
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000727TEST_F(NetworkTest, TestNetworkAdapterTypes) {
728 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
729 ADAPTER_TYPE_WIFI);
730 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
731 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
732 ADAPTER_TYPE_ETHERNET);
733 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
734 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
735 ADAPTER_TYPE_CELLULAR);
736 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
737 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
738 ADAPTER_TYPE_VPN);
739 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
740 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
741 ADAPTER_TYPE_UNKNOWN);
742 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
743}
744
745#if defined(WEBRTC_POSIX)
746// Verify that we correctly handle interfaces with no address.
747TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
748 ifaddrs list;
749 memset(&list, 0, sizeof(list));
750 list.ifa_name = const_cast<char*>("test_iface");
751
752 NetworkManager::NetworkList result;
753 BasicNetworkManager manager;
754 CallConvertIfAddrs(manager, &list, true, &result);
755 EXPECT_TRUE(result.empty());
756}
honghaizdb8cf502015-12-21 13:08:46 -0800757
758// Verify that if there are two addresses on one interface, only one network
759// is generated.
760TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
761 char if_name[20] = "rmnet0";
762 ifaddrs* list = nullptr;
763 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
764 "FFFF:FFFF:FFFF:FFFF::", 0);
765 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
766 "FFFF:FFFF:FFFF:FFFF::", 0);
767 NetworkManager::NetworkList result;
768 BasicNetworkManager manager;
769 CallConvertIfAddrs(manager, list, true, &result);
770 EXPECT_EQ(1U, result.size());
771 bool changed;
772 // This ensures we release the objects created in CallConvertIfAddrs.
773 MergeNetworkList(manager, result, &changed);
774 ReleaseIfAddrs(list);
775}
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800776
777TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
778 ifaddrs list;
779 memset(&list, 0, sizeof(list));
780 list.ifa_name = const_cast<char*>("test_iface");
781 sockaddr ifa_addr;
782 sockaddr ifa_netmask;
783 list.ifa_addr = &ifa_addr;
784 list.ifa_netmask = &ifa_netmask;
785
786 NetworkManager::NetworkList result;
787 BasicNetworkManager manager;
788 CallConvertIfAddrs(manager, &list, true, &result);
789 EXPECT_TRUE(result.empty());
790}
Honghai Zhang351d77b2016-05-20 15:08:29 -0700791
792// Tests that the network type can be updated after the network monitor is
793// started.
794TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
795 char if_name1[20] = "wifi0";
796 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
797 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
798 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
799 BasicNetworkManager manager;
800 // A network created before the network monitor is started will get
801 // UNKNOWN type.
802 ifaddrs* addr_list =
803 InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
804 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
805 ReleaseIfAddrs(addr_list);
806 // Note: Do not call ClearNetworks here in order to test that the type
807 // of an existing network can be changed after the network monitor starts
808 // and detects the network type correctly.
809
810 // After the network monitor starts, the type will be updated.
811 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
812 NetworkMonitorFactory::SetFactory(factory);
813 // This brings up the hook with the network monitor.
814 manager.StartUpdating();
815 // Add the same ipv6 address as before but it has the right network type
816 // detected by the network monitor now.
817 addr_list = InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
818 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
819 ReleaseIfAddrs(addr_list);
820 ClearNetworks(manager);
821
822 // Add another network with the type inferred from the network monitor.
823 char if_name2[20] = "cellular0";
824 addr_list = InstallIpv6Network(if_name2, ipv6_address2, ipv6_mask, manager);
825 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
826 ReleaseIfAddrs(addr_list);
827 ClearNetworks(manager);
828}
829
830// Test that the network type can be determined based on name matching in
831// a few cases. Note that UNKNOWN type for non-matching strings has been tested
832// in the above test.
833TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800834 std::string ipv4_address1 = "192.0.0.121";
835 std::string ipv4_mask = "255.255.255.0";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700836 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
837 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
838 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
839 BasicNetworkManager manager;
840
deadbeef4cd599f2017-07-27 15:05:29 -0700841 // IPSec interface; name is in form "ipsec<index>".
842 char if_name[20] = "ipsec11";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700843 ifaddrs* addr_list =
844 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
deadbeef4cd599f2017-07-27 15:05:29 -0700845 EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
846 ClearNetworks(manager);
847 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700848
Qingsi Wange53ac042018-05-08 11:55:07 -0700849 strcpy(if_name, "lo0");
850 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
851 EXPECT_EQ(ADAPTER_TYPE_LOOPBACK, GetAdapterType(manager));
852 ClearNetworks(manager);
853 ReleaseIfAddrs(addr_list);
854
855 strcpy(if_name, "eth0");
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800856 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
Qingsi Wange53ac042018-05-08 11:55:07 -0700857 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, GetAdapterType(manager));
858 ClearNetworks(manager);
859 ReleaseIfAddrs(addr_list);
860
deadbeef4cd599f2017-07-27 15:05:29 -0700861#if defined(WEBRTC_IOS)
862 strcpy(if_name, "pdp_ip0");
863 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700864 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
865 ClearNetworks(manager);
866 ReleaseIfAddrs(addr_list);
867
Honghai Zhang63ab8102016-05-26 20:30:15 -0700868 strcpy(if_name, "en0");
869 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
870 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
871 ClearNetworks(manager);
872 ReleaseIfAddrs(addr_list);
873
Honghai Zhang351d77b2016-05-20 15:08:29 -0700874#elif defined(WEBRTC_ANDROID)
deadbeef4cd599f2017-07-27 15:05:29 -0700875 strcpy(if_name, "rmnet0");
876 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700877 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
878 ClearNetworks(manager);
879 ReleaseIfAddrs(addr_list);
880
881 strcpy(if_name, "wlan1");
882 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
883 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
884 ClearNetworks(manager);
885 ReleaseIfAddrs(addr_list);
886
887 strcpy(if_name, "v4-rmnet_data0");
888 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
889 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
890 ClearNetworks(manager);
891 ReleaseIfAddrs(addr_list);
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800892
893 strcpy(if_name, "clat4");
894 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
895 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
896 ClearNetworks(manager);
897 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700898#else
deadbeef4cd599f2017-07-27 15:05:29 -0700899 // TODO(deadbeef): If not iOS or Android, "wlan0" should be treated as
900 // "unknown"? Why? This should be fixed if there's no good reason.
901 strcpy(if_name, "wlan0");
902 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700903
904 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
905 ClearNetworks(manager);
906 ReleaseIfAddrs(addr_list);
907#endif
908}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000909#endif // defined(WEBRTC_POSIX)
910
911#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
912// If you want to test non-default routes, you can do the following on a linux
913// machine:
914// 1) Load the dummy network driver:
915// sudo modprobe dummy
916// sudo ifconfig dummy0 127.0.0.1
917// 2) Run this test and confirm the output says it found a dummy route (and
918// passes).
919// 3) When done:
920// sudo rmmmod dummy
921TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
922 BasicNetworkManager manager;
923 NetworkManager::NetworkList list;
924 list = GetNetworks(manager, false);
925 bool found_dummy = false;
Mirko Bonadei675513b2017-11-09 11:09:25 +0100926 RTC_LOG(LS_INFO) << "Looking for dummy network: ";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000927 for (NetworkManager::NetworkList::iterator it = list.begin();
928 it != list.end(); ++it) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100929 RTC_LOG(LS_INFO) << " Network name: " << (*it)->name();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000930 found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
931 }
932 for (NetworkManager::NetworkList::iterator it = list.begin();
933 it != list.end(); ++it) {
934 delete (*it);
935 }
936 if (!found_dummy) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100937 RTC_LOG(LS_INFO) << "No dummy found, quitting.";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000938 return;
939 }
Mirko Bonadei675513b2017-11-09 11:09:25 +0100940 RTC_LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
941 << "routes.";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000942 manager.set_ignore_non_default_routes(true);
943 list = GetNetworks(manager, false);
944 for (NetworkManager::NetworkList::iterator it = list.begin();
945 it != list.end(); ++it) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100946 RTC_LOG(LS_INFO) << " Network name: " << (*it)->name();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000947 EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
948 }
949 for (NetworkManager::NetworkList::iterator it = list.begin();
950 it != list.end(); ++it) {
951 delete (*it);
952 }
953}
954#endif
955
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000956// Test MergeNetworkList successfully combines all IPs for the same
957// prefix/length into a single Network.
958TEST_F(NetworkTest, TestMergeNetworkList) {
959 BasicNetworkManager manager;
960 NetworkManager::NetworkList list;
961
962 // Create 2 IPAddress classes with only last digit different.
963 IPAddress ip1, ip2;
964 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
965 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
966
967 // Create 2 networks with the same prefix and length.
968 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
969 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
970
971 // Add different IP into each.
972 net1->AddIP(ip1);
973 net2->AddIP(ip2);
974
975 list.push_back(net1);
976 list.push_back(net2);
977 bool changed;
978 MergeNetworkList(manager, list, &changed);
979 EXPECT_TRUE(changed);
980
981 NetworkManager::NetworkList list2;
982 manager.GetNetworks(&list2);
983
984 // Make sure the resulted networklist has only 1 element and 2
985 // IPAddresses.
986 EXPECT_EQ(list2.size(), 1uL);
987 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
Taylor Brandstetter01cb5f22018-03-07 15:49:32 -0800988 EXPECT_EQ(list2[0]->GetIPs()[0], InterfaceAddress(ip1));
989 EXPECT_EQ(list2[0]->GetIPs()[1], InterfaceAddress(ip2));
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000990}
991
honghaizdb8cf502015-12-21 13:08:46 -0800992// Test that MergeNetworkList successfully detects the change if
993// a network becomes inactive and then active again.
994TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
995 BasicNetworkManager manager;
996 Network network1("test_wifi", "Test Network Adapter 1",
997 IPAddress(0x12345600U), 24);
998 Network network2("test_eth0", "Test Network Adapter 2",
999 IPAddress(0x00010000U), 16);
1000 network1.AddIP(IPAddress(0x12345678));
1001 network2.AddIP(IPAddress(0x00010004));
1002 NetworkManager::NetworkList list;
1003 Network* net1 = new Network(network1);
1004 list.push_back(net1);
1005 bool changed;
1006 MergeNetworkList(manager, list, &changed);
1007 EXPECT_TRUE(changed);
1008 list.clear();
1009 manager.GetNetworks(&list);
1010 ASSERT_EQ(1U, list.size());
1011 EXPECT_EQ(net1, list[0]);
1012
1013 list.clear();
1014 Network* net2 = new Network(network2);
1015 list.push_back(net2);
1016 MergeNetworkList(manager, list, &changed);
1017 EXPECT_TRUE(changed);
1018 list.clear();
1019 manager.GetNetworks(&list);
1020 ASSERT_EQ(1U, list.size());
1021 EXPECT_EQ(net2, list[0]);
1022
1023 // Now network1 is inactive. Try to merge it again.
1024 list.clear();
1025 list.push_back(new Network(network1));
1026 MergeNetworkList(manager, list, &changed);
1027 EXPECT_TRUE(changed);
1028 list.clear();
1029 manager.GetNetworks(&list);
1030 ASSERT_EQ(1U, list.size());
1031 EXPECT_TRUE(list[0]->active());
1032 EXPECT_EQ(net1, list[0]);
1033}
1034
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001035// Test that the filtering logic follows the defined ruleset in network.h.
1036TEST_F(NetworkTest, TestIPv6Selection) {
1037 InterfaceAddress ip;
1038 std::string ipstr;
1039
1040 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1041 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1042
1043 // Create a network with this prefix.
Yves Gerey665174f2018-06-19 15:03:05 +02001044 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
1045 64);
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001046
1047 // When there is no address added, it should return an unspecified
1048 // address.
1049 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1050 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1051
1052 // Deprecated one should not be returned.
1053 ipv6_network.AddIP(ip);
1054 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1055
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001056 // Add ULA one. ULA is unique local address which is starting either
1057 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001058 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1059 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1060 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001061 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001062
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001063 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001064 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1065 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1066 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001067 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001068
1069 // Add global dynamic temporary one.
1070 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1071 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1072 ipv6_network.AddIP(ip);
1073 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1074}
1075
honghaiz023f3ef2015-10-19 09:39:32 -07001076TEST_F(NetworkTest, TestNetworkMonitoring) {
1077 BasicNetworkManager manager;
1078 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1079 &NetworkTest::OnNetworksChanged);
1080 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
1081 NetworkMonitorFactory::SetFactory(factory);
1082 manager.StartUpdating();
honghaizcec0a082016-01-15 14:49:09 -08001083 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1084 EXPECT_TRUE(network_monitor && network_monitor->started());
honghaiz023f3ef2015-10-19 09:39:32 -07001085 EXPECT_TRUE_WAIT(callback_called_, 1000);
1086 callback_called_ = false;
1087
1088 // Clear the networks so that there will be network changes below.
1089 ClearNetworks(manager);
1090 // Network manager is started, so the callback is called when the network
1091 // monitor fires the network-change event.
1092 network_monitor->OnNetworksChanged();
1093 EXPECT_TRUE_WAIT(callback_called_, 1000);
1094
honghaizcec0a082016-01-15 14:49:09 -08001095 // Network manager is stopped.
honghaiz023f3ef2015-10-19 09:39:32 -07001096 manager.StopUpdating();
honghaizcec0a082016-01-15 14:49:09 -08001097 EXPECT_FALSE(GetNetworkMonitor(manager)->started());
honghaiz023f3ef2015-10-19 09:39:32 -07001098
1099 NetworkMonitorFactory::ReleaseFactory(factory);
1100}
1101
Edward Lemur8dc945c2016-07-21 10:16:40 +02001102// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
1103#if defined(WEBRTC_ANDROID)
1104#define MAYBE_DefaultLocalAddress DISABLED_DefaultLocalAddress
1105#else
1106#define MAYBE_DefaultLocalAddress DefaultLocalAddress
1107#endif
1108TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001109 IPAddress ip;
guoweis56271ed2016-01-15 14:45:06 -08001110 TestBasicNetworkManager manager;
1111 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1112 &NetworkTest::OnNetworksChanged);
1113 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
1114 NetworkMonitorFactory::SetFactory(factory);
1115 manager.StartUpdating();
1116 EXPECT_TRUE_WAIT(callback_called_, 1000);
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001117
1118 // Make sure we can query default local address when an address for such
1119 // address family exists.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001120 std::vector<Network*> networks;
1121 manager.GetNetworks(&networks);
guoweis56271ed2016-01-15 14:45:06 -08001122 EXPECT_TRUE(!networks.empty());
Steve Anton9de3aac2017-10-24 10:08:26 -07001123 for (const auto* network : networks) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001124 if (network->GetBestIP().family() == AF_INET) {
1125 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
guoweis56271ed2016-01-15 14:45:06 -08001126 } else if (network->GetBestIP().family() == AF_INET6 &&
1127 !IPIsLoopback(network->GetBestIP())) {
1128 // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
1129 // enabled.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001130 EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress());
1131 }
1132 }
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001133
1134 // GetDefaultLocalAddress should return the valid default address after set.
1135 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1136 GetLoopbackIP(AF_INET6));
1137 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1138 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1139 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1140 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
honghaizaf83fe62016-04-18 14:50:44 -07001141
1142 // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
1143 // default address may be different from the best IP address of any network.
1144 InterfaceAddress ip1;
1145 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
1146 IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
1147 // Create a network with a prefix of ip1.
1148 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
1149 64);
1150 IPAddress ip2;
1151 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
1152 ipv6_network.AddIP(ip1);
1153 ipv6_network.AddIP(ip2);
1154 BasicNetworkManager::NetworkList list(1, new Network(ipv6_network));
1155 bool changed;
1156 MergeNetworkList(manager, list, &changed);
1157 // If the set default address is not in any network, GetDefaultLocalAddress
1158 // should return it.
1159 IPAddress ip3;
1160 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
1161 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
1162 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1163 EXPECT_EQ(ip3, ip);
1164 // If the set default address is in a network, GetDefaultLocalAddress will
1165 // return the best IP in that network.
1166 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1167 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1168 EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1169
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001170 manager.StopUpdating();
1171}
1172
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001173} // namespace rtc