blob: 29a89ba1becee0ff52b0a9df761c55880373a047 [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 Bonadei06d35592020-04-01 13:43:08 +020018#include "absl/strings/match.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "rtc_base/net_helpers.h"
21#include "rtc_base/network_monitor.h"
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -070022#include "rtc_base/network_monitor_factory.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000023#if defined(WEBRTC_POSIX)
Henrik Kjellander00725112017-06-30 15:14:45 +020024#include <net/if.h>
Yves Gerey665174f2018-06-19 15:03:05 +020025#include <sys/types.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020026
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "rtc_base/ifaddrs_converter.h"
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080028#endif // defined(WEBRTC_POSIX)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "rtc_base/gunit.h"
Steve Anton2acd1632019-03-25 13:48:30 -070030#include "test/gmock.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 11:09:25 +010032#include "rtc_base/logging.h" // For RTC_LOG_GLE
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033#endif
34
Steve Anton2acd1632019-03-25 13:48:30 -070035using ::testing::Contains;
36using ::testing::Not;
37using ::testing::UnorderedElementsAre;
38using ::testing::UnorderedElementsAreArray;
39
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040namespace rtc {
41
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080042namespace {
43
honghaiz023f3ef2015-10-19 09:39:32 -070044class FakeNetworkMonitor : public NetworkMonitorBase {
45 public:
honghaizcec0a082016-01-15 14:49:09 -080046 void Start() override { started_ = true; }
47 void Stop() override { started_ = false; }
48 bool started() { return started_; }
honghaiza7ad7c32016-02-02 12:54:14 -080049 AdapterType GetAdapterType(const std::string& if_name) override {
Honghai Zhang351d77b2016-05-20 15:08:29 -070050 // Note that the name matching rules are different from the
51 // GetAdapterTypeFromName in NetworkManager.
Mirko Bonadei06d35592020-04-01 13:43:08 +020052 if (absl::StartsWith(if_name, "wifi")) {
Honghai Zhang351d77b2016-05-20 15:08:29 -070053 return ADAPTER_TYPE_WIFI;
54 }
Mirko Bonadei06d35592020-04-01 13:43:08 +020055 if (absl::StartsWith(if_name, "cellular")) {
Honghai Zhang351d77b2016-05-20 15:08:29 -070056 return ADAPTER_TYPE_CELLULAR;
57 }
honghaiza7ad7c32016-02-02 12:54:14 -080058 return ADAPTER_TYPE_UNKNOWN;
59 }
honghaizcec0a082016-01-15 14:49:09 -080060
61 private:
62 bool started_ = false;
honghaiz023f3ef2015-10-19 09:39:32 -070063};
64
65class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
66 public:
67 FakeNetworkMonitorFactory() {}
honghaizcec0a082016-01-15 14:49:09 -080068 NetworkMonitorInterface* CreateNetworkMonitor() override {
honghaiz023f3ef2015-10-19 09:39:32 -070069 return new FakeNetworkMonitor();
70 }
71};
72
Qingsi Wang10a0e512018-05-16 13:37:03 -070073bool SameNameAndPrefix(const rtc::Network& a, const rtc::Network& b) {
74 if (a.name() != b.name()) {
75 RTC_LOG(INFO) << "Different interface names.";
76 return false;
77 }
78 if (a.prefix_length() != b.prefix_length() || a.prefix() != b.prefix()) {
79 RTC_LOG(INFO) << "Different IP prefixes.";
80 return false;
81 }
82 return true;
83}
84
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080085} // namespace
86
Mirko Bonadei6a489f22019-04-09 15:11:12 +020087class NetworkTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000088 public:
89 NetworkTest() : callback_called_(false) {}
90
Yves Gerey665174f2018-06-19 15:03:05 +020091 void OnNetworksChanged() { callback_called_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000092
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +000093 NetworkManager::Stats MergeNetworkList(
94 BasicNetworkManager& network_manager,
95 const NetworkManager::NetworkList& list,
96 bool* changed) {
97 NetworkManager::Stats stats;
98 network_manager.MergeNetworkList(list, changed, &stats);
99 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100 }
101
102 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
103 const Network& network) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700104 RTC_DCHECK_RUN_ON(network_manager.thread_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105 return network_manager.IsIgnoredNetwork(network);
106 }
107
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700108 IPAddress QueryDefaultLocalAddress(BasicNetworkManager& network_manager,
109 int family) {
110 RTC_DCHECK_RUN_ON(network_manager.thread_);
111 return network_manager.QueryDefaultLocalAddress(family);
112 }
113
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 NetworkManager::NetworkList GetNetworks(
Yves Gerey665174f2018-06-19 15:03:05 +0200115 const BasicNetworkManager& network_manager,
116 bool include_ignored) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700117 RTC_DCHECK_RUN_ON(network_manager.thread_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118 NetworkManager::NetworkList list;
119 network_manager.CreateNetworks(include_ignored, &list);
120 return list;
121 }
122
honghaizcec0a082016-01-15 14:49:09 -0800123 FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700124 RTC_DCHECK_RUN_ON(network_manager.thread_);
honghaizcec0a082016-01-15 14:49:09 -0800125 return static_cast<FakeNetworkMonitor*>(
126 network_manager.network_monitor_.get());
honghaiz023f3ef2015-10-19 09:39:32 -0700127 }
128 void ClearNetworks(BasicNetworkManager& network_manager) {
129 for (const auto& kv : network_manager.networks_map_) {
130 delete kv.second;
131 }
132 network_manager.networks_.clear();
133 network_manager.networks_map_.clear();
134 }
135
Honghai Zhang351d77b2016-05-20 15:08:29 -0700136 AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
137 BasicNetworkManager::NetworkList list;
138 network_manager.GetNetworks(&list);
nissec16fa5e2017-02-07 07:18:43 -0800139 RTC_CHECK_EQ(1, list.size());
Honghai Zhang351d77b2016-05-20 15:08:29 -0700140 return list[0]->type();
141 }
142
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000143#if defined(WEBRTC_POSIX)
144 // Separated from CreateNetworks for tests.
145 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
146 struct ifaddrs* interfaces,
147 bool include_ignored,
148 NetworkManager::NetworkList* networks) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700149 RTC_DCHECK_RUN_ON(network_manager.thread_);
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800150 // Use the base IfAddrsConverter for test cases.
jbauch555604a2016-04-26 03:13:22 -0700151 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800152 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
153 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154 }
honghaizdb8cf502015-12-21 13:08:46 -0800155
156 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string,
157 uint32_t scope_id) {
Yves Gerey665174f2018-06-19 15:03:05 +0200158 struct sockaddr_in6* ipv6_addr =
159 static_cast<struct sockaddr_in6*>(malloc(sizeof(struct sockaddr_in6)));
honghaizdb8cf502015-12-21 13:08:46 -0800160 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
161 ipv6_addr->sin6_family = AF_INET6;
162 ipv6_addr->sin6_scope_id = scope_id;
163 IPAddress ip;
164 IPFromString(ip_string, &ip);
165 ipv6_addr->sin6_addr = ip.ipv6_address();
166 return ipv6_addr;
167 }
168
169 // Pointers created here need to be released via ReleaseIfAddrs.
170 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
171 char* if_name,
172 const std::string& ipv6_address,
173 const std::string& ipv6_netmask,
174 uint32_t scope_id) {
175 struct ifaddrs* if_addr = new struct ifaddrs;
176 memset(if_addr, 0, sizeof(struct ifaddrs));
177 if_addr->ifa_name = if_name;
178 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
179 CreateIpv6Addr(ipv6_address, scope_id));
180 if_addr->ifa_netmask =
181 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
182 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800183 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 13:08:46 -0800184 return if_addr;
185 }
186
Honghai Zhang351d77b2016-05-20 15:08:29 -0700187 struct ifaddrs* InstallIpv6Network(char* if_name,
188 const std::string& ipv6_address,
189 const std::string& ipv6_mask,
190 BasicNetworkManager& network_manager) {
191 ifaddrs* addr_list = nullptr;
192 addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
193 NetworkManager::NetworkList result;
194 bool changed;
195 NetworkManager::Stats stats;
196 CallConvertIfAddrs(network_manager, addr_list, true, &result);
197 network_manager.MergeNetworkList(result, &changed, &stats);
198 return addr_list;
199 }
200
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800201 struct sockaddr_in* CreateIpv4Addr(const std::string& ip_string) {
202 struct sockaddr_in* ipv4_addr =
203 static_cast<struct sockaddr_in*>(malloc(sizeof(struct sockaddr_in)));
204 memset(ipv4_addr, 0, sizeof(struct sockaddr_in));
205 ipv4_addr->sin_family = AF_INET;
206 IPAddress ip;
207 IPFromString(ip_string, &ip);
208 ipv4_addr->sin_addr = ip.ipv4_address();
209 return ipv4_addr;
210 }
211
212 // Pointers created here need to be released via ReleaseIfAddrs.
213 struct ifaddrs* AddIpv4Address(struct ifaddrs* list,
214 char* if_name,
215 const std::string& ipv4_address,
216 const std::string& ipv4_netmask) {
217 struct ifaddrs* if_addr = new struct ifaddrs;
218 memset(if_addr, 0, sizeof(struct ifaddrs));
219 if_addr->ifa_name = if_name;
220 if_addr->ifa_addr =
221 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_address));
222 if_addr->ifa_netmask =
223 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_netmask));
224 if_addr->ifa_next = list;
225 if_addr->ifa_flags = IFF_RUNNING;
226 return if_addr;
227 }
228
229 struct ifaddrs* InstallIpv4Network(char* if_name,
230 const std::string& ipv4_address,
231 const std::string& ipv4_mask,
232 BasicNetworkManager& network_manager) {
233 ifaddrs* addr_list = nullptr;
234 addr_list = AddIpv4Address(addr_list, if_name, ipv4_address, ipv4_mask);
235 NetworkManager::NetworkList result;
236 bool changed;
237 NetworkManager::Stats stats;
238 CallConvertIfAddrs(network_manager, addr_list, true, &result);
239 network_manager.MergeNetworkList(result, &changed, &stats);
240 return addr_list;
241 }
242
honghaizdb8cf502015-12-21 13:08:46 -0800243 void ReleaseIfAddrs(struct ifaddrs* list) {
244 struct ifaddrs* if_addr = list;
245 while (if_addr != nullptr) {
246 struct ifaddrs* next_addr = if_addr->ifa_next;
oprypin1ea631f2017-08-18 00:15:19 -0700247 free(if_addr->ifa_addr);
248 free(if_addr->ifa_netmask);
honghaizdb8cf502015-12-21 13:08:46 -0800249 delete if_addr;
250 if_addr = next_addr;
251 }
252 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000253#endif // defined(WEBRTC_POSIX)
254
255 protected:
256 bool callback_called_;
257};
258
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800259class TestBasicNetworkManager : public BasicNetworkManager {
260 public:
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700261 TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory)
262 : BasicNetworkManager(network_monitor_factory) {}
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800263 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800264 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800265};
266
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000267// Test that the Network ctor works properly.
268TEST_F(NetworkTest, TestNetworkConstruct) {
269 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
270 IPAddress(0x12345600U), 24);
271 EXPECT_EQ("test_eth0", ipv4_network1.name());
272 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
273 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
274 EXPECT_EQ(24, ipv4_network1.prefix_length());
275 EXPECT_FALSE(ipv4_network1.ignored());
276}
277
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000278TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
279 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
280 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000281 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000282 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000283 BasicNetworkManager network_manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700284 network_manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000285 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
286 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
287}
288
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000289// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000290TEST_F(NetworkTest, TestIgnoreList) {
Yves Gerey665174f2018-06-19 15:03:05 +0200291 Network ignore_me("ignore_me", "Ignore me please!", IPAddress(0x12345600U),
292 24);
293 Network include_me("include_me", "Include me please!", IPAddress(0x12345600U),
294 24);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700295 BasicNetworkManager default_network_manager;
296 default_network_manager.StartUpdating();
297 EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, ignore_me));
298 EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, include_me));
299
300 BasicNetworkManager ignoring_network_manager;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000301 std::vector<std::string> ignore_list;
302 ignore_list.push_back("ignore_me");
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700303 ignoring_network_manager.set_network_ignore_list(ignore_list);
304 ignoring_network_manager.StartUpdating();
305 EXPECT_TRUE(IsIgnoredNetwork(ignoring_network_manager, ignore_me));
306 EXPECT_FALSE(IsIgnoredNetwork(ignoring_network_manager, include_me));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000307}
308
309// Test is failing on Windows opt: b/11288214
310TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
311 BasicNetworkManager manager;
312 NetworkManager::NetworkList result = GetNetworks(manager, true);
313 // We should be able to bind to any addresses we find.
314 NetworkManager::NetworkList::iterator it;
Yves Gerey665174f2018-06-19 15:03:05 +0200315 for (it = result.begin(); it != result.end(); ++it) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000316 sockaddr_storage storage;
317 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000318 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000319 SocketAddress bindaddress(ip, 0);
320 bindaddress.SetScopeID((*it)->scope_id());
321 // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
322 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
323 if (fd > 0) {
324 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
325 EXPECT_GE(ipsize, 0U);
Yves Gerey665174f2018-06-19 15:03:05 +0200326 int success = ::bind(fd, reinterpret_cast<sockaddr*>(&storage),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000327 static_cast<int>(ipsize));
328#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 11:09:25 +0100329 if (success)
330 RTC_LOG_GLE(LS_ERROR) << "Socket bind failed.";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000331#endif
332 EXPECT_EQ(0, success);
333#if defined(WEBRTC_WIN)
334 closesocket(fd);
335#else
336 close(fd);
337#endif
338 }
339 delete (*it);
340 }
341}
342
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700343// Test StartUpdating() and StopUpdating(). network_permission_state starts with
344// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000345TEST_F(NetworkTest, TestUpdateNetworks) {
346 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200347 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
348 &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700349 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
350 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000351 manager.StartUpdating();
352 Thread::Current()->ProcessMessages(0);
353 EXPECT_TRUE(callback_called_);
354 callback_called_ = false;
355 // Callback should be triggered immediately when StartUpdating
356 // is called, after network update signal is already sent.
357 manager.StartUpdating();
358 EXPECT_TRUE(manager.started());
359 Thread::Current()->ProcessMessages(0);
360 EXPECT_TRUE(callback_called_);
361 manager.StopUpdating();
362 EXPECT_TRUE(manager.started());
363 manager.StopUpdating();
guoweisea1012b2015-08-21 09:06:28 -0700364 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
365 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000366 EXPECT_FALSE(manager.started());
367 manager.StopUpdating();
368 EXPECT_FALSE(manager.started());
369 callback_called_ = false;
370 // Callback should be triggered immediately after StartUpdating is called
371 // when start_count_ is reset to 0.
372 manager.StartUpdating();
373 Thread::Current()->ProcessMessages(0);
374 EXPECT_TRUE(callback_called_);
375}
376
377// Verify that MergeNetworkList() merges network lists properly.
378TEST_F(NetworkTest, TestBasicMergeNetworkList) {
379 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
380 IPAddress(0x12345600U), 24);
381 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
382 IPAddress(0x00010000U), 16);
383 ipv4_network1.AddIP(IPAddress(0x12345678));
384 ipv4_network2.AddIP(IPAddress(0x00010004));
385 BasicNetworkManager manager;
386
387 // Add ipv4_network1 to the list of networks.
388 NetworkManager::NetworkList list;
389 list.push_back(new Network(ipv4_network1));
390 bool changed;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000391 NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000392 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000393 EXPECT_EQ(stats.ipv6_network_count, 0);
394 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395 list.clear();
396
397 manager.GetNetworks(&list);
398 EXPECT_EQ(1U, list.size());
Qingsi Wang10a0e512018-05-16 13:37:03 -0700399 EXPECT_TRUE(SameNameAndPrefix(ipv4_network1, *list[0]));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400 Network* net1 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700401 uint16_t net_id1 = net1->id();
402 EXPECT_EQ(1, net_id1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000403 list.clear();
404
405 // Replace ipv4_network1 with ipv4_network2.
406 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000407 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000408 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000409 EXPECT_EQ(stats.ipv6_network_count, 0);
410 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000411 list.clear();
412
413 manager.GetNetworks(&list);
414 EXPECT_EQ(1U, list.size());
Qingsi Wang10a0e512018-05-16 13:37:03 -0700415 EXPECT_TRUE(SameNameAndPrefix(ipv4_network2, *list[0]));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000416 Network* net2 = list[0];
honghaiza0c44ea2016-03-23 16:07:48 -0700417 uint16_t net_id2 = net2->id();
418 // Network id will increase.
419 EXPECT_LT(net_id1, net_id2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000420 list.clear();
421
422 // Add Network2 back.
423 list.push_back(new Network(ipv4_network1));
424 list.push_back(new Network(ipv4_network2));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000425 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000426 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000427 EXPECT_EQ(stats.ipv6_network_count, 0);
428 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000429 list.clear();
430
431 // Verify that we get previous instances of Network objects.
432 manager.GetNetworks(&list);
433 EXPECT_EQ(2U, list.size());
434 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
435 (net1 == list[1] && net2 == list[0]));
honghaiza0c44ea2016-03-23 16:07:48 -0700436 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
437 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000438 list.clear();
439
440 // Call MergeNetworkList() again and verify that we don't get update
441 // notification.
442 list.push_back(new Network(ipv4_network2));
443 list.push_back(new Network(ipv4_network1));
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000444 stats = MergeNetworkList(manager, list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000445 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000446 EXPECT_EQ(stats.ipv6_network_count, 0);
447 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000448 list.clear();
449
450 // Verify that we get previous instances of Network objects.
451 manager.GetNetworks(&list);
452 EXPECT_EQ(2U, list.size());
453 EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
454 (net1 == list[1] && net2 == list[0]));
Olga Sharonovaf74d2ce2020-03-30 08:20:05 +0000455 EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
456 (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000457 list.clear();
458}
459
460// Sets up some test IPv6 networks and appends them to list.
461// Four networks are added - public and link local, for two interfaces.
462void SetupNetworks(NetworkManager::NetworkList* list) {
463 IPAddress ip;
464 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000465 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
466 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000467 // First, fake link-locals.
468 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
469 prefix, 64);
470 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000471 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000472 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
473 prefix, 64);
474 ipv6_eth1_linklocalnetwork.AddIP(ip);
475 // Public networks:
476 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
477 prefix = TruncateIP(ip, 64);
478 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
479 prefix, 64);
480 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
481 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
482 prefix = TruncateIP(ip, 64);
483 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
484 prefix, 64);
485 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
486 list->push_back(new Network(ipv6_eth0_linklocalnetwork));
487 list->push_back(new Network(ipv6_eth1_linklocalnetwork));
488 list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
489 list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
490}
491
492// Test that the basic network merging case works.
493TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
494 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200495 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
496 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000497 NetworkManager::NetworkList original_list;
498 SetupNetworks(&original_list);
499 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000500 NetworkManager::Stats stats =
501 MergeNetworkList(manager, original_list, &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000502 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000503 EXPECT_EQ(stats.ipv6_network_count, 4);
504 EXPECT_EQ(stats.ipv4_network_count, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000505 NetworkManager::NetworkList list;
506 manager.GetNetworks(&list);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000507 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700508 EXPECT_THAT(list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000509}
510
511// Tests that when two network lists that describe the same set of networks are
512// merged, that the changed callback is not called, and that the original
513// objects remain in the result list.
514TEST_F(NetworkTest, TestNoChangeMerge) {
515 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200516 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
517 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000518 NetworkManager::NetworkList original_list;
519 SetupNetworks(&original_list);
520 bool changed = false;
521 MergeNetworkList(manager, original_list, &changed);
522 EXPECT_TRUE(changed);
523 // Second list that describes the same networks but with new objects.
524 NetworkManager::NetworkList second_list;
525 SetupNetworks(&second_list);
526 changed = false;
527 MergeNetworkList(manager, second_list, &changed);
528 EXPECT_FALSE(changed);
529 NetworkManager::NetworkList resulting_list;
530 manager.GetNetworks(&resulting_list);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000531 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700532 EXPECT_THAT(resulting_list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000533 // Doublecheck that the new networks aren't in the list.
Steve Anton2acd1632019-03-25 13:48:30 -0700534 for (const Network* network : second_list) {
535 EXPECT_THAT(resulting_list, Not(Contains(network)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000536 }
537}
538
539// Test that we can merge a network that is the same as another network but with
540// a different IP. The original network should remain in the list, but have its
541// IP changed.
542TEST_F(NetworkTest, MergeWithChangedIP) {
543 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200544 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
545 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000546 NetworkManager::NetworkList original_list;
547 SetupNetworks(&original_list);
548 // Make a network that we're going to change.
549 IPAddress ip;
550 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
551 IPAddress prefix = TruncateIP(ip, 64);
Yves Gerey665174f2018-06-19 15:03:05 +0200552 Network* network_to_change =
553 new Network("test_eth0", "Test Network Adapter 1", prefix, 64);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000554 Network* changed_network = new Network(*network_to_change);
555 network_to_change->AddIP(ip);
556 IPAddress changed_ip;
557 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
558 changed_network->AddIP(changed_ip);
559 original_list.push_back(network_to_change);
560 bool changed = false;
561 MergeNetworkList(manager, original_list, &changed);
562 NetworkManager::NetworkList second_list;
563 SetupNetworks(&second_list);
564 second_list.push_back(changed_network);
565 changed = false;
566 MergeNetworkList(manager, second_list, &changed);
567 EXPECT_TRUE(changed);
568 NetworkManager::NetworkList list;
569 manager.GetNetworks(&list);
570 EXPECT_EQ(original_list.size(), list.size());
571 // Make sure the original network is still in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700572 EXPECT_THAT(list, Contains(network_to_change));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000573 EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
574}
575
576// Testing a similar case to above, but checking that a network can be updated
577// with additional IPs (not just a replacement).
578TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
579 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200580 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
581 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000582 NetworkManager::NetworkList original_list;
583 SetupNetworks(&original_list);
584 bool changed = false;
585 MergeNetworkList(manager, original_list, &changed);
586 EXPECT_TRUE(changed);
587 IPAddress ip;
588 IPAddress check_ip;
589 IPAddress prefix;
590 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
591 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
592 prefix = TruncateIP(ip, 64);
593 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
594 prefix, 64);
595 // This is the IP that already existed in the public network on eth0.
596 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
597 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
598 original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
599 changed = false;
600 MergeNetworkList(manager, original_list, &changed);
601 EXPECT_TRUE(changed);
602 // There should still be four networks.
603 NetworkManager::NetworkList list;
604 manager.GetNetworks(&list);
605 EXPECT_EQ(4U, list.size());
606 // Check the gathered IPs.
607 int matchcount = 0;
608 for (NetworkManager::NetworkList::iterator it = list.begin();
609 it != list.end(); ++it) {
Qingsi Wang10a0e512018-05-16 13:37:03 -0700610 if (SameNameAndPrefix(**it, *original_list[2])) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000611 ++matchcount;
612 EXPECT_EQ(1, matchcount);
613 // This should be the same network object as before.
614 EXPECT_EQ((*it), original_list[2]);
615 // But with two addresses now.
Steve Anton2acd1632019-03-25 13:48:30 -0700616 EXPECT_THAT((*it)->GetIPs(),
617 UnorderedElementsAre(InterfaceAddress(check_ip),
618 InterfaceAddress(ip)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000619 } else {
620 // Check the IP didn't get added anywhere it wasn't supposed to.
Steve Anton2acd1632019-03-25 13:48:30 -0700621 EXPECT_THAT((*it)->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000622 }
623 }
624}
625
626// Test that merge correctly distinguishes multiple networks on an interface.
627TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
628 BasicNetworkManager manager;
Yves Gerey665174f2018-06-19 15:03:05 +0200629 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
630 &NetworkTest::OnNetworksChanged);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000631 NetworkManager::NetworkList original_list;
632 SetupNetworks(&original_list);
633 bool changed = false;
634 MergeNetworkList(manager, original_list, &changed);
635 EXPECT_TRUE(changed);
636 IPAddress ip;
637 IPAddress prefix;
638 // A second network for eth0.
639 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
640 prefix = TruncateIP(ip, 64);
641 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
642 prefix, 64);
643 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
644 original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
645 changed = false;
646 MergeNetworkList(manager, original_list, &changed);
647 EXPECT_TRUE(changed);
648 // There should be five networks now.
649 NetworkManager::NetworkList list;
650 manager.GetNetworks(&list);
651 EXPECT_EQ(5U, list.size());
652 // Check the resulting addresses.
653 for (NetworkManager::NetworkList::iterator it = list.begin();
654 it != list.end(); ++it) {
655 if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
656 (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
657 // Check the new network has 1 IP and that it's the correct one.
658 EXPECT_EQ(1U, (*it)->GetIPs().size());
659 EXPECT_EQ(ip, (*it)->GetIPs().at(0));
660 } else {
661 // Check the IP didn't get added anywhere it wasn't supposed to.
Steve Anton2acd1632019-03-25 13:48:30 -0700662 EXPECT_THAT((*it)->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000663 }
664 }
665}
666
honghaizdb8cf502015-12-21 13:08:46 -0800667// Test that DumpNetworks does not crash.
668TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000669 BasicNetworkManager manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700670 manager.StartUpdating();
honghaizdb8cf502015-12-21 13:08:46 -0800671 NetworkManager::NetworkList list = GetNetworks(manager, true);
672 bool changed;
673 MergeNetworkList(manager, list, &changed);
674 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000675}
676
Mirko Bonadei44f0f872019-01-20 18:16:42 +0100677TEST_F(NetworkTest, TestIPv6Toggle) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000678 BasicNetworkManager manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700679 manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000680 bool ipv6_found = false;
681 NetworkManager::NetworkList list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000682 list = GetNetworks(manager, true);
683 for (NetworkManager::NetworkList::iterator it = list.begin();
684 it != list.end(); ++it) {
685 if ((*it)->prefix().family() == AF_INET6) {
686 ipv6_found = true;
687 break;
688 }
689 }
690 EXPECT_TRUE(ipv6_found);
691 for (NetworkManager::NetworkList::iterator it = list.begin();
692 it != list.end(); ++it) {
693 delete (*it);
694 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000695}
696
deadbeef3427f532017-07-26 16:09:33 -0700697// Test that when network interfaces are sorted and given preference values,
698// IPv6 comes first.
699TEST_F(NetworkTest, IPv6NetworksPreferredOverIPv4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000700 BasicNetworkManager manager;
701 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
702 IPAddress(0x12345600U), 24);
703 ipv4_network1.AddIP(IPAddress(0x12345600U));
704
705 IPAddress ip;
706 IPAddress prefix;
707 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
708 prefix = TruncateIP(ip, 64);
709 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
710 prefix, 64);
711 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
712
713 NetworkManager::NetworkList list;
714 list.push_back(new Network(ipv4_network1));
715 list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
716 Network* net1 = list[0];
717 Network* net2 = list[1];
718
719 bool changed = false;
720 MergeNetworkList(manager, list, &changed);
721 ASSERT_TRUE(changed);
722 // After sorting IPv6 network should be higher order than IPv4 networks.
723 EXPECT_TRUE(net1->preference() < net2->preference());
724}
725
deadbeef3427f532017-07-26 16:09:33 -0700726// When two interfaces are equivalent in everything but name, they're expected
727// to be preference-ordered by name. For example, "eth0" before "eth1".
728TEST_F(NetworkTest, NetworksSortedByInterfaceName) {
729 BasicNetworkManager manager;
730 Network* eth0 = new Network("test_eth0", "Test Network Adapter 1",
731 IPAddress(0x65432100U), 24);
732 eth0->AddIP(IPAddress(0x65432100U));
733 Network* eth1 = new Network("test_eth1", "Test Network Adapter 2",
734 IPAddress(0x12345600U), 24);
735 eth1->AddIP(IPAddress(0x12345600U));
736 NetworkManager::NetworkList list;
737 // Add them to the list in the opposite of the expected sorted order, to
738 // ensure sorting actually occurs.
739 list.push_back(eth1);
740 list.push_back(eth0);
741
742 bool changed = false;
743 MergeNetworkList(manager, list, &changed);
744 ASSERT_TRUE(changed);
745 // "test_eth0" should be preferred over "test_eth1".
746 EXPECT_TRUE(eth0->preference() > eth1->preference());
747}
748
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000749TEST_F(NetworkTest, TestNetworkAdapterTypes) {
750 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
751 ADAPTER_TYPE_WIFI);
752 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
753 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
754 ADAPTER_TYPE_ETHERNET);
755 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
756 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
757 ADAPTER_TYPE_CELLULAR);
758 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
759 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
760 ADAPTER_TYPE_VPN);
761 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
762 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
763 ADAPTER_TYPE_UNKNOWN);
764 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
765}
766
767#if defined(WEBRTC_POSIX)
768// Verify that we correctly handle interfaces with no address.
769TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
770 ifaddrs list;
771 memset(&list, 0, sizeof(list));
772 list.ifa_name = const_cast<char*>("test_iface");
773
774 NetworkManager::NetworkList result;
775 BasicNetworkManager manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700776 manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000777 CallConvertIfAddrs(manager, &list, true, &result);
778 EXPECT_TRUE(result.empty());
779}
honghaizdb8cf502015-12-21 13:08:46 -0800780
781// Verify that if there are two addresses on one interface, only one network
782// is generated.
783TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
784 char if_name[20] = "rmnet0";
785 ifaddrs* list = nullptr;
786 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
787 "FFFF:FFFF:FFFF:FFFF::", 0);
788 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
789 "FFFF:FFFF:FFFF:FFFF::", 0);
790 NetworkManager::NetworkList result;
791 BasicNetworkManager manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700792 manager.StartUpdating();
honghaizdb8cf502015-12-21 13:08:46 -0800793 CallConvertIfAddrs(manager, list, true, &result);
794 EXPECT_EQ(1U, result.size());
795 bool changed;
796 // This ensures we release the objects created in CallConvertIfAddrs.
797 MergeNetworkList(manager, result, &changed);
798 ReleaseIfAddrs(list);
799}
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800800
801TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
802 ifaddrs list;
803 memset(&list, 0, sizeof(list));
804 list.ifa_name = const_cast<char*>("test_iface");
805 sockaddr ifa_addr;
806 sockaddr ifa_netmask;
807 list.ifa_addr = &ifa_addr;
808 list.ifa_netmask = &ifa_netmask;
809
810 NetworkManager::NetworkList result;
811 BasicNetworkManager manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700812 manager.StartUpdating();
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800813 CallConvertIfAddrs(manager, &list, true, &result);
814 EXPECT_TRUE(result.empty());
815}
Honghai Zhang351d77b2016-05-20 15:08:29 -0700816
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700817// Tests that the network type can be determined from the network monitor when
818// it would otherwise be unknown.
Honghai Zhang351d77b2016-05-20 15:08:29 -0700819TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700820 char if_name[20] = "wifi0";
821 std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700822 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700823 BasicNetworkManager manager_without_monitor;
824 manager_without_monitor.StartUpdating();
825 // A network created without a network monitor will get UNKNOWN type.
826 ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
827 manager_without_monitor);
828 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager_without_monitor));
Honghai Zhang351d77b2016-05-20 15:08:29 -0700829 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700830
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700831 // With the fake network monitor the type should be correctly determined.
832 FakeNetworkMonitorFactory factory;
833 BasicNetworkManager manager_with_monitor(&factory);
834 manager_with_monitor.StartUpdating();
Honghai Zhang351d77b2016-05-20 15:08:29 -0700835 // Add the same ipv6 address as before but it has the right network type
836 // detected by the network monitor now.
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700837 addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
838 manager_with_monitor);
839 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager_with_monitor));
Honghai Zhang351d77b2016-05-20 15:08:29 -0700840 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700841}
842
843// Test that the network type can be determined based on name matching in
844// a few cases. Note that UNKNOWN type for non-matching strings has been tested
845// in the above test.
846TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800847 std::string ipv4_address1 = "192.0.0.121";
848 std::string ipv4_mask = "255.255.255.0";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700849 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
850 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
851 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
852 BasicNetworkManager manager;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700853 manager.StartUpdating();
Honghai Zhang351d77b2016-05-20 15:08:29 -0700854
deadbeef4cd599f2017-07-27 15:05:29 -0700855 // IPSec interface; name is in form "ipsec<index>".
856 char if_name[20] = "ipsec11";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700857 ifaddrs* addr_list =
858 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
deadbeef4cd599f2017-07-27 15:05:29 -0700859 EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
860 ClearNetworks(manager);
861 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700862
Qingsi Wange53ac042018-05-08 11:55:07 -0700863 strcpy(if_name, "lo0");
864 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
865 EXPECT_EQ(ADAPTER_TYPE_LOOPBACK, GetAdapterType(manager));
866 ClearNetworks(manager);
867 ReleaseIfAddrs(addr_list);
868
869 strcpy(if_name, "eth0");
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800870 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
Qingsi Wange53ac042018-05-08 11:55:07 -0700871 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, GetAdapterType(manager));
872 ClearNetworks(manager);
873 ReleaseIfAddrs(addr_list);
874
Qingsi Wangc5bc9d62019-09-25 15:03:19 -0700875 strcpy(if_name, "wlan0");
876 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
877 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
878 ClearNetworks(manager);
879 ReleaseIfAddrs(addr_list);
880
deadbeef4cd599f2017-07-27 15:05:29 -0700881#if defined(WEBRTC_IOS)
882 strcpy(if_name, "pdp_ip0");
883 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700884 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
885 ClearNetworks(manager);
886 ReleaseIfAddrs(addr_list);
887
Honghai Zhang63ab8102016-05-26 20:30:15 -0700888 strcpy(if_name, "en0");
889 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
890 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
891 ClearNetworks(manager);
892 ReleaseIfAddrs(addr_list);
893
Honghai Zhang351d77b2016-05-20 15:08:29 -0700894#elif defined(WEBRTC_ANDROID)
deadbeef4cd599f2017-07-27 15:05:29 -0700895 strcpy(if_name, "rmnet0");
896 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700897 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
898 ClearNetworks(manager);
899 ReleaseIfAddrs(addr_list);
900
Honghai Zhang351d77b2016-05-20 15:08:29 -0700901 strcpy(if_name, "v4-rmnet_data0");
902 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
903 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
904 ClearNetworks(manager);
905 ReleaseIfAddrs(addr_list);
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800906
907 strcpy(if_name, "clat4");
908 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
909 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
910 ClearNetworks(manager);
911 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700912#endif
913}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000914#endif // defined(WEBRTC_POSIX)
915
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000916// Test MergeNetworkList successfully combines all IPs for the same
917// prefix/length into a single Network.
918TEST_F(NetworkTest, TestMergeNetworkList) {
919 BasicNetworkManager manager;
920 NetworkManager::NetworkList list;
921
922 // Create 2 IPAddress classes with only last digit different.
923 IPAddress ip1, ip2;
924 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
925 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
926
927 // Create 2 networks with the same prefix and length.
928 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
929 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
930
931 // Add different IP into each.
932 net1->AddIP(ip1);
933 net2->AddIP(ip2);
934
935 list.push_back(net1);
936 list.push_back(net2);
937 bool changed;
938 MergeNetworkList(manager, list, &changed);
939 EXPECT_TRUE(changed);
940
941 NetworkManager::NetworkList list2;
942 manager.GetNetworks(&list2);
943
944 // Make sure the resulted networklist has only 1 element and 2
945 // IPAddresses.
946 EXPECT_EQ(list2.size(), 1uL);
947 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
Taylor Brandstetter01cb5f22018-03-07 15:49:32 -0800948 EXPECT_EQ(list2[0]->GetIPs()[0], InterfaceAddress(ip1));
949 EXPECT_EQ(list2[0]->GetIPs()[1], InterfaceAddress(ip2));
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +0000950}
951
honghaizdb8cf502015-12-21 13:08:46 -0800952// Test that MergeNetworkList successfully detects the change if
953// a network becomes inactive and then active again.
954TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
955 BasicNetworkManager manager;
956 Network network1("test_wifi", "Test Network Adapter 1",
957 IPAddress(0x12345600U), 24);
958 Network network2("test_eth0", "Test Network Adapter 2",
959 IPAddress(0x00010000U), 16);
960 network1.AddIP(IPAddress(0x12345678));
961 network2.AddIP(IPAddress(0x00010004));
962 NetworkManager::NetworkList list;
963 Network* net1 = new Network(network1);
964 list.push_back(net1);
965 bool changed;
966 MergeNetworkList(manager, list, &changed);
967 EXPECT_TRUE(changed);
968 list.clear();
969 manager.GetNetworks(&list);
970 ASSERT_EQ(1U, list.size());
971 EXPECT_EQ(net1, list[0]);
972
973 list.clear();
974 Network* net2 = new Network(network2);
975 list.push_back(net2);
976 MergeNetworkList(manager, list, &changed);
977 EXPECT_TRUE(changed);
978 list.clear();
979 manager.GetNetworks(&list);
980 ASSERT_EQ(1U, list.size());
981 EXPECT_EQ(net2, list[0]);
982
983 // Now network1 is inactive. Try to merge it again.
984 list.clear();
985 list.push_back(new Network(network1));
986 MergeNetworkList(manager, list, &changed);
987 EXPECT_TRUE(changed);
988 list.clear();
989 manager.GetNetworks(&list);
990 ASSERT_EQ(1U, list.size());
991 EXPECT_TRUE(list[0]->active());
992 EXPECT_EQ(net1, list[0]);
993}
994
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000995// Test that the filtering logic follows the defined ruleset in network.h.
996TEST_F(NetworkTest, TestIPv6Selection) {
997 InterfaceAddress ip;
998 std::string ipstr;
999
1000 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1001 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1002
1003 // Create a network with this prefix.
Yves Gerey665174f2018-06-19 15:03:05 +02001004 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
1005 64);
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001006
1007 // When there is no address added, it should return an unspecified
1008 // address.
1009 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1010 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1011
1012 // Deprecated one should not be returned.
1013 ipv6_network.AddIP(ip);
1014 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1015
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001016 // Add ULA one. ULA is unique local address which is starting either
1017 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001018 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1019 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1020 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001021 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001022
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001023 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001024 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1025 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1026 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001027 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001028
1029 // Add global dynamic temporary one.
1030 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1031 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1032 ipv6_network.AddIP(ip);
1033 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1034}
1035
honghaiz023f3ef2015-10-19 09:39:32 -07001036TEST_F(NetworkTest, TestNetworkMonitoring) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001037 FakeNetworkMonitorFactory factory;
1038 BasicNetworkManager manager(&factory);
honghaiz023f3ef2015-10-19 09:39:32 -07001039 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1040 &NetworkTest::OnNetworksChanged);
honghaiz023f3ef2015-10-19 09:39:32 -07001041 manager.StartUpdating();
honghaizcec0a082016-01-15 14:49:09 -08001042 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1043 EXPECT_TRUE(network_monitor && network_monitor->started());
honghaiz023f3ef2015-10-19 09:39:32 -07001044 EXPECT_TRUE_WAIT(callback_called_, 1000);
1045 callback_called_ = false;
1046
1047 // Clear the networks so that there will be network changes below.
1048 ClearNetworks(manager);
1049 // Network manager is started, so the callback is called when the network
1050 // monitor fires the network-change event.
1051 network_monitor->OnNetworksChanged();
1052 EXPECT_TRUE_WAIT(callback_called_, 1000);
1053
honghaizcec0a082016-01-15 14:49:09 -08001054 // Network manager is stopped.
honghaiz023f3ef2015-10-19 09:39:32 -07001055 manager.StopUpdating();
honghaizcec0a082016-01-15 14:49:09 -08001056 EXPECT_FALSE(GetNetworkMonitor(manager)->started());
honghaiz023f3ef2015-10-19 09:39:32 -07001057}
1058
Edward Lemur8dc945c2016-07-21 10:16:40 +02001059// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
1060#if defined(WEBRTC_ANDROID)
1061#define MAYBE_DefaultLocalAddress DISABLED_DefaultLocalAddress
1062#else
1063#define MAYBE_DefaultLocalAddress DefaultLocalAddress
1064#endif
1065TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001066 IPAddress ip;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001067 FakeNetworkMonitorFactory factory;
1068 TestBasicNetworkManager manager(&factory);
guoweis56271ed2016-01-15 14:45:06 -08001069 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1070 &NetworkTest::OnNetworksChanged);
guoweis56271ed2016-01-15 14:45:06 -08001071 manager.StartUpdating();
1072 EXPECT_TRUE_WAIT(callback_called_, 1000);
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001073
1074 // Make sure we can query default local address when an address for such
1075 // address family exists.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001076 std::vector<Network*> networks;
1077 manager.GetNetworks(&networks);
guoweis56271ed2016-01-15 14:45:06 -08001078 EXPECT_TRUE(!networks.empty());
Steve Anton9de3aac2017-10-24 10:08:26 -07001079 for (const auto* network : networks) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001080 if (network->GetBestIP().family() == AF_INET) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001081 EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET) != IPAddress());
guoweis56271ed2016-01-15 14:45:06 -08001082 } else if (network->GetBestIP().family() == AF_INET6 &&
1083 !IPIsLoopback(network->GetBestIP())) {
1084 // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
1085 // enabled.
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001086 EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET6) != IPAddress());
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001087 }
1088 }
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001089
1090 // GetDefaultLocalAddress should return the valid default address after set.
1091 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1092 GetLoopbackIP(AF_INET6));
1093 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1094 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1095 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1096 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
honghaizaf83fe62016-04-18 14:50:44 -07001097
1098 // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
1099 // default address may be different from the best IP address of any network.
1100 InterfaceAddress ip1;
1101 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
1102 IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
1103 // Create a network with a prefix of ip1.
1104 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
1105 64);
1106 IPAddress ip2;
1107 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
1108 ipv6_network.AddIP(ip1);
1109 ipv6_network.AddIP(ip2);
1110 BasicNetworkManager::NetworkList list(1, new Network(ipv6_network));
1111 bool changed;
1112 MergeNetworkList(manager, list, &changed);
1113 // If the set default address is not in any network, GetDefaultLocalAddress
1114 // should return it.
1115 IPAddress ip3;
1116 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
1117 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
1118 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1119 EXPECT_EQ(ip3, ip);
1120 // If the set default address is in a network, GetDefaultLocalAddress will
1121 // return the best IP in that network.
1122 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1123 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1124 EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1125
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001126 manager.StopUpdating();
1127}
1128
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001129// Test that MergeNetworkList does not set change = true
1130// when changing from cellular_X to cellular_Y.
1131TEST_F(NetworkTest, TestWhenNetworkListChangeReturnsChangedFlag) {
1132 BasicNetworkManager manager;
1133
1134 IPAddress ip1;
1135 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1136 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1137 net1->set_type(ADAPTER_TYPE_CELLULAR_3G);
1138 net1->AddIP(ip1);
1139 NetworkManager::NetworkList list;
1140 list.push_back(net1);
1141
1142 {
1143 bool changed;
1144 MergeNetworkList(manager, list, &changed);
1145 EXPECT_TRUE(changed);
1146 NetworkManager::NetworkList list2;
1147 manager.GetNetworks(&list2);
1148 EXPECT_EQ(list2.size(), 1uL);
1149 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_3G, list2[0]->type());
1150 }
1151
1152 // Modify net1 from 3G to 4G
1153 {
1154 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1155 net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1156 net2->AddIP(ip1);
1157 list.clear();
1158 list.push_back(net2);
1159 bool changed;
1160 MergeNetworkList(manager, list, &changed);
1161
1162 // Change from 3G to 4G shall not trigger OnNetworksChanged,
1163 // i.e changed = false.
1164 EXPECT_FALSE(changed);
1165 NetworkManager::NetworkList list2;
1166 manager.GetNetworks(&list2);
1167 ASSERT_EQ(list2.size(), 1uL);
1168 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1169 }
1170
1171 // Don't modify.
1172 {
1173 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1174 net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1175 net2->AddIP(ip1);
1176 list.clear();
1177 list.push_back(net2);
1178 bool changed;
1179 MergeNetworkList(manager, list, &changed);
1180
1181 // No change.
1182 EXPECT_FALSE(changed);
1183 NetworkManager::NetworkList list2;
1184 manager.GetNetworks(&list2);
1185 ASSERT_EQ(list2.size(), 1uL);
1186 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1187 }
1188}
1189
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001190} // namespace rtc