blob: d1999f349c79f6701206ce29a2fb8a87f9b04a23 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
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 04:47:3111#include "rtc_base/network.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2612
oprypin1ea631f2017-08-18 07:15:1913#include <stdlib.h>
14
Taylor Brandstetterea7fbfb2020-08-19 23:41:5415#include <algorithm>
jbauch555604a2016-04-26 10:13:2216#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:2617#include <vector>
oprypin1ea631f2017-08-18 07:15:1918
Taylor Brandstetterea7fbfb2020-08-19 23:41:5419#include "absl/algorithm/container.h"
Mirko Bonadei06d35592020-04-01 11:43:0820#include "absl/strings/match.h"
Ali Tofigh7fa90572022-03-17 14:47:4921#include "absl/strings/string_view.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 17:11:0023#include "rtc_base/net_helpers.h"
Christoffer Jansson8dc55682023-08-07 07:11:3424#include "rtc_base/net_test_helpers.h"
Steve Anton10542f22019-01-11 17:11:0025#include "rtc_base/network_monitor.h"
Taylor Brandstetter239ac8a2020-07-31 23:07:5226#include "rtc_base/network_monitor_factory.h"
Niels Mölleraa373162021-09-28 14:09:0727#include "rtc_base/physical_socket_server.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2628#if defined(WEBRTC_POSIX)
Henrik Kjellander00725112017-06-30 13:14:4529#include <net/if.h>
Yves Gerey665174f2018-06-19 13:03:0530#include <sys/types.h>
Jonas Olssona4d87372019-07-05 17:08:3331
Mirko Bonadei92ea95e2017-09-15 04:47:3132#include "rtc_base/ifaddrs_converter.h"
Guo-wei Shieh9faf1542015-12-28 22:06:5533#endif // defined(WEBRTC_POSIX)
Mirko Bonadei92ea95e2017-09-15 04:47:3134#include "rtc_base/gunit.h"
Steve Anton2acd1632019-03-25 20:48:3035#include "test/gmock.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2636#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 10:09:2537#include "rtc_base/logging.h" // For RTC_LOG_GLE
henrike@webrtc.orgf0488722014-05-13 18:00:2638#endif
Jonas Oreland47fa08f2020-12-05 17:09:1339#include "test/field_trial.h"
Jonas Orelandc06fe8b2022-03-28 12:58:2640#include "test/scoped_key_value_config.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2641
Steve Anton2acd1632019-03-25 20:48:3042using ::testing::Contains;
43using ::testing::Not;
44using ::testing::UnorderedElementsAre;
45using ::testing::UnorderedElementsAreArray;
46
henrike@webrtc.orgf0488722014-05-13 18:00:2647namespace rtc {
48
Christoffer Jansson8dc55682023-08-07 07:11:3449#define MAYBE_SKIP_IPV4 \
50 if (!HasIPv4Enabled()) { \
51 RTC_LOG(LS_INFO) << "No IPv4... skipping"; \
52 return; \
53 }
54
Guo-wei Shieh9faf1542015-12-28 22:06:5555namespace {
56
Ali Tofigh7fa90572022-03-17 14:47:4957IPAddress IPFromString(absl::string_view str) {
Jonas Oreland2ee0e642021-08-25 13:43:0258 IPAddress ip;
59 RTC_CHECK(IPFromString(str, &ip));
60 return ip;
61}
62
Taylor Brandstetter32eb03a2020-09-11 17:15:3063class FakeNetworkMonitor : public NetworkMonitorInterface {
honghaiz023f3ef2015-10-19 16:39:3264 public:
honghaizcec0a082016-01-15 22:49:0965 void Start() override { started_ = true; }
66 void Stop() override { started_ = false; }
67 bool started() { return started_; }
Jonas Oreland61dbcd12022-05-31 09:34:2068 InterfaceInfo GetInterfaceInfo(absl::string_view if_name) override {
69 InterfaceInfo if_info = {
70 .adapter_type = ADAPTER_TYPE_UNKNOWN,
71 .available = absl::c_count(unavailable_adapters_, if_name) == 0,
72 };
Mirko Bonadei06d35592020-04-01 11:43:0873 if (absl::StartsWith(if_name, "wifi")) {
Jonas Oreland61dbcd12022-05-31 09:34:2074 if_info.adapter_type = ADAPTER_TYPE_WIFI;
75 } else if (absl::StartsWith(if_name, "cellular")) {
76 if_info.adapter_type = ADAPTER_TYPE_CELLULAR;
Honghai Zhang351d77b2016-05-20 22:08:2977 }
Jonas Oreland61dbcd12022-05-31 09:34:2078 return if_info;
Taylor Brandstetterea7fbfb2020-08-19 23:41:5479 }
80
81 // Used to test IsAdapterAvailable.
82 void set_unavailable_adapters(std::vector<std::string> unavailable_adapters) {
83 unavailable_adapters_ = unavailable_adapters;
84 }
85
Jonas Oreland6ca955a2021-03-15 08:27:4386 bool SupportsBindSocketToNetwork() const override { return true; }
87
Ali Tofigh7fa90572022-03-17 14:47:4988 NetworkBindingResult BindSocketToNetwork(int socket_fd,
89 const IPAddress& address,
90 absl::string_view if_name) override {
Jonas Oreland6ca955a2021-03-15 08:27:4391 if (absl::c_count(addresses_, address) > 0) {
92 return NetworkBindingResult::SUCCESS;
93 }
94
95 for (auto const& iter : adapters_) {
Ali Tofigh7fa90572022-03-17 14:47:4996 if (if_name.find(iter) != absl::string_view::npos) {
Jonas Oreland6ca955a2021-03-15 08:27:4397 return NetworkBindingResult::SUCCESS;
98 }
99 }
100 return NetworkBindingResult::ADDRESS_NOT_FOUND;
101 }
102
103 void set_ip_addresses(std::vector<IPAddress> addresses) {
104 addresses_ = addresses;
105 }
106
107 void set_adapters(std::vector<std::string> adapters) { adapters_ = adapters; }
108
Mirko Bonadei37077932021-07-27 15:00:58109 void InovkeNetworksChangedCallbackForTesting() {
110 InvokeNetworksChangedCallback();
111 }
112
honghaizcec0a082016-01-15 22:49:09113 private:
114 bool started_ = false;
Jonas Oreland6ca955a2021-03-15 08:27:43115 std::vector<std::string> adapters_;
Taylor Brandstetterea7fbfb2020-08-19 23:41:54116 std::vector<std::string> unavailable_adapters_;
Jonas Oreland6ca955a2021-03-15 08:27:43117 std::vector<IPAddress> addresses_;
honghaiz023f3ef2015-10-19 16:39:32118};
119
120class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
121 public:
122 FakeNetworkMonitorFactory() {}
Jonas Orelandc06fe8b2022-03-28 12:58:26123 NetworkMonitorInterface* CreateNetworkMonitor(
Jonas Orelande62c2f22022-03-29 09:04:48124 const webrtc::FieldTrialsView& field_trials) override {
honghaiz023f3ef2015-10-19 16:39:32125 return new FakeNetworkMonitor();
126 }
127};
128
Qingsi Wang10a0e512018-05-16 20:37:03129bool SameNameAndPrefix(const rtc::Network& a, const rtc::Network& b) {
130 if (a.name() != b.name()) {
Harald Alvestrand97597c02021-11-04 12:01:23131 RTC_LOG(LS_INFO) << "Different interface names.";
Qingsi Wang10a0e512018-05-16 20:37:03132 return false;
133 }
134 if (a.prefix_length() != b.prefix_length() || a.prefix() != b.prefix()) {
Harald Alvestrand97597c02021-11-04 12:01:23135 RTC_LOG(LS_INFO) << "Different IP prefixes.";
Qingsi Wang10a0e512018-05-16 20:37:03136 return false;
137 }
138 return true;
139}
140
Niels Möllerd959f3a2022-04-19 09:29:19141std::vector<const Network*> CopyNetworkPointers(
142 const std::vector<std::unique_ptr<Network>>& owning_list) {
143 std::vector<const Network*> ptr_list;
144 ptr_list.reserve(owning_list.size());
145 for (const auto& network : owning_list) {
146 ptr_list.push_back(network.get());
147 }
148 return ptr_list;
149}
150
Guo-wei Shieh9faf1542015-12-28 22:06:55151} // namespace
152
Mirko Bonadei6a489f22019-04-09 13:11:12153class NetworkTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26154 public:
155 NetworkTest() : callback_called_(false) {}
156
Yves Gerey665174f2018-06-19 13:03:05157 void OnNetworksChanged() { callback_called_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26158
guoweis@webrtc.orga094cac2015-01-28 19:34:05159 NetworkManager::Stats MergeNetworkList(
160 BasicNetworkManager& network_manager,
Niels Möllerd959f3a2022-04-19 09:29:19161 std::vector<std::unique_ptr<Network>> list,
guoweis@webrtc.orga094cac2015-01-28 19:34:05162 bool* changed) {
163 NetworkManager::Stats stats;
Niels Möllerd959f3a2022-04-19 09:29:19164 network_manager.MergeNetworkList(std::move(list), changed, &stats);
guoweis@webrtc.orga094cac2015-01-28 19:34:05165 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26166 }
167
168 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
169 const Network& network) {
Taylor Brandstetter239ac8a2020-07-31 23:07:52170 RTC_DCHECK_RUN_ON(network_manager.thread_);
henrike@webrtc.orgf0488722014-05-13 18:00:26171 return network_manager.IsIgnoredNetwork(network);
172 }
173
Taylor Brandstetter239ac8a2020-07-31 23:07:52174 IPAddress QueryDefaultLocalAddress(BasicNetworkManager& network_manager,
175 int family) {
176 RTC_DCHECK_RUN_ON(network_manager.thread_);
177 return network_manager.QueryDefaultLocalAddress(family);
178 }
179
Niels Möllerd959f3a2022-04-19 09:29:19180 std::vector<std::unique_ptr<Network>> GetNetworks(
Yves Gerey665174f2018-06-19 13:03:05181 const BasicNetworkManager& network_manager,
182 bool include_ignored) {
Taylor Brandstetter239ac8a2020-07-31 23:07:52183 RTC_DCHECK_RUN_ON(network_manager.thread_);
Niels Möllerd959f3a2022-04-19 09:29:19184 std::vector<std::unique_ptr<Network>> list;
henrike@webrtc.orgf0488722014-05-13 18:00:26185 network_manager.CreateNetworks(include_ignored, &list);
186 return list;
187 }
188
honghaizcec0a082016-01-15 22:49:09189 FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
Taylor Brandstetter239ac8a2020-07-31 23:07:52190 RTC_DCHECK_RUN_ON(network_manager.thread_);
honghaizcec0a082016-01-15 22:49:09191 return static_cast<FakeNetworkMonitor*>(
192 network_manager.network_monitor_.get());
honghaiz023f3ef2015-10-19 16:39:32193 }
194 void ClearNetworks(BasicNetworkManager& network_manager) {
honghaiz023f3ef2015-10-19 16:39:32195 network_manager.networks_.clear();
196 network_manager.networks_map_.clear();
197 }
198
Honghai Zhang351d77b2016-05-20 22:08:29199 AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
Niels Möller22211442022-04-07 09:43:28200 std::vector<const Network*> list = network_manager.GetNetworks();
nissec16fa5e2017-02-07 15:18:43201 RTC_CHECK_EQ(1, list.size());
Honghai Zhang351d77b2016-05-20 22:08:29202 return list[0]->type();
203 }
204
henrike@webrtc.orgf0488722014-05-13 18:00:26205#if defined(WEBRTC_POSIX)
206 // Separated from CreateNetworks for tests.
Niels Möllerd959f3a2022-04-19 09:29:19207 static void CallConvertIfAddrs(
208 const BasicNetworkManager& network_manager,
209 struct ifaddrs* interfaces,
210 bool include_ignored,
211 std::vector<std::unique_ptr<Network>>* networks) {
Taylor Brandstetter239ac8a2020-07-31 23:07:52212 RTC_DCHECK_RUN_ON(network_manager.thread_);
Guo-wei Shieh9faf1542015-12-28 22:06:55213 // Use the base IfAddrsConverter for test cases.
jbauch555604a2016-04-26 10:13:22214 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
Guo-wei Shieh9faf1542015-12-28 22:06:55215 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
216 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26217 }
honghaizdb8cf502015-12-21 21:08:46218
Ali Tofigh7fa90572022-03-17 14:47:49219 struct sockaddr_in6* CreateIpv6Addr(absl::string_view ip_string,
honghaizdb8cf502015-12-21 21:08:46220 uint32_t scope_id) {
Yves Gerey665174f2018-06-19 13:03:05221 struct sockaddr_in6* ipv6_addr =
222 static_cast<struct sockaddr_in6*>(malloc(sizeof(struct sockaddr_in6)));
honghaizdb8cf502015-12-21 21:08:46223 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
224 ipv6_addr->sin6_family = AF_INET6;
225 ipv6_addr->sin6_scope_id = scope_id;
226 IPAddress ip;
227 IPFromString(ip_string, &ip);
228 ipv6_addr->sin6_addr = ip.ipv6_address();
229 return ipv6_addr;
230 }
231
232 // Pointers created here need to be released via ReleaseIfAddrs.
233 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
234 char* if_name,
Ali Tofigh7fa90572022-03-17 14:47:49235 absl::string_view ipv6_address,
236 absl::string_view ipv6_netmask,
honghaizdb8cf502015-12-21 21:08:46237 uint32_t scope_id) {
238 struct ifaddrs* if_addr = new struct ifaddrs;
239 memset(if_addr, 0, sizeof(struct ifaddrs));
240 if_addr->ifa_name = if_name;
241 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
242 CreateIpv6Addr(ipv6_address, scope_id));
243 if_addr->ifa_netmask =
244 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
245 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 22:06:55246 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 21:08:46247 return if_addr;
248 }
249
Honghai Zhang351d77b2016-05-20 22:08:29250 struct ifaddrs* InstallIpv6Network(char* if_name,
Ali Tofigh7fa90572022-03-17 14:47:49251 absl::string_view ipv6_address,
252 absl::string_view ipv6_mask,
Honghai Zhang351d77b2016-05-20 22:08:29253 BasicNetworkManager& network_manager) {
254 ifaddrs* addr_list = nullptr;
255 addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
Niels Möllerd959f3a2022-04-19 09:29:19256 std::vector<std::unique_ptr<Network>> result;
Honghai Zhang351d77b2016-05-20 22:08:29257 bool changed;
258 NetworkManager::Stats stats;
259 CallConvertIfAddrs(network_manager, addr_list, true, &result);
Niels Möllerd959f3a2022-04-19 09:29:19260 network_manager.MergeNetworkList(std::move(result), &changed, &stats);
Honghai Zhang351d77b2016-05-20 22:08:29261 return addr_list;
262 }
263
Ali Tofigh7fa90572022-03-17 14:47:49264 struct sockaddr_in* CreateIpv4Addr(absl::string_view ip_string) {
Jeroen de Borst8f096d02019-02-21 21:34:45265 struct sockaddr_in* ipv4_addr =
266 static_cast<struct sockaddr_in*>(malloc(sizeof(struct sockaddr_in)));
267 memset(ipv4_addr, 0, sizeof(struct sockaddr_in));
268 ipv4_addr->sin_family = AF_INET;
269 IPAddress ip;
270 IPFromString(ip_string, &ip);
271 ipv4_addr->sin_addr = ip.ipv4_address();
272 return ipv4_addr;
273 }
274
275 // Pointers created here need to be released via ReleaseIfAddrs.
276 struct ifaddrs* AddIpv4Address(struct ifaddrs* list,
277 char* if_name,
Ali Tofigh7fa90572022-03-17 14:47:49278 absl::string_view ipv4_address,
279 absl::string_view ipv4_netmask) {
Jeroen de Borst8f096d02019-02-21 21:34:45280 struct ifaddrs* if_addr = new struct ifaddrs;
281 memset(if_addr, 0, sizeof(struct ifaddrs));
282 if_addr->ifa_name = if_name;
283 if_addr->ifa_addr =
284 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_address));
285 if_addr->ifa_netmask =
286 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_netmask));
287 if_addr->ifa_next = list;
288 if_addr->ifa_flags = IFF_RUNNING;
289 return if_addr;
290 }
291
292 struct ifaddrs* InstallIpv4Network(char* if_name,
Ali Tofigh7fa90572022-03-17 14:47:49293 absl::string_view ipv4_address,
294 absl::string_view ipv4_mask,
Jeroen de Borst8f096d02019-02-21 21:34:45295 BasicNetworkManager& network_manager) {
296 ifaddrs* addr_list = nullptr;
297 addr_list = AddIpv4Address(addr_list, if_name, ipv4_address, ipv4_mask);
Niels Möllerd959f3a2022-04-19 09:29:19298 std::vector<std::unique_ptr<Network>> result;
Jeroen de Borst8f096d02019-02-21 21:34:45299 bool changed;
300 NetworkManager::Stats stats;
301 CallConvertIfAddrs(network_manager, addr_list, true, &result);
Niels Möllerd959f3a2022-04-19 09:29:19302 network_manager.MergeNetworkList(std::move(result), &changed, &stats);
Jeroen de Borst8f096d02019-02-21 21:34:45303 return addr_list;
304 }
305
honghaizdb8cf502015-12-21 21:08:46306 void ReleaseIfAddrs(struct ifaddrs* list) {
307 struct ifaddrs* if_addr = list;
308 while (if_addr != nullptr) {
309 struct ifaddrs* next_addr = if_addr->ifa_next;
oprypin1ea631f2017-08-18 07:15:19310 free(if_addr->ifa_addr);
311 free(if_addr->ifa_netmask);
honghaizdb8cf502015-12-21 21:08:46312 delete if_addr;
313 if_addr = next_addr;
314 }
315 }
henrike@webrtc.orgf0488722014-05-13 18:00:26316#endif // defined(WEBRTC_POSIX)
317
318 protected:
Jonas Orelandc06fe8b2022-03-28 12:58:26319 webrtc::test::ScopedKeyValueConfig field_trials_;
Niels Möller83830f32022-05-20 07:12:57320 rtc::AutoThread main_thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26321 bool callback_called_;
322};
323
Guo-wei Shieh9af97f82015-11-10 22:47:39324class TestBasicNetworkManager : public BasicNetworkManager {
325 public:
Niels Mölleraa373162021-09-28 14:09:07326 TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
Jonas Orelandc06fe8b2022-03-28 12:58:26327 SocketFactory* socket_factory,
Jonas Orelande62c2f22022-03-29 09:04:48328 const webrtc::FieldTrialsView& field_trials)
Jonas Orelandc06fe8b2022-03-28 12:58:26329 : BasicNetworkManager(network_monitor_factory,
330 socket_factory,
331 &field_trials) {}
Guo-wei Shieh9af97f82015-11-10 22:47:39332 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 21:12:26333 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 22:47:39334};
335
henrike@webrtc.orgf0488722014-05-13 18:00:26336// Test that the Network ctor works properly.
337TEST_F(NetworkTest, TestNetworkConstruct) {
338 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
339 IPAddress(0x12345600U), 24);
340 EXPECT_EQ("test_eth0", ipv4_network1.name());
341 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
342 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
343 EXPECT_EQ(24, ipv4_network1.prefix_length());
Sameer Vijaykara75eb432022-08-11 11:47:20344 EXPECT_EQ(AF_INET, ipv4_network1.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26345 EXPECT_FALSE(ipv4_network1.ignored());
346}
347
phoglund@webrtc.org006521d2015-02-12 09:23:59348TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
349 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
Sameer Vijaykardf7df192023-04-24 09:05:44350 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26351 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
Sameer Vijaykardf7df192023-04-24 09:05:44352 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
Niels Möller539f3e12021-11-26 15:33:19353 PhysicalSocketServer socket_server;
354 BasicNetworkManager network_manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52355 network_manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26356 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
357 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
358}
359
phoglund@webrtc.org006521d2015-02-12 09:23:59360// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26361TEST_F(NetworkTest, TestIgnoreList) {
Yves Gerey665174f2018-06-19 13:03:05362 Network ignore_me("ignore_me", "Ignore me please!", IPAddress(0x12345600U),
363 24);
364 Network include_me("include_me", "Include me please!", IPAddress(0x12345600U),
365 24);
Niels Möller539f3e12021-11-26 15:33:19366 PhysicalSocketServer socket_server;
367 BasicNetworkManager default_network_manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52368 default_network_manager.StartUpdating();
369 EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, ignore_me));
370 EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, include_me));
371
Niels Möller539f3e12021-11-26 15:33:19372 BasicNetworkManager ignoring_network_manager(&socket_server);
henrike@webrtc.orgf0488722014-05-13 18:00:26373 std::vector<std::string> ignore_list;
374 ignore_list.push_back("ignore_me");
Taylor Brandstetter239ac8a2020-07-31 23:07:52375 ignoring_network_manager.set_network_ignore_list(ignore_list);
376 ignoring_network_manager.StartUpdating();
377 EXPECT_TRUE(IsIgnoredNetwork(ignoring_network_manager, ignore_me));
378 EXPECT_FALSE(IsIgnoredNetwork(ignoring_network_manager, include_me));
henrike@webrtc.orgf0488722014-05-13 18:00:26379}
380
381// Test is failing on Windows opt: b/11288214
382TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
Niels Möller539f3e12021-11-26 15:33:19383 PhysicalSocketServer socket_server;
384 BasicNetworkManager manager(&socket_server);
Niels Möllerd959f3a2022-04-19 09:29:19385 std::vector<std::unique_ptr<Network>> result = GetNetworks(manager, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26386 // We should be able to bind to any addresses we find.
Niels Möllerd959f3a2022-04-19 09:29:19387 for (auto it = result.begin(); it != result.end(); ++it) {
henrike@webrtc.orgf0488722014-05-13 18:00:26388 sockaddr_storage storage;
389 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29390 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26391 SocketAddress bindaddress(ip, 0);
392 bindaddress.SetScopeID((*it)->scope_id());
Niels Möllerd0b88792021-08-12 08:32:30393 // TODO(thaloun): Use rtc::Socket once it supports IPv6.
henrike@webrtc.orgf0488722014-05-13 18:00:26394 int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
395 if (fd > 0) {
396 size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
397 EXPECT_GE(ipsize, 0U);
Yves Gerey665174f2018-06-19 13:03:05398 int success = ::bind(fd, reinterpret_cast<sockaddr*>(&storage),
henrike@webrtc.orgf0488722014-05-13 18:00:26399 static_cast<int>(ipsize));
400#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 10:09:25401 if (success)
402 RTC_LOG_GLE(LS_ERROR) << "Socket bind failed.";
henrike@webrtc.orgf0488722014-05-13 18:00:26403#endif
404 EXPECT_EQ(0, success);
405#if defined(WEBRTC_WIN)
406 closesocket(fd);
407#else
408 close(fd);
409#endif
410 }
henrike@webrtc.orgf0488722014-05-13 18:00:26411 }
412}
413
Guo-wei Shieh47872ec2015-08-19 17:32:46414// Test StartUpdating() and StopUpdating(). network_permission_state starts with
415// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26416TEST_F(NetworkTest, TestUpdateNetworks) {
Niels Mölleraa373162021-09-28 14:09:07417 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:26418 BasicNetworkManager manager(nullptr, &socket_server, &field_trials_);
Yves Gerey665174f2018-06-19 13:03:05419 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
420 &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 16:06:28421 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
422 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26423 manager.StartUpdating();
424 Thread::Current()->ProcessMessages(0);
425 EXPECT_TRUE(callback_called_);
426 callback_called_ = false;
427 // Callback should be triggered immediately when StartUpdating
428 // is called, after network update signal is already sent.
429 manager.StartUpdating();
430 EXPECT_TRUE(manager.started());
431 Thread::Current()->ProcessMessages(0);
432 EXPECT_TRUE(callback_called_);
433 manager.StopUpdating();
434 EXPECT_TRUE(manager.started());
435 manager.StopUpdating();
guoweisea1012b2015-08-21 16:06:28436 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
437 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26438 EXPECT_FALSE(manager.started());
439 manager.StopUpdating();
440 EXPECT_FALSE(manager.started());
441 callback_called_ = false;
442 // Callback should be triggered immediately after StartUpdating is called
443 // when start_count_ is reset to 0.
444 manager.StartUpdating();
445 Thread::Current()->ProcessMessages(0);
446 EXPECT_TRUE(callback_called_);
447}
448
449// Verify that MergeNetworkList() merges network lists properly.
450TEST_F(NetworkTest, TestBasicMergeNetworkList) {
451 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
452 IPAddress(0x12345600U), 24);
453 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
454 IPAddress(0x00010000U), 16);
455 ipv4_network1.AddIP(IPAddress(0x12345678));
456 ipv4_network2.AddIP(IPAddress(0x00010004));
Niels Möller539f3e12021-11-26 15:33:19457 PhysicalSocketServer socket_server;
458 BasicNetworkManager manager(&socket_server);
henrike@webrtc.orgf0488722014-05-13 18:00:26459
460 // Add ipv4_network1 to the list of networks.
Niels Möllerd959f3a2022-04-19 09:29:19461 std::vector<std::unique_ptr<Network>> list;
462 list.push_back(std::make_unique<Network>(ipv4_network1));
henrike@webrtc.orgf0488722014-05-13 18:00:26463 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:19464 NetworkManager::Stats stats =
465 MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26466 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05467 EXPECT_EQ(stats.ipv6_network_count, 0);
468 EXPECT_EQ(stats.ipv4_network_count, 1);
Niels Möllerd959f3a2022-04-19 09:29:19469 list.clear(); // It is fine to call .clear() on a moved-from vector.
henrike@webrtc.orgf0488722014-05-13 18:00:26470
Niels Möller22211442022-04-07 09:43:28471 std::vector<const rtc::Network*> current = manager.GetNetworks();
472 EXPECT_EQ(1U, current.size());
473 EXPECT_TRUE(SameNameAndPrefix(ipv4_network1, *current[0]));
474 const Network* net1 = current[0];
honghaiza0c44ea2016-03-23 23:07:48475 uint16_t net_id1 = net1->id();
476 EXPECT_EQ(1, net_id1);
henrike@webrtc.orgf0488722014-05-13 18:00:26477
478 // Replace ipv4_network1 with ipv4_network2.
Niels Möllerd959f3a2022-04-19 09:29:19479 list.push_back(std::make_unique<Network>(ipv4_network2));
480 stats = MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26481 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05482 EXPECT_EQ(stats.ipv6_network_count, 0);
483 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26484 list.clear();
485
Niels Möller22211442022-04-07 09:43:28486 current = manager.GetNetworks();
487 EXPECT_EQ(1U, current.size());
488 EXPECT_TRUE(SameNameAndPrefix(ipv4_network2, *current[0]));
489 const Network* net2 = current[0];
honghaiza0c44ea2016-03-23 23:07:48490 uint16_t net_id2 = net2->id();
491 // Network id will increase.
492 EXPECT_LT(net_id1, net_id2);
henrike@webrtc.orgf0488722014-05-13 18:00:26493
494 // Add Network2 back.
Niels Möllerd959f3a2022-04-19 09:29:19495 list.push_back(std::make_unique<Network>(ipv4_network1));
496 list.push_back(std::make_unique<Network>(ipv4_network2));
497 stats = MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26498 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05499 EXPECT_EQ(stats.ipv6_network_count, 0);
500 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26501 list.clear();
502
503 // Verify that we get previous instances of Network objects.
Niels Möller22211442022-04-07 09:43:28504 current = manager.GetNetworks();
505 EXPECT_EQ(2U, current.size());
506 EXPECT_TRUE((net1 == current[0] && net2 == current[1]) ||
507 (net1 == current[1] && net2 == current[0]));
508 EXPECT_TRUE((net_id1 == current[0]->id() && net_id2 == current[1]->id()) ||
509 (net_id1 == current[1]->id() && net_id2 == current[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26510
511 // Call MergeNetworkList() again and verify that we don't get update
512 // notification.
Niels Möllerd959f3a2022-04-19 09:29:19513 list.push_back(std::make_unique<Network>(ipv4_network2));
514 list.push_back(std::make_unique<Network>(ipv4_network1));
515 stats = MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26516 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05517 EXPECT_EQ(stats.ipv6_network_count, 0);
518 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26519 list.clear();
520
521 // Verify that we get previous instances of Network objects.
Niels Möller22211442022-04-07 09:43:28522 current = manager.GetNetworks();
523 EXPECT_EQ(2U, current.size());
524 EXPECT_TRUE((net1 == current[0] && net2 == current[1]) ||
525 (net1 == current[1] && net2 == current[0]));
526 EXPECT_TRUE((net_id1 == current[0]->id() && net_id2 == current[1]->id()) ||
527 (net_id1 == current[1]->id() && net_id2 == current[0]->id()));
henrike@webrtc.orgf0488722014-05-13 18:00:26528}
529
530// Sets up some test IPv6 networks and appends them to list.
531// Four networks are added - public and link local, for two interfaces.
Niels Möllerd959f3a2022-04-19 09:29:19532void SetupNetworks(std::vector<std::unique_ptr<Network>>* list) {
henrike@webrtc.orgf0488722014-05-13 18:00:26533 IPAddress ip;
534 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29535 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
536 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26537 // First, fake link-locals.
538 Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
539 prefix, 64);
540 ipv6_eth0_linklocalnetwork.AddIP(ip);
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29541 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26542 Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
543 prefix, 64);
544 ipv6_eth1_linklocalnetwork.AddIP(ip);
545 // Public networks:
546 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
547 prefix = TruncateIP(ip, 64);
548 Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
549 prefix, 64);
550 ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
551 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
552 prefix = TruncateIP(ip, 64);
553 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
554 prefix, 64);
555 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
Niels Möllerd959f3a2022-04-19 09:29:19556 list->push_back(std::make_unique<Network>(ipv6_eth0_linklocalnetwork));
557 list->push_back(std::make_unique<Network>(ipv6_eth1_linklocalnetwork));
558 list->push_back(std::make_unique<Network>(ipv6_eth0_publicnetwork1_ip1));
559 list->push_back(std::make_unique<Network>(ipv6_eth1_publicnetwork1_ip1));
henrike@webrtc.orgf0488722014-05-13 18:00:26560}
561
562// Test that the basic network merging case works.
563TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
Niels Möller539f3e12021-11-26 15:33:19564 PhysicalSocketServer socket_server;
565 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 13:03:05566 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
567 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 09:29:19568 std::vector<std::unique_ptr<Network>> networks;
569 SetupNetworks(&networks);
570 std::vector<const Network*> original_list = CopyNetworkPointers(networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26571 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05572 NetworkManager::Stats stats =
Niels Möllerd959f3a2022-04-19 09:29:19573 MergeNetworkList(manager, std::move(networks), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26574 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05575 EXPECT_EQ(stats.ipv6_network_count, 4);
576 EXPECT_EQ(stats.ipv4_network_count, 0);
Niels Möller22211442022-04-07 09:43:28577 std::vector<const Network*> list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26578 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 20:48:30579 EXPECT_THAT(list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26580}
581
582// Tests that when two network lists that describe the same set of networks are
583// merged, that the changed callback is not called, and that the original
584// objects remain in the result list.
585TEST_F(NetworkTest, TestNoChangeMerge) {
Niels Möller539f3e12021-11-26 15:33:19586 PhysicalSocketServer socket_server;
587 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 13:03:05588 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
589 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 09:29:19590 std::vector<std::unique_ptr<Network>> networks;
591 SetupNetworks(&networks);
592 std::vector<const Network*> original_list = CopyNetworkPointers(networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26593 bool changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19594 MergeNetworkList(manager, std::move(networks), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26595 EXPECT_TRUE(changed);
596 // Second list that describes the same networks but with new objects.
Niels Möllerd959f3a2022-04-19 09:29:19597 std::vector<std::unique_ptr<Network>> second_networks;
598 SetupNetworks(&second_networks);
599 std::vector<const Network*> second_list =
600 CopyNetworkPointers(second_networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26601 changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19602 MergeNetworkList(manager, std::move(second_networks), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26603 EXPECT_FALSE(changed);
Niels Möller22211442022-04-07 09:43:28604 std::vector<const Network*> resulting_list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26605 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 20:48:30606 EXPECT_THAT(resulting_list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26607 // Doublecheck that the new networks aren't in the list.
Steve Anton2acd1632019-03-25 20:48:30608 for (const Network* network : second_list) {
609 EXPECT_THAT(resulting_list, Not(Contains(network)));
henrike@webrtc.orgf0488722014-05-13 18:00:26610 }
611}
612
613// Test that we can merge a network that is the same as another network but with
614// a different IP. The original network should remain in the list, but have its
615// IP changed.
616TEST_F(NetworkTest, MergeWithChangedIP) {
Niels Möller539f3e12021-11-26 15:33:19617 PhysicalSocketServer socket_server;
618 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 13:03:05619 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
620 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 09:29:19621 std::vector<std::unique_ptr<Network>> original_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26622 SetupNetworks(&original_list);
623 // Make a network that we're going to change.
624 IPAddress ip;
625 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
626 IPAddress prefix = TruncateIP(ip, 64);
Niels Möllerd959f3a2022-04-19 09:29:19627 std::unique_ptr<Network> network_to_change = std::make_unique<Network>(
628 "test_eth0", "Test Network Adapter 1", prefix, 64);
629 std::unique_ptr<Network> changed_network =
630 std::make_unique<Network>(*network_to_change);
henrike@webrtc.orgf0488722014-05-13 18:00:26631 network_to_change->AddIP(ip);
632 IPAddress changed_ip;
633 EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
634 changed_network->AddIP(changed_ip);
Niels Möllerd959f3a2022-04-19 09:29:19635 const Network* const network_to_change_ptr = network_to_change.get();
636 original_list.push_back(std::move(network_to_change));
637 const size_t original_size = original_list.size();
henrike@webrtc.orgf0488722014-05-13 18:00:26638 bool changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19639 MergeNetworkList(manager, std::move(original_list), &changed);
640 std::vector<std::unique_ptr<Network>> second_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26641 SetupNetworks(&second_list);
Niels Möllerd959f3a2022-04-19 09:29:19642 second_list.push_back(std::move(changed_network));
henrike@webrtc.orgf0488722014-05-13 18:00:26643 changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19644 MergeNetworkList(manager, std::move(second_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26645 EXPECT_TRUE(changed);
Niels Möller22211442022-04-07 09:43:28646 std::vector<const Network*> list = manager.GetNetworks();
Niels Möllerd959f3a2022-04-19 09:29:19647 EXPECT_EQ(original_size, list.size());
henrike@webrtc.orgf0488722014-05-13 18:00:26648 // Make sure the original network is still in the merged list.
Niels Möllerd959f3a2022-04-19 09:29:19649 EXPECT_THAT(list, Contains(network_to_change_ptr));
650 EXPECT_EQ(changed_ip, network_to_change_ptr->GetIPs().at(0));
henrike@webrtc.orgf0488722014-05-13 18:00:26651}
652
Niels Möllerd959f3a2022-04-19 09:29:19653TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
Niels Möller539f3e12021-11-26 15:33:19654 PhysicalSocketServer socket_server;
655 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 13:03:05656 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
657 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 09:29:19658 std::vector<std::unique_ptr<Network>> original_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26659 SetupNetworks(&original_list);
Niels Möllerd959f3a2022-04-19 09:29:19660 const Network* const network_ptr = original_list[2].get();
henrike@webrtc.orgf0488722014-05-13 18:00:26661 bool changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19662 MergeNetworkList(manager, std::move(original_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26663 EXPECT_TRUE(changed);
664 IPAddress ip;
665 IPAddress check_ip;
666 IPAddress prefix;
667 // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
668 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
669 prefix = TruncateIP(ip, 64);
670 Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
671 prefix, 64);
672 // This is the IP that already existed in the public network on eth0.
673 EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
674 ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
Niels Möllerd959f3a2022-04-19 09:29:19675
676 std::vector<std::unique_ptr<Network>> second_list;
677 SetupNetworks(&second_list);
678 second_list.push_back(
679 std::make_unique<Network>(ipv6_eth0_publicnetwork1_ip2));
henrike@webrtc.orgf0488722014-05-13 18:00:26680 changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19681 const auto network_copy = std::make_unique<Network>(*second_list[2]);
682 MergeNetworkList(manager, std::move(second_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26683 EXPECT_TRUE(changed);
684 // There should still be four networks.
Niels Möller22211442022-04-07 09:43:28685 std::vector<const Network*> list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26686 EXPECT_EQ(4U, list.size());
687 // Check the gathered IPs.
688 int matchcount = 0;
Niels Möller22211442022-04-07 09:43:28689 for (const Network* network : list) {
Niels Möllerd959f3a2022-04-19 09:29:19690 if (SameNameAndPrefix(*network, *network_copy)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26691 ++matchcount;
692 EXPECT_EQ(1, matchcount);
693 // This should be the same network object as before.
Niels Möllerd959f3a2022-04-19 09:29:19694 EXPECT_EQ(network, network_ptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26695 // But with two addresses now.
Niels Möller22211442022-04-07 09:43:28696 EXPECT_THAT(network->GetIPs(),
Steve Anton2acd1632019-03-25 20:48:30697 UnorderedElementsAre(InterfaceAddress(check_ip),
698 InterfaceAddress(ip)));
henrike@webrtc.orgf0488722014-05-13 18:00:26699 } else {
700 // Check the IP didn't get added anywhere it wasn't supposed to.
Niels Möller22211442022-04-07 09:43:28701 EXPECT_THAT(network->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26702 }
703 }
704}
705
706// Test that merge correctly distinguishes multiple networks on an interface.
707TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
Niels Möller539f3e12021-11-26 15:33:19708 PhysicalSocketServer socket_server;
709 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 13:03:05710 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
711 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 09:29:19712 std::vector<std::unique_ptr<Network>> original_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26713 SetupNetworks(&original_list);
714 bool changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19715 MergeNetworkList(manager, std::move(original_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26716 EXPECT_TRUE(changed);
717 IPAddress ip;
718 IPAddress prefix;
719 // A second network for eth0.
720 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
721 prefix = TruncateIP(ip, 64);
722 Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
723 prefix, 64);
724 ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
Niels Möllerd959f3a2022-04-19 09:29:19725 std::vector<std::unique_ptr<Network>> second_list;
726 SetupNetworks(&second_list);
727 second_list.push_back(
728 std::make_unique<Network>(ipv6_eth0_publicnetwork2_ip1));
henrike@webrtc.orgf0488722014-05-13 18:00:26729 changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19730 MergeNetworkList(manager, std::move(second_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26731 EXPECT_TRUE(changed);
732 // There should be five networks now.
Niels Möller22211442022-04-07 09:43:28733 std::vector<const Network*> list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26734 EXPECT_EQ(5U, list.size());
735 // Check the resulting addresses.
Niels Möller22211442022-04-07 09:43:28736 for (const Network* network : list) {
737 if (network->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
738 network->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
henrike@webrtc.orgf0488722014-05-13 18:00:26739 // Check the new network has 1 IP and that it's the correct one.
Niels Möller22211442022-04-07 09:43:28740 EXPECT_EQ(1U, network->GetIPs().size());
741 EXPECT_EQ(ip, network->GetIPs().at(0));
henrike@webrtc.orgf0488722014-05-13 18:00:26742 } else {
743 // Check the IP didn't get added anywhere it wasn't supposed to.
Niels Möller22211442022-04-07 09:43:28744 EXPECT_THAT(network->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26745 }
746 }
747}
748
honghaizdb8cf502015-12-21 21:08:46749// Test that DumpNetworks does not crash.
750TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
Niels Möller539f3e12021-11-26 15:33:19751 PhysicalSocketServer socket_server;
752 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52753 manager.StartUpdating();
Niels Möllerd959f3a2022-04-19 09:29:19754 std::vector<std::unique_ptr<Network>> list = GetNetworks(manager, true);
honghaizdb8cf502015-12-21 21:08:46755 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:19756 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 21:08:46757 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26758}
759
Mirko Bonadei44f0f872019-01-20 17:16:42760TEST_F(NetworkTest, TestIPv6Toggle) {
Niels Möller539f3e12021-11-26 15:33:19761 PhysicalSocketServer socket_server;
762 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52763 manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26764 bool ipv6_found = false;
Niels Möllerd959f3a2022-04-19 09:29:19765 for (const auto& network : GetNetworks(manager, true)) {
766 if (network->prefix().family() == AF_INET6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26767 ipv6_found = true;
768 break;
769 }
770 }
771 EXPECT_TRUE(ipv6_found);
henrike@webrtc.orgf0488722014-05-13 18:00:26772}
773
deadbeef3427f532017-07-26 23:09:33774// Test that when network interfaces are sorted and given preference values,
775// IPv6 comes first.
776TEST_F(NetworkTest, IPv6NetworksPreferredOverIPv4) {
Niels Möller539f3e12021-11-26 15:33:19777 PhysicalSocketServer socket_server;
778 BasicNetworkManager manager(&socket_server);
henrike@webrtc.orgf0488722014-05-13 18:00:26779 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
780 IPAddress(0x12345600U), 24);
781 ipv4_network1.AddIP(IPAddress(0x12345600U));
782
783 IPAddress ip;
784 IPAddress prefix;
785 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
786 prefix = TruncateIP(ip, 64);
787 Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
788 prefix, 64);
789 ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
790
Niels Möllerd959f3a2022-04-19 09:29:19791 std::vector<std::unique_ptr<Network>> list;
792 list.push_back(std::make_unique<Network>(ipv4_network1));
793 list.push_back(std::make_unique<Network>(ipv6_eth1_publicnetwork1_ip1));
794 const Network* net1 = list[0].get();
795 const Network* net2 = list[1].get();
henrike@webrtc.orgf0488722014-05-13 18:00:26796
797 bool changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19798 MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26799 ASSERT_TRUE(changed);
800 // After sorting IPv6 network should be higher order than IPv4 networks.
801 EXPECT_TRUE(net1->preference() < net2->preference());
802}
803
deadbeef3427f532017-07-26 23:09:33804// When two interfaces are equivalent in everything but name, they're expected
805// to be preference-ordered by name. For example, "eth0" before "eth1".
806TEST_F(NetworkTest, NetworksSortedByInterfaceName) {
Niels Möller539f3e12021-11-26 15:33:19807 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:26808 BasicNetworkManager manager(&socket_server, &field_trials_);
Niels Möllerd959f3a2022-04-19 09:29:19809 auto eth0 = std::make_unique<Network>("test_eth0", "Test Network Adapter 1",
810 IPAddress(0x65432100U), 24);
deadbeef3427f532017-07-26 23:09:33811 eth0->AddIP(IPAddress(0x65432100U));
Niels Möllerd959f3a2022-04-19 09:29:19812 auto eth1 = std::make_unique<Network>("test_eth1", "Test Network Adapter 2",
813 IPAddress(0x12345600U), 24);
deadbeef3427f532017-07-26 23:09:33814 eth1->AddIP(IPAddress(0x12345600U));
Niels Möllerd959f3a2022-04-19 09:29:19815 std::vector<std::unique_ptr<Network>> list;
816 const Network* eth0_ptr = eth0.get();
817 const Network* eth1_ptr = eth1.get();
deadbeef3427f532017-07-26 23:09:33818 // Add them to the list in the opposite of the expected sorted order, to
819 // ensure sorting actually occurs.
Niels Möllerd959f3a2022-04-19 09:29:19820 list.push_back(std::move(eth1));
821 list.push_back(std::move(eth0));
deadbeef3427f532017-07-26 23:09:33822
823 bool changed = false;
Niels Möllerd959f3a2022-04-19 09:29:19824 MergeNetworkList(manager, std::move(list), &changed);
deadbeef3427f532017-07-26 23:09:33825 ASSERT_TRUE(changed);
826 // "test_eth0" should be preferred over "test_eth1".
Niels Möllerd959f3a2022-04-19 09:29:19827 EXPECT_TRUE(eth0_ptr->preference() > eth1_ptr->preference());
deadbeef3427f532017-07-26 23:09:33828}
829
henrike@webrtc.orgf0488722014-05-13 18:00:26830TEST_F(NetworkTest, TestNetworkAdapterTypes) {
831 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
Sameer Vijaykardf7df192023-04-24 09:05:44832 ADAPTER_TYPE_WIFI);
henrike@webrtc.orgf0488722014-05-13 18:00:26833 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
834 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
Sameer Vijaykardf7df192023-04-24 09:05:44835 ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26836 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
837 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
Sameer Vijaykardf7df192023-04-24 09:05:44838 ADAPTER_TYPE_CELLULAR);
henrike@webrtc.orgf0488722014-05-13 18:00:26839 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
840 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
Sameer Vijaykardf7df192023-04-24 09:05:44841 ADAPTER_TYPE_VPN);
henrike@webrtc.orgf0488722014-05-13 18:00:26842 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
843 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
Sameer Vijaykardf7df192023-04-24 09:05:44844 ADAPTER_TYPE_UNKNOWN);
henrike@webrtc.orgf0488722014-05-13 18:00:26845 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
846}
847
848#if defined(WEBRTC_POSIX)
849// Verify that we correctly handle interfaces with no address.
850TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
851 ifaddrs list;
852 memset(&list, 0, sizeof(list));
853 list.ifa_name = const_cast<char*>("test_iface");
854
Niels Möllerd959f3a2022-04-19 09:29:19855 std::vector<std::unique_ptr<Network>> result;
Niels Möller539f3e12021-11-26 15:33:19856 PhysicalSocketServer socket_server;
857 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52858 manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26859 CallConvertIfAddrs(manager, &list, true, &result);
860 EXPECT_TRUE(result.empty());
861}
honghaizdb8cf502015-12-21 21:08:46862
863// Verify that if there are two addresses on one interface, only one network
864// is generated.
865TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
866 char if_name[20] = "rmnet0";
867 ifaddrs* list = nullptr;
868 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
869 "FFFF:FFFF:FFFF:FFFF::", 0);
870 list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
871 "FFFF:FFFF:FFFF:FFFF::", 0);
Niels Möllerd959f3a2022-04-19 09:29:19872 std::vector<std::unique_ptr<Network>> result;
Niels Möller539f3e12021-11-26 15:33:19873 PhysicalSocketServer socket_server;
874 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52875 manager.StartUpdating();
honghaizdb8cf502015-12-21 21:08:46876 CallConvertIfAddrs(manager, list, true, &result);
877 EXPECT_EQ(1U, result.size());
878 bool changed;
879 // This ensures we release the objects created in CallConvertIfAddrs.
Niels Möllerd959f3a2022-04-19 09:29:19880 MergeNetworkList(manager, std::move(result), &changed);
honghaizdb8cf502015-12-21 21:08:46881 ReleaseIfAddrs(list);
882}
Guo-wei Shieh9faf1542015-12-28 22:06:55883
884TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
885 ifaddrs list;
886 memset(&list, 0, sizeof(list));
887 list.ifa_name = const_cast<char*>("test_iface");
888 sockaddr ifa_addr;
Diep Bui7e2aa7d2023-05-08 14:46:09889 ifa_addr.sa_family = AF_UNSPEC;
Guo-wei Shieh9faf1542015-12-28 22:06:55890 sockaddr ifa_netmask;
891 list.ifa_addr = &ifa_addr;
892 list.ifa_netmask = &ifa_netmask;
893
Niels Möllerd959f3a2022-04-19 09:29:19894 std::vector<std::unique_ptr<Network>> result;
Niels Möller539f3e12021-11-26 15:33:19895 PhysicalSocketServer socket_server;
896 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52897 manager.StartUpdating();
Guo-wei Shieh9faf1542015-12-28 22:06:55898 CallConvertIfAddrs(manager, &list, true, &result);
899 EXPECT_TRUE(result.empty());
900}
Honghai Zhang351d77b2016-05-20 22:08:29901
Diep Bui7e2aa7d2023-05-08 14:46:09902TEST_F(NetworkTest, TestConvertIfAddrsGetsNullAddr) {
903 ifaddrs list;
904 memset(&list, 0, sizeof(list));
905 list.ifa_name = const_cast<char*>("test_iface");
906 list.ifa_addr = nullptr;
907 list.ifa_netmask = nullptr;
908
909 std::vector<std::unique_ptr<Network>> result;
910 PhysicalSocketServer socket_server;
911 BasicNetworkManager manager(&socket_server);
912 manager.StartUpdating();
913 CallConvertIfAddrs(manager, &list, true, &result);
914 EXPECT_TRUE(result.empty());
915}
916
Taylor Brandstetter239ac8a2020-07-31 23:07:52917// Tests that the network type can be determined from the network monitor when
918// it would otherwise be unknown.
Honghai Zhang351d77b2016-05-20 22:08:29919TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
Taylor Brandstetter239ac8a2020-07-31 23:07:52920 char if_name[20] = "wifi0";
921 std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
Honghai Zhang351d77b2016-05-20 22:08:29922 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
Niels Mölleraa373162021-09-28 14:09:07923 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:26924 BasicNetworkManager manager_without_monitor(nullptr, &socket_server,
925 &field_trials_);
Taylor Brandstetter239ac8a2020-07-31 23:07:52926 manager_without_monitor.StartUpdating();
927 // A network created without a network monitor will get UNKNOWN type.
928 ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
929 manager_without_monitor);
930 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager_without_monitor));
Honghai Zhang351d77b2016-05-20 22:08:29931 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 22:08:29932
Taylor Brandstetter239ac8a2020-07-31 23:07:52933 // With the fake network monitor the type should be correctly determined.
934 FakeNetworkMonitorFactory factory;
Jonas Orelandc06fe8b2022-03-28 12:58:26935 BasicNetworkManager manager_with_monitor(&factory, &socket_server,
936 &field_trials_);
Taylor Brandstetter239ac8a2020-07-31 23:07:52937 manager_with_monitor.StartUpdating();
Honghai Zhang351d77b2016-05-20 22:08:29938 // Add the same ipv6 address as before but it has the right network type
939 // detected by the network monitor now.
Taylor Brandstetter239ac8a2020-07-31 23:07:52940 addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
941 manager_with_monitor);
942 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager_with_monitor));
Honghai Zhang351d77b2016-05-20 22:08:29943 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 22:08:29944}
945
946// Test that the network type can be determined based on name matching in
947// a few cases. Note that UNKNOWN type for non-matching strings has been tested
948// in the above test.
949TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
Jeroen de Borst8f096d02019-02-21 21:34:45950 std::string ipv4_address1 = "192.0.0.121";
951 std::string ipv4_mask = "255.255.255.0";
Honghai Zhang351d77b2016-05-20 22:08:29952 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
953 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
954 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
Niels Möller539f3e12021-11-26 15:33:19955 PhysicalSocketServer socket_server;
956 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 23:07:52957 manager.StartUpdating();
Honghai Zhang351d77b2016-05-20 22:08:29958
deadbeef4cd599f2017-07-27 22:05:29959 // IPSec interface; name is in form "ipsec<index>".
960 char if_name[20] = "ipsec11";
Honghai Zhang351d77b2016-05-20 22:08:29961 ifaddrs* addr_list =
962 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
deadbeef4cd599f2017-07-27 22:05:29963 EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
964 ClearNetworks(manager);
965 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 22:08:29966
Qingsi Wange53ac042018-05-08 18:55:07967 strcpy(if_name, "lo0");
968 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
969 EXPECT_EQ(ADAPTER_TYPE_LOOPBACK, GetAdapterType(manager));
970 ClearNetworks(manager);
971 ReleaseIfAddrs(addr_list);
972
973 strcpy(if_name, "eth0");
Jeroen de Borst8f096d02019-02-21 21:34:45974 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
Qingsi Wange53ac042018-05-08 18:55:07975 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, GetAdapterType(manager));
976 ClearNetworks(manager);
977 ReleaseIfAddrs(addr_list);
978
Qingsi Wangc5bc9d62019-09-25 22:03:19979 strcpy(if_name, "wlan0");
980 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
981 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
982 ClearNetworks(manager);
983 ReleaseIfAddrs(addr_list);
984
deadbeef4cd599f2017-07-27 22:05:29985#if defined(WEBRTC_IOS)
986 strcpy(if_name, "pdp_ip0");
987 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 22:08:29988 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
989 ClearNetworks(manager);
990 ReleaseIfAddrs(addr_list);
991
Honghai Zhang63ab8102016-05-27 03:30:15992 strcpy(if_name, "en0");
993 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
994 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
995 ClearNetworks(manager);
996 ReleaseIfAddrs(addr_list);
997
Honghai Zhang351d77b2016-05-20 22:08:29998#elif defined(WEBRTC_ANDROID)
deadbeef4cd599f2017-07-27 22:05:29999 strcpy(if_name, "rmnet0");
1000 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 22:08:291001 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
1002 ClearNetworks(manager);
1003 ReleaseIfAddrs(addr_list);
1004
Honghai Zhang351d77b2016-05-20 22:08:291005 strcpy(if_name, "v4-rmnet_data0");
1006 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
1007 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
1008 ClearNetworks(manager);
1009 ReleaseIfAddrs(addr_list);
Jeroen de Borst8f096d02019-02-21 21:34:451010
1011 strcpy(if_name, "clat4");
1012 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
1013 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
1014 ClearNetworks(manager);
1015 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 22:08:291016#endif
1017}
Taylor Brandstetterea7fbfb2020-08-19 23:41:541018
1019// Test that an adapter won't be included in the network list if there's a
1020// network monitor that says it's unavailable.
1021TEST_F(NetworkTest, TestNetworkMonitorIsAdapterAvailable) {
1022 char if_name1[20] = "pdp_ip0";
1023 char if_name2[20] = "pdp_ip1";
1024 ifaddrs* list = nullptr;
1025 list = AddIpv6Address(list, if_name1, "1000:2000:3000:4000:0:0:0:1",
1026 "FFFF:FFFF:FFFF:FFFF::", 0);
1027 list = AddIpv6Address(list, if_name2, "1000:2000:3000:4000:0:0:0:2",
1028 "FFFF:FFFF:FFFF:FFFF::", 0);
Niels Möllerd959f3a2022-04-19 09:29:191029 std::vector<std::unique_ptr<Network>> result;
Taylor Brandstetterea7fbfb2020-08-19 23:41:541030
1031 // Sanity check that both interfaces are included by default.
1032 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 14:09:071033 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:261034 BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
Taylor Brandstetterea7fbfb2020-08-19 23:41:541035 manager.StartUpdating();
1036 CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1037 EXPECT_EQ(2u, result.size());
1038 bool changed;
1039 // This ensures we release the objects created in CallConvertIfAddrs.
Niels Möllerd959f3a2022-04-19 09:29:191040 MergeNetworkList(manager, std::move(result), &changed);
Taylor Brandstetterea7fbfb2020-08-19 23:41:541041 result.clear();
1042
1043 // Now simulate one interface being unavailable.
1044 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1045 network_monitor->set_unavailable_adapters({if_name1});
1046 CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1047 EXPECT_EQ(1u, result.size());
1048 EXPECT_EQ(if_name2, result[0]->name());
1049
Niels Möllerd959f3a2022-04-19 09:29:191050 MergeNetworkList(manager, std::move(result), &changed);
Taylor Brandstetterea7fbfb2020-08-19 23:41:541051 ReleaseIfAddrs(list);
1052}
1053
henrike@webrtc.orgf0488722014-05-13 18:00:261054#endif // defined(WEBRTC_POSIX)
1055
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451056// Test MergeNetworkList successfully combines all IPs for the same
1057// prefix/length into a single Network.
1058TEST_F(NetworkTest, TestMergeNetworkList) {
Niels Möller539f3e12021-11-26 15:33:191059 PhysicalSocketServer socket_server;
1060 BasicNetworkManager manager(&socket_server);
Niels Möllerd959f3a2022-04-19 09:29:191061 std::vector<std::unique_ptr<Network>> list;
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451062
1063 // Create 2 IPAddress classes with only last digit different.
1064 IPAddress ip1, ip2;
1065 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1066 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
1067
1068 // Create 2 networks with the same prefix and length.
Niels Möllerd959f3a2022-04-19 09:29:191069 auto net1 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1070 auto net2 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451071
1072 // Add different IP into each.
1073 net1->AddIP(ip1);
1074 net2->AddIP(ip2);
1075
Niels Möllerd959f3a2022-04-19 09:29:191076 list.push_back(std::move(net1));
1077 list.push_back(std::move(net2));
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451078 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:191079 MergeNetworkList(manager, std::move(list), &changed);
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451080 EXPECT_TRUE(changed);
1081
Niels Möller22211442022-04-07 09:43:281082 std::vector<const Network*> list2 = manager.GetNetworks();
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451083
1084 // Make sure the resulted networklist has only 1 element and 2
1085 // IPAddresses.
1086 EXPECT_EQ(list2.size(), 1uL);
1087 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
Mirko Bonadeib2a57852022-03-18 11:19:561088 EXPECT_THAT(list2[0]->GetIPs(), UnorderedElementsAre(InterfaceAddress(ip1),
1089 InterfaceAddress(ip2)));
guoweis@webrtc.org4bbd3c82014-09-09 13:54:451090}
1091
honghaizdb8cf502015-12-21 21:08:461092// Test that MergeNetworkList successfully detects the change if
1093// a network becomes inactive and then active again.
1094TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
Niels Möller539f3e12021-11-26 15:33:191095 PhysicalSocketServer socket_server;
1096 BasicNetworkManager manager(&socket_server);
honghaizdb8cf502015-12-21 21:08:461097 Network network1("test_wifi", "Test Network Adapter 1",
1098 IPAddress(0x12345600U), 24);
1099 Network network2("test_eth0", "Test Network Adapter 2",
1100 IPAddress(0x00010000U), 16);
1101 network1.AddIP(IPAddress(0x12345678));
1102 network2.AddIP(IPAddress(0x00010004));
Niels Möllerd959f3a2022-04-19 09:29:191103 std::vector<std::unique_ptr<Network>> list;
1104 auto net1 = std::make_unique<Network>(network1);
1105 const Network* const net1_ptr = net1.get();
1106 list.push_back(std::move(net1));
honghaizdb8cf502015-12-21 21:08:461107 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:191108 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 21:08:461109 EXPECT_TRUE(changed);
1110 list.clear();
Niels Möller22211442022-04-07 09:43:281111
1112 std::vector<const Network*> current = manager.GetNetworks();
1113 ASSERT_EQ(1U, current.size());
Niels Möllerd959f3a2022-04-19 09:29:191114 EXPECT_EQ(net1_ptr, current[0]);
honghaizdb8cf502015-12-21 21:08:461115
1116 list.clear();
Niels Möllerd959f3a2022-04-19 09:29:191117 auto net2 = std::make_unique<Network>(network2);
1118 const Network* const net2_ptr = net2.get();
1119 list.push_back(std::move(net2));
1120 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 21:08:461121 EXPECT_TRUE(changed);
1122 list.clear();
Niels Möller22211442022-04-07 09:43:281123
1124 current = manager.GetNetworks();
1125 ASSERT_EQ(1U, current.size());
Niels Möllerd959f3a2022-04-19 09:29:191126 EXPECT_EQ(net2_ptr, current[0]);
honghaizdb8cf502015-12-21 21:08:461127 // Now network1 is inactive. Try to merge it again.
1128 list.clear();
Niels Möllerd959f3a2022-04-19 09:29:191129 list.push_back(std::make_unique<Network>(network1));
1130 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 21:08:461131 EXPECT_TRUE(changed);
1132 list.clear();
Niels Möller22211442022-04-07 09:43:281133 current = manager.GetNetworks();
1134 ASSERT_EQ(1U, current.size());
1135 EXPECT_TRUE(current[0]->active());
Niels Möllerd959f3a2022-04-19 09:29:191136 EXPECT_EQ(net1_ptr, current[0]);
honghaizdb8cf502015-12-21 21:08:461137}
1138
guoweis@webrtc.org369a6372014-09-17 22:37:291139// Test that the filtering logic follows the defined ruleset in network.h.
1140TEST_F(NetworkTest, TestIPv6Selection) {
1141 InterfaceAddress ip;
1142 std::string ipstr;
1143
1144 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1145 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1146
1147 // Create a network with this prefix.
Yves Gerey665174f2018-06-19 13:03:051148 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
1149 64);
Sameer Vijaykara75eb432022-08-11 11:47:201150 EXPECT_EQ(AF_INET6, ipv6_network.family());
guoweis@webrtc.org369a6372014-09-17 22:37:291151
1152 // When there is no address added, it should return an unspecified
1153 // address.
1154 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1155 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1156
1157 // Deprecated one should not be returned.
1158 ipv6_network.AddIP(ip);
1159 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1160
aluebs@webrtc.org07dcf602015-02-27 18:42:221161 // Add ULA one. ULA is unique local address which is starting either
1162 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:291163 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1164 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1165 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:221166 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:291167
aluebs@webrtc.org07dcf602015-02-27 18:42:221168 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:291169 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1170 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1171 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:221172 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:291173
1174 // Add global dynamic temporary one.
1175 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1176 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1177 ipv6_network.AddIP(ip);
1178 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1179}
1180
Diep Bui1e589eb2022-08-02 07:37:301181// Test that the filtering logic follows the defined ruleset in network.h.
1182TEST_F(NetworkTest, TestGetBestIPWithPreferGlobalIPv6ToLinkLocalEnabled) {
Diep Bui1e589eb2022-08-02 07:37:301183 InterfaceAddress ip, link_local;
1184 std::string ipstr;
1185
1186 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1187 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1188
1189 // Create a network with this prefix.
1190 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
Sameer Vijaykardf7df192023-04-24 09:05:441191 64, ADAPTER_TYPE_UNKNOWN);
Diep Bui1e589eb2022-08-02 07:37:301192
1193 // When there is no address added, it should return an unspecified
1194 // address.
1195 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1196 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1197
1198 // Deprecated one should not be returned.
1199 ipv6_network.AddIP(ip);
1200 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1201
1202 // Add ULA one. ULA is unique local address which is starting either
1203 // with 0xfc or 0xfd.
1204 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1205 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1206 ipv6_network.AddIP(ip);
1207 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1208
1209 // Add link local one.
1210 ipstr = "fe80::aabb:ccff:fedd:eeff";
1211 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &link_local));
1212 ipv6_network.AddIP(link_local);
1213 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(link_local));
1214
1215 // Add global one.
1216 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1217 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1218 ipv6_network.AddIP(ip);
1219 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1220
1221 // Add another link local address, then the compatible address is still global
1222 // one.
1223 ipstr = "fe80::aabb:ccff:fedd:eedd";
1224 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &link_local));
1225 ipv6_network.AddIP(link_local);
1226 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1227
1228 // Add global dynamic temporary one.
1229 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1230 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1231 ipv6_network.AddIP(ip);
1232 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1233
1234 // Add another link local address, then the compatible address is still global
1235 // dynamic one.
1236 ipstr = "fe80::aabb:ccff:fedd:eedd";
1237 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &link_local));
1238 ipv6_network.AddIP(link_local);
1239 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1240}
1241
honghaiz023f3ef2015-10-19 16:39:321242TEST_F(NetworkTest, TestNetworkMonitoring) {
Taylor Brandstetter239ac8a2020-07-31 23:07:521243 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 14:09:071244 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:261245 BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
honghaiz023f3ef2015-10-19 16:39:321246 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1247 &NetworkTest::OnNetworksChanged);
honghaiz023f3ef2015-10-19 16:39:321248 manager.StartUpdating();
honghaizcec0a082016-01-15 22:49:091249 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1250 EXPECT_TRUE(network_monitor && network_monitor->started());
honghaiz023f3ef2015-10-19 16:39:321251 EXPECT_TRUE_WAIT(callback_called_, 1000);
1252 callback_called_ = false;
1253
1254 // Clear the networks so that there will be network changes below.
1255 ClearNetworks(manager);
1256 // Network manager is started, so the callback is called when the network
1257 // monitor fires the network-change event.
Mirko Bonadei37077932021-07-27 15:00:581258 network_monitor->InovkeNetworksChangedCallbackForTesting();
honghaiz023f3ef2015-10-19 16:39:321259 EXPECT_TRUE_WAIT(callback_called_, 1000);
1260
honghaizcec0a082016-01-15 22:49:091261 // Network manager is stopped.
honghaiz023f3ef2015-10-19 16:39:321262 manager.StopUpdating();
honghaizcec0a082016-01-15 22:49:091263 EXPECT_FALSE(GetNetworkMonitor(manager)->started());
honghaiz023f3ef2015-10-19 16:39:321264}
1265
Edward Lemur8dc945c2016-07-21 08:16:401266// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
1267#if defined(WEBRTC_ANDROID)
1268#define MAYBE_DefaultLocalAddress DISABLED_DefaultLocalAddress
1269#else
1270#define MAYBE_DefaultLocalAddress DefaultLocalAddress
1271#endif
1272TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
Christoffer Jansson8dc55682023-08-07 07:11:341273 MAYBE_SKIP_IPV4;
Guo-wei Shieha34c39e2015-11-25 21:12:261274 IPAddress ip;
Taylor Brandstetter239ac8a2020-07-31 23:07:521275 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 14:09:071276 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:261277 TestBasicNetworkManager manager(&factory, &socket_server, field_trials_);
guoweis56271ed2016-01-15 22:45:061278 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1279 &NetworkTest::OnNetworksChanged);
guoweis56271ed2016-01-15 22:45:061280 manager.StartUpdating();
1281 EXPECT_TRUE_WAIT(callback_called_, 1000);
Guo-wei Shieha34c39e2015-11-25 21:12:261282
1283 // Make sure we can query default local address when an address for such
1284 // address family exists.
Niels Möller22211442022-04-07 09:43:281285 std::vector<const Network*> networks = manager.GetNetworks();
guoweis56271ed2016-01-15 22:45:061286 EXPECT_TRUE(!networks.empty());
Niels Möller22211442022-04-07 09:43:281287 for (const Network* network : networks) {
Guo-wei Shieh9af97f82015-11-10 22:47:391288 if (network->GetBestIP().family() == AF_INET) {
Taylor Brandstetter239ac8a2020-07-31 23:07:521289 EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET) != IPAddress());
guoweis56271ed2016-01-15 22:45:061290 } else if (network->GetBestIP().family() == AF_INET6 &&
1291 !IPIsLoopback(network->GetBestIP())) {
1292 // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
1293 // enabled.
Taylor Brandstetter239ac8a2020-07-31 23:07:521294 EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET6) != IPAddress());
Guo-wei Shieh9af97f82015-11-10 22:47:391295 }
1296 }
Guo-wei Shieha34c39e2015-11-25 21:12:261297
1298 // GetDefaultLocalAddress should return the valid default address after set.
1299 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1300 GetLoopbackIP(AF_INET6));
1301 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1302 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1303 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1304 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
honghaizaf83fe62016-04-18 21:50:441305
1306 // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
1307 // default address may be different from the best IP address of any network.
1308 InterfaceAddress ip1;
1309 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
1310 IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
1311 // Create a network with a prefix of ip1.
1312 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
1313 64);
1314 IPAddress ip2;
1315 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
1316 ipv6_network.AddIP(ip1);
1317 ipv6_network.AddIP(ip2);
Niels Möllerd959f3a2022-04-19 09:29:191318 std::vector<std::unique_ptr<Network>> list;
1319 list.push_back(std::make_unique<Network>(ipv6_network));
honghaizaf83fe62016-04-18 21:50:441320 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:191321 MergeNetworkList(manager, std::move(list), &changed);
honghaizaf83fe62016-04-18 21:50:441322 // If the set default address is not in any network, GetDefaultLocalAddress
1323 // should return it.
1324 IPAddress ip3;
1325 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
1326 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
1327 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1328 EXPECT_EQ(ip3, ip);
1329 // If the set default address is in a network, GetDefaultLocalAddress will
1330 // return the best IP in that network.
1331 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1332 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1333 EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1334
Guo-wei Shieh9af97f82015-11-10 22:47:391335 manager.StopUpdating();
1336}
1337
Jonas Orelandc7ea04a2020-04-03 08:12:281338// Test that MergeNetworkList does not set change = true
1339// when changing from cellular_X to cellular_Y.
1340TEST_F(NetworkTest, TestWhenNetworkListChangeReturnsChangedFlag) {
Niels Möller539f3e12021-11-26 15:33:191341 PhysicalSocketServer socket_server;
1342 BasicNetworkManager manager(&socket_server);
Jonas Orelandc7ea04a2020-04-03 08:12:281343
1344 IPAddress ip1;
1345 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
Niels Möllerd959f3a2022-04-19 09:29:191346 auto net1 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
Jonas Orelandc7ea04a2020-04-03 08:12:281347 net1->set_type(ADAPTER_TYPE_CELLULAR_3G);
1348 net1->AddIP(ip1);
Niels Möllerd959f3a2022-04-19 09:29:191349 std::vector<std::unique_ptr<Network>> list;
1350 list.push_back(std::move(net1));
Jonas Orelandc7ea04a2020-04-03 08:12:281351
1352 {
1353 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:191354 MergeNetworkList(manager, std::move(list), &changed);
Jonas Orelandc7ea04a2020-04-03 08:12:281355 EXPECT_TRUE(changed);
Niels Möller22211442022-04-07 09:43:281356 std::vector<const Network*> list2 = manager.GetNetworks();
Jonas Orelandc7ea04a2020-04-03 08:12:281357 EXPECT_EQ(list2.size(), 1uL);
1358 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_3G, list2[0]->type());
1359 }
1360
1361 // Modify net1 from 3G to 4G
1362 {
Niels Möllerd959f3a2022-04-19 09:29:191363 auto net2 =
1364 std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
Jonas Orelandc7ea04a2020-04-03 08:12:281365 net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1366 net2->AddIP(ip1);
1367 list.clear();
Niels Möllerd959f3a2022-04-19 09:29:191368 list.push_back(std::move(net2));
Jonas Orelandc7ea04a2020-04-03 08:12:281369 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:191370 MergeNetworkList(manager, std::move(list), &changed);
Jonas Orelandc7ea04a2020-04-03 08:12:281371
1372 // Change from 3G to 4G shall not trigger OnNetworksChanged,
1373 // i.e changed = false.
1374 EXPECT_FALSE(changed);
Niels Möller22211442022-04-07 09:43:281375 std::vector<const Network*> list2 = manager.GetNetworks();
Jonas Orelandc7ea04a2020-04-03 08:12:281376 ASSERT_EQ(list2.size(), 1uL);
1377 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1378 }
1379
1380 // Don't modify.
1381 {
Niels Möllerd959f3a2022-04-19 09:29:191382 auto net2 =
1383 std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
Jonas Orelandc7ea04a2020-04-03 08:12:281384 net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1385 net2->AddIP(ip1);
1386 list.clear();
Niels Möllerd959f3a2022-04-19 09:29:191387 list.push_back(std::move(net2));
Jonas Orelandc7ea04a2020-04-03 08:12:281388 bool changed;
Niels Möllerd959f3a2022-04-19 09:29:191389 MergeNetworkList(manager, std::move(list), &changed);
Jonas Orelandc7ea04a2020-04-03 08:12:281390
1391 // No change.
1392 EXPECT_FALSE(changed);
Niels Möller22211442022-04-07 09:43:281393 std::vector<const Network*> list2 = manager.GetNetworks();
Jonas Orelandc7ea04a2020-04-03 08:12:281394 ASSERT_EQ(list2.size(), 1uL);
1395 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1396 }
1397}
1398
Jonas Oreland47fa08f2020-12-05 17:09:131399#if defined(WEBRTC_POSIX)
1400TEST_F(NetworkTest, IgnoresMACBasedIPv6Address) {
1401 std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
1402 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
Niels Möller539f3e12021-11-26 15:33:191403 PhysicalSocketServer socket_server;
1404 BasicNetworkManager manager(&socket_server);
Jonas Oreland47fa08f2020-12-05 17:09:131405 manager.StartUpdating();
1406
1407 // IPSec interface; name is in form "ipsec<index>".
1408 char if_name[20] = "ipsec11";
1409 ifaddrs* addr_list =
1410 InstallIpv6Network(if_name, ipv6_address, ipv6_mask, manager);
1411
Niels Möller22211442022-04-07 09:43:281412 std::vector<const Network*> list = manager.GetNetworks();
Jonas Oreland47fa08f2020-12-05 17:09:131413 EXPECT_EQ(list.size(), 0u);
1414 ReleaseIfAddrs(addr_list);
1415}
1416
1417TEST_F(NetworkTest, WebRTC_AllowMACBasedIPv6Address) {
1418 webrtc::test::ScopedFieldTrials field_trials(
1419 "WebRTC-AllowMACBasedIPv6/Enabled/");
1420 std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
1421 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
Niels Möller539f3e12021-11-26 15:33:191422 PhysicalSocketServer socket_server;
1423 BasicNetworkManager manager(&socket_server);
Jonas Oreland47fa08f2020-12-05 17:09:131424 manager.StartUpdating();
1425
1426 // IPSec interface; name is in form "ipsec<index>".
1427 char if_name[20] = "ipsec11";
1428 ifaddrs* addr_list =
1429 InstallIpv6Network(if_name, ipv6_address, ipv6_mask, manager);
1430
Niels Möller22211442022-04-07 09:43:281431 std::vector<const Network*> list = manager.GetNetworks();
Jonas Oreland47fa08f2020-12-05 17:09:131432 EXPECT_EQ(list.size(), 1u);
1433 ReleaseIfAddrs(addr_list);
1434}
1435#endif
1436
Jonas Oreland6ca955a2021-03-15 08:27:431437#if defined(WEBRTC_POSIX)
1438TEST_F(NetworkTest, WebRTC_BindUsingInterfaceName) {
Jonas Oreland6ca955a2021-03-15 08:27:431439 char if_name1[20] = "wlan0";
1440 char if_name2[20] = "v4-wlan0";
1441 ifaddrs* list = nullptr;
1442 list = AddIpv6Address(list, if_name1, "1000:2000:3000:4000:0:0:0:1",
1443 "FFFF:FFFF:FFFF:FFFF::", 0);
1444 list = AddIpv4Address(list, if_name2, "192.168.0.2", "255.255.255.255");
Niels Möllerd959f3a2022-04-19 09:29:191445 std::vector<std::unique_ptr<Network>> result;
Jonas Oreland6ca955a2021-03-15 08:27:431446
1447 // Sanity check that both interfaces are included by default.
1448 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 14:09:071449 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:261450 BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
Jonas Oreland6ca955a2021-03-15 08:27:431451 manager.StartUpdating();
1452 CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1453 EXPECT_EQ(2u, result.size());
1454 ReleaseIfAddrs(list);
1455 bool changed;
1456 // This ensures we release the objects created in CallConvertIfAddrs.
Niels Möllerd959f3a2022-04-19 09:29:191457 MergeNetworkList(manager, std::move(result), &changed);
Jonas Oreland6ca955a2021-03-15 08:27:431458 result.clear();
1459
1460 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1461
1462 IPAddress ipv6;
1463 EXPECT_TRUE(IPFromString("1000:2000:3000:4000:0:0:0:1", &ipv6));
1464 IPAddress ipv4;
1465 EXPECT_TRUE(IPFromString("192.168.0.2", &ipv4));
1466
1467 // The network monitor only knwos about the ipv6 address, interface.
1468 network_monitor->set_adapters({"wlan0"});
1469 network_monitor->set_ip_addresses({ipv6});
1470 EXPECT_EQ(manager.BindSocketToNetwork(/* fd */ 77, ipv6),
1471 NetworkBindingResult::SUCCESS);
1472
1473 // But it will bind anyway using string matching...
1474 EXPECT_EQ(manager.BindSocketToNetwork(/* fd */ 77, ipv4),
1475 NetworkBindingResult::SUCCESS);
1476}
1477#endif
1478
Jonas Orelandb477fc72021-08-23 10:16:331479TEST_F(NetworkTest, NetworkCostVpn_Default) {
1480 IPAddress ip1;
1481 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
Jonas Orelandc06fe8b2022-03-28 12:58:261482 webrtc::test::ScopedKeyValueConfig field_trials;
Jonas Orelandb477fc72021-08-23 10:16:331483
1484 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1485 net1->set_type(ADAPTER_TYPE_VPN);
1486 net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
1487
1488 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1489 net2->set_type(ADAPTER_TYPE_ETHERNET);
1490
Jonas Orelandc06fe8b2022-03-28 12:58:261491 EXPECT_EQ(net1->GetCost(field_trials), net2->GetCost(field_trials));
Jonas Orelandb477fc72021-08-23 10:16:331492 delete net1;
1493 delete net2;
1494}
1495
1496TEST_F(NetworkTest, NetworkCostVpn_VpnMoreExpensive) {
Jonas Orelandc06fe8b2022-03-28 12:58:261497 webrtc::test::ScopedKeyValueConfig field_trials(
Jonas Orelandb477fc72021-08-23 10:16:331498 "WebRTC-AddNetworkCostToVpn/Enabled/");
1499
1500 IPAddress ip1;
1501 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1502
1503 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1504 net1->set_type(ADAPTER_TYPE_VPN);
1505 net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
1506
1507 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1508 net2->set_type(ADAPTER_TYPE_ETHERNET);
1509
Jonas Orelandc06fe8b2022-03-28 12:58:261510 EXPECT_GT(net1->GetCost(field_trials), net2->GetCost(field_trials));
Jonas Orelandb477fc72021-08-23 10:16:331511 delete net1;
1512 delete net2;
1513}
1514
Jonas Oreland30019052022-01-28 13:11:441515TEST_F(NetworkTest, GuessAdapterFromNetworkCost) {
Jonas Orelandc06fe8b2022-03-28 12:58:261516 webrtc::test::ScopedKeyValueConfig field_trials(
Jonas Oreland30019052022-01-28 13:11:441517 "WebRTC-AddNetworkCostToVpn/Enabled/"
1518 "WebRTC-UseDifferentiatedCellularCosts/Enabled/");
1519
1520 IPAddress ip1;
1521 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1522
1523 for (auto type : kAllAdapterTypes) {
1524 if (type == rtc::ADAPTER_TYPE_VPN)
1525 continue;
1526 Network net1("em1", "em1", TruncateIP(ip1, 64), 64);
1527 net1.set_type(type);
Jonas Orelandc06fe8b2022-03-28 12:58:261528 auto [guess, vpn] =
1529 Network::GuessAdapterFromNetworkCost(net1.GetCost(field_trials));
Jonas Oreland30019052022-01-28 13:11:441530 EXPECT_FALSE(vpn);
1531 if (type == rtc::ADAPTER_TYPE_LOOPBACK) {
1532 EXPECT_EQ(guess, rtc::ADAPTER_TYPE_ETHERNET);
1533 } else {
1534 EXPECT_EQ(type, guess);
1535 }
1536 }
1537
1538 // VPN
1539 for (auto type : kAllAdapterTypes) {
1540 if (type == rtc::ADAPTER_TYPE_VPN)
1541 continue;
1542 Network net1("em1", "em1", TruncateIP(ip1, 64), 64);
1543 net1.set_type(rtc::ADAPTER_TYPE_VPN);
1544 net1.set_underlying_type_for_vpn(type);
Jonas Orelandc06fe8b2022-03-28 12:58:261545 auto [guess, vpn] =
1546 Network::GuessAdapterFromNetworkCost(net1.GetCost(field_trials));
Jonas Oreland30019052022-01-28 13:11:441547 EXPECT_TRUE(vpn);
1548 if (type == rtc::ADAPTER_TYPE_LOOPBACK) {
1549 EXPECT_EQ(guess, rtc::ADAPTER_TYPE_ETHERNET);
1550 } else {
1551 EXPECT_EQ(type, guess);
1552 }
1553 }
1554}
1555
Jonas Oreland2ee0e642021-08-25 13:43:021556TEST_F(NetworkTest, VpnList) {
Niels Möller539f3e12021-11-26 15:33:191557 PhysicalSocketServer socket_server;
Jonas Oreland2ee0e642021-08-25 13:43:021558 {
Niels Möller539f3e12021-11-26 15:33:191559 BasicNetworkManager manager(&socket_server);
Jonas Oreland2ee0e642021-08-25 13:43:021560 manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 16)});
1561 manager.StartUpdating();
1562 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.1.1"), 32));
1563 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.12.1"), 24));
1564 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 16));
1565 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 24));
1566 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.133.1.1"), 32));
1567 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.133.0.0"), 16));
1568 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 15));
1569 }
1570 {
Niels Möller539f3e12021-11-26 15:33:191571 BasicNetworkManager manager(&socket_server);
Jonas Oreland2ee0e642021-08-25 13:43:021572 manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 24)});
1573 manager.StartUpdating();
1574 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.168.1.1"), 32));
1575 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.1"), 32));
1576 }
1577}
1578
1579#if defined(WEBRTC_POSIX)
1580// TODO(webrtc:13114): Implement the InstallIpv4Network for windows.
1581TEST_F(NetworkTest, VpnListOverrideAdapterType) {
Niels Möller539f3e12021-11-26 15:33:191582 PhysicalSocketServer socket_server;
1583 BasicNetworkManager manager(&socket_server);
Jonas Oreland2ee0e642021-08-25 13:43:021584 manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 16)});
1585 manager.StartUpdating();
1586
1587 char if_name[20] = "eth0";
1588 auto addr_list =
1589 InstallIpv4Network(if_name, "192.168.1.23", "255.255.255.255", manager);
1590
Niels Möller22211442022-04-07 09:43:281591 std::vector<const Network*> list = manager.GetNetworks();
Jonas Oreland2ee0e642021-08-25 13:43:021592 ASSERT_EQ(1u, list.size());
1593 EXPECT_EQ(ADAPTER_TYPE_VPN, list[0]->type());
1594 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, list[0]->underlying_type_for_vpn());
1595 ClearNetworks(manager);
1596 ReleaseIfAddrs(addr_list);
1597}
1598#endif // defined(WEBRTC_POSIX)
1599
Jonas Orelandac554eb2021-08-27 07:43:381600TEST_F(NetworkTest, HardcodedVpn) {
1601 const uint8_t cisco[] = {0x0, 0x5, 0x9A, 0x3C, 0x7A, 0x0};
1602 const uint8_t global[] = {0x2, 0x50, 0x41, 0x0, 0x0, 0x1};
1603 const uint8_t unknown[] = {0x2, 0x50, 0x41, 0x0, 0x0, 0x0};
1604 const uint8_t five_bytes[] = {0x2, 0x50, 0x41, 0x0, 0x0};
1605 EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(cisco));
1606 EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(global));
1607
1608 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(
1609 rtc::ArrayView<const uint8_t>(cisco, 5)));
1610 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(five_bytes));
1611 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(unknown));
1612 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(nullptr));
1613}
1614
Mirko Bonadei13f9c622022-04-29 14:38:321615TEST(CompareNetworks, IrreflexivityTest) {
1616 // x < x is false
1617 auto network = std::make_unique<Network>(
1618 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1619 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network, network));
1620}
1621
1622TEST(CompareNetworks, AsymmetryTest) {
1623 // x < y and y < x cannot be both true
1624 auto network_a = std::make_unique<Network>(
1625 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1626 auto network_b = std::make_unique<Network>(
1627 "test_eth1", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1628 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_b));
1629 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_b, network_a));
1630
1631 auto network_c = std::make_unique<Network>(
1632 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345500U), 24);
1633 auto network_d = std::make_unique<Network>(
1634 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1635 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_c, network_d));
1636 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_d, network_c));
1637}
1638
1639TEST(CompareNetworks, TransitivityTest) {
1640 // x < y and y < z imply x < z
1641 auto network_a = std::make_unique<Network>(
1642 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1643 auto network_b = std::make_unique<Network>(
1644 "test_eth1", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1645 auto network_c = std::make_unique<Network>(
1646 "test_eth2", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1647 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_b));
1648 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_b, network_c));
1649
1650 auto network_d = std::make_unique<Network>(
1651 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1652 auto network_e = std::make_unique<Network>(
1653 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345700U), 24);
1654 auto network_f = std::make_unique<Network>(
1655 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345800U), 24);
1656 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_d, network_e));
1657 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_e, network_f));
1658 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_d, network_f));
1659 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_c));
1660}
1661
1662TEST(CompareNetworks, TransitivityOfIncomparabilityTest) {
1663 // x == y and y == z imply x == z,
1664 // where x == y means x < y and y < x are both false
1665 auto network_a = std::make_unique<Network>(
1666 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 23);
1667 auto network_b = std::make_unique<Network>(
1668 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1669 auto network_c = std::make_unique<Network>(
1670 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345700U), 24);
1671
1672 // network_a < network_b
1673 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_b));
1674 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_b, network_a));
1675
1676 // network_b < network_c
1677 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_b, network_c));
1678 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_c, network_b));
1679
1680 // network_a < network_c
1681 EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_c));
1682 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_c, network_a));
1683
1684 auto network_d = std::make_unique<Network>(
1685 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1686 auto network_e = std::make_unique<Network>(
1687 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1688 auto network_f = std::make_unique<Network>(
1689 "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1690
1691 // network_d == network_e
1692 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_d, network_e));
1693 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_e, network_d));
1694
1695 // network_e == network_f
1696 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_e, network_f));
1697 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_f, network_e));
1698
1699 // network_d == network_f
1700 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_d, network_f));
1701 EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_f, network_d));
1702}
1703
henrike@webrtc.orgf0488722014-05-13 18:00:261704} // namespace rtc