blob: 8f60de5563770c37d0d36f086b475afe54b75c10 [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
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -070015#include <algorithm>
jbauch555604a2016-04-26 03:13:22 -070016#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000017#include <vector>
oprypin1ea631f2017-08-18 00:15:19 -070018
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -070019#include "absl/algorithm/container.h"
Mirko Bonadei06d35592020-04-01 13:43:08 +020020#include "absl/strings/match.h"
Ali Tofigh7fa90572022-03-17 15:47:49 +010021#include "absl/strings/string_view.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "rtc_base/net_helpers.h"
24#include "rtc_base/network_monitor.h"
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -070025#include "rtc_base/network_monitor_factory.h"
Niels Mölleraa373162021-09-28 16:09:07 +020026#include "rtc_base/physical_socket_server.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000027#if defined(WEBRTC_POSIX)
Henrik Kjellander00725112017-06-30 15:14:45 +020028#include <net/if.h>
Yves Gerey665174f2018-06-19 15:03:05 +020029#include <sys/types.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020030
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "rtc_base/ifaddrs_converter.h"
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080032#endif // defined(WEBRTC_POSIX)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/gunit.h"
Steve Anton2acd1632019-03-25 13:48:30 -070034#include "test/gmock.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000035#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 11:09:25 +010036#include "rtc_base/logging.h" // For RTC_LOG_GLE
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037#endif
Jonas Oreland47fa08f2020-12-05 18:09:13 +010038#include "test/field_trial.h"
Jonas Orelandc06fe8b2022-03-28 14:58:26 +020039#include "test/scoped_key_value_config.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040
Steve Anton2acd1632019-03-25 13:48:30 -070041using ::testing::Contains;
42using ::testing::Not;
43using ::testing::UnorderedElementsAre;
44using ::testing::UnorderedElementsAreArray;
45
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000046namespace rtc {
47
Guo-wei Shieh9faf1542015-12-28 14:06:55 -080048namespace {
49
Ali Tofigh7fa90572022-03-17 15:47:49 +010050IPAddress IPFromString(absl::string_view str) {
Jonas Oreland2ee0e642021-08-25 15:43:02 +020051 IPAddress ip;
52 RTC_CHECK(IPFromString(str, &ip));
53 return ip;
54}
55
Taylor Brandstetter32eb03a2020-09-11 17:15:30 +000056class FakeNetworkMonitor : public NetworkMonitorInterface {
honghaiz023f3ef2015-10-19 09:39:32 -070057 public:
honghaizcec0a082016-01-15 14:49:09 -080058 void Start() override { started_ = true; }
59 void Stop() override { started_ = false; }
60 bool started() { return started_; }
Ali Tofigh7fa90572022-03-17 15:47:49 +010061 AdapterType GetAdapterType(absl::string_view if_name) override {
Honghai Zhang351d77b2016-05-20 15:08:29 -070062 // Note that the name matching rules are different from the
63 // GetAdapterTypeFromName in NetworkManager.
Mirko Bonadei06d35592020-04-01 13:43:08 +020064 if (absl::StartsWith(if_name, "wifi")) {
Honghai Zhang351d77b2016-05-20 15:08:29 -070065 return ADAPTER_TYPE_WIFI;
66 }
Mirko Bonadei06d35592020-04-01 13:43:08 +020067 if (absl::StartsWith(if_name, "cellular")) {
Honghai Zhang351d77b2016-05-20 15:08:29 -070068 return ADAPTER_TYPE_CELLULAR;
69 }
honghaiza7ad7c32016-02-02 12:54:14 -080070 return ADAPTER_TYPE_UNKNOWN;
71 }
Ali Tofigh7fa90572022-03-17 15:47:49 +010072 AdapterType GetVpnUnderlyingAdapterType(absl::string_view if_name) override {
Taylor Brandstetter32eb03a2020-09-11 17:15:30 +000073 return ADAPTER_TYPE_UNKNOWN;
74 }
Ali Tofigh7fa90572022-03-17 15:47:49 +010075 NetworkPreference GetNetworkPreference(absl::string_view if_name) override {
Jonas Orelandf7721fb2020-08-07 11:08:34 +020076 return NetworkPreference::NEUTRAL;
77 }
honghaizcec0a082016-01-15 14:49:09 -080078
Ali Tofigh7fa90572022-03-17 15:47:49 +010079 bool IsAdapterAvailable(absl::string_view if_name) override {
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -070080 return absl::c_count(unavailable_adapters_, if_name) == 0;
81 }
82
83 // Used to test IsAdapterAvailable.
84 void set_unavailable_adapters(std::vector<std::string> unavailable_adapters) {
85 unavailable_adapters_ = unavailable_adapters;
86 }
87
Jonas Oreland6ca955a2021-03-15 08:27:43 +000088 bool SupportsBindSocketToNetwork() const override { return true; }
89
Ali Tofigh7fa90572022-03-17 15:47:49 +010090 NetworkBindingResult BindSocketToNetwork(int socket_fd,
91 const IPAddress& address,
92 absl::string_view if_name) override {
Jonas Oreland6ca955a2021-03-15 08:27:43 +000093 if (absl::c_count(addresses_, address) > 0) {
94 return NetworkBindingResult::SUCCESS;
95 }
96
97 for (auto const& iter : adapters_) {
Ali Tofigh7fa90572022-03-17 15:47:49 +010098 if (if_name.find(iter) != absl::string_view::npos) {
Jonas Oreland6ca955a2021-03-15 08:27:43 +000099 return NetworkBindingResult::SUCCESS;
100 }
101 }
102 return NetworkBindingResult::ADDRESS_NOT_FOUND;
103 }
104
105 void set_ip_addresses(std::vector<IPAddress> addresses) {
106 addresses_ = addresses;
107 }
108
109 void set_adapters(std::vector<std::string> adapters) { adapters_ = adapters; }
110
Mirko Bonadei37077932021-07-27 17:00:58 +0200111 void InovkeNetworksChangedCallbackForTesting() {
112 InvokeNetworksChangedCallback();
113 }
114
honghaizcec0a082016-01-15 14:49:09 -0800115 private:
116 bool started_ = false;
Jonas Oreland6ca955a2021-03-15 08:27:43 +0000117 std::vector<std::string> adapters_;
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -0700118 std::vector<std::string> unavailable_adapters_;
Jonas Oreland6ca955a2021-03-15 08:27:43 +0000119 std::vector<IPAddress> addresses_;
honghaiz023f3ef2015-10-19 09:39:32 -0700120};
121
122class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
123 public:
124 FakeNetworkMonitorFactory() {}
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200125 NetworkMonitorInterface* CreateNetworkMonitor(
Jonas Orelande62c2f22022-03-29 11:04:48 +0200126 const webrtc::FieldTrialsView& field_trials) override {
honghaiz023f3ef2015-10-19 09:39:32 -0700127 return new FakeNetworkMonitor();
128 }
129};
130
Qingsi Wang10a0e512018-05-16 13:37:03 -0700131bool SameNameAndPrefix(const rtc::Network& a, const rtc::Network& b) {
132 if (a.name() != b.name()) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000133 RTC_LOG(LS_INFO) << "Different interface names.";
Qingsi Wang10a0e512018-05-16 13:37:03 -0700134 return false;
135 }
136 if (a.prefix_length() != b.prefix_length() || a.prefix() != b.prefix()) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000137 RTC_LOG(LS_INFO) << "Different IP prefixes.";
Qingsi Wang10a0e512018-05-16 13:37:03 -0700138 return false;
139 }
140 return true;
141}
142
Niels Möllerd959f3a2022-04-19 11:29:19 +0200143std::vector<const Network*> CopyNetworkPointers(
144 const std::vector<std::unique_ptr<Network>>& owning_list) {
145 std::vector<const Network*> ptr_list;
146 ptr_list.reserve(owning_list.size());
147 for (const auto& network : owning_list) {
148 ptr_list.push_back(network.get());
149 }
150 return ptr_list;
151}
152
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800153} // namespace
154
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200155class NetworkTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156 public:
157 NetworkTest() : callback_called_(false) {}
158
Yves Gerey665174f2018-06-19 15:03:05 +0200159 void OnNetworksChanged() { callback_called_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000160
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000161 NetworkManager::Stats MergeNetworkList(
162 BasicNetworkManager& network_manager,
Niels Möllerd959f3a2022-04-19 11:29:19 +0200163 std::vector<std::unique_ptr<Network>> list,
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000164 bool* changed) {
165 NetworkManager::Stats stats;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200166 network_manager.MergeNetworkList(std::move(list), changed, &stats);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000167 return stats;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000168 }
169
170 bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
171 const Network& network) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700172 RTC_DCHECK_RUN_ON(network_manager.thread_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000173 return network_manager.IsIgnoredNetwork(network);
174 }
175
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700176 IPAddress QueryDefaultLocalAddress(BasicNetworkManager& network_manager,
177 int family) {
178 RTC_DCHECK_RUN_ON(network_manager.thread_);
179 return network_manager.QueryDefaultLocalAddress(family);
180 }
181
Niels Möllerd959f3a2022-04-19 11:29:19 +0200182 std::vector<std::unique_ptr<Network>> GetNetworks(
Yves Gerey665174f2018-06-19 15:03:05 +0200183 const BasicNetworkManager& network_manager,
184 bool include_ignored) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700185 RTC_DCHECK_RUN_ON(network_manager.thread_);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200186 std::vector<std::unique_ptr<Network>> list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000187 network_manager.CreateNetworks(include_ignored, &list);
188 return list;
189 }
190
honghaizcec0a082016-01-15 14:49:09 -0800191 FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700192 RTC_DCHECK_RUN_ON(network_manager.thread_);
honghaizcec0a082016-01-15 14:49:09 -0800193 return static_cast<FakeNetworkMonitor*>(
194 network_manager.network_monitor_.get());
honghaiz023f3ef2015-10-19 09:39:32 -0700195 }
196 void ClearNetworks(BasicNetworkManager& network_manager) {
honghaiz023f3ef2015-10-19 09:39:32 -0700197 network_manager.networks_.clear();
198 network_manager.networks_map_.clear();
199 }
200
Honghai Zhang351d77b2016-05-20 15:08:29 -0700201 AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
Niels Möller22211442022-04-07 11:43:28 +0200202 std::vector<const Network*> list = network_manager.GetNetworks();
nissec16fa5e2017-02-07 07:18:43 -0800203 RTC_CHECK_EQ(1, list.size());
Honghai Zhang351d77b2016-05-20 15:08:29 -0700204 return list[0]->type();
205 }
206
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000207#if defined(WEBRTC_POSIX)
208 // Separated from CreateNetworks for tests.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200209 static void CallConvertIfAddrs(
210 const BasicNetworkManager& network_manager,
211 struct ifaddrs* interfaces,
212 bool include_ignored,
213 std::vector<std::unique_ptr<Network>>* networks) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700214 RTC_DCHECK_RUN_ON(network_manager.thread_);
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800215 // Use the base IfAddrsConverter for test cases.
jbauch555604a2016-04-26 03:13:22 -0700216 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800217 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
218 include_ignored, networks);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000219 }
honghaizdb8cf502015-12-21 13:08:46 -0800220
Ali Tofigh7fa90572022-03-17 15:47:49 +0100221 struct sockaddr_in6* CreateIpv6Addr(absl::string_view ip_string,
honghaizdb8cf502015-12-21 13:08:46 -0800222 uint32_t scope_id) {
Yves Gerey665174f2018-06-19 15:03:05 +0200223 struct sockaddr_in6* ipv6_addr =
224 static_cast<struct sockaddr_in6*>(malloc(sizeof(struct sockaddr_in6)));
honghaizdb8cf502015-12-21 13:08:46 -0800225 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
226 ipv6_addr->sin6_family = AF_INET6;
227 ipv6_addr->sin6_scope_id = scope_id;
228 IPAddress ip;
229 IPFromString(ip_string, &ip);
230 ipv6_addr->sin6_addr = ip.ipv6_address();
231 return ipv6_addr;
232 }
233
234 // Pointers created here need to be released via ReleaseIfAddrs.
235 struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
236 char* if_name,
Ali Tofigh7fa90572022-03-17 15:47:49 +0100237 absl::string_view ipv6_address,
238 absl::string_view ipv6_netmask,
honghaizdb8cf502015-12-21 13:08:46 -0800239 uint32_t scope_id) {
240 struct ifaddrs* if_addr = new struct ifaddrs;
241 memset(if_addr, 0, sizeof(struct ifaddrs));
242 if_addr->ifa_name = if_name;
243 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
244 CreateIpv6Addr(ipv6_address, scope_id));
245 if_addr->ifa_netmask =
246 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
247 if_addr->ifa_next = list;
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800248 if_addr->ifa_flags = IFF_RUNNING;
honghaizdb8cf502015-12-21 13:08:46 -0800249 return if_addr;
250 }
251
Honghai Zhang351d77b2016-05-20 15:08:29 -0700252 struct ifaddrs* InstallIpv6Network(char* if_name,
Ali Tofigh7fa90572022-03-17 15:47:49 +0100253 absl::string_view ipv6_address,
254 absl::string_view ipv6_mask,
Honghai Zhang351d77b2016-05-20 15:08:29 -0700255 BasicNetworkManager& network_manager) {
256 ifaddrs* addr_list = nullptr;
257 addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200258 std::vector<std::unique_ptr<Network>> result;
Honghai Zhang351d77b2016-05-20 15:08:29 -0700259 bool changed;
260 NetworkManager::Stats stats;
261 CallConvertIfAddrs(network_manager, addr_list, true, &result);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200262 network_manager.MergeNetworkList(std::move(result), &changed, &stats);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700263 return addr_list;
264 }
265
Ali Tofigh7fa90572022-03-17 15:47:49 +0100266 struct sockaddr_in* CreateIpv4Addr(absl::string_view ip_string) {
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800267 struct sockaddr_in* ipv4_addr =
268 static_cast<struct sockaddr_in*>(malloc(sizeof(struct sockaddr_in)));
269 memset(ipv4_addr, 0, sizeof(struct sockaddr_in));
270 ipv4_addr->sin_family = AF_INET;
271 IPAddress ip;
272 IPFromString(ip_string, &ip);
273 ipv4_addr->sin_addr = ip.ipv4_address();
274 return ipv4_addr;
275 }
276
277 // Pointers created here need to be released via ReleaseIfAddrs.
278 struct ifaddrs* AddIpv4Address(struct ifaddrs* list,
279 char* if_name,
Ali Tofigh7fa90572022-03-17 15:47:49 +0100280 absl::string_view ipv4_address,
281 absl::string_view ipv4_netmask) {
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800282 struct ifaddrs* if_addr = new struct ifaddrs;
283 memset(if_addr, 0, sizeof(struct ifaddrs));
284 if_addr->ifa_name = if_name;
285 if_addr->ifa_addr =
286 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_address));
287 if_addr->ifa_netmask =
288 reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_netmask));
289 if_addr->ifa_next = list;
290 if_addr->ifa_flags = IFF_RUNNING;
291 return if_addr;
292 }
293
294 struct ifaddrs* InstallIpv4Network(char* if_name,
Ali Tofigh7fa90572022-03-17 15:47:49 +0100295 absl::string_view ipv4_address,
296 absl::string_view ipv4_mask,
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800297 BasicNetworkManager& network_manager) {
298 ifaddrs* addr_list = nullptr;
299 addr_list = AddIpv4Address(addr_list, if_name, ipv4_address, ipv4_mask);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200300 std::vector<std::unique_ptr<Network>> result;
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800301 bool changed;
302 NetworkManager::Stats stats;
303 CallConvertIfAddrs(network_manager, addr_list, true, &result);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200304 network_manager.MergeNetworkList(std::move(result), &changed, &stats);
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800305 return addr_list;
306 }
307
honghaizdb8cf502015-12-21 13:08:46 -0800308 void ReleaseIfAddrs(struct ifaddrs* list) {
309 struct ifaddrs* if_addr = list;
310 while (if_addr != nullptr) {
311 struct ifaddrs* next_addr = if_addr->ifa_next;
oprypin1ea631f2017-08-18 00:15:19 -0700312 free(if_addr->ifa_addr);
313 free(if_addr->ifa_netmask);
honghaizdb8cf502015-12-21 13:08:46 -0800314 delete if_addr;
315 if_addr = next_addr;
316 }
317 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000318#endif // defined(WEBRTC_POSIX)
319
320 protected:
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200321 webrtc::test::ScopedKeyValueConfig field_trials_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000322 bool callback_called_;
323};
324
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800325class TestBasicNetworkManager : public BasicNetworkManager {
326 public:
Niels Mölleraa373162021-09-28 16:09:07 +0200327 TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200328 SocketFactory* socket_factory,
Jonas Orelande62c2f22022-03-29 11:04:48 +0200329 const webrtc::FieldTrialsView& field_trials)
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200330 : BasicNetworkManager(network_monitor_factory,
331 socket_factory,
332 &field_trials) {}
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800333 using BasicNetworkManager::QueryDefaultLocalAddress;
Guo-wei Shieha34c39e2015-11-25 13:12:26 -0800334 using BasicNetworkManager::set_default_local_addresses;
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800335};
336
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000337// Test that the Network ctor works properly.
338TEST_F(NetworkTest, TestNetworkConstruct) {
339 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
340 IPAddress(0x12345600U), 24);
341 EXPECT_EQ("test_eth0", ipv4_network1.name());
342 EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
343 EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
344 EXPECT_EQ(24, ipv4_network1.prefix_length());
345 EXPECT_FALSE(ipv4_network1.ignored());
346}
347
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000348TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
349 Network ipv4_network1("test_eth0", "Test Network Adapter 1",
350 IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000351 Network ipv4_network2("test_eth1", "Test Network Adapter 2",
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000352 IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
Niels Möller539f3e12021-11-26 16:33:19 +0100353 PhysicalSocketServer socket_server;
354 BasicNetworkManager network_manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700355 network_manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000356 EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
357 EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
358}
359
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000360// TODO(phoglund): Remove when ignore list goes away.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000361TEST_F(NetworkTest, TestIgnoreList) {
Yves Gerey665174f2018-06-19 15:03:05 +0200362 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 16:33:19 +0100366 PhysicalSocketServer socket_server;
367 BasicNetworkManager default_network_manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700368 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 16:33:19 +0100372 BasicNetworkManager ignoring_network_manager(&socket_server);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373 std::vector<std::string> ignore_list;
374 ignore_list.push_back("ignore_me");
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700375 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:26 +0000379}
380
381// Test is failing on Windows opt: b/11288214
382TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
Niels Möller539f3e12021-11-26 16:33:19 +0100383 PhysicalSocketServer socket_server;
384 BasicNetworkManager manager(&socket_server);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200385 std::vector<std::unique_ptr<Network>> result = GetNetworks(manager, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000386 // We should be able to bind to any addresses we find.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200387 for (auto it = result.begin(); it != result.end(); ++it) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000388 sockaddr_storage storage;
389 memset(&storage, 0, sizeof(storage));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +0000390 IPAddress ip = (*it)->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000391 SocketAddress bindaddress(ip, 0);
392 bindaddress.SetScopeID((*it)->scope_id());
Niels Möllerd0b88792021-08-12 10:32:30 +0200393 // TODO(thaloun): Use rtc::Socket once it supports IPv6.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000394 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 15:03:05 +0200398 int success = ::bind(fd, reinterpret_cast<sockaddr*>(&storage),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000399 static_cast<int>(ipsize));
400#if defined(WEBRTC_WIN)
Mirko Bonadei675513b2017-11-09 11:09:25 +0100401 if (success)
402 RTC_LOG_GLE(LS_ERROR) << "Socket bind failed.";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000403#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:26 +0000411 }
412}
413
Guo-wei Shieh47872ec2015-08-19 10:32:46 -0700414// Test StartUpdating() and StopUpdating(). network_permission_state starts with
415// ALLOWED.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000416TEST_F(NetworkTest, TestUpdateNetworks) {
Niels Mölleraa373162021-09-28 16:09:07 +0200417 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200418 BasicNetworkManager manager(nullptr, &socket_server, &field_trials_);
Yves Gerey665174f2018-06-19 15:03:05 +0200419 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
420 &NetworkTest::OnNetworksChanged);
guoweisea1012b2015-08-21 09:06:28 -0700421 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
422 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000423 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 09:06:28 -0700436 EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
437 manager.enumeration_permission());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000438 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 16:33:19 +0100457 PhysicalSocketServer socket_server;
458 BasicNetworkManager manager(&socket_server);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000459
460 // Add ipv4_network1 to the list of networks.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200461 std::vector<std::unique_ptr<Network>> list;
462 list.push_back(std::make_unique<Network>(ipv4_network1));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000463 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200464 NetworkManager::Stats stats =
465 MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000466 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000467 EXPECT_EQ(stats.ipv6_network_count, 0);
468 EXPECT_EQ(stats.ipv4_network_count, 1);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200469 list.clear(); // It is fine to call .clear() on a moved-from vector.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000470
Niels Möller22211442022-04-07 11:43:28 +0200471 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 16:07:48 -0700475 uint16_t net_id1 = net1->id();
476 EXPECT_EQ(1, net_id1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000477
478 // Replace ipv4_network1 with ipv4_network2.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200479 list.push_back(std::make_unique<Network>(ipv4_network2));
480 stats = MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000481 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000482 EXPECT_EQ(stats.ipv6_network_count, 0);
483 EXPECT_EQ(stats.ipv4_network_count, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000484 list.clear();
485
Niels Möller22211442022-04-07 11:43:28 +0200486 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 16:07:48 -0700490 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:26 +0000493
494 // Add Network2 back.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200495 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:26 +0000498 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000499 EXPECT_EQ(stats.ipv6_network_count, 0);
500 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000501 list.clear();
502
503 // Verify that we get previous instances of Network objects.
Niels Möller22211442022-04-07 11:43:28 +0200504 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:26 +0000510
511 // Call MergeNetworkList() again and verify that we don't get update
512 // notification.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200513 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:26 +0000516 EXPECT_FALSE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000517 EXPECT_EQ(stats.ipv6_network_count, 0);
518 EXPECT_EQ(stats.ipv4_network_count, 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000519 list.clear();
520
521 // Verify that we get previous instances of Network objects.
Niels Möller22211442022-04-07 11:43:28 +0200522 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:26 +0000528}
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 11:29:19 +0200532void SetupNetworks(std::vector<std::unique_ptr<Network>>* list) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000533 IPAddress ip;
534 IPAddress prefix;
guoweis@webrtc.orgbbce5ef2015-03-05 04:38:29 +0000535 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
536 EXPECT_TRUE(IPFromString("abcd::", &prefix));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000537 // 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:29 +0000541 EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000542 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 11:29:19 +0200556 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:26 +0000560}
561
562// Test that the basic network merging case works.
563TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
Niels Möller539f3e12021-11-26 16:33:19 +0100564 PhysicalSocketServer socket_server;
565 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 15:03:05 +0200566 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
567 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200568 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:26 +0000571 bool changed = false;
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000572 NetworkManager::Stats stats =
Niels Möllerd959f3a2022-04-19 11:29:19 +0200573 MergeNetworkList(manager, std::move(networks), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000574 EXPECT_TRUE(changed);
guoweis@webrtc.orga094cac2015-01-28 19:34:05 +0000575 EXPECT_EQ(stats.ipv6_network_count, 4);
576 EXPECT_EQ(stats.ipv4_network_count, 0);
Niels Möller22211442022-04-07 11:43:28 +0200577 std::vector<const Network*> list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000578 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700579 EXPECT_THAT(list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000580}
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 16:33:19 +0100586 PhysicalSocketServer socket_server;
587 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 15:03:05 +0200588 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
589 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200590 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:26 +0000593 bool changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200594 MergeNetworkList(manager, std::move(networks), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000595 EXPECT_TRUE(changed);
596 // Second list that describes the same networks but with new objects.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200597 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:26 +0000601 changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200602 MergeNetworkList(manager, std::move(second_networks), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000603 EXPECT_FALSE(changed);
Niels Möller22211442022-04-07 11:43:28 +0200604 std::vector<const Network*> resulting_list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000605 // Verify that the original members are in the merged list.
Steve Anton2acd1632019-03-25 13:48:30 -0700606 EXPECT_THAT(resulting_list, UnorderedElementsAreArray(original_list));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000607 // Doublecheck that the new networks aren't in the list.
Steve Anton2acd1632019-03-25 13:48:30 -0700608 for (const Network* network : second_list) {
609 EXPECT_THAT(resulting_list, Not(Contains(network)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000610 }
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 16:33:19 +0100617 PhysicalSocketServer socket_server;
618 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 15:03:05 +0200619 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
620 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200621 std::vector<std::unique_ptr<Network>> original_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000622 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 11:29:19 +0200627 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:26 +0000631 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 11:29:19 +0200635 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:26 +0000638 bool changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200639 MergeNetworkList(manager, std::move(original_list), &changed);
640 std::vector<std::unique_ptr<Network>> second_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000641 SetupNetworks(&second_list);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200642 second_list.push_back(std::move(changed_network));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000643 changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200644 MergeNetworkList(manager, std::move(second_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000645 EXPECT_TRUE(changed);
Niels Möller22211442022-04-07 11:43:28 +0200646 std::vector<const Network*> list = manager.GetNetworks();
Niels Möllerd959f3a2022-04-19 11:29:19 +0200647 EXPECT_EQ(original_size, list.size());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000648 // Make sure the original network is still in the merged list.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200649 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:26 +0000651}
652
Niels Möllerd959f3a2022-04-19 11:29:19 +0200653TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
Niels Möller539f3e12021-11-26 16:33:19 +0100654 PhysicalSocketServer socket_server;
655 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 15:03:05 +0200656 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
657 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200658 std::vector<std::unique_ptr<Network>> original_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000659 SetupNetworks(&original_list);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200660 const Network* const network_ptr = original_list[2].get();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000661 bool changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200662 MergeNetworkList(manager, std::move(original_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000663 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 11:29:19 +0200675
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:26 +0000680 changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200681 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:26 +0000683 EXPECT_TRUE(changed);
684 // There should still be four networks.
Niels Möller22211442022-04-07 11:43:28 +0200685 std::vector<const Network*> list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000686 EXPECT_EQ(4U, list.size());
687 // Check the gathered IPs.
688 int matchcount = 0;
Niels Möller22211442022-04-07 11:43:28 +0200689 for (const Network* network : list) {
Niels Möllerd959f3a2022-04-19 11:29:19 +0200690 if (SameNameAndPrefix(*network, *network_copy)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000691 ++matchcount;
692 EXPECT_EQ(1, matchcount);
693 // This should be the same network object as before.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200694 EXPECT_EQ(network, network_ptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000695 // But with two addresses now.
Niels Möller22211442022-04-07 11:43:28 +0200696 EXPECT_THAT(network->GetIPs(),
Steve Anton2acd1632019-03-25 13:48:30 -0700697 UnorderedElementsAre(InterfaceAddress(check_ip),
698 InterfaceAddress(ip)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000699 } else {
700 // Check the IP didn't get added anywhere it wasn't supposed to.
Niels Möller22211442022-04-07 11:43:28 +0200701 EXPECT_THAT(network->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702 }
703 }
704}
705
706// Test that merge correctly distinguishes multiple networks on an interface.
707TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
Niels Möller539f3e12021-11-26 16:33:19 +0100708 PhysicalSocketServer socket_server;
709 BasicNetworkManager manager(&socket_server);
Yves Gerey665174f2018-06-19 15:03:05 +0200710 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
711 &NetworkTest::OnNetworksChanged);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200712 std::vector<std::unique_ptr<Network>> original_list;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000713 SetupNetworks(&original_list);
714 bool changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200715 MergeNetworkList(manager, std::move(original_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000716 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 11:29:19 +0200725 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:26 +0000729 changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200730 MergeNetworkList(manager, std::move(second_list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000731 EXPECT_TRUE(changed);
732 // There should be five networks now.
Niels Möller22211442022-04-07 11:43:28 +0200733 std::vector<const Network*> list = manager.GetNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000734 EXPECT_EQ(5U, list.size());
735 // Check the resulting addresses.
Niels Möller22211442022-04-07 11:43:28 +0200736 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:26 +0000739 // Check the new network has 1 IP and that it's the correct one.
Niels Möller22211442022-04-07 11:43:28 +0200740 EXPECT_EQ(1U, network->GetIPs().size());
741 EXPECT_EQ(ip, network->GetIPs().at(0));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000742 } else {
743 // Check the IP didn't get added anywhere it wasn't supposed to.
Niels Möller22211442022-04-07 11:43:28 +0200744 EXPECT_THAT(network->GetIPs(), Not(Contains(InterfaceAddress(ip))));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000745 }
746 }
747}
748
honghaizdb8cf502015-12-21 13:08:46 -0800749// Test that DumpNetworks does not crash.
750TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
Niels Möller539f3e12021-11-26 16:33:19 +0100751 PhysicalSocketServer socket_server;
752 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700753 manager.StartUpdating();
Niels Möllerd959f3a2022-04-19 11:29:19 +0200754 std::vector<std::unique_ptr<Network>> list = GetNetworks(manager, true);
honghaizdb8cf502015-12-21 13:08:46 -0800755 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200756 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 13:08:46 -0800757 manager.DumpNetworks();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000758}
759
Mirko Bonadei44f0f872019-01-20 18:16:42 +0100760TEST_F(NetworkTest, TestIPv6Toggle) {
Niels Möller539f3e12021-11-26 16:33:19 +0100761 PhysicalSocketServer socket_server;
762 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700763 manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000764 bool ipv6_found = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200765 for (const auto& network : GetNetworks(manager, true)) {
766 if (network->prefix().family() == AF_INET6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000767 ipv6_found = true;
768 break;
769 }
770 }
771 EXPECT_TRUE(ipv6_found);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000772}
773
deadbeef3427f532017-07-26 16:09:33 -0700774// Test that when network interfaces are sorted and given preference values,
775// IPv6 comes first.
776TEST_F(NetworkTest, IPv6NetworksPreferredOverIPv4) {
Niels Möller539f3e12021-11-26 16:33:19 +0100777 PhysicalSocketServer socket_server;
778 BasicNetworkManager manager(&socket_server);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000779 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 11:29:19 +0200791 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:26 +0000796
797 bool changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200798 MergeNetworkList(manager, std::move(list), &changed);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000799 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 16:09:33 -0700804// 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 16:33:19 +0100807 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200808 BasicNetworkManager manager(&socket_server, &field_trials_);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200809 auto eth0 = std::make_unique<Network>("test_eth0", "Test Network Adapter 1",
810 IPAddress(0x65432100U), 24);
deadbeef3427f532017-07-26 16:09:33 -0700811 eth0->AddIP(IPAddress(0x65432100U));
Niels Möllerd959f3a2022-04-19 11:29:19 +0200812 auto eth1 = std::make_unique<Network>("test_eth1", "Test Network Adapter 2",
813 IPAddress(0x12345600U), 24);
deadbeef3427f532017-07-26 16:09:33 -0700814 eth1->AddIP(IPAddress(0x12345600U));
Niels Möllerd959f3a2022-04-19 11:29:19 +0200815 std::vector<std::unique_ptr<Network>> list;
816 const Network* eth0_ptr = eth0.get();
817 const Network* eth1_ptr = eth1.get();
deadbeef3427f532017-07-26 16:09:33 -0700818 // Add them to the list in the opposite of the expected sorted order, to
819 // ensure sorting actually occurs.
Niels Möllerd959f3a2022-04-19 11:29:19 +0200820 list.push_back(std::move(eth1));
821 list.push_back(std::move(eth0));
deadbeef3427f532017-07-26 16:09:33 -0700822
823 bool changed = false;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200824 MergeNetworkList(manager, std::move(list), &changed);
deadbeef3427f532017-07-26 16:09:33 -0700825 ASSERT_TRUE(changed);
826 // "test_eth0" should be preferred over "test_eth1".
Niels Möllerd959f3a2022-04-19 11:29:19 +0200827 EXPECT_TRUE(eth0_ptr->preference() > eth1_ptr->preference());
deadbeef3427f532017-07-26 16:09:33 -0700828}
829
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000830TEST_F(NetworkTest, TestNetworkAdapterTypes) {
831 Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
832 ADAPTER_TYPE_WIFI);
833 EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
834 Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
835 ADAPTER_TYPE_ETHERNET);
836 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
837 Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
838 ADAPTER_TYPE_CELLULAR);
839 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
840 Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
841 ADAPTER_TYPE_VPN);
842 EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
843 Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
844 ADAPTER_TYPE_UNKNOWN);
845 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 11:29:19 +0200855 std::vector<std::unique_ptr<Network>> result;
Niels Möller539f3e12021-11-26 16:33:19 +0100856 PhysicalSocketServer socket_server;
857 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700858 manager.StartUpdating();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000859 CallConvertIfAddrs(manager, &list, true, &result);
860 EXPECT_TRUE(result.empty());
861}
honghaizdb8cf502015-12-21 13:08:46 -0800862
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 11:29:19 +0200872 std::vector<std::unique_ptr<Network>> result;
Niels Möller539f3e12021-11-26 16:33:19 +0100873 PhysicalSocketServer socket_server;
874 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700875 manager.StartUpdating();
honghaizdb8cf502015-12-21 13:08:46 -0800876 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 11:29:19 +0200880 MergeNetworkList(manager, std::move(result), &changed);
honghaizdb8cf502015-12-21 13:08:46 -0800881 ReleaseIfAddrs(list);
882}
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800883
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;
889 sockaddr ifa_netmask;
890 list.ifa_addr = &ifa_addr;
891 list.ifa_netmask = &ifa_netmask;
892
Niels Möllerd959f3a2022-04-19 11:29:19 +0200893 std::vector<std::unique_ptr<Network>> result;
Niels Möller539f3e12021-11-26 16:33:19 +0100894 PhysicalSocketServer socket_server;
895 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700896 manager.StartUpdating();
Guo-wei Shieh9faf1542015-12-28 14:06:55 -0800897 CallConvertIfAddrs(manager, &list, true, &result);
898 EXPECT_TRUE(result.empty());
899}
Honghai Zhang351d77b2016-05-20 15:08:29 -0700900
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700901// Tests that the network type can be determined from the network monitor when
902// it would otherwise be unknown.
Honghai Zhang351d77b2016-05-20 15:08:29 -0700903TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700904 char if_name[20] = "wifi0";
905 std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700906 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
Niels Mölleraa373162021-09-28 16:09:07 +0200907 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200908 BasicNetworkManager manager_without_monitor(nullptr, &socket_server,
909 &field_trials_);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700910 manager_without_monitor.StartUpdating();
911 // A network created without a network monitor will get UNKNOWN type.
912 ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
913 manager_without_monitor);
914 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager_without_monitor));
Honghai Zhang351d77b2016-05-20 15:08:29 -0700915 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700916
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700917 // With the fake network monitor the type should be correctly determined.
918 FakeNetworkMonitorFactory factory;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +0200919 BasicNetworkManager manager_with_monitor(&factory, &socket_server,
920 &field_trials_);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700921 manager_with_monitor.StartUpdating();
Honghai Zhang351d77b2016-05-20 15:08:29 -0700922 // Add the same ipv6 address as before but it has the right network type
923 // detected by the network monitor now.
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700924 addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
925 manager_with_monitor);
926 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager_with_monitor));
Honghai Zhang351d77b2016-05-20 15:08:29 -0700927 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700928}
929
930// Test that the network type can be determined based on name matching in
931// a few cases. Note that UNKNOWN type for non-matching strings has been tested
932// in the above test.
933TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800934 std::string ipv4_address1 = "192.0.0.121";
935 std::string ipv4_mask = "255.255.255.0";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700936 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
937 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
938 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
Niels Möller539f3e12021-11-26 16:33:19 +0100939 PhysicalSocketServer socket_server;
940 BasicNetworkManager manager(&socket_server);
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -0700941 manager.StartUpdating();
Honghai Zhang351d77b2016-05-20 15:08:29 -0700942
deadbeef4cd599f2017-07-27 15:05:29 -0700943 // IPSec interface; name is in form "ipsec<index>".
944 char if_name[20] = "ipsec11";
Honghai Zhang351d77b2016-05-20 15:08:29 -0700945 ifaddrs* addr_list =
946 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
deadbeef4cd599f2017-07-27 15:05:29 -0700947 EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
948 ClearNetworks(manager);
949 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700950
Qingsi Wange53ac042018-05-08 11:55:07 -0700951 strcpy(if_name, "lo0");
952 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
953 EXPECT_EQ(ADAPTER_TYPE_LOOPBACK, GetAdapterType(manager));
954 ClearNetworks(manager);
955 ReleaseIfAddrs(addr_list);
956
957 strcpy(if_name, "eth0");
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800958 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
Qingsi Wange53ac042018-05-08 11:55:07 -0700959 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, GetAdapterType(manager));
960 ClearNetworks(manager);
961 ReleaseIfAddrs(addr_list);
962
Qingsi Wangc5bc9d62019-09-25 15:03:19 -0700963 strcpy(if_name, "wlan0");
964 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
965 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
966 ClearNetworks(manager);
967 ReleaseIfAddrs(addr_list);
968
deadbeef4cd599f2017-07-27 15:05:29 -0700969#if defined(WEBRTC_IOS)
970 strcpy(if_name, "pdp_ip0");
971 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700972 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
973 ClearNetworks(manager);
974 ReleaseIfAddrs(addr_list);
975
Honghai Zhang63ab8102016-05-26 20:30:15 -0700976 strcpy(if_name, "en0");
977 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
978 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
979 ClearNetworks(manager);
980 ReleaseIfAddrs(addr_list);
981
Honghai Zhang351d77b2016-05-20 15:08:29 -0700982#elif defined(WEBRTC_ANDROID)
deadbeef4cd599f2017-07-27 15:05:29 -0700983 strcpy(if_name, "rmnet0");
984 addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
Honghai Zhang351d77b2016-05-20 15:08:29 -0700985 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
986 ClearNetworks(manager);
987 ReleaseIfAddrs(addr_list);
988
Honghai Zhang351d77b2016-05-20 15:08:29 -0700989 strcpy(if_name, "v4-rmnet_data0");
990 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
991 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
992 ClearNetworks(manager);
993 ReleaseIfAddrs(addr_list);
Jeroen de Borst8f096d02019-02-21 13:34:45 -0800994
995 strcpy(if_name, "clat4");
996 addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
997 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
998 ClearNetworks(manager);
999 ReleaseIfAddrs(addr_list);
Honghai Zhang351d77b2016-05-20 15:08:29 -07001000#endif
1001}
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -07001002
1003// Test that an adapter won't be included in the network list if there's a
1004// network monitor that says it's unavailable.
1005TEST_F(NetworkTest, TestNetworkMonitorIsAdapterAvailable) {
1006 char if_name1[20] = "pdp_ip0";
1007 char if_name2[20] = "pdp_ip1";
1008 ifaddrs* list = nullptr;
1009 list = AddIpv6Address(list, if_name1, "1000:2000:3000:4000:0:0:0:1",
1010 "FFFF:FFFF:FFFF:FFFF::", 0);
1011 list = AddIpv6Address(list, if_name2, "1000:2000:3000:4000:0:0:0:2",
1012 "FFFF:FFFF:FFFF:FFFF::", 0);
Niels Möllerd959f3a2022-04-19 11:29:19 +02001013 std::vector<std::unique_ptr<Network>> result;
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -07001014
1015 // Sanity check that both interfaces are included by default.
1016 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 16:09:07 +02001017 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001018 BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -07001019 manager.StartUpdating();
1020 CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1021 EXPECT_EQ(2u, result.size());
1022 bool changed;
1023 // This ensures we release the objects created in CallConvertIfAddrs.
Niels Möllerd959f3a2022-04-19 11:29:19 +02001024 MergeNetworkList(manager, std::move(result), &changed);
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -07001025 result.clear();
1026
1027 // Now simulate one interface being unavailable.
1028 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1029 network_monitor->set_unavailable_adapters({if_name1});
1030 CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1031 EXPECT_EQ(1u, result.size());
1032 EXPECT_EQ(if_name2, result[0]->name());
1033
Niels Möllerd959f3a2022-04-19 11:29:19 +02001034 MergeNetworkList(manager, std::move(result), &changed);
Taylor Brandstetterea7fbfb2020-08-19 16:41:54 -07001035 ReleaseIfAddrs(list);
1036}
1037
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001038#endif // defined(WEBRTC_POSIX)
1039
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001040// Test MergeNetworkList successfully combines all IPs for the same
1041// prefix/length into a single Network.
1042TEST_F(NetworkTest, TestMergeNetworkList) {
Niels Möller539f3e12021-11-26 16:33:19 +01001043 PhysicalSocketServer socket_server;
1044 BasicNetworkManager manager(&socket_server);
Niels Möllerd959f3a2022-04-19 11:29:19 +02001045 std::vector<std::unique_ptr<Network>> list;
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001046
1047 // Create 2 IPAddress classes with only last digit different.
1048 IPAddress ip1, ip2;
1049 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1050 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
1051
1052 // Create 2 networks with the same prefix and length.
Niels Möllerd959f3a2022-04-19 11:29:19 +02001053 auto net1 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1054 auto net2 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001055
1056 // Add different IP into each.
1057 net1->AddIP(ip1);
1058 net2->AddIP(ip2);
1059
Niels Möllerd959f3a2022-04-19 11:29:19 +02001060 list.push_back(std::move(net1));
1061 list.push_back(std::move(net2));
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001062 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +02001063 MergeNetworkList(manager, std::move(list), &changed);
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001064 EXPECT_TRUE(changed);
1065
Niels Möller22211442022-04-07 11:43:28 +02001066 std::vector<const Network*> list2 = manager.GetNetworks();
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001067
1068 // Make sure the resulted networklist has only 1 element and 2
1069 // IPAddresses.
1070 EXPECT_EQ(list2.size(), 1uL);
1071 EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
Mirko Bonadeib2a57852022-03-18 12:19:56 +01001072 EXPECT_THAT(list2[0]->GetIPs(), UnorderedElementsAre(InterfaceAddress(ip1),
1073 InterfaceAddress(ip2)));
guoweis@webrtc.org4bbd3c82014-09-09 13:54:45 +00001074}
1075
honghaizdb8cf502015-12-21 13:08:46 -08001076// Test that MergeNetworkList successfully detects the change if
1077// a network becomes inactive and then active again.
1078TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
Niels Möller539f3e12021-11-26 16:33:19 +01001079 PhysicalSocketServer socket_server;
1080 BasicNetworkManager manager(&socket_server);
honghaizdb8cf502015-12-21 13:08:46 -08001081 Network network1("test_wifi", "Test Network Adapter 1",
1082 IPAddress(0x12345600U), 24);
1083 Network network2("test_eth0", "Test Network Adapter 2",
1084 IPAddress(0x00010000U), 16);
1085 network1.AddIP(IPAddress(0x12345678));
1086 network2.AddIP(IPAddress(0x00010004));
Niels Möllerd959f3a2022-04-19 11:29:19 +02001087 std::vector<std::unique_ptr<Network>> list;
1088 auto net1 = std::make_unique<Network>(network1);
1089 const Network* const net1_ptr = net1.get();
1090 list.push_back(std::move(net1));
honghaizdb8cf502015-12-21 13:08:46 -08001091 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +02001092 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 13:08:46 -08001093 EXPECT_TRUE(changed);
1094 list.clear();
Niels Möller22211442022-04-07 11:43:28 +02001095
1096 std::vector<const Network*> current = manager.GetNetworks();
1097 ASSERT_EQ(1U, current.size());
Niels Möllerd959f3a2022-04-19 11:29:19 +02001098 EXPECT_EQ(net1_ptr, current[0]);
honghaizdb8cf502015-12-21 13:08:46 -08001099
1100 list.clear();
Niels Möllerd959f3a2022-04-19 11:29:19 +02001101 auto net2 = std::make_unique<Network>(network2);
1102 const Network* const net2_ptr = net2.get();
1103 list.push_back(std::move(net2));
1104 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 13:08:46 -08001105 EXPECT_TRUE(changed);
1106 list.clear();
Niels Möller22211442022-04-07 11:43:28 +02001107
1108 current = manager.GetNetworks();
1109 ASSERT_EQ(1U, current.size());
Niels Möllerd959f3a2022-04-19 11:29:19 +02001110 EXPECT_EQ(net2_ptr, current[0]);
honghaizdb8cf502015-12-21 13:08:46 -08001111 // Now network1 is inactive. Try to merge it again.
1112 list.clear();
Niels Möllerd959f3a2022-04-19 11:29:19 +02001113 list.push_back(std::make_unique<Network>(network1));
1114 MergeNetworkList(manager, std::move(list), &changed);
honghaizdb8cf502015-12-21 13:08:46 -08001115 EXPECT_TRUE(changed);
1116 list.clear();
Niels Möller22211442022-04-07 11:43:28 +02001117 current = manager.GetNetworks();
1118 ASSERT_EQ(1U, current.size());
1119 EXPECT_TRUE(current[0]->active());
Niels Möllerd959f3a2022-04-19 11:29:19 +02001120 EXPECT_EQ(net1_ptr, current[0]);
honghaizdb8cf502015-12-21 13:08:46 -08001121}
1122
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001123// Test that the filtering logic follows the defined ruleset in network.h.
1124TEST_F(NetworkTest, TestIPv6Selection) {
1125 InterfaceAddress ip;
1126 std::string ipstr;
1127
1128 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1129 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1130
1131 // Create a network with this prefix.
Yves Gerey665174f2018-06-19 15:03:05 +02001132 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
1133 64);
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001134
1135 // When there is no address added, it should return an unspecified
1136 // address.
1137 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1138 EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1139
1140 // Deprecated one should not be returned.
1141 ipv6_network.AddIP(ip);
1142 EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1143
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001144 // Add ULA one. ULA is unique local address which is starting either
1145 // with 0xfc or 0xfd.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001146 ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1147 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1148 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001149 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001150
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001151 // Add global one.
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001152 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1153 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1154 ipv6_network.AddIP(ip);
aluebs@webrtc.org07dcf602015-02-27 18:42:22 +00001155 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
guoweis@webrtc.org369a6372014-09-17 22:37:29 +00001156
1157 // Add global dynamic temporary one.
1158 ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1159 ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1160 ipv6_network.AddIP(ip);
1161 EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1162}
1163
honghaiz023f3ef2015-10-19 09:39:32 -07001164TEST_F(NetworkTest, TestNetworkMonitoring) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001165 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 16:09:07 +02001166 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001167 BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
honghaiz023f3ef2015-10-19 09:39:32 -07001168 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1169 &NetworkTest::OnNetworksChanged);
honghaiz023f3ef2015-10-19 09:39:32 -07001170 manager.StartUpdating();
honghaizcec0a082016-01-15 14:49:09 -08001171 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1172 EXPECT_TRUE(network_monitor && network_monitor->started());
honghaiz023f3ef2015-10-19 09:39:32 -07001173 EXPECT_TRUE_WAIT(callback_called_, 1000);
1174 callback_called_ = false;
1175
1176 // Clear the networks so that there will be network changes below.
1177 ClearNetworks(manager);
1178 // Network manager is started, so the callback is called when the network
1179 // monitor fires the network-change event.
Mirko Bonadei37077932021-07-27 17:00:58 +02001180 network_monitor->InovkeNetworksChangedCallbackForTesting();
honghaiz023f3ef2015-10-19 09:39:32 -07001181 EXPECT_TRUE_WAIT(callback_called_, 1000);
1182
honghaizcec0a082016-01-15 14:49:09 -08001183 // Network manager is stopped.
honghaiz023f3ef2015-10-19 09:39:32 -07001184 manager.StopUpdating();
honghaizcec0a082016-01-15 14:49:09 -08001185 EXPECT_FALSE(GetNetworkMonitor(manager)->started());
honghaiz023f3ef2015-10-19 09:39:32 -07001186}
1187
Edward Lemur8dc945c2016-07-21 10:16:40 +02001188// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
1189#if defined(WEBRTC_ANDROID)
1190#define MAYBE_DefaultLocalAddress DISABLED_DefaultLocalAddress
1191#else
1192#define MAYBE_DefaultLocalAddress DefaultLocalAddress
1193#endif
1194TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001195 IPAddress ip;
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001196 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 16:09:07 +02001197 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001198 TestBasicNetworkManager manager(&factory, &socket_server, field_trials_);
guoweis56271ed2016-01-15 14:45:06 -08001199 manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1200 &NetworkTest::OnNetworksChanged);
guoweis56271ed2016-01-15 14:45:06 -08001201 manager.StartUpdating();
1202 EXPECT_TRUE_WAIT(callback_called_, 1000);
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001203
1204 // Make sure we can query default local address when an address for such
1205 // address family exists.
Niels Möller22211442022-04-07 11:43:28 +02001206 std::vector<const Network*> networks = manager.GetNetworks();
guoweis56271ed2016-01-15 14:45:06 -08001207 EXPECT_TRUE(!networks.empty());
Niels Möller22211442022-04-07 11:43:28 +02001208 for (const Network* network : networks) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001209 if (network->GetBestIP().family() == AF_INET) {
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001210 EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET) != IPAddress());
guoweis56271ed2016-01-15 14:45:06 -08001211 } else if (network->GetBestIP().family() == AF_INET6 &&
1212 !IPIsLoopback(network->GetBestIP())) {
1213 // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
1214 // enabled.
Taylor Brandstetter239ac8a2020-07-31 16:07:52 -07001215 EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET6) != IPAddress());
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001216 }
1217 }
Guo-wei Shieha34c39e2015-11-25 13:12:26 -08001218
1219 // GetDefaultLocalAddress should return the valid default address after set.
1220 manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1221 GetLoopbackIP(AF_INET6));
1222 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1223 EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1224 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1225 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
honghaizaf83fe62016-04-18 14:50:44 -07001226
1227 // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
1228 // default address may be different from the best IP address of any network.
1229 InterfaceAddress ip1;
1230 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
1231 IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
1232 // Create a network with a prefix of ip1.
1233 Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
1234 64);
1235 IPAddress ip2;
1236 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
1237 ipv6_network.AddIP(ip1);
1238 ipv6_network.AddIP(ip2);
Niels Möllerd959f3a2022-04-19 11:29:19 +02001239 std::vector<std::unique_ptr<Network>> list;
1240 list.push_back(std::make_unique<Network>(ipv6_network));
honghaizaf83fe62016-04-18 14:50:44 -07001241 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +02001242 MergeNetworkList(manager, std::move(list), &changed);
honghaizaf83fe62016-04-18 14:50:44 -07001243 // If the set default address is not in any network, GetDefaultLocalAddress
1244 // should return it.
1245 IPAddress ip3;
1246 EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
1247 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
1248 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1249 EXPECT_EQ(ip3, ip);
1250 // If the set default address is in a network, GetDefaultLocalAddress will
1251 // return the best IP in that network.
1252 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1253 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1254 EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1255
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001256 manager.StopUpdating();
1257}
1258
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001259// Test that MergeNetworkList does not set change = true
1260// when changing from cellular_X to cellular_Y.
1261TEST_F(NetworkTest, TestWhenNetworkListChangeReturnsChangedFlag) {
Niels Möller539f3e12021-11-26 16:33:19 +01001262 PhysicalSocketServer socket_server;
1263 BasicNetworkManager manager(&socket_server);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001264
1265 IPAddress ip1;
1266 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
Niels Möllerd959f3a2022-04-19 11:29:19 +02001267 auto net1 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001268 net1->set_type(ADAPTER_TYPE_CELLULAR_3G);
1269 net1->AddIP(ip1);
Niels Möllerd959f3a2022-04-19 11:29:19 +02001270 std::vector<std::unique_ptr<Network>> list;
1271 list.push_back(std::move(net1));
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001272
1273 {
1274 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +02001275 MergeNetworkList(manager, std::move(list), &changed);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001276 EXPECT_TRUE(changed);
Niels Möller22211442022-04-07 11:43:28 +02001277 std::vector<const Network*> list2 = manager.GetNetworks();
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001278 EXPECT_EQ(list2.size(), 1uL);
1279 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_3G, list2[0]->type());
1280 }
1281
1282 // Modify net1 from 3G to 4G
1283 {
Niels Möllerd959f3a2022-04-19 11:29:19 +02001284 auto net2 =
1285 std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001286 net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1287 net2->AddIP(ip1);
1288 list.clear();
Niels Möllerd959f3a2022-04-19 11:29:19 +02001289 list.push_back(std::move(net2));
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001290 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +02001291 MergeNetworkList(manager, std::move(list), &changed);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001292
1293 // Change from 3G to 4G shall not trigger OnNetworksChanged,
1294 // i.e changed = false.
1295 EXPECT_FALSE(changed);
Niels Möller22211442022-04-07 11:43:28 +02001296 std::vector<const Network*> list2 = manager.GetNetworks();
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001297 ASSERT_EQ(list2.size(), 1uL);
1298 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1299 }
1300
1301 // Don't modify.
1302 {
Niels Möllerd959f3a2022-04-19 11:29:19 +02001303 auto net2 =
1304 std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001305 net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1306 net2->AddIP(ip1);
1307 list.clear();
Niels Möllerd959f3a2022-04-19 11:29:19 +02001308 list.push_back(std::move(net2));
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001309 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +02001310 MergeNetworkList(manager, std::move(list), &changed);
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001311
1312 // No change.
1313 EXPECT_FALSE(changed);
Niels Möller22211442022-04-07 11:43:28 +02001314 std::vector<const Network*> list2 = manager.GetNetworks();
Jonas Orelandc7ea04a2020-04-03 10:12:28 +02001315 ASSERT_EQ(list2.size(), 1uL);
1316 EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1317 }
1318}
1319
Jonas Oreland47fa08f2020-12-05 18:09:13 +01001320#if defined(WEBRTC_POSIX)
1321TEST_F(NetworkTest, IgnoresMACBasedIPv6Address) {
1322 std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
1323 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
Niels Möller539f3e12021-11-26 16:33:19 +01001324 PhysicalSocketServer socket_server;
1325 BasicNetworkManager manager(&socket_server);
Jonas Oreland47fa08f2020-12-05 18:09:13 +01001326 manager.StartUpdating();
1327
1328 // IPSec interface; name is in form "ipsec<index>".
1329 char if_name[20] = "ipsec11";
1330 ifaddrs* addr_list =
1331 InstallIpv6Network(if_name, ipv6_address, ipv6_mask, manager);
1332
Niels Möller22211442022-04-07 11:43:28 +02001333 std::vector<const Network*> list = manager.GetNetworks();
Jonas Oreland47fa08f2020-12-05 18:09:13 +01001334 EXPECT_EQ(list.size(), 0u);
1335 ReleaseIfAddrs(addr_list);
1336}
1337
1338TEST_F(NetworkTest, WebRTC_AllowMACBasedIPv6Address) {
1339 webrtc::test::ScopedFieldTrials field_trials(
1340 "WebRTC-AllowMACBasedIPv6/Enabled/");
1341 std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
1342 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
Niels Möller539f3e12021-11-26 16:33:19 +01001343 PhysicalSocketServer socket_server;
1344 BasicNetworkManager manager(&socket_server);
Jonas Oreland47fa08f2020-12-05 18:09:13 +01001345 manager.StartUpdating();
1346
1347 // IPSec interface; name is in form "ipsec<index>".
1348 char if_name[20] = "ipsec11";
1349 ifaddrs* addr_list =
1350 InstallIpv6Network(if_name, ipv6_address, ipv6_mask, manager);
1351
Niels Möller22211442022-04-07 11:43:28 +02001352 std::vector<const Network*> list = manager.GetNetworks();
Jonas Oreland47fa08f2020-12-05 18:09:13 +01001353 EXPECT_EQ(list.size(), 1u);
1354 ReleaseIfAddrs(addr_list);
1355}
1356#endif
1357
Jonas Oreland6ca955a2021-03-15 08:27:43 +00001358#if defined(WEBRTC_POSIX)
1359TEST_F(NetworkTest, WebRTC_BindUsingInterfaceName) {
Jonas Oreland6ca955a2021-03-15 08:27:43 +00001360 char if_name1[20] = "wlan0";
1361 char if_name2[20] = "v4-wlan0";
1362 ifaddrs* list = nullptr;
1363 list = AddIpv6Address(list, if_name1, "1000:2000:3000:4000:0:0:0:1",
1364 "FFFF:FFFF:FFFF:FFFF::", 0);
1365 list = AddIpv4Address(list, if_name2, "192.168.0.2", "255.255.255.255");
Niels Möllerd959f3a2022-04-19 11:29:19 +02001366 std::vector<std::unique_ptr<Network>> result;
Jonas Oreland6ca955a2021-03-15 08:27:43 +00001367
1368 // Sanity check that both interfaces are included by default.
1369 FakeNetworkMonitorFactory factory;
Niels Mölleraa373162021-09-28 16:09:07 +02001370 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001371 BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
Jonas Oreland6ca955a2021-03-15 08:27:43 +00001372 manager.StartUpdating();
1373 CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1374 EXPECT_EQ(2u, result.size());
1375 ReleaseIfAddrs(list);
1376 bool changed;
1377 // This ensures we release the objects created in CallConvertIfAddrs.
Niels Möllerd959f3a2022-04-19 11:29:19 +02001378 MergeNetworkList(manager, std::move(result), &changed);
Jonas Oreland6ca955a2021-03-15 08:27:43 +00001379 result.clear();
1380
1381 FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1382
1383 IPAddress ipv6;
1384 EXPECT_TRUE(IPFromString("1000:2000:3000:4000:0:0:0:1", &ipv6));
1385 IPAddress ipv4;
1386 EXPECT_TRUE(IPFromString("192.168.0.2", &ipv4));
1387
1388 // The network monitor only knwos about the ipv6 address, interface.
1389 network_monitor->set_adapters({"wlan0"});
1390 network_monitor->set_ip_addresses({ipv6});
1391 EXPECT_EQ(manager.BindSocketToNetwork(/* fd */ 77, ipv6),
1392 NetworkBindingResult::SUCCESS);
1393
1394 // But it will bind anyway using string matching...
1395 EXPECT_EQ(manager.BindSocketToNetwork(/* fd */ 77, ipv4),
1396 NetworkBindingResult::SUCCESS);
1397}
1398#endif
1399
Jonas Orelandb477fc72021-08-23 12:16:33 +02001400TEST_F(NetworkTest, NetworkCostVpn_Default) {
1401 IPAddress ip1;
1402 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001403 webrtc::test::ScopedKeyValueConfig field_trials;
Jonas Orelandb477fc72021-08-23 12:16:33 +02001404
1405 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1406 net1->set_type(ADAPTER_TYPE_VPN);
1407 net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
1408
1409 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1410 net2->set_type(ADAPTER_TYPE_ETHERNET);
1411
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001412 EXPECT_EQ(net1->GetCost(field_trials), net2->GetCost(field_trials));
Jonas Orelandb477fc72021-08-23 12:16:33 +02001413 delete net1;
1414 delete net2;
1415}
1416
1417TEST_F(NetworkTest, NetworkCostVpn_VpnMoreExpensive) {
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001418 webrtc::test::ScopedKeyValueConfig field_trials(
Jonas Orelandb477fc72021-08-23 12:16:33 +02001419 "WebRTC-AddNetworkCostToVpn/Enabled/");
1420
1421 IPAddress ip1;
1422 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1423
1424 Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1425 net1->set_type(ADAPTER_TYPE_VPN);
1426 net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
1427
1428 Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1429 net2->set_type(ADAPTER_TYPE_ETHERNET);
1430
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001431 EXPECT_GT(net1->GetCost(field_trials), net2->GetCost(field_trials));
Jonas Orelandb477fc72021-08-23 12:16:33 +02001432 delete net1;
1433 delete net2;
1434}
1435
Jonas Oreland30019052022-01-28 14:11:44 +01001436TEST_F(NetworkTest, GuessAdapterFromNetworkCost) {
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001437 webrtc::test::ScopedKeyValueConfig field_trials(
Jonas Oreland30019052022-01-28 14:11:44 +01001438 "WebRTC-AddNetworkCostToVpn/Enabled/"
1439 "WebRTC-UseDifferentiatedCellularCosts/Enabled/");
1440
1441 IPAddress ip1;
1442 EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1443
1444 for (auto type : kAllAdapterTypes) {
1445 if (type == rtc::ADAPTER_TYPE_VPN)
1446 continue;
1447 Network net1("em1", "em1", TruncateIP(ip1, 64), 64);
1448 net1.set_type(type);
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001449 auto [guess, vpn] =
1450 Network::GuessAdapterFromNetworkCost(net1.GetCost(field_trials));
Jonas Oreland30019052022-01-28 14:11:44 +01001451 EXPECT_FALSE(vpn);
1452 if (type == rtc::ADAPTER_TYPE_LOOPBACK) {
1453 EXPECT_EQ(guess, rtc::ADAPTER_TYPE_ETHERNET);
1454 } else {
1455 EXPECT_EQ(type, guess);
1456 }
1457 }
1458
1459 // VPN
1460 for (auto type : kAllAdapterTypes) {
1461 if (type == rtc::ADAPTER_TYPE_VPN)
1462 continue;
1463 Network net1("em1", "em1", TruncateIP(ip1, 64), 64);
1464 net1.set_type(rtc::ADAPTER_TYPE_VPN);
1465 net1.set_underlying_type_for_vpn(type);
Jonas Orelandc06fe8b2022-03-28 14:58:26 +02001466 auto [guess, vpn] =
1467 Network::GuessAdapterFromNetworkCost(net1.GetCost(field_trials));
Jonas Oreland30019052022-01-28 14:11:44 +01001468 EXPECT_TRUE(vpn);
1469 if (type == rtc::ADAPTER_TYPE_LOOPBACK) {
1470 EXPECT_EQ(guess, rtc::ADAPTER_TYPE_ETHERNET);
1471 } else {
1472 EXPECT_EQ(type, guess);
1473 }
1474 }
1475}
1476
Jonas Oreland2ee0e642021-08-25 15:43:02 +02001477TEST_F(NetworkTest, VpnList) {
Niels Möller539f3e12021-11-26 16:33:19 +01001478 PhysicalSocketServer socket_server;
Jonas Oreland2ee0e642021-08-25 15:43:02 +02001479 {
Niels Möller539f3e12021-11-26 16:33:19 +01001480 BasicNetworkManager manager(&socket_server);
Jonas Oreland2ee0e642021-08-25 15:43:02 +02001481 manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 16)});
1482 manager.StartUpdating();
1483 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.1.1"), 32));
1484 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.12.1"), 24));
1485 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 16));
1486 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 24));
1487 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.133.1.1"), 32));
1488 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.133.0.0"), 16));
1489 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 15));
1490 }
1491 {
Niels Möller539f3e12021-11-26 16:33:19 +01001492 BasicNetworkManager manager(&socket_server);
Jonas Oreland2ee0e642021-08-25 15:43:02 +02001493 manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 24)});
1494 manager.StartUpdating();
1495 EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.168.1.1"), 32));
1496 EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.1"), 32));
1497 }
1498}
1499
1500#if defined(WEBRTC_POSIX)
1501// TODO(webrtc:13114): Implement the InstallIpv4Network for windows.
1502TEST_F(NetworkTest, VpnListOverrideAdapterType) {
Niels Möller539f3e12021-11-26 16:33:19 +01001503 PhysicalSocketServer socket_server;
1504 BasicNetworkManager manager(&socket_server);
Jonas Oreland2ee0e642021-08-25 15:43:02 +02001505 manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 16)});
1506 manager.StartUpdating();
1507
1508 char if_name[20] = "eth0";
1509 auto addr_list =
1510 InstallIpv4Network(if_name, "192.168.1.23", "255.255.255.255", manager);
1511
Niels Möller22211442022-04-07 11:43:28 +02001512 std::vector<const Network*> list = manager.GetNetworks();
Jonas Oreland2ee0e642021-08-25 15:43:02 +02001513 ASSERT_EQ(1u, list.size());
1514 EXPECT_EQ(ADAPTER_TYPE_VPN, list[0]->type());
1515 EXPECT_EQ(ADAPTER_TYPE_ETHERNET, list[0]->underlying_type_for_vpn());
1516 ClearNetworks(manager);
1517 ReleaseIfAddrs(addr_list);
1518}
1519#endif // defined(WEBRTC_POSIX)
1520
Jonas Orelandac554eb2021-08-27 09:43:38 +02001521TEST_F(NetworkTest, HardcodedVpn) {
1522 const uint8_t cisco[] = {0x0, 0x5, 0x9A, 0x3C, 0x7A, 0x0};
1523 const uint8_t global[] = {0x2, 0x50, 0x41, 0x0, 0x0, 0x1};
1524 const uint8_t unknown[] = {0x2, 0x50, 0x41, 0x0, 0x0, 0x0};
1525 const uint8_t five_bytes[] = {0x2, 0x50, 0x41, 0x0, 0x0};
1526 EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(cisco));
1527 EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(global));
1528
1529 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(
1530 rtc::ArrayView<const uint8_t>(cisco, 5)));
1531 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(five_bytes));
1532 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(unknown));
1533 EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(nullptr));
1534}
1535
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001536} // namespace rtc