1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <stdlib.h>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include <algorithm>
16*d9f75844SAndroid Build Coastguard Worker #include <memory>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker
19*d9f75844SAndroid Build Coastguard Worker #include "absl/algorithm/container.h"
20*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/match.h"
21*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
22*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/net_helpers.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_monitor.h"
25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_monitor_factory.h"
26*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/physical_socket_server.h"
27*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX)
28*d9f75844SAndroid Build Coastguard Worker #include <net/if.h>
29*d9f75844SAndroid Build Coastguard Worker #include <sys/types.h>
30*d9f75844SAndroid Build Coastguard Worker
31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ifaddrs_converter.h"
32*d9f75844SAndroid Build Coastguard Worker #endif // defined(WEBRTC_POSIX)
33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/gunit.h"
34*d9f75844SAndroid Build Coastguard Worker #include "test/gmock.h"
35*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
36*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.h" // For RTC_LOG_GLE
37*d9f75844SAndroid Build Coastguard Worker #endif
38*d9f75844SAndroid Build Coastguard Worker #include "test/field_trial.h"
39*d9f75844SAndroid Build Coastguard Worker #include "test/scoped_key_value_config.h"
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard Worker using ::testing::Contains;
42*d9f75844SAndroid Build Coastguard Worker using ::testing::Not;
43*d9f75844SAndroid Build Coastguard Worker using ::testing::UnorderedElementsAre;
44*d9f75844SAndroid Build Coastguard Worker using ::testing::UnorderedElementsAreArray;
45*d9f75844SAndroid Build Coastguard Worker
46*d9f75844SAndroid Build Coastguard Worker namespace rtc {
47*d9f75844SAndroid Build Coastguard Worker
48*d9f75844SAndroid Build Coastguard Worker namespace {
49*d9f75844SAndroid Build Coastguard Worker
IPFromString(absl::string_view str)50*d9f75844SAndroid Build Coastguard Worker IPAddress IPFromString(absl::string_view str) {
51*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
52*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(IPFromString(str, &ip));
53*d9f75844SAndroid Build Coastguard Worker return ip;
54*d9f75844SAndroid Build Coastguard Worker }
55*d9f75844SAndroid Build Coastguard Worker
56*d9f75844SAndroid Build Coastguard Worker class FakeNetworkMonitor : public NetworkMonitorInterface {
57*d9f75844SAndroid Build Coastguard Worker public:
Start()58*d9f75844SAndroid Build Coastguard Worker void Start() override { started_ = true; }
Stop()59*d9f75844SAndroid Build Coastguard Worker void Stop() override { started_ = false; }
started()60*d9f75844SAndroid Build Coastguard Worker bool started() { return started_; }
GetInterfaceInfo(absl::string_view if_name)61*d9f75844SAndroid Build Coastguard Worker InterfaceInfo GetInterfaceInfo(absl::string_view if_name) override {
62*d9f75844SAndroid Build Coastguard Worker InterfaceInfo if_info = {
63*d9f75844SAndroid Build Coastguard Worker .adapter_type = ADAPTER_TYPE_UNKNOWN,
64*d9f75844SAndroid Build Coastguard Worker .available = absl::c_count(unavailable_adapters_, if_name) == 0,
65*d9f75844SAndroid Build Coastguard Worker };
66*d9f75844SAndroid Build Coastguard Worker if (absl::StartsWith(if_name, "wifi")) {
67*d9f75844SAndroid Build Coastguard Worker if_info.adapter_type = ADAPTER_TYPE_WIFI;
68*d9f75844SAndroid Build Coastguard Worker } else if (absl::StartsWith(if_name, "cellular")) {
69*d9f75844SAndroid Build Coastguard Worker if_info.adapter_type = ADAPTER_TYPE_CELLULAR;
70*d9f75844SAndroid Build Coastguard Worker }
71*d9f75844SAndroid Build Coastguard Worker return if_info;
72*d9f75844SAndroid Build Coastguard Worker }
73*d9f75844SAndroid Build Coastguard Worker
74*d9f75844SAndroid Build Coastguard Worker // Used to test IsAdapterAvailable.
set_unavailable_adapters(std::vector<std::string> unavailable_adapters)75*d9f75844SAndroid Build Coastguard Worker void set_unavailable_adapters(std::vector<std::string> unavailable_adapters) {
76*d9f75844SAndroid Build Coastguard Worker unavailable_adapters_ = unavailable_adapters;
77*d9f75844SAndroid Build Coastguard Worker }
78*d9f75844SAndroid Build Coastguard Worker
SupportsBindSocketToNetwork() const79*d9f75844SAndroid Build Coastguard Worker bool SupportsBindSocketToNetwork() const override { return true; }
80*d9f75844SAndroid Build Coastguard Worker
BindSocketToNetwork(int socket_fd,const IPAddress & address,absl::string_view if_name)81*d9f75844SAndroid Build Coastguard Worker NetworkBindingResult BindSocketToNetwork(int socket_fd,
82*d9f75844SAndroid Build Coastguard Worker const IPAddress& address,
83*d9f75844SAndroid Build Coastguard Worker absl::string_view if_name) override {
84*d9f75844SAndroid Build Coastguard Worker if (absl::c_count(addresses_, address) > 0) {
85*d9f75844SAndroid Build Coastguard Worker return NetworkBindingResult::SUCCESS;
86*d9f75844SAndroid Build Coastguard Worker }
87*d9f75844SAndroid Build Coastguard Worker
88*d9f75844SAndroid Build Coastguard Worker for (auto const& iter : adapters_) {
89*d9f75844SAndroid Build Coastguard Worker if (if_name.find(iter) != absl::string_view::npos) {
90*d9f75844SAndroid Build Coastguard Worker return NetworkBindingResult::SUCCESS;
91*d9f75844SAndroid Build Coastguard Worker }
92*d9f75844SAndroid Build Coastguard Worker }
93*d9f75844SAndroid Build Coastguard Worker return NetworkBindingResult::ADDRESS_NOT_FOUND;
94*d9f75844SAndroid Build Coastguard Worker }
95*d9f75844SAndroid Build Coastguard Worker
set_ip_addresses(std::vector<IPAddress> addresses)96*d9f75844SAndroid Build Coastguard Worker void set_ip_addresses(std::vector<IPAddress> addresses) {
97*d9f75844SAndroid Build Coastguard Worker addresses_ = addresses;
98*d9f75844SAndroid Build Coastguard Worker }
99*d9f75844SAndroid Build Coastguard Worker
set_adapters(std::vector<std::string> adapters)100*d9f75844SAndroid Build Coastguard Worker void set_adapters(std::vector<std::string> adapters) { adapters_ = adapters; }
101*d9f75844SAndroid Build Coastguard Worker
InovkeNetworksChangedCallbackForTesting()102*d9f75844SAndroid Build Coastguard Worker void InovkeNetworksChangedCallbackForTesting() {
103*d9f75844SAndroid Build Coastguard Worker InvokeNetworksChangedCallback();
104*d9f75844SAndroid Build Coastguard Worker }
105*d9f75844SAndroid Build Coastguard Worker
106*d9f75844SAndroid Build Coastguard Worker private:
107*d9f75844SAndroid Build Coastguard Worker bool started_ = false;
108*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> adapters_;
109*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> unavailable_adapters_;
110*d9f75844SAndroid Build Coastguard Worker std::vector<IPAddress> addresses_;
111*d9f75844SAndroid Build Coastguard Worker };
112*d9f75844SAndroid Build Coastguard Worker
113*d9f75844SAndroid Build Coastguard Worker class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
114*d9f75844SAndroid Build Coastguard Worker public:
FakeNetworkMonitorFactory()115*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitorFactory() {}
CreateNetworkMonitor(const webrtc::FieldTrialsView & field_trials)116*d9f75844SAndroid Build Coastguard Worker NetworkMonitorInterface* CreateNetworkMonitor(
117*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView& field_trials) override {
118*d9f75844SAndroid Build Coastguard Worker return new FakeNetworkMonitor();
119*d9f75844SAndroid Build Coastguard Worker }
120*d9f75844SAndroid Build Coastguard Worker };
121*d9f75844SAndroid Build Coastguard Worker
SameNameAndPrefix(const rtc::Network & a,const rtc::Network & b)122*d9f75844SAndroid Build Coastguard Worker bool SameNameAndPrefix(const rtc::Network& a, const rtc::Network& b) {
123*d9f75844SAndroid Build Coastguard Worker if (a.name() != b.name()) {
124*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_INFO) << "Different interface names.";
125*d9f75844SAndroid Build Coastguard Worker return false;
126*d9f75844SAndroid Build Coastguard Worker }
127*d9f75844SAndroid Build Coastguard Worker if (a.prefix_length() != b.prefix_length() || a.prefix() != b.prefix()) {
128*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_INFO) << "Different IP prefixes.";
129*d9f75844SAndroid Build Coastguard Worker return false;
130*d9f75844SAndroid Build Coastguard Worker }
131*d9f75844SAndroid Build Coastguard Worker return true;
132*d9f75844SAndroid Build Coastguard Worker }
133*d9f75844SAndroid Build Coastguard Worker
CopyNetworkPointers(const std::vector<std::unique_ptr<Network>> & owning_list)134*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> CopyNetworkPointers(
135*d9f75844SAndroid Build Coastguard Worker const std::vector<std::unique_ptr<Network>>& owning_list) {
136*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> ptr_list;
137*d9f75844SAndroid Build Coastguard Worker ptr_list.reserve(owning_list.size());
138*d9f75844SAndroid Build Coastguard Worker for (const auto& network : owning_list) {
139*d9f75844SAndroid Build Coastguard Worker ptr_list.push_back(network.get());
140*d9f75844SAndroid Build Coastguard Worker }
141*d9f75844SAndroid Build Coastguard Worker return ptr_list;
142*d9f75844SAndroid Build Coastguard Worker }
143*d9f75844SAndroid Build Coastguard Worker
144*d9f75844SAndroid Build Coastguard Worker } // namespace
145*d9f75844SAndroid Build Coastguard Worker
146*d9f75844SAndroid Build Coastguard Worker class NetworkTest : public ::testing::Test, public sigslot::has_slots<> {
147*d9f75844SAndroid Build Coastguard Worker public:
NetworkTest()148*d9f75844SAndroid Build Coastguard Worker NetworkTest() : callback_called_(false) {}
149*d9f75844SAndroid Build Coastguard Worker
OnNetworksChanged()150*d9f75844SAndroid Build Coastguard Worker void OnNetworksChanged() { callback_called_ = true; }
151*d9f75844SAndroid Build Coastguard Worker
MergeNetworkList(BasicNetworkManager & network_manager,std::vector<std::unique_ptr<Network>> list,bool * changed)152*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats MergeNetworkList(
153*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager& network_manager,
154*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list,
155*d9f75844SAndroid Build Coastguard Worker bool* changed) {
156*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats stats;
157*d9f75844SAndroid Build Coastguard Worker network_manager.MergeNetworkList(std::move(list), changed, &stats);
158*d9f75844SAndroid Build Coastguard Worker return stats;
159*d9f75844SAndroid Build Coastguard Worker }
160*d9f75844SAndroid Build Coastguard Worker
IsIgnoredNetwork(BasicNetworkManager & network_manager,const Network & network)161*d9f75844SAndroid Build Coastguard Worker bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
162*d9f75844SAndroid Build Coastguard Worker const Network& network) {
163*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_manager.thread_);
164*d9f75844SAndroid Build Coastguard Worker return network_manager.IsIgnoredNetwork(network);
165*d9f75844SAndroid Build Coastguard Worker }
166*d9f75844SAndroid Build Coastguard Worker
QueryDefaultLocalAddress(BasicNetworkManager & network_manager,int family)167*d9f75844SAndroid Build Coastguard Worker IPAddress QueryDefaultLocalAddress(BasicNetworkManager& network_manager,
168*d9f75844SAndroid Build Coastguard Worker int family) {
169*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_manager.thread_);
170*d9f75844SAndroid Build Coastguard Worker return network_manager.QueryDefaultLocalAddress(family);
171*d9f75844SAndroid Build Coastguard Worker }
172*d9f75844SAndroid Build Coastguard Worker
GetNetworks(const BasicNetworkManager & network_manager,bool include_ignored)173*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> GetNetworks(
174*d9f75844SAndroid Build Coastguard Worker const BasicNetworkManager& network_manager,
175*d9f75844SAndroid Build Coastguard Worker bool include_ignored) {
176*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_manager.thread_);
177*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
178*d9f75844SAndroid Build Coastguard Worker network_manager.CreateNetworks(include_ignored, &list);
179*d9f75844SAndroid Build Coastguard Worker return list;
180*d9f75844SAndroid Build Coastguard Worker }
181*d9f75844SAndroid Build Coastguard Worker
GetNetworkMonitor(BasicNetworkManager & network_manager)182*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
183*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_manager.thread_);
184*d9f75844SAndroid Build Coastguard Worker return static_cast<FakeNetworkMonitor*>(
185*d9f75844SAndroid Build Coastguard Worker network_manager.network_monitor_.get());
186*d9f75844SAndroid Build Coastguard Worker }
ClearNetworks(BasicNetworkManager & network_manager)187*d9f75844SAndroid Build Coastguard Worker void ClearNetworks(BasicNetworkManager& network_manager) {
188*d9f75844SAndroid Build Coastguard Worker network_manager.networks_.clear();
189*d9f75844SAndroid Build Coastguard Worker network_manager.networks_map_.clear();
190*d9f75844SAndroid Build Coastguard Worker }
191*d9f75844SAndroid Build Coastguard Worker
GetAdapterType(BasicNetworkManager & network_manager)192*d9f75844SAndroid Build Coastguard Worker AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
193*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = network_manager.GetNetworks();
194*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_EQ(1, list.size());
195*d9f75844SAndroid Build Coastguard Worker return list[0]->type();
196*d9f75844SAndroid Build Coastguard Worker }
197*d9f75844SAndroid Build Coastguard Worker
198*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX)
199*d9f75844SAndroid Build Coastguard Worker // Separated from CreateNetworks for tests.
CallConvertIfAddrs(const BasicNetworkManager & network_manager,struct ifaddrs * interfaces,bool include_ignored,std::vector<std::unique_ptr<Network>> * networks)200*d9f75844SAndroid Build Coastguard Worker static void CallConvertIfAddrs(
201*d9f75844SAndroid Build Coastguard Worker const BasicNetworkManager& network_manager,
202*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* interfaces,
203*d9f75844SAndroid Build Coastguard Worker bool include_ignored,
204*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>>* networks) {
205*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_manager.thread_);
206*d9f75844SAndroid Build Coastguard Worker // Use the base IfAddrsConverter for test cases.
207*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
208*d9f75844SAndroid Build Coastguard Worker network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
209*d9f75844SAndroid Build Coastguard Worker include_ignored, networks);
210*d9f75844SAndroid Build Coastguard Worker }
211*d9f75844SAndroid Build Coastguard Worker
CreateIpv6Addr(absl::string_view ip_string,uint32_t scope_id)212*d9f75844SAndroid Build Coastguard Worker struct sockaddr_in6* CreateIpv6Addr(absl::string_view ip_string,
213*d9f75844SAndroid Build Coastguard Worker uint32_t scope_id) {
214*d9f75844SAndroid Build Coastguard Worker struct sockaddr_in6* ipv6_addr =
215*d9f75844SAndroid Build Coastguard Worker static_cast<struct sockaddr_in6*>(malloc(sizeof(struct sockaddr_in6)));
216*d9f75844SAndroid Build Coastguard Worker memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
217*d9f75844SAndroid Build Coastguard Worker ipv6_addr->sin6_family = AF_INET6;
218*d9f75844SAndroid Build Coastguard Worker ipv6_addr->sin6_scope_id = scope_id;
219*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
220*d9f75844SAndroid Build Coastguard Worker IPFromString(ip_string, &ip);
221*d9f75844SAndroid Build Coastguard Worker ipv6_addr->sin6_addr = ip.ipv6_address();
222*d9f75844SAndroid Build Coastguard Worker return ipv6_addr;
223*d9f75844SAndroid Build Coastguard Worker }
224*d9f75844SAndroid Build Coastguard Worker
225*d9f75844SAndroid Build Coastguard Worker // Pointers created here need to be released via ReleaseIfAddrs.
AddIpv6Address(struct ifaddrs * list,char * if_name,absl::string_view ipv6_address,absl::string_view ipv6_netmask,uint32_t scope_id)226*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
227*d9f75844SAndroid Build Coastguard Worker char* if_name,
228*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv6_address,
229*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv6_netmask,
230*d9f75844SAndroid Build Coastguard Worker uint32_t scope_id) {
231*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* if_addr = new struct ifaddrs;
232*d9f75844SAndroid Build Coastguard Worker memset(if_addr, 0, sizeof(struct ifaddrs));
233*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_name = if_name;
234*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
235*d9f75844SAndroid Build Coastguard Worker CreateIpv6Addr(ipv6_address, scope_id));
236*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_netmask =
237*d9f75844SAndroid Build Coastguard Worker reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
238*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_next = list;
239*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_flags = IFF_RUNNING;
240*d9f75844SAndroid Build Coastguard Worker return if_addr;
241*d9f75844SAndroid Build Coastguard Worker }
242*d9f75844SAndroid Build Coastguard Worker
InstallIpv6Network(char * if_name,absl::string_view ipv6_address,absl::string_view ipv6_mask,BasicNetworkManager & network_manager)243*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* InstallIpv6Network(char* if_name,
244*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv6_address,
245*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv6_mask,
246*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager& network_manager) {
247*d9f75844SAndroid Build Coastguard Worker ifaddrs* addr_list = nullptr;
248*d9f75844SAndroid Build Coastguard Worker addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
249*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
250*d9f75844SAndroid Build Coastguard Worker bool changed;
251*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats stats;
252*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(network_manager, addr_list, true, &result);
253*d9f75844SAndroid Build Coastguard Worker network_manager.MergeNetworkList(std::move(result), &changed, &stats);
254*d9f75844SAndroid Build Coastguard Worker return addr_list;
255*d9f75844SAndroid Build Coastguard Worker }
256*d9f75844SAndroid Build Coastguard Worker
CreateIpv4Addr(absl::string_view ip_string)257*d9f75844SAndroid Build Coastguard Worker struct sockaddr_in* CreateIpv4Addr(absl::string_view ip_string) {
258*d9f75844SAndroid Build Coastguard Worker struct sockaddr_in* ipv4_addr =
259*d9f75844SAndroid Build Coastguard Worker static_cast<struct sockaddr_in*>(malloc(sizeof(struct sockaddr_in)));
260*d9f75844SAndroid Build Coastguard Worker memset(ipv4_addr, 0, sizeof(struct sockaddr_in));
261*d9f75844SAndroid Build Coastguard Worker ipv4_addr->sin_family = AF_INET;
262*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
263*d9f75844SAndroid Build Coastguard Worker IPFromString(ip_string, &ip);
264*d9f75844SAndroid Build Coastguard Worker ipv4_addr->sin_addr = ip.ipv4_address();
265*d9f75844SAndroid Build Coastguard Worker return ipv4_addr;
266*d9f75844SAndroid Build Coastguard Worker }
267*d9f75844SAndroid Build Coastguard Worker
268*d9f75844SAndroid Build Coastguard Worker // Pointers created here need to be released via ReleaseIfAddrs.
AddIpv4Address(struct ifaddrs * list,char * if_name,absl::string_view ipv4_address,absl::string_view ipv4_netmask)269*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* AddIpv4Address(struct ifaddrs* list,
270*d9f75844SAndroid Build Coastguard Worker char* if_name,
271*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv4_address,
272*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv4_netmask) {
273*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* if_addr = new struct ifaddrs;
274*d9f75844SAndroid Build Coastguard Worker memset(if_addr, 0, sizeof(struct ifaddrs));
275*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_name = if_name;
276*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_addr =
277*d9f75844SAndroid Build Coastguard Worker reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_address));
278*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_netmask =
279*d9f75844SAndroid Build Coastguard Worker reinterpret_cast<struct sockaddr*>(CreateIpv4Addr(ipv4_netmask));
280*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_next = list;
281*d9f75844SAndroid Build Coastguard Worker if_addr->ifa_flags = IFF_RUNNING;
282*d9f75844SAndroid Build Coastguard Worker return if_addr;
283*d9f75844SAndroid Build Coastguard Worker }
284*d9f75844SAndroid Build Coastguard Worker
InstallIpv4Network(char * if_name,absl::string_view ipv4_address,absl::string_view ipv4_mask,BasicNetworkManager & network_manager)285*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* InstallIpv4Network(char* if_name,
286*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv4_address,
287*d9f75844SAndroid Build Coastguard Worker absl::string_view ipv4_mask,
288*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager& network_manager) {
289*d9f75844SAndroid Build Coastguard Worker ifaddrs* addr_list = nullptr;
290*d9f75844SAndroid Build Coastguard Worker addr_list = AddIpv4Address(addr_list, if_name, ipv4_address, ipv4_mask);
291*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
292*d9f75844SAndroid Build Coastguard Worker bool changed;
293*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats stats;
294*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(network_manager, addr_list, true, &result);
295*d9f75844SAndroid Build Coastguard Worker network_manager.MergeNetworkList(std::move(result), &changed, &stats);
296*d9f75844SAndroid Build Coastguard Worker return addr_list;
297*d9f75844SAndroid Build Coastguard Worker }
298*d9f75844SAndroid Build Coastguard Worker
ReleaseIfAddrs(struct ifaddrs * list)299*d9f75844SAndroid Build Coastguard Worker void ReleaseIfAddrs(struct ifaddrs* list) {
300*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* if_addr = list;
301*d9f75844SAndroid Build Coastguard Worker while (if_addr != nullptr) {
302*d9f75844SAndroid Build Coastguard Worker struct ifaddrs* next_addr = if_addr->ifa_next;
303*d9f75844SAndroid Build Coastguard Worker free(if_addr->ifa_addr);
304*d9f75844SAndroid Build Coastguard Worker free(if_addr->ifa_netmask);
305*d9f75844SAndroid Build Coastguard Worker delete if_addr;
306*d9f75844SAndroid Build Coastguard Worker if_addr = next_addr;
307*d9f75844SAndroid Build Coastguard Worker }
308*d9f75844SAndroid Build Coastguard Worker }
309*d9f75844SAndroid Build Coastguard Worker #endif // defined(WEBRTC_POSIX)
310*d9f75844SAndroid Build Coastguard Worker
311*d9f75844SAndroid Build Coastguard Worker protected:
312*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedKeyValueConfig field_trials_;
313*d9f75844SAndroid Build Coastguard Worker rtc::AutoThread main_thread_;
314*d9f75844SAndroid Build Coastguard Worker bool callback_called_;
315*d9f75844SAndroid Build Coastguard Worker };
316*d9f75844SAndroid Build Coastguard Worker
317*d9f75844SAndroid Build Coastguard Worker class TestBasicNetworkManager : public BasicNetworkManager {
318*d9f75844SAndroid Build Coastguard Worker public:
TestBasicNetworkManager(NetworkMonitorFactory * network_monitor_factory,SocketFactory * socket_factory,const webrtc::FieldTrialsView & field_trials)319*d9f75844SAndroid Build Coastguard Worker TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
320*d9f75844SAndroid Build Coastguard Worker SocketFactory* socket_factory,
321*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView& field_trials)
322*d9f75844SAndroid Build Coastguard Worker : BasicNetworkManager(network_monitor_factory,
323*d9f75844SAndroid Build Coastguard Worker socket_factory,
324*d9f75844SAndroid Build Coastguard Worker &field_trials) {}
325*d9f75844SAndroid Build Coastguard Worker using BasicNetworkManager::QueryDefaultLocalAddress;
326*d9f75844SAndroid Build Coastguard Worker using BasicNetworkManager::set_default_local_addresses;
327*d9f75844SAndroid Build Coastguard Worker };
328*d9f75844SAndroid Build Coastguard Worker
329*d9f75844SAndroid Build Coastguard Worker // Test that the Network ctor works properly.
TEST_F(NetworkTest,TestNetworkConstruct)330*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestNetworkConstruct) {
331*d9f75844SAndroid Build Coastguard Worker Network ipv4_network1("test_eth0", "Test Network Adapter 1",
332*d9f75844SAndroid Build Coastguard Worker IPAddress(0x12345600U), 24);
333*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("test_eth0", ipv4_network1.name());
334*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
335*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
336*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(24, ipv4_network1.prefix_length());
337*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(AF_INET, ipv4_network1.family());
338*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(ipv4_network1.ignored());
339*d9f75844SAndroid Build Coastguard Worker }
340*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,TestIsIgnoredNetworkIgnoresIPsStartingWith0)341*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
342*d9f75844SAndroid Build Coastguard Worker Network ipv4_network1("test_eth0", "Test Network Adapter 1",
343*d9f75844SAndroid Build Coastguard Worker IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET,
344*d9f75844SAndroid Build Coastguard Worker &field_trials_);
345*d9f75844SAndroid Build Coastguard Worker Network ipv4_network2("test_eth1", "Test Network Adapter 2",
346*d9f75844SAndroid Build Coastguard Worker IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET,
347*d9f75844SAndroid Build Coastguard Worker &field_trials_);
348*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
349*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager network_manager(&socket_server);
350*d9f75844SAndroid Build Coastguard Worker network_manager.StartUpdating();
351*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
352*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
353*d9f75844SAndroid Build Coastguard Worker }
354*d9f75844SAndroid Build Coastguard Worker
355*d9f75844SAndroid Build Coastguard Worker // TODO(phoglund): Remove when ignore list goes away.
TEST_F(NetworkTest,TestIgnoreList)356*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestIgnoreList) {
357*d9f75844SAndroid Build Coastguard Worker Network ignore_me("ignore_me", "Ignore me please!", IPAddress(0x12345600U),
358*d9f75844SAndroid Build Coastguard Worker 24);
359*d9f75844SAndroid Build Coastguard Worker Network include_me("include_me", "Include me please!", IPAddress(0x12345600U),
360*d9f75844SAndroid Build Coastguard Worker 24);
361*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
362*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager default_network_manager(&socket_server);
363*d9f75844SAndroid Build Coastguard Worker default_network_manager.StartUpdating();
364*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, ignore_me));
365*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsIgnoredNetwork(default_network_manager, include_me));
366*d9f75844SAndroid Build Coastguard Worker
367*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager ignoring_network_manager(&socket_server);
368*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> ignore_list;
369*d9f75844SAndroid Build Coastguard Worker ignore_list.push_back("ignore_me");
370*d9f75844SAndroid Build Coastguard Worker ignoring_network_manager.set_network_ignore_list(ignore_list);
371*d9f75844SAndroid Build Coastguard Worker ignoring_network_manager.StartUpdating();
372*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsIgnoredNetwork(ignoring_network_manager, ignore_me));
373*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(IsIgnoredNetwork(ignoring_network_manager, include_me));
374*d9f75844SAndroid Build Coastguard Worker }
375*d9f75844SAndroid Build Coastguard Worker
376*d9f75844SAndroid Build Coastguard Worker // Test is failing on Windows opt: b/11288214
TEST_F(NetworkTest,DISABLED_TestCreateNetworks)377*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
378*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
379*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
380*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result = GetNetworks(manager, true);
381*d9f75844SAndroid Build Coastguard Worker // We should be able to bind to any addresses we find.
382*d9f75844SAndroid Build Coastguard Worker for (auto it = result.begin(); it != result.end(); ++it) {
383*d9f75844SAndroid Build Coastguard Worker sockaddr_storage storage;
384*d9f75844SAndroid Build Coastguard Worker memset(&storage, 0, sizeof(storage));
385*d9f75844SAndroid Build Coastguard Worker IPAddress ip = (*it)->GetBestIP();
386*d9f75844SAndroid Build Coastguard Worker SocketAddress bindaddress(ip, 0);
387*d9f75844SAndroid Build Coastguard Worker bindaddress.SetScopeID((*it)->scope_id());
388*d9f75844SAndroid Build Coastguard Worker // TODO(thaloun): Use rtc::Socket once it supports IPv6.
389*d9f75844SAndroid Build Coastguard Worker int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
390*d9f75844SAndroid Build Coastguard Worker if (fd > 0) {
391*d9f75844SAndroid Build Coastguard Worker size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
392*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(ipsize, 0U);
393*d9f75844SAndroid Build Coastguard Worker int success = ::bind(fd, reinterpret_cast<sockaddr*>(&storage),
394*d9f75844SAndroid Build Coastguard Worker static_cast<int>(ipsize));
395*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
396*d9f75844SAndroid Build Coastguard Worker if (success)
397*d9f75844SAndroid Build Coastguard Worker RTC_LOG_GLE(LS_ERROR) << "Socket bind failed.";
398*d9f75844SAndroid Build Coastguard Worker #endif
399*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, success);
400*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
401*d9f75844SAndroid Build Coastguard Worker closesocket(fd);
402*d9f75844SAndroid Build Coastguard Worker #else
403*d9f75844SAndroid Build Coastguard Worker close(fd);
404*d9f75844SAndroid Build Coastguard Worker #endif
405*d9f75844SAndroid Build Coastguard Worker }
406*d9f75844SAndroid Build Coastguard Worker }
407*d9f75844SAndroid Build Coastguard Worker }
408*d9f75844SAndroid Build Coastguard Worker
409*d9f75844SAndroid Build Coastguard Worker // Test StartUpdating() and StopUpdating(). network_permission_state starts with
410*d9f75844SAndroid Build Coastguard Worker // ALLOWED.
TEST_F(NetworkTest,TestUpdateNetworks)411*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestUpdateNetworks) {
412*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
413*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(nullptr, &socket_server, &field_trials_);
414*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
415*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
416*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
417*d9f75844SAndroid Build Coastguard Worker manager.enumeration_permission());
418*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
419*d9f75844SAndroid Build Coastguard Worker Thread::Current()->ProcessMessages(0);
420*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(callback_called_);
421*d9f75844SAndroid Build Coastguard Worker callback_called_ = false;
422*d9f75844SAndroid Build Coastguard Worker // Callback should be triggered immediately when StartUpdating
423*d9f75844SAndroid Build Coastguard Worker // is called, after network update signal is already sent.
424*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
425*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.started());
426*d9f75844SAndroid Build Coastguard Worker Thread::Current()->ProcessMessages(0);
427*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(callback_called_);
428*d9f75844SAndroid Build Coastguard Worker manager.StopUpdating();
429*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.started());
430*d9f75844SAndroid Build Coastguard Worker manager.StopUpdating();
431*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
432*d9f75844SAndroid Build Coastguard Worker manager.enumeration_permission());
433*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(manager.started());
434*d9f75844SAndroid Build Coastguard Worker manager.StopUpdating();
435*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(manager.started());
436*d9f75844SAndroid Build Coastguard Worker callback_called_ = false;
437*d9f75844SAndroid Build Coastguard Worker // Callback should be triggered immediately after StartUpdating is called
438*d9f75844SAndroid Build Coastguard Worker // when start_count_ is reset to 0.
439*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
440*d9f75844SAndroid Build Coastguard Worker Thread::Current()->ProcessMessages(0);
441*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(callback_called_);
442*d9f75844SAndroid Build Coastguard Worker }
443*d9f75844SAndroid Build Coastguard Worker
444*d9f75844SAndroid Build Coastguard Worker // Verify that MergeNetworkList() merges network lists properly.
TEST_F(NetworkTest,TestBasicMergeNetworkList)445*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestBasicMergeNetworkList) {
446*d9f75844SAndroid Build Coastguard Worker Network ipv4_network1("test_eth0", "Test Network Adapter 1",
447*d9f75844SAndroid Build Coastguard Worker IPAddress(0x12345600U), 24);
448*d9f75844SAndroid Build Coastguard Worker Network ipv4_network2("test_eth1", "Test Network Adapter 2",
449*d9f75844SAndroid Build Coastguard Worker IPAddress(0x00010000U), 16);
450*d9f75844SAndroid Build Coastguard Worker ipv4_network1.AddIP(IPAddress(0x12345678));
451*d9f75844SAndroid Build Coastguard Worker ipv4_network2.AddIP(IPAddress(0x00010004));
452*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
453*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
454*d9f75844SAndroid Build Coastguard Worker
455*d9f75844SAndroid Build Coastguard Worker // Add ipv4_network1 to the list of networks.
456*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
457*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network1));
458*d9f75844SAndroid Build Coastguard Worker bool changed;
459*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats stats =
460*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
461*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
462*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv6_network_count, 0);
463*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv4_network_count, 1);
464*d9f75844SAndroid Build Coastguard Worker list.clear(); // It is fine to call .clear() on a moved-from vector.
465*d9f75844SAndroid Build Coastguard Worker
466*d9f75844SAndroid Build Coastguard Worker std::vector<const rtc::Network*> current = manager.GetNetworks();
467*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1U, current.size());
468*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SameNameAndPrefix(ipv4_network1, *current[0]));
469*d9f75844SAndroid Build Coastguard Worker const Network* net1 = current[0];
470*d9f75844SAndroid Build Coastguard Worker uint16_t net_id1 = net1->id();
471*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, net_id1);
472*d9f75844SAndroid Build Coastguard Worker
473*d9f75844SAndroid Build Coastguard Worker // Replace ipv4_network1 with ipv4_network2.
474*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network2));
475*d9f75844SAndroid Build Coastguard Worker stats = MergeNetworkList(manager, std::move(list), &changed);
476*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
477*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv6_network_count, 0);
478*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv4_network_count, 1);
479*d9f75844SAndroid Build Coastguard Worker list.clear();
480*d9f75844SAndroid Build Coastguard Worker
481*d9f75844SAndroid Build Coastguard Worker current = manager.GetNetworks();
482*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1U, current.size());
483*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(SameNameAndPrefix(ipv4_network2, *current[0]));
484*d9f75844SAndroid Build Coastguard Worker const Network* net2 = current[0];
485*d9f75844SAndroid Build Coastguard Worker uint16_t net_id2 = net2->id();
486*d9f75844SAndroid Build Coastguard Worker // Network id will increase.
487*d9f75844SAndroid Build Coastguard Worker EXPECT_LT(net_id1, net_id2);
488*d9f75844SAndroid Build Coastguard Worker
489*d9f75844SAndroid Build Coastguard Worker // Add Network2 back.
490*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network1));
491*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network2));
492*d9f75844SAndroid Build Coastguard Worker stats = MergeNetworkList(manager, std::move(list), &changed);
493*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
494*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv6_network_count, 0);
495*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv4_network_count, 2);
496*d9f75844SAndroid Build Coastguard Worker list.clear();
497*d9f75844SAndroid Build Coastguard Worker
498*d9f75844SAndroid Build Coastguard Worker // Verify that we get previous instances of Network objects.
499*d9f75844SAndroid Build Coastguard Worker current = manager.GetNetworks();
500*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2U, current.size());
501*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE((net1 == current[0] && net2 == current[1]) ||
502*d9f75844SAndroid Build Coastguard Worker (net1 == current[1] && net2 == current[0]));
503*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE((net_id1 == current[0]->id() && net_id2 == current[1]->id()) ||
504*d9f75844SAndroid Build Coastguard Worker (net_id1 == current[1]->id() && net_id2 == current[0]->id()));
505*d9f75844SAndroid Build Coastguard Worker
506*d9f75844SAndroid Build Coastguard Worker // Call MergeNetworkList() again and verify that we don't get update
507*d9f75844SAndroid Build Coastguard Worker // notification.
508*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network2));
509*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network1));
510*d9f75844SAndroid Build Coastguard Worker stats = MergeNetworkList(manager, std::move(list), &changed);
511*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(changed);
512*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv6_network_count, 0);
513*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv4_network_count, 2);
514*d9f75844SAndroid Build Coastguard Worker list.clear();
515*d9f75844SAndroid Build Coastguard Worker
516*d9f75844SAndroid Build Coastguard Worker // Verify that we get previous instances of Network objects.
517*d9f75844SAndroid Build Coastguard Worker current = manager.GetNetworks();
518*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2U, current.size());
519*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE((net1 == current[0] && net2 == current[1]) ||
520*d9f75844SAndroid Build Coastguard Worker (net1 == current[1] && net2 == current[0]));
521*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE((net_id1 == current[0]->id() && net_id2 == current[1]->id()) ||
522*d9f75844SAndroid Build Coastguard Worker (net_id1 == current[1]->id() && net_id2 == current[0]->id()));
523*d9f75844SAndroid Build Coastguard Worker }
524*d9f75844SAndroid Build Coastguard Worker
525*d9f75844SAndroid Build Coastguard Worker // Sets up some test IPv6 networks and appends them to list.
526*d9f75844SAndroid Build Coastguard Worker // Four networks are added - public and link local, for two interfaces.
SetupNetworks(std::vector<std::unique_ptr<Network>> * list)527*d9f75844SAndroid Build Coastguard Worker void SetupNetworks(std::vector<std::unique_ptr<Network>>* list) {
528*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
529*d9f75844SAndroid Build Coastguard Worker IPAddress prefix;
530*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
531*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("abcd::", &prefix));
532*d9f75844SAndroid Build Coastguard Worker // First, fake link-locals.
533*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
534*d9f75844SAndroid Build Coastguard Worker prefix, 64);
535*d9f75844SAndroid Build Coastguard Worker ipv6_eth0_linklocalnetwork.AddIP(ip);
536*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
537*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
538*d9f75844SAndroid Build Coastguard Worker prefix, 64);
539*d9f75844SAndroid Build Coastguard Worker ipv6_eth1_linklocalnetwork.AddIP(ip);
540*d9f75844SAndroid Build Coastguard Worker // Public networks:
541*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
542*d9f75844SAndroid Build Coastguard Worker prefix = TruncateIP(ip, 64);
543*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
544*d9f75844SAndroid Build Coastguard Worker prefix, 64);
545*d9f75844SAndroid Build Coastguard Worker ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
546*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
547*d9f75844SAndroid Build Coastguard Worker prefix = TruncateIP(ip, 64);
548*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
549*d9f75844SAndroid Build Coastguard Worker prefix, 64);
550*d9f75844SAndroid Build Coastguard Worker ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
551*d9f75844SAndroid Build Coastguard Worker list->push_back(std::make_unique<Network>(ipv6_eth0_linklocalnetwork));
552*d9f75844SAndroid Build Coastguard Worker list->push_back(std::make_unique<Network>(ipv6_eth1_linklocalnetwork));
553*d9f75844SAndroid Build Coastguard Worker list->push_back(std::make_unique<Network>(ipv6_eth0_publicnetwork1_ip1));
554*d9f75844SAndroid Build Coastguard Worker list->push_back(std::make_unique<Network>(ipv6_eth1_publicnetwork1_ip1));
555*d9f75844SAndroid Build Coastguard Worker }
556*d9f75844SAndroid Build Coastguard Worker
557*d9f75844SAndroid Build Coastguard Worker // Test that the basic network merging case works.
TEST_F(NetworkTest,TestIPv6MergeNetworkList)558*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
559*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
560*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
561*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
562*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
563*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> networks;
564*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&networks);
565*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> original_list = CopyNetworkPointers(networks);
566*d9f75844SAndroid Build Coastguard Worker bool changed = false;
567*d9f75844SAndroid Build Coastguard Worker NetworkManager::Stats stats =
568*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(networks), &changed);
569*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
570*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv6_network_count, 4);
571*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.ipv4_network_count, 0);
572*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
573*d9f75844SAndroid Build Coastguard Worker // Verify that the original members are in the merged list.
574*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(list, UnorderedElementsAreArray(original_list));
575*d9f75844SAndroid Build Coastguard Worker }
576*d9f75844SAndroid Build Coastguard Worker
577*d9f75844SAndroid Build Coastguard Worker // Tests that when two network lists that describe the same set of networks are
578*d9f75844SAndroid Build Coastguard Worker // merged, that the changed callback is not called, and that the original
579*d9f75844SAndroid Build Coastguard Worker // objects remain in the result list.
TEST_F(NetworkTest,TestNoChangeMerge)580*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestNoChangeMerge) {
581*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
582*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
583*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
584*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
585*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> networks;
586*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&networks);
587*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> original_list = CopyNetworkPointers(networks);
588*d9f75844SAndroid Build Coastguard Worker bool changed = false;
589*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(networks), &changed);
590*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
591*d9f75844SAndroid Build Coastguard Worker // Second list that describes the same networks but with new objects.
592*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> second_networks;
593*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&second_networks);
594*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> second_list =
595*d9f75844SAndroid Build Coastguard Worker CopyNetworkPointers(second_networks);
596*d9f75844SAndroid Build Coastguard Worker changed = false;
597*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(second_networks), &changed);
598*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(changed);
599*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> resulting_list = manager.GetNetworks();
600*d9f75844SAndroid Build Coastguard Worker // Verify that the original members are in the merged list.
601*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(resulting_list, UnorderedElementsAreArray(original_list));
602*d9f75844SAndroid Build Coastguard Worker // Doublecheck that the new networks aren't in the list.
603*d9f75844SAndroid Build Coastguard Worker for (const Network* network : second_list) {
604*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(resulting_list, Not(Contains(network)));
605*d9f75844SAndroid Build Coastguard Worker }
606*d9f75844SAndroid Build Coastguard Worker }
607*d9f75844SAndroid Build Coastguard Worker
608*d9f75844SAndroid Build Coastguard Worker // Test that we can merge a network that is the same as another network but with
609*d9f75844SAndroid Build Coastguard Worker // a different IP. The original network should remain in the list, but have its
610*d9f75844SAndroid Build Coastguard Worker // IP changed.
TEST_F(NetworkTest,MergeWithChangedIP)611*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, MergeWithChangedIP) {
612*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
613*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
614*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
615*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
616*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> original_list;
617*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&original_list);
618*d9f75844SAndroid Build Coastguard Worker // Make a network that we're going to change.
619*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
620*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
621*d9f75844SAndroid Build Coastguard Worker IPAddress prefix = TruncateIP(ip, 64);
622*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Network> network_to_change = std::make_unique<Network>(
623*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", prefix, 64);
624*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Network> changed_network =
625*d9f75844SAndroid Build Coastguard Worker std::make_unique<Network>(*network_to_change);
626*d9f75844SAndroid Build Coastguard Worker network_to_change->AddIP(ip);
627*d9f75844SAndroid Build Coastguard Worker IPAddress changed_ip;
628*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
629*d9f75844SAndroid Build Coastguard Worker changed_network->AddIP(changed_ip);
630*d9f75844SAndroid Build Coastguard Worker const Network* const network_to_change_ptr = network_to_change.get();
631*d9f75844SAndroid Build Coastguard Worker original_list.push_back(std::move(network_to_change));
632*d9f75844SAndroid Build Coastguard Worker const size_t original_size = original_list.size();
633*d9f75844SAndroid Build Coastguard Worker bool changed = false;
634*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(original_list), &changed);
635*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> second_list;
636*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&second_list);
637*d9f75844SAndroid Build Coastguard Worker second_list.push_back(std::move(changed_network));
638*d9f75844SAndroid Build Coastguard Worker changed = false;
639*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(second_list), &changed);
640*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
641*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
642*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(original_size, list.size());
643*d9f75844SAndroid Build Coastguard Worker // Make sure the original network is still in the merged list.
644*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(list, Contains(network_to_change_ptr));
645*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(changed_ip, network_to_change_ptr->GetIPs().at(0));
646*d9f75844SAndroid Build Coastguard Worker }
647*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,TestMultipleIPMergeNetworkList)648*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
649*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
650*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
651*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
652*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
653*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> original_list;
654*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&original_list);
655*d9f75844SAndroid Build Coastguard Worker const Network* const network_ptr = original_list[2].get();
656*d9f75844SAndroid Build Coastguard Worker bool changed = false;
657*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(original_list), &changed);
658*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
659*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
660*d9f75844SAndroid Build Coastguard Worker IPAddress check_ip;
661*d9f75844SAndroid Build Coastguard Worker IPAddress prefix;
662*d9f75844SAndroid Build Coastguard Worker // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
663*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
664*d9f75844SAndroid Build Coastguard Worker prefix = TruncateIP(ip, 64);
665*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
666*d9f75844SAndroid Build Coastguard Worker prefix, 64);
667*d9f75844SAndroid Build Coastguard Worker // This is the IP that already existed in the public network on eth0.
668*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
669*d9f75844SAndroid Build Coastguard Worker ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
670*d9f75844SAndroid Build Coastguard Worker
671*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> second_list;
672*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&second_list);
673*d9f75844SAndroid Build Coastguard Worker second_list.push_back(
674*d9f75844SAndroid Build Coastguard Worker std::make_unique<Network>(ipv6_eth0_publicnetwork1_ip2));
675*d9f75844SAndroid Build Coastguard Worker changed = false;
676*d9f75844SAndroid Build Coastguard Worker const auto network_copy = std::make_unique<Network>(*second_list[2]);
677*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(second_list), &changed);
678*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
679*d9f75844SAndroid Build Coastguard Worker // There should still be four networks.
680*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
681*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(4U, list.size());
682*d9f75844SAndroid Build Coastguard Worker // Check the gathered IPs.
683*d9f75844SAndroid Build Coastguard Worker int matchcount = 0;
684*d9f75844SAndroid Build Coastguard Worker for (const Network* network : list) {
685*d9f75844SAndroid Build Coastguard Worker if (SameNameAndPrefix(*network, *network_copy)) {
686*d9f75844SAndroid Build Coastguard Worker ++matchcount;
687*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, matchcount);
688*d9f75844SAndroid Build Coastguard Worker // This should be the same network object as before.
689*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(network, network_ptr);
690*d9f75844SAndroid Build Coastguard Worker // But with two addresses now.
691*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(network->GetIPs(),
692*d9f75844SAndroid Build Coastguard Worker UnorderedElementsAre(InterfaceAddress(check_ip),
693*d9f75844SAndroid Build Coastguard Worker InterfaceAddress(ip)));
694*d9f75844SAndroid Build Coastguard Worker } else {
695*d9f75844SAndroid Build Coastguard Worker // Check the IP didn't get added anywhere it wasn't supposed to.
696*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(network->GetIPs(), Not(Contains(InterfaceAddress(ip))));
697*d9f75844SAndroid Build Coastguard Worker }
698*d9f75844SAndroid Build Coastguard Worker }
699*d9f75844SAndroid Build Coastguard Worker }
700*d9f75844SAndroid Build Coastguard Worker
701*d9f75844SAndroid Build Coastguard Worker // Test that merge correctly distinguishes multiple networks on an interface.
TEST_F(NetworkTest,TestMultiplePublicNetworksOnOneInterfaceMerge)702*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
703*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
704*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
705*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
706*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
707*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> original_list;
708*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&original_list);
709*d9f75844SAndroid Build Coastguard Worker bool changed = false;
710*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(original_list), &changed);
711*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
712*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
713*d9f75844SAndroid Build Coastguard Worker IPAddress prefix;
714*d9f75844SAndroid Build Coastguard Worker // A second network for eth0.
715*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
716*d9f75844SAndroid Build Coastguard Worker prefix = TruncateIP(ip, 64);
717*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
718*d9f75844SAndroid Build Coastguard Worker prefix, 64);
719*d9f75844SAndroid Build Coastguard Worker ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
720*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> second_list;
721*d9f75844SAndroid Build Coastguard Worker SetupNetworks(&second_list);
722*d9f75844SAndroid Build Coastguard Worker second_list.push_back(
723*d9f75844SAndroid Build Coastguard Worker std::make_unique<Network>(ipv6_eth0_publicnetwork2_ip1));
724*d9f75844SAndroid Build Coastguard Worker changed = false;
725*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(second_list), &changed);
726*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
727*d9f75844SAndroid Build Coastguard Worker // There should be five networks now.
728*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
729*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(5U, list.size());
730*d9f75844SAndroid Build Coastguard Worker // Check the resulting addresses.
731*d9f75844SAndroid Build Coastguard Worker for (const Network* network : list) {
732*d9f75844SAndroid Build Coastguard Worker if (network->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
733*d9f75844SAndroid Build Coastguard Worker network->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
734*d9f75844SAndroid Build Coastguard Worker // Check the new network has 1 IP and that it's the correct one.
735*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1U, network->GetIPs().size());
736*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ip, network->GetIPs().at(0));
737*d9f75844SAndroid Build Coastguard Worker } else {
738*d9f75844SAndroid Build Coastguard Worker // Check the IP didn't get added anywhere it wasn't supposed to.
739*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(network->GetIPs(), Not(Contains(InterfaceAddress(ip))));
740*d9f75844SAndroid Build Coastguard Worker }
741*d9f75844SAndroid Build Coastguard Worker }
742*d9f75844SAndroid Build Coastguard Worker }
743*d9f75844SAndroid Build Coastguard Worker
744*d9f75844SAndroid Build Coastguard Worker // Test that DumpNetworks does not crash.
TEST_F(NetworkTest,TestCreateAndDumpNetworks)745*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
746*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
747*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
748*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
749*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list = GetNetworks(manager, true);
750*d9f75844SAndroid Build Coastguard Worker bool changed;
751*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
752*d9f75844SAndroid Build Coastguard Worker manager.DumpNetworks();
753*d9f75844SAndroid Build Coastguard Worker }
754*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,TestIPv6Toggle)755*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestIPv6Toggle) {
756*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
757*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
758*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
759*d9f75844SAndroid Build Coastguard Worker bool ipv6_found = false;
760*d9f75844SAndroid Build Coastguard Worker for (const auto& network : GetNetworks(manager, true)) {
761*d9f75844SAndroid Build Coastguard Worker if (network->prefix().family() == AF_INET6) {
762*d9f75844SAndroid Build Coastguard Worker ipv6_found = true;
763*d9f75844SAndroid Build Coastguard Worker break;
764*d9f75844SAndroid Build Coastguard Worker }
765*d9f75844SAndroid Build Coastguard Worker }
766*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(ipv6_found);
767*d9f75844SAndroid Build Coastguard Worker }
768*d9f75844SAndroid Build Coastguard Worker
769*d9f75844SAndroid Build Coastguard Worker // Test that when network interfaces are sorted and given preference values,
770*d9f75844SAndroid Build Coastguard Worker // IPv6 comes first.
TEST_F(NetworkTest,IPv6NetworksPreferredOverIPv4)771*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, IPv6NetworksPreferredOverIPv4) {
772*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
773*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
774*d9f75844SAndroid Build Coastguard Worker Network ipv4_network1("test_eth0", "Test Network Adapter 1",
775*d9f75844SAndroid Build Coastguard Worker IPAddress(0x12345600U), 24);
776*d9f75844SAndroid Build Coastguard Worker ipv4_network1.AddIP(IPAddress(0x12345600U));
777*d9f75844SAndroid Build Coastguard Worker
778*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
779*d9f75844SAndroid Build Coastguard Worker IPAddress prefix;
780*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
781*d9f75844SAndroid Build Coastguard Worker prefix = TruncateIP(ip, 64);
782*d9f75844SAndroid Build Coastguard Worker Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
783*d9f75844SAndroid Build Coastguard Worker prefix, 64);
784*d9f75844SAndroid Build Coastguard Worker ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
785*d9f75844SAndroid Build Coastguard Worker
786*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
787*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv4_network1));
788*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv6_eth1_publicnetwork1_ip1));
789*d9f75844SAndroid Build Coastguard Worker const Network* net1 = list[0].get();
790*d9f75844SAndroid Build Coastguard Worker const Network* net2 = list[1].get();
791*d9f75844SAndroid Build Coastguard Worker
792*d9f75844SAndroid Build Coastguard Worker bool changed = false;
793*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
794*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(changed);
795*d9f75844SAndroid Build Coastguard Worker // After sorting IPv6 network should be higher order than IPv4 networks.
796*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(net1->preference() < net2->preference());
797*d9f75844SAndroid Build Coastguard Worker }
798*d9f75844SAndroid Build Coastguard Worker
799*d9f75844SAndroid Build Coastguard Worker // When two interfaces are equivalent in everything but name, they're expected
800*d9f75844SAndroid Build Coastguard Worker // to be preference-ordered by name. For example, "eth0" before "eth1".
TEST_F(NetworkTest,NetworksSortedByInterfaceName)801*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, NetworksSortedByInterfaceName) {
802*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
803*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server, &field_trials_);
804*d9f75844SAndroid Build Coastguard Worker auto eth0 = std::make_unique<Network>("test_eth0", "Test Network Adapter 1",
805*d9f75844SAndroid Build Coastguard Worker IPAddress(0x65432100U), 24);
806*d9f75844SAndroid Build Coastguard Worker eth0->AddIP(IPAddress(0x65432100U));
807*d9f75844SAndroid Build Coastguard Worker auto eth1 = std::make_unique<Network>("test_eth1", "Test Network Adapter 2",
808*d9f75844SAndroid Build Coastguard Worker IPAddress(0x12345600U), 24);
809*d9f75844SAndroid Build Coastguard Worker eth1->AddIP(IPAddress(0x12345600U));
810*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
811*d9f75844SAndroid Build Coastguard Worker const Network* eth0_ptr = eth0.get();
812*d9f75844SAndroid Build Coastguard Worker const Network* eth1_ptr = eth1.get();
813*d9f75844SAndroid Build Coastguard Worker // Add them to the list in the opposite of the expected sorted order, to
814*d9f75844SAndroid Build Coastguard Worker // ensure sorting actually occurs.
815*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(eth1));
816*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(eth0));
817*d9f75844SAndroid Build Coastguard Worker
818*d9f75844SAndroid Build Coastguard Worker bool changed = false;
819*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
820*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(changed);
821*d9f75844SAndroid Build Coastguard Worker // "test_eth0" should be preferred over "test_eth1".
822*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(eth0_ptr->preference() > eth1_ptr->preference());
823*d9f75844SAndroid Build Coastguard Worker }
824*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,TestNetworkAdapterTypes)825*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestNetworkAdapterTypes) {
826*d9f75844SAndroid Build Coastguard Worker Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
827*d9f75844SAndroid Build Coastguard Worker ADAPTER_TYPE_WIFI, &field_trials_);
828*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
829*d9f75844SAndroid Build Coastguard Worker Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
830*d9f75844SAndroid Build Coastguard Worker ADAPTER_TYPE_ETHERNET, &field_trials_);
831*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
832*d9f75844SAndroid Build Coastguard Worker Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
833*d9f75844SAndroid Build Coastguard Worker ADAPTER_TYPE_CELLULAR, &field_trials_);
834*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
835*d9f75844SAndroid Build Coastguard Worker Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
836*d9f75844SAndroid Build Coastguard Worker ADAPTER_TYPE_VPN, &field_trials_);
837*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
838*d9f75844SAndroid Build Coastguard Worker Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
839*d9f75844SAndroid Build Coastguard Worker ADAPTER_TYPE_UNKNOWN, &field_trials_);
840*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
841*d9f75844SAndroid Build Coastguard Worker }
842*d9f75844SAndroid Build Coastguard Worker
843*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX)
844*d9f75844SAndroid Build Coastguard Worker // Verify that we correctly handle interfaces with no address.
TEST_F(NetworkTest,TestConvertIfAddrsNoAddress)845*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
846*d9f75844SAndroid Build Coastguard Worker ifaddrs list;
847*d9f75844SAndroid Build Coastguard Worker memset(&list, 0, sizeof(list));
848*d9f75844SAndroid Build Coastguard Worker list.ifa_name = const_cast<char*>("test_iface");
849*d9f75844SAndroid Build Coastguard Worker
850*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
851*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
852*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
853*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
854*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(manager, &list, true, &result);
855*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.empty());
856*d9f75844SAndroid Build Coastguard Worker }
857*d9f75844SAndroid Build Coastguard Worker
858*d9f75844SAndroid Build Coastguard Worker // Verify that if there are two addresses on one interface, only one network
859*d9f75844SAndroid Build Coastguard Worker // is generated.
TEST_F(NetworkTest,TestConvertIfAddrsMultiAddressesOnOneInterface)860*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
861*d9f75844SAndroid Build Coastguard Worker char if_name[20] = "rmnet0";
862*d9f75844SAndroid Build Coastguard Worker ifaddrs* list = nullptr;
863*d9f75844SAndroid Build Coastguard Worker list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
864*d9f75844SAndroid Build Coastguard Worker "FFFF:FFFF:FFFF:FFFF::", 0);
865*d9f75844SAndroid Build Coastguard Worker list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
866*d9f75844SAndroid Build Coastguard Worker "FFFF:FFFF:FFFF:FFFF::", 0);
867*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
868*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
869*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
870*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
871*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(manager, list, true, &result);
872*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1U, result.size());
873*d9f75844SAndroid Build Coastguard Worker bool changed;
874*d9f75844SAndroid Build Coastguard Worker // This ensures we release the objects created in CallConvertIfAddrs.
875*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(result), &changed);
876*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(list);
877*d9f75844SAndroid Build Coastguard Worker }
878*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,TestConvertIfAddrsNotRunning)879*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
880*d9f75844SAndroid Build Coastguard Worker ifaddrs list;
881*d9f75844SAndroid Build Coastguard Worker memset(&list, 0, sizeof(list));
882*d9f75844SAndroid Build Coastguard Worker list.ifa_name = const_cast<char*>("test_iface");
883*d9f75844SAndroid Build Coastguard Worker sockaddr ifa_addr;
884*d9f75844SAndroid Build Coastguard Worker sockaddr ifa_netmask;
885*d9f75844SAndroid Build Coastguard Worker list.ifa_addr = &ifa_addr;
886*d9f75844SAndroid Build Coastguard Worker list.ifa_netmask = &ifa_netmask;
887*d9f75844SAndroid Build Coastguard Worker
888*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
889*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
890*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
891*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
892*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(manager, &list, true, &result);
893*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.empty());
894*d9f75844SAndroid Build Coastguard Worker }
895*d9f75844SAndroid Build Coastguard Worker
896*d9f75844SAndroid Build Coastguard Worker // Tests that the network type can be determined from the network monitor when
897*d9f75844SAndroid Build Coastguard Worker // it would otherwise be unknown.
TEST_F(NetworkTest,TestGetAdapterTypeFromNetworkMonitor)898*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
899*d9f75844SAndroid Build Coastguard Worker char if_name[20] = "wifi0";
900*d9f75844SAndroid Build Coastguard Worker std::string ipv6_address = "1000:2000:3000:4000:0:0:0:1";
901*d9f75844SAndroid Build Coastguard Worker std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
902*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
903*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager_without_monitor(nullptr, &socket_server,
904*d9f75844SAndroid Build Coastguard Worker &field_trials_);
905*d9f75844SAndroid Build Coastguard Worker manager_without_monitor.StartUpdating();
906*d9f75844SAndroid Build Coastguard Worker // A network created without a network monitor will get UNKNOWN type.
907*d9f75844SAndroid Build Coastguard Worker ifaddrs* addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
908*d9f75844SAndroid Build Coastguard Worker manager_without_monitor);
909*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager_without_monitor));
910*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
911*d9f75844SAndroid Build Coastguard Worker
912*d9f75844SAndroid Build Coastguard Worker // With the fake network monitor the type should be correctly determined.
913*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitorFactory factory;
914*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager_with_monitor(&factory, &socket_server,
915*d9f75844SAndroid Build Coastguard Worker &field_trials_);
916*d9f75844SAndroid Build Coastguard Worker manager_with_monitor.StartUpdating();
917*d9f75844SAndroid Build Coastguard Worker // Add the same ipv6 address as before but it has the right network type
918*d9f75844SAndroid Build Coastguard Worker // detected by the network monitor now.
919*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address, ipv6_mask,
920*d9f75844SAndroid Build Coastguard Worker manager_with_monitor);
921*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager_with_monitor));
922*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
923*d9f75844SAndroid Build Coastguard Worker }
924*d9f75844SAndroid Build Coastguard Worker
925*d9f75844SAndroid Build Coastguard Worker // Test that the network type can be determined based on name matching in
926*d9f75844SAndroid Build Coastguard Worker // a few cases. Note that UNKNOWN type for non-matching strings has been tested
927*d9f75844SAndroid Build Coastguard Worker // in the above test.
TEST_F(NetworkTest,TestGetAdapterTypeFromNameMatching)928*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
929*d9f75844SAndroid Build Coastguard Worker std::string ipv4_address1 = "192.0.0.121";
930*d9f75844SAndroid Build Coastguard Worker std::string ipv4_mask = "255.255.255.0";
931*d9f75844SAndroid Build Coastguard Worker std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
932*d9f75844SAndroid Build Coastguard Worker std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
933*d9f75844SAndroid Build Coastguard Worker std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
934*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
935*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
936*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
937*d9f75844SAndroid Build Coastguard Worker
938*d9f75844SAndroid Build Coastguard Worker // IPSec interface; name is in form "ipsec<index>".
939*d9f75844SAndroid Build Coastguard Worker char if_name[20] = "ipsec11";
940*d9f75844SAndroid Build Coastguard Worker ifaddrs* addr_list =
941*d9f75844SAndroid Build Coastguard Worker InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
942*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
943*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
944*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
945*d9f75844SAndroid Build Coastguard Worker
946*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "lo0");
947*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
948*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_LOOPBACK, GetAdapterType(manager));
949*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
950*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
951*d9f75844SAndroid Build Coastguard Worker
952*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "eth0");
953*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
954*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_ETHERNET, GetAdapterType(manager));
955*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
956*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
957*d9f75844SAndroid Build Coastguard Worker
958*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "wlan0");
959*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
960*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
961*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
962*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
963*d9f75844SAndroid Build Coastguard Worker
964*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_IOS)
965*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "pdp_ip0");
966*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
967*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
968*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
969*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
970*d9f75844SAndroid Build Coastguard Worker
971*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "en0");
972*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
973*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
974*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
975*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
976*d9f75844SAndroid Build Coastguard Worker
977*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_ANDROID)
978*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "rmnet0");
979*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
980*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
981*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
982*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
983*d9f75844SAndroid Build Coastguard Worker
984*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "v4-rmnet_data0");
985*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
986*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
987*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
988*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
989*d9f75844SAndroid Build Coastguard Worker
990*d9f75844SAndroid Build Coastguard Worker strcpy(if_name, "clat4");
991*d9f75844SAndroid Build Coastguard Worker addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
992*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
993*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
994*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
995*d9f75844SAndroid Build Coastguard Worker #endif
996*d9f75844SAndroid Build Coastguard Worker }
997*d9f75844SAndroid Build Coastguard Worker
998*d9f75844SAndroid Build Coastguard Worker // Test that an adapter won't be included in the network list if there's a
999*d9f75844SAndroid Build Coastguard Worker // network monitor that says it's unavailable.
TEST_F(NetworkTest,TestNetworkMonitorIsAdapterAvailable)1000*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestNetworkMonitorIsAdapterAvailable) {
1001*d9f75844SAndroid Build Coastguard Worker char if_name1[20] = "pdp_ip0";
1002*d9f75844SAndroid Build Coastguard Worker char if_name2[20] = "pdp_ip1";
1003*d9f75844SAndroid Build Coastguard Worker ifaddrs* list = nullptr;
1004*d9f75844SAndroid Build Coastguard Worker list = AddIpv6Address(list, if_name1, "1000:2000:3000:4000:0:0:0:1",
1005*d9f75844SAndroid Build Coastguard Worker "FFFF:FFFF:FFFF:FFFF::", 0);
1006*d9f75844SAndroid Build Coastguard Worker list = AddIpv6Address(list, if_name2, "1000:2000:3000:4000:0:0:0:2",
1007*d9f75844SAndroid Build Coastguard Worker "FFFF:FFFF:FFFF:FFFF::", 0);
1008*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
1009*d9f75844SAndroid Build Coastguard Worker
1010*d9f75844SAndroid Build Coastguard Worker // Sanity check that both interfaces are included by default.
1011*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitorFactory factory;
1012*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1013*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
1014*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1015*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1016*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2u, result.size());
1017*d9f75844SAndroid Build Coastguard Worker bool changed;
1018*d9f75844SAndroid Build Coastguard Worker // This ensures we release the objects created in CallConvertIfAddrs.
1019*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(result), &changed);
1020*d9f75844SAndroid Build Coastguard Worker result.clear();
1021*d9f75844SAndroid Build Coastguard Worker
1022*d9f75844SAndroid Build Coastguard Worker // Now simulate one interface being unavailable.
1023*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1024*d9f75844SAndroid Build Coastguard Worker network_monitor->set_unavailable_adapters({if_name1});
1025*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1026*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, result.size());
1027*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(if_name2, result[0]->name());
1028*d9f75844SAndroid Build Coastguard Worker
1029*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(result), &changed);
1030*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(list);
1031*d9f75844SAndroid Build Coastguard Worker }
1032*d9f75844SAndroid Build Coastguard Worker
1033*d9f75844SAndroid Build Coastguard Worker #endif // defined(WEBRTC_POSIX)
1034*d9f75844SAndroid Build Coastguard Worker
1035*d9f75844SAndroid Build Coastguard Worker // Test MergeNetworkList successfully combines all IPs for the same
1036*d9f75844SAndroid Build Coastguard Worker // prefix/length into a single Network.
TEST_F(NetworkTest,TestMergeNetworkList)1037*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestMergeNetworkList) {
1038*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1039*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1040*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
1041*d9f75844SAndroid Build Coastguard Worker
1042*d9f75844SAndroid Build Coastguard Worker // Create 2 IPAddress classes with only last digit different.
1043*d9f75844SAndroid Build Coastguard Worker IPAddress ip1, ip2;
1044*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1045*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
1046*d9f75844SAndroid Build Coastguard Worker
1047*d9f75844SAndroid Build Coastguard Worker // Create 2 networks with the same prefix and length.
1048*d9f75844SAndroid Build Coastguard Worker auto net1 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1049*d9f75844SAndroid Build Coastguard Worker auto net2 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1050*d9f75844SAndroid Build Coastguard Worker
1051*d9f75844SAndroid Build Coastguard Worker // Add different IP into each.
1052*d9f75844SAndroid Build Coastguard Worker net1->AddIP(ip1);
1053*d9f75844SAndroid Build Coastguard Worker net2->AddIP(ip2);
1054*d9f75844SAndroid Build Coastguard Worker
1055*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net1));
1056*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net2));
1057*d9f75844SAndroid Build Coastguard Worker bool changed;
1058*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1059*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
1060*d9f75844SAndroid Build Coastguard Worker
1061*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list2 = manager.GetNetworks();
1062*d9f75844SAndroid Build Coastguard Worker
1063*d9f75844SAndroid Build Coastguard Worker // Make sure the resulted networklist has only 1 element and 2
1064*d9f75844SAndroid Build Coastguard Worker // IPAddresses.
1065*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(list2.size(), 1uL);
1066*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
1067*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(list2[0]->GetIPs(), UnorderedElementsAre(InterfaceAddress(ip1),
1068*d9f75844SAndroid Build Coastguard Worker InterfaceAddress(ip2)));
1069*d9f75844SAndroid Build Coastguard Worker }
1070*d9f75844SAndroid Build Coastguard Worker
1071*d9f75844SAndroid Build Coastguard Worker // Test that MergeNetworkList successfully detects the change if
1072*d9f75844SAndroid Build Coastguard Worker // a network becomes inactive and then active again.
TEST_F(NetworkTest,TestMergeNetworkListWithInactiveNetworks)1073*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
1074*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1075*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1076*d9f75844SAndroid Build Coastguard Worker Network network1("test_wifi", "Test Network Adapter 1",
1077*d9f75844SAndroid Build Coastguard Worker IPAddress(0x12345600U), 24);
1078*d9f75844SAndroid Build Coastguard Worker Network network2("test_eth0", "Test Network Adapter 2",
1079*d9f75844SAndroid Build Coastguard Worker IPAddress(0x00010000U), 16);
1080*d9f75844SAndroid Build Coastguard Worker network1.AddIP(IPAddress(0x12345678));
1081*d9f75844SAndroid Build Coastguard Worker network2.AddIP(IPAddress(0x00010004));
1082*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
1083*d9f75844SAndroid Build Coastguard Worker auto net1 = std::make_unique<Network>(network1);
1084*d9f75844SAndroid Build Coastguard Worker const Network* const net1_ptr = net1.get();
1085*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net1));
1086*d9f75844SAndroid Build Coastguard Worker bool changed;
1087*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1088*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
1089*d9f75844SAndroid Build Coastguard Worker list.clear();
1090*d9f75844SAndroid Build Coastguard Worker
1091*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> current = manager.GetNetworks();
1092*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1U, current.size());
1093*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(net1_ptr, current[0]);
1094*d9f75844SAndroid Build Coastguard Worker
1095*d9f75844SAndroid Build Coastguard Worker list.clear();
1096*d9f75844SAndroid Build Coastguard Worker auto net2 = std::make_unique<Network>(network2);
1097*d9f75844SAndroid Build Coastguard Worker const Network* const net2_ptr = net2.get();
1098*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net2));
1099*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1100*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
1101*d9f75844SAndroid Build Coastguard Worker list.clear();
1102*d9f75844SAndroid Build Coastguard Worker
1103*d9f75844SAndroid Build Coastguard Worker current = manager.GetNetworks();
1104*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1U, current.size());
1105*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(net2_ptr, current[0]);
1106*d9f75844SAndroid Build Coastguard Worker // Now network1 is inactive. Try to merge it again.
1107*d9f75844SAndroid Build Coastguard Worker list.clear();
1108*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(network1));
1109*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1110*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
1111*d9f75844SAndroid Build Coastguard Worker list.clear();
1112*d9f75844SAndroid Build Coastguard Worker current = manager.GetNetworks();
1113*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1U, current.size());
1114*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(current[0]->active());
1115*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(net1_ptr, current[0]);
1116*d9f75844SAndroid Build Coastguard Worker }
1117*d9f75844SAndroid Build Coastguard Worker
1118*d9f75844SAndroid Build Coastguard Worker // Test that the filtering logic follows the defined ruleset in network.h.
TEST_F(NetworkTest,TestIPv6Selection)1119*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestIPv6Selection) {
1120*d9f75844SAndroid Build Coastguard Worker InterfaceAddress ip;
1121*d9f75844SAndroid Build Coastguard Worker std::string ipstr;
1122*d9f75844SAndroid Build Coastguard Worker
1123*d9f75844SAndroid Build Coastguard Worker ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1124*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1125*d9f75844SAndroid Build Coastguard Worker
1126*d9f75844SAndroid Build Coastguard Worker // Create a network with this prefix.
1127*d9f75844SAndroid Build Coastguard Worker Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
1128*d9f75844SAndroid Build Coastguard Worker 64);
1129*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(AF_INET6, ipv6_network.family());
1130*d9f75844SAndroid Build Coastguard Worker
1131*d9f75844SAndroid Build Coastguard Worker // When there is no address added, it should return an unspecified
1132*d9f75844SAndroid Build Coastguard Worker // address.
1133*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1134*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1135*d9f75844SAndroid Build Coastguard Worker
1136*d9f75844SAndroid Build Coastguard Worker // Deprecated one should not be returned.
1137*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1138*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1139*d9f75844SAndroid Build Coastguard Worker
1140*d9f75844SAndroid Build Coastguard Worker // Add ULA one. ULA is unique local address which is starting either
1141*d9f75844SAndroid Build Coastguard Worker // with 0xfc or 0xfd.
1142*d9f75844SAndroid Build Coastguard Worker ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1143*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1144*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1145*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1146*d9f75844SAndroid Build Coastguard Worker
1147*d9f75844SAndroid Build Coastguard Worker // Add global one.
1148*d9f75844SAndroid Build Coastguard Worker ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1149*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1150*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1151*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1152*d9f75844SAndroid Build Coastguard Worker
1153*d9f75844SAndroid Build Coastguard Worker // Add global dynamic temporary one.
1154*d9f75844SAndroid Build Coastguard Worker ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1155*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1156*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1157*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1158*d9f75844SAndroid Build Coastguard Worker }
1159*d9f75844SAndroid Build Coastguard Worker
1160*d9f75844SAndroid Build Coastguard Worker // Test that the filtering logic follows the defined ruleset in network.h.
TEST_F(NetworkTest,TestGetBestIPWithPreferGlobalIPv6ToLinkLocalEnabled)1161*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestGetBestIPWithPreferGlobalIPv6ToLinkLocalEnabled) {
1162*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedKeyValueConfig field_trials(
1163*d9f75844SAndroid Build Coastguard Worker "WebRTC-IPv6NetworkResolutionFixes/"
1164*d9f75844SAndroid Build Coastguard Worker "Enabled,PreferGlobalIPv6Address:true/");
1165*d9f75844SAndroid Build Coastguard Worker InterfaceAddress ip, link_local;
1166*d9f75844SAndroid Build Coastguard Worker std::string ipstr;
1167*d9f75844SAndroid Build Coastguard Worker
1168*d9f75844SAndroid Build Coastguard Worker ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
1169*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
1170*d9f75844SAndroid Build Coastguard Worker
1171*d9f75844SAndroid Build Coastguard Worker // Create a network with this prefix.
1172*d9f75844SAndroid Build Coastguard Worker Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64),
1173*d9f75844SAndroid Build Coastguard Worker 64, ADAPTER_TYPE_UNKNOWN, &field_trials);
1174*d9f75844SAndroid Build Coastguard Worker
1175*d9f75844SAndroid Build Coastguard Worker // When there is no address added, it should return an unspecified
1176*d9f75844SAndroid Build Coastguard Worker // address.
1177*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1178*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
1179*d9f75844SAndroid Build Coastguard Worker
1180*d9f75844SAndroid Build Coastguard Worker // Deprecated one should not be returned.
1181*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1182*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
1183*d9f75844SAndroid Build Coastguard Worker
1184*d9f75844SAndroid Build Coastguard Worker // Add ULA one. ULA is unique local address which is starting either
1185*d9f75844SAndroid Build Coastguard Worker // with 0xfc or 0xfd.
1186*d9f75844SAndroid Build Coastguard Worker ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
1187*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1188*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1189*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1190*d9f75844SAndroid Build Coastguard Worker
1191*d9f75844SAndroid Build Coastguard Worker // Add link local one.
1192*d9f75844SAndroid Build Coastguard Worker ipstr = "fe80::aabb:ccff:fedd:eeff";
1193*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &link_local));
1194*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(link_local);
1195*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(link_local));
1196*d9f75844SAndroid Build Coastguard Worker
1197*d9f75844SAndroid Build Coastguard Worker // Add global one.
1198*d9f75844SAndroid Build Coastguard Worker ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
1199*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
1200*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1201*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1202*d9f75844SAndroid Build Coastguard Worker
1203*d9f75844SAndroid Build Coastguard Worker // Add another link local address, then the compatible address is still global
1204*d9f75844SAndroid Build Coastguard Worker // one.
1205*d9f75844SAndroid Build Coastguard Worker ipstr = "fe80::aabb:ccff:fedd:eedd";
1206*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &link_local));
1207*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(link_local);
1208*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1209*d9f75844SAndroid Build Coastguard Worker
1210*d9f75844SAndroid Build Coastguard Worker // Add global dynamic temporary one.
1211*d9f75844SAndroid Build Coastguard Worker ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
1212*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
1213*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip);
1214*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1215*d9f75844SAndroid Build Coastguard Worker
1216*d9f75844SAndroid Build Coastguard Worker // Add another link local address, then the compatible address is still global
1217*d9f75844SAndroid Build Coastguard Worker // dynamic one.
1218*d9f75844SAndroid Build Coastguard Worker ipstr = "fe80::aabb:ccff:fedd:eedd";
1219*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &link_local));
1220*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(link_local);
1221*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
1222*d9f75844SAndroid Build Coastguard Worker }
1223*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,TestNetworkMonitoring)1224*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestNetworkMonitoring) {
1225*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitorFactory factory;
1226*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1227*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
1228*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1229*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
1230*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1231*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1232*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(network_monitor && network_monitor->started());
1233*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE_WAIT(callback_called_, 1000);
1234*d9f75844SAndroid Build Coastguard Worker callback_called_ = false;
1235*d9f75844SAndroid Build Coastguard Worker
1236*d9f75844SAndroid Build Coastguard Worker // Clear the networks so that there will be network changes below.
1237*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
1238*d9f75844SAndroid Build Coastguard Worker // Network manager is started, so the callback is called when the network
1239*d9f75844SAndroid Build Coastguard Worker // monitor fires the network-change event.
1240*d9f75844SAndroid Build Coastguard Worker network_monitor->InovkeNetworksChangedCallbackForTesting();
1241*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE_WAIT(callback_called_, 1000);
1242*d9f75844SAndroid Build Coastguard Worker
1243*d9f75844SAndroid Build Coastguard Worker // Network manager is stopped.
1244*d9f75844SAndroid Build Coastguard Worker manager.StopUpdating();
1245*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(GetNetworkMonitor(manager)->started());
1246*d9f75844SAndroid Build Coastguard Worker }
1247*d9f75844SAndroid Build Coastguard Worker
1248*d9f75844SAndroid Build Coastguard Worker // Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
1249*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_ANDROID)
1250*d9f75844SAndroid Build Coastguard Worker #define MAYBE_DefaultLocalAddress DISABLED_DefaultLocalAddress
1251*d9f75844SAndroid Build Coastguard Worker #else
1252*d9f75844SAndroid Build Coastguard Worker #define MAYBE_DefaultLocalAddress DefaultLocalAddress
1253*d9f75844SAndroid Build Coastguard Worker #endif
TEST_F(NetworkTest,MAYBE_DefaultLocalAddress)1254*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
1255*d9f75844SAndroid Build Coastguard Worker IPAddress ip;
1256*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitorFactory factory;
1257*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1258*d9f75844SAndroid Build Coastguard Worker TestBasicNetworkManager manager(&factory, &socket_server, field_trials_);
1259*d9f75844SAndroid Build Coastguard Worker manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
1260*d9f75844SAndroid Build Coastguard Worker &NetworkTest::OnNetworksChanged);
1261*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1262*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE_WAIT(callback_called_, 1000);
1263*d9f75844SAndroid Build Coastguard Worker
1264*d9f75844SAndroid Build Coastguard Worker // Make sure we can query default local address when an address for such
1265*d9f75844SAndroid Build Coastguard Worker // address family exists.
1266*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> networks = manager.GetNetworks();
1267*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(!networks.empty());
1268*d9f75844SAndroid Build Coastguard Worker for (const Network* network : networks) {
1269*d9f75844SAndroid Build Coastguard Worker if (network->GetBestIP().family() == AF_INET) {
1270*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET) != IPAddress());
1271*d9f75844SAndroid Build Coastguard Worker } else if (network->GetBestIP().family() == AF_INET6 &&
1272*d9f75844SAndroid Build Coastguard Worker !IPIsLoopback(network->GetBestIP())) {
1273*d9f75844SAndroid Build Coastguard Worker // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
1274*d9f75844SAndroid Build Coastguard Worker // enabled.
1275*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(QueryDefaultLocalAddress(manager, AF_INET6) != IPAddress());
1276*d9f75844SAndroid Build Coastguard Worker }
1277*d9f75844SAndroid Build Coastguard Worker }
1278*d9f75844SAndroid Build Coastguard Worker
1279*d9f75844SAndroid Build Coastguard Worker // GetDefaultLocalAddress should return the valid default address after set.
1280*d9f75844SAndroid Build Coastguard Worker manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
1281*d9f75844SAndroid Build Coastguard Worker GetLoopbackIP(AF_INET6));
1282*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
1283*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
1284*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1285*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
1286*d9f75844SAndroid Build Coastguard Worker
1287*d9f75844SAndroid Build Coastguard Worker // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
1288*d9f75844SAndroid Build Coastguard Worker // default address may be different from the best IP address of any network.
1289*d9f75844SAndroid Build Coastguard Worker InterfaceAddress ip1;
1290*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
1291*d9f75844SAndroid Build Coastguard Worker IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
1292*d9f75844SAndroid Build Coastguard Worker // Create a network with a prefix of ip1.
1293*d9f75844SAndroid Build Coastguard Worker Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
1294*d9f75844SAndroid Build Coastguard Worker 64);
1295*d9f75844SAndroid Build Coastguard Worker IPAddress ip2;
1296*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
1297*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip1);
1298*d9f75844SAndroid Build Coastguard Worker ipv6_network.AddIP(ip2);
1299*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
1300*d9f75844SAndroid Build Coastguard Worker list.push_back(std::make_unique<Network>(ipv6_network));
1301*d9f75844SAndroid Build Coastguard Worker bool changed;
1302*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1303*d9f75844SAndroid Build Coastguard Worker // If the set default address is not in any network, GetDefaultLocalAddress
1304*d9f75844SAndroid Build Coastguard Worker // should return it.
1305*d9f75844SAndroid Build Coastguard Worker IPAddress ip3;
1306*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
1307*d9f75844SAndroid Build Coastguard Worker manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
1308*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1309*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ip3, ip);
1310*d9f75844SAndroid Build Coastguard Worker // If the set default address is in a network, GetDefaultLocalAddress will
1311*d9f75844SAndroid Build Coastguard Worker // return the best IP in that network.
1312*d9f75844SAndroid Build Coastguard Worker manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1313*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1314*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1315*d9f75844SAndroid Build Coastguard Worker
1316*d9f75844SAndroid Build Coastguard Worker manager.StopUpdating();
1317*d9f75844SAndroid Build Coastguard Worker }
1318*d9f75844SAndroid Build Coastguard Worker
1319*d9f75844SAndroid Build Coastguard Worker // Test that MergeNetworkList does not set change = true
1320*d9f75844SAndroid Build Coastguard Worker // when changing from cellular_X to cellular_Y.
TEST_F(NetworkTest,TestWhenNetworkListChangeReturnsChangedFlag)1321*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, TestWhenNetworkListChangeReturnsChangedFlag) {
1322*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1323*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1324*d9f75844SAndroid Build Coastguard Worker
1325*d9f75844SAndroid Build Coastguard Worker IPAddress ip1;
1326*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1327*d9f75844SAndroid Build Coastguard Worker auto net1 = std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1328*d9f75844SAndroid Build Coastguard Worker net1->set_type(ADAPTER_TYPE_CELLULAR_3G);
1329*d9f75844SAndroid Build Coastguard Worker net1->AddIP(ip1);
1330*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> list;
1331*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net1));
1332*d9f75844SAndroid Build Coastguard Worker
1333*d9f75844SAndroid Build Coastguard Worker {
1334*d9f75844SAndroid Build Coastguard Worker bool changed;
1335*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1336*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(changed);
1337*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list2 = manager.GetNetworks();
1338*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(list2.size(), 1uL);
1339*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR_3G, list2[0]->type());
1340*d9f75844SAndroid Build Coastguard Worker }
1341*d9f75844SAndroid Build Coastguard Worker
1342*d9f75844SAndroid Build Coastguard Worker // Modify net1 from 3G to 4G
1343*d9f75844SAndroid Build Coastguard Worker {
1344*d9f75844SAndroid Build Coastguard Worker auto net2 =
1345*d9f75844SAndroid Build Coastguard Worker std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1346*d9f75844SAndroid Build Coastguard Worker net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1347*d9f75844SAndroid Build Coastguard Worker net2->AddIP(ip1);
1348*d9f75844SAndroid Build Coastguard Worker list.clear();
1349*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net2));
1350*d9f75844SAndroid Build Coastguard Worker bool changed;
1351*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1352*d9f75844SAndroid Build Coastguard Worker
1353*d9f75844SAndroid Build Coastguard Worker // Change from 3G to 4G shall not trigger OnNetworksChanged,
1354*d9f75844SAndroid Build Coastguard Worker // i.e changed = false.
1355*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(changed);
1356*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list2 = manager.GetNetworks();
1357*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(list2.size(), 1uL);
1358*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1359*d9f75844SAndroid Build Coastguard Worker }
1360*d9f75844SAndroid Build Coastguard Worker
1361*d9f75844SAndroid Build Coastguard Worker // Don't modify.
1362*d9f75844SAndroid Build Coastguard Worker {
1363*d9f75844SAndroid Build Coastguard Worker auto net2 =
1364*d9f75844SAndroid Build Coastguard Worker std::make_unique<Network>("em1", "em1", TruncateIP(ip1, 64), 64);
1365*d9f75844SAndroid Build Coastguard Worker net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
1366*d9f75844SAndroid Build Coastguard Worker net2->AddIP(ip1);
1367*d9f75844SAndroid Build Coastguard Worker list.clear();
1368*d9f75844SAndroid Build Coastguard Worker list.push_back(std::move(net2));
1369*d9f75844SAndroid Build Coastguard Worker bool changed;
1370*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(list), &changed);
1371*d9f75844SAndroid Build Coastguard Worker
1372*d9f75844SAndroid Build Coastguard Worker // No change.
1373*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(changed);
1374*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list2 = manager.GetNetworks();
1375*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(list2.size(), 1uL);
1376*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
1377*d9f75844SAndroid Build Coastguard Worker }
1378*d9f75844SAndroid Build Coastguard Worker }
1379*d9f75844SAndroid Build Coastguard Worker
1380*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX)
TEST_F(NetworkTest,IgnoresMACBasedIPv6Address)1381*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, IgnoresMACBasedIPv6Address) {
1382*d9f75844SAndroid Build Coastguard Worker std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
1383*d9f75844SAndroid Build Coastguard Worker std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
1384*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1385*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1386*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1387*d9f75844SAndroid Build Coastguard Worker
1388*d9f75844SAndroid Build Coastguard Worker // IPSec interface; name is in form "ipsec<index>".
1389*d9f75844SAndroid Build Coastguard Worker char if_name[20] = "ipsec11";
1390*d9f75844SAndroid Build Coastguard Worker ifaddrs* addr_list =
1391*d9f75844SAndroid Build Coastguard Worker InstallIpv6Network(if_name, ipv6_address, ipv6_mask, manager);
1392*d9f75844SAndroid Build Coastguard Worker
1393*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
1394*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(list.size(), 0u);
1395*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
1396*d9f75844SAndroid Build Coastguard Worker }
1397*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,WebRTC_AllowMACBasedIPv6Address)1398*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, WebRTC_AllowMACBasedIPv6Address) {
1399*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedFieldTrials field_trials(
1400*d9f75844SAndroid Build Coastguard Worker "WebRTC-AllowMACBasedIPv6/Enabled/");
1401*d9f75844SAndroid Build Coastguard Worker std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
1402*d9f75844SAndroid Build Coastguard Worker std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
1403*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1404*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1405*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1406*d9f75844SAndroid Build Coastguard Worker
1407*d9f75844SAndroid Build Coastguard Worker // IPSec interface; name is in form "ipsec<index>".
1408*d9f75844SAndroid Build Coastguard Worker char if_name[20] = "ipsec11";
1409*d9f75844SAndroid Build Coastguard Worker ifaddrs* addr_list =
1410*d9f75844SAndroid Build Coastguard Worker InstallIpv6Network(if_name, ipv6_address, ipv6_mask, manager);
1411*d9f75844SAndroid Build Coastguard Worker
1412*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
1413*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(list.size(), 1u);
1414*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
1415*d9f75844SAndroid Build Coastguard Worker }
1416*d9f75844SAndroid Build Coastguard Worker #endif
1417*d9f75844SAndroid Build Coastguard Worker
1418*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX)
TEST_F(NetworkTest,WebRTC_BindUsingInterfaceName)1419*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, WebRTC_BindUsingInterfaceName) {
1420*d9f75844SAndroid Build Coastguard Worker char if_name1[20] = "wlan0";
1421*d9f75844SAndroid Build Coastguard Worker char if_name2[20] = "v4-wlan0";
1422*d9f75844SAndroid Build Coastguard Worker ifaddrs* list = nullptr;
1423*d9f75844SAndroid Build Coastguard Worker list = AddIpv6Address(list, if_name1, "1000:2000:3000:4000:0:0:0:1",
1424*d9f75844SAndroid Build Coastguard Worker "FFFF:FFFF:FFFF:FFFF::", 0);
1425*d9f75844SAndroid Build Coastguard Worker list = AddIpv4Address(list, if_name2, "192.168.0.2", "255.255.255.255");
1426*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> result;
1427*d9f75844SAndroid Build Coastguard Worker
1428*d9f75844SAndroid Build Coastguard Worker // Sanity check that both interfaces are included by default.
1429*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitorFactory factory;
1430*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1431*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&factory, &socket_server, &field_trials_);
1432*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1433*d9f75844SAndroid Build Coastguard Worker CallConvertIfAddrs(manager, list, /*include_ignored=*/false, &result);
1434*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2u, result.size());
1435*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(list);
1436*d9f75844SAndroid Build Coastguard Worker bool changed;
1437*d9f75844SAndroid Build Coastguard Worker // This ensures we release the objects created in CallConvertIfAddrs.
1438*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(manager, std::move(result), &changed);
1439*d9f75844SAndroid Build Coastguard Worker result.clear();
1440*d9f75844SAndroid Build Coastguard Worker
1441*d9f75844SAndroid Build Coastguard Worker FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
1442*d9f75844SAndroid Build Coastguard Worker
1443*d9f75844SAndroid Build Coastguard Worker IPAddress ipv6;
1444*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("1000:2000:3000:4000:0:0:0:1", &ipv6));
1445*d9f75844SAndroid Build Coastguard Worker IPAddress ipv4;
1446*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("192.168.0.2", &ipv4));
1447*d9f75844SAndroid Build Coastguard Worker
1448*d9f75844SAndroid Build Coastguard Worker // The network monitor only knwos about the ipv6 address, interface.
1449*d9f75844SAndroid Build Coastguard Worker network_monitor->set_adapters({"wlan0"});
1450*d9f75844SAndroid Build Coastguard Worker network_monitor->set_ip_addresses({ipv6});
1451*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(manager.BindSocketToNetwork(/* fd */ 77, ipv6),
1452*d9f75844SAndroid Build Coastguard Worker NetworkBindingResult::SUCCESS);
1453*d9f75844SAndroid Build Coastguard Worker
1454*d9f75844SAndroid Build Coastguard Worker // But it will bind anyway using string matching...
1455*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(manager.BindSocketToNetwork(/* fd */ 77, ipv4),
1456*d9f75844SAndroid Build Coastguard Worker NetworkBindingResult::SUCCESS);
1457*d9f75844SAndroid Build Coastguard Worker }
1458*d9f75844SAndroid Build Coastguard Worker #endif
1459*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,NetworkCostVpn_Default)1460*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, NetworkCostVpn_Default) {
1461*d9f75844SAndroid Build Coastguard Worker IPAddress ip1;
1462*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1463*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedKeyValueConfig field_trials;
1464*d9f75844SAndroid Build Coastguard Worker
1465*d9f75844SAndroid Build Coastguard Worker Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1466*d9f75844SAndroid Build Coastguard Worker net1->set_type(ADAPTER_TYPE_VPN);
1467*d9f75844SAndroid Build Coastguard Worker net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
1468*d9f75844SAndroid Build Coastguard Worker
1469*d9f75844SAndroid Build Coastguard Worker Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1470*d9f75844SAndroid Build Coastguard Worker net2->set_type(ADAPTER_TYPE_ETHERNET);
1471*d9f75844SAndroid Build Coastguard Worker
1472*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(net1->GetCost(field_trials), net2->GetCost(field_trials));
1473*d9f75844SAndroid Build Coastguard Worker delete net1;
1474*d9f75844SAndroid Build Coastguard Worker delete net2;
1475*d9f75844SAndroid Build Coastguard Worker }
1476*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,NetworkCostVpn_VpnMoreExpensive)1477*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, NetworkCostVpn_VpnMoreExpensive) {
1478*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedKeyValueConfig field_trials(
1479*d9f75844SAndroid Build Coastguard Worker "WebRTC-AddNetworkCostToVpn/Enabled/");
1480*d9f75844SAndroid Build Coastguard Worker
1481*d9f75844SAndroid Build Coastguard Worker IPAddress ip1;
1482*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1483*d9f75844SAndroid Build Coastguard Worker
1484*d9f75844SAndroid Build Coastguard Worker Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1485*d9f75844SAndroid Build Coastguard Worker net1->set_type(ADAPTER_TYPE_VPN);
1486*d9f75844SAndroid Build Coastguard Worker net1->set_underlying_type_for_vpn(ADAPTER_TYPE_ETHERNET);
1487*d9f75844SAndroid Build Coastguard Worker
1488*d9f75844SAndroid Build Coastguard Worker Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
1489*d9f75844SAndroid Build Coastguard Worker net2->set_type(ADAPTER_TYPE_ETHERNET);
1490*d9f75844SAndroid Build Coastguard Worker
1491*d9f75844SAndroid Build Coastguard Worker EXPECT_GT(net1->GetCost(field_trials), net2->GetCost(field_trials));
1492*d9f75844SAndroid Build Coastguard Worker delete net1;
1493*d9f75844SAndroid Build Coastguard Worker delete net2;
1494*d9f75844SAndroid Build Coastguard Worker }
1495*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,GuessAdapterFromNetworkCost)1496*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, GuessAdapterFromNetworkCost) {
1497*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedKeyValueConfig field_trials(
1498*d9f75844SAndroid Build Coastguard Worker "WebRTC-AddNetworkCostToVpn/Enabled/"
1499*d9f75844SAndroid Build Coastguard Worker "WebRTC-UseDifferentiatedCellularCosts/Enabled/");
1500*d9f75844SAndroid Build Coastguard Worker
1501*d9f75844SAndroid Build Coastguard Worker IPAddress ip1;
1502*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
1503*d9f75844SAndroid Build Coastguard Worker
1504*d9f75844SAndroid Build Coastguard Worker for (auto type : kAllAdapterTypes) {
1505*d9f75844SAndroid Build Coastguard Worker if (type == rtc::ADAPTER_TYPE_VPN)
1506*d9f75844SAndroid Build Coastguard Worker continue;
1507*d9f75844SAndroid Build Coastguard Worker Network net1("em1", "em1", TruncateIP(ip1, 64), 64);
1508*d9f75844SAndroid Build Coastguard Worker net1.set_type(type);
1509*d9f75844SAndroid Build Coastguard Worker auto [guess, vpn] =
1510*d9f75844SAndroid Build Coastguard Worker Network::GuessAdapterFromNetworkCost(net1.GetCost(field_trials));
1511*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(vpn);
1512*d9f75844SAndroid Build Coastguard Worker if (type == rtc::ADAPTER_TYPE_LOOPBACK) {
1513*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(guess, rtc::ADAPTER_TYPE_ETHERNET);
1514*d9f75844SAndroid Build Coastguard Worker } else {
1515*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(type, guess);
1516*d9f75844SAndroid Build Coastguard Worker }
1517*d9f75844SAndroid Build Coastguard Worker }
1518*d9f75844SAndroid Build Coastguard Worker
1519*d9f75844SAndroid Build Coastguard Worker // VPN
1520*d9f75844SAndroid Build Coastguard Worker for (auto type : kAllAdapterTypes) {
1521*d9f75844SAndroid Build Coastguard Worker if (type == rtc::ADAPTER_TYPE_VPN)
1522*d9f75844SAndroid Build Coastguard Worker continue;
1523*d9f75844SAndroid Build Coastguard Worker Network net1("em1", "em1", TruncateIP(ip1, 64), 64);
1524*d9f75844SAndroid Build Coastguard Worker net1.set_type(rtc::ADAPTER_TYPE_VPN);
1525*d9f75844SAndroid Build Coastguard Worker net1.set_underlying_type_for_vpn(type);
1526*d9f75844SAndroid Build Coastguard Worker auto [guess, vpn] =
1527*d9f75844SAndroid Build Coastguard Worker Network::GuessAdapterFromNetworkCost(net1.GetCost(field_trials));
1528*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(vpn);
1529*d9f75844SAndroid Build Coastguard Worker if (type == rtc::ADAPTER_TYPE_LOOPBACK) {
1530*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(guess, rtc::ADAPTER_TYPE_ETHERNET);
1531*d9f75844SAndroid Build Coastguard Worker } else {
1532*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(type, guess);
1533*d9f75844SAndroid Build Coastguard Worker }
1534*d9f75844SAndroid Build Coastguard Worker }
1535*d9f75844SAndroid Build Coastguard Worker }
1536*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,VpnList)1537*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, VpnList) {
1538*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1539*d9f75844SAndroid Build Coastguard Worker {
1540*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1541*d9f75844SAndroid Build Coastguard Worker manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 16)});
1542*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1543*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.1.1"), 32));
1544*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.12.1"), 24));
1545*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 16));
1546*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 24));
1547*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.133.1.1"), 32));
1548*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.133.0.0"), 16));
1549*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.168.0.0"), 15));
1550*d9f75844SAndroid Build Coastguard Worker }
1551*d9f75844SAndroid Build Coastguard Worker {
1552*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1553*d9f75844SAndroid Build Coastguard Worker manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 24)});
1554*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1555*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(manager.IsConfiguredVpn(IPFromString("192.168.1.1"), 32));
1556*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(manager.IsConfiguredVpn(IPFromString("192.168.0.1"), 32));
1557*d9f75844SAndroid Build Coastguard Worker }
1558*d9f75844SAndroid Build Coastguard Worker }
1559*d9f75844SAndroid Build Coastguard Worker
1560*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_POSIX)
1561*d9f75844SAndroid Build Coastguard Worker // TODO(webrtc:13114): Implement the InstallIpv4Network for windows.
TEST_F(NetworkTest,VpnListOverrideAdapterType)1562*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, VpnListOverrideAdapterType) {
1563*d9f75844SAndroid Build Coastguard Worker PhysicalSocketServer socket_server;
1564*d9f75844SAndroid Build Coastguard Worker BasicNetworkManager manager(&socket_server);
1565*d9f75844SAndroid Build Coastguard Worker manager.set_vpn_list({NetworkMask(IPFromString("192.168.0.0"), 16)});
1566*d9f75844SAndroid Build Coastguard Worker manager.StartUpdating();
1567*d9f75844SAndroid Build Coastguard Worker
1568*d9f75844SAndroid Build Coastguard Worker char if_name[20] = "eth0";
1569*d9f75844SAndroid Build Coastguard Worker auto addr_list =
1570*d9f75844SAndroid Build Coastguard Worker InstallIpv4Network(if_name, "192.168.1.23", "255.255.255.255", manager);
1571*d9f75844SAndroid Build Coastguard Worker
1572*d9f75844SAndroid Build Coastguard Worker std::vector<const Network*> list = manager.GetNetworks();
1573*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, list.size());
1574*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_VPN, list[0]->type());
1575*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(ADAPTER_TYPE_ETHERNET, list[0]->underlying_type_for_vpn());
1576*d9f75844SAndroid Build Coastguard Worker ClearNetworks(manager);
1577*d9f75844SAndroid Build Coastguard Worker ReleaseIfAddrs(addr_list);
1578*d9f75844SAndroid Build Coastguard Worker }
1579*d9f75844SAndroid Build Coastguard Worker #endif // defined(WEBRTC_POSIX)
1580*d9f75844SAndroid Build Coastguard Worker
TEST_F(NetworkTest,HardcodedVpn)1581*d9f75844SAndroid Build Coastguard Worker TEST_F(NetworkTest, HardcodedVpn) {
1582*d9f75844SAndroid Build Coastguard Worker const uint8_t cisco[] = {0x0, 0x5, 0x9A, 0x3C, 0x7A, 0x0};
1583*d9f75844SAndroid Build Coastguard Worker const uint8_t global[] = {0x2, 0x50, 0x41, 0x0, 0x0, 0x1};
1584*d9f75844SAndroid Build Coastguard Worker const uint8_t unknown[] = {0x2, 0x50, 0x41, 0x0, 0x0, 0x0};
1585*d9f75844SAndroid Build Coastguard Worker const uint8_t five_bytes[] = {0x2, 0x50, 0x41, 0x0, 0x0};
1586*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(cisco));
1587*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(global));
1588*d9f75844SAndroid Build Coastguard Worker
1589*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(
1590*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<const uint8_t>(cisco, 5)));
1591*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(five_bytes));
1592*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(unknown));
1593*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(nullptr));
1594*d9f75844SAndroid Build Coastguard Worker }
1595*d9f75844SAndroid Build Coastguard Worker
TEST(CompareNetworks,IrreflexivityTest)1596*d9f75844SAndroid Build Coastguard Worker TEST(CompareNetworks, IrreflexivityTest) {
1597*d9f75844SAndroid Build Coastguard Worker // x < x is false
1598*d9f75844SAndroid Build Coastguard Worker auto network = std::make_unique<Network>(
1599*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1600*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network, network));
1601*d9f75844SAndroid Build Coastguard Worker }
1602*d9f75844SAndroid Build Coastguard Worker
TEST(CompareNetworks,AsymmetryTest)1603*d9f75844SAndroid Build Coastguard Worker TEST(CompareNetworks, AsymmetryTest) {
1604*d9f75844SAndroid Build Coastguard Worker // x < y and y < x cannot be both true
1605*d9f75844SAndroid Build Coastguard Worker auto network_a = std::make_unique<Network>(
1606*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1607*d9f75844SAndroid Build Coastguard Worker auto network_b = std::make_unique<Network>(
1608*d9f75844SAndroid Build Coastguard Worker "test_eth1", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1609*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_b));
1610*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_b, network_a));
1611*d9f75844SAndroid Build Coastguard Worker
1612*d9f75844SAndroid Build Coastguard Worker auto network_c = std::make_unique<Network>(
1613*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345500U), 24);
1614*d9f75844SAndroid Build Coastguard Worker auto network_d = std::make_unique<Network>(
1615*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1616*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_c, network_d));
1617*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_d, network_c));
1618*d9f75844SAndroid Build Coastguard Worker }
1619*d9f75844SAndroid Build Coastguard Worker
TEST(CompareNetworks,TransitivityTest)1620*d9f75844SAndroid Build Coastguard Worker TEST(CompareNetworks, TransitivityTest) {
1621*d9f75844SAndroid Build Coastguard Worker // x < y and y < z imply x < z
1622*d9f75844SAndroid Build Coastguard Worker auto network_a = std::make_unique<Network>(
1623*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1624*d9f75844SAndroid Build Coastguard Worker auto network_b = std::make_unique<Network>(
1625*d9f75844SAndroid Build Coastguard Worker "test_eth1", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1626*d9f75844SAndroid Build Coastguard Worker auto network_c = std::make_unique<Network>(
1627*d9f75844SAndroid Build Coastguard Worker "test_eth2", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1628*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_b));
1629*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_b, network_c));
1630*d9f75844SAndroid Build Coastguard Worker
1631*d9f75844SAndroid Build Coastguard Worker auto network_d = std::make_unique<Network>(
1632*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1633*d9f75844SAndroid Build Coastguard Worker auto network_e = std::make_unique<Network>(
1634*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345700U), 24);
1635*d9f75844SAndroid Build Coastguard Worker auto network_f = std::make_unique<Network>(
1636*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345800U), 24);
1637*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_d, network_e));
1638*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_e, network_f));
1639*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_d, network_f));
1640*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_c));
1641*d9f75844SAndroid Build Coastguard Worker }
1642*d9f75844SAndroid Build Coastguard Worker
TEST(CompareNetworks,TransitivityOfIncomparabilityTest)1643*d9f75844SAndroid Build Coastguard Worker TEST(CompareNetworks, TransitivityOfIncomparabilityTest) {
1644*d9f75844SAndroid Build Coastguard Worker // x == y and y == z imply x == z,
1645*d9f75844SAndroid Build Coastguard Worker // where x == y means x < y and y < x are both false
1646*d9f75844SAndroid Build Coastguard Worker auto network_a = std::make_unique<Network>(
1647*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 23);
1648*d9f75844SAndroid Build Coastguard Worker auto network_b = std::make_unique<Network>(
1649*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1650*d9f75844SAndroid Build Coastguard Worker auto network_c = std::make_unique<Network>(
1651*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345700U), 24);
1652*d9f75844SAndroid Build Coastguard Worker
1653*d9f75844SAndroid Build Coastguard Worker // network_a < network_b
1654*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_b));
1655*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_b, network_a));
1656*d9f75844SAndroid Build Coastguard Worker
1657*d9f75844SAndroid Build Coastguard Worker // network_b < network_c
1658*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_b, network_c));
1659*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_c, network_b));
1660*d9f75844SAndroid Build Coastguard Worker
1661*d9f75844SAndroid Build Coastguard Worker // network_a < network_c
1662*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(webrtc_network_internal::CompareNetworks(network_a, network_c));
1663*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_c, network_a));
1664*d9f75844SAndroid Build Coastguard Worker
1665*d9f75844SAndroid Build Coastguard Worker auto network_d = std::make_unique<Network>(
1666*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1667*d9f75844SAndroid Build Coastguard Worker auto network_e = std::make_unique<Network>(
1668*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1669*d9f75844SAndroid Build Coastguard Worker auto network_f = std::make_unique<Network>(
1670*d9f75844SAndroid Build Coastguard Worker "test_eth0", "Test Network Adapter 1", IPAddress(0x12345600U), 24);
1671*d9f75844SAndroid Build Coastguard Worker
1672*d9f75844SAndroid Build Coastguard Worker // network_d == network_e
1673*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_d, network_e));
1674*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_e, network_d));
1675*d9f75844SAndroid Build Coastguard Worker
1676*d9f75844SAndroid Build Coastguard Worker // network_e == network_f
1677*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_e, network_f));
1678*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_f, network_e));
1679*d9f75844SAndroid Build Coastguard Worker
1680*d9f75844SAndroid Build Coastguard Worker // network_d == network_f
1681*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_d, network_f));
1682*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(webrtc_network_internal::CompareNetworks(network_f, network_d));
1683*d9f75844SAndroid Build Coastguard Worker }
1684*d9f75844SAndroid Build Coastguard Worker
1685*d9f75844SAndroid Build Coastguard Worker } // namespace rtc
1686