socket_proxy_testing/
lib.rs

1// Copyright 2024 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use fidl_fuchsia_net::{IpAddress, SocketAddress};
6use fidl_fuchsia_net_policy_socketproxy::{
7    DnsServerList, FuchsiaNetworkInfo, FuchsiaNetworksProxy, Network, NetworkDnsServers,
8    NetworkInfo, NetworkRegistryAddResult, NetworkRegistryRemoveResult,
9    NetworkRegistrySetDefaultResult, NetworkRegistryUpdateResult, StarnixNetworkInfo,
10    StarnixNetworksProxy,
11};
12use fidl_fuchsia_posix_socket::OptionalUint32;
13use std::future::Future;
14
15fn dns_server_list(id: u32) -> DnsServerList {
16    DnsServerList { source_network_id: Some(id), addresses: Some(vec![]), ..Default::default() }
17}
18
19fn starnix_network_info(mark: u32) -> NetworkInfo {
20    NetworkInfo::Starnix(StarnixNetworkInfo {
21        mark: Some(mark),
22        handle: Some(0),
23        ..Default::default()
24    })
25}
26
27fn starnix_network(network_id: u32) -> Network {
28    Network {
29        network_id: Some(network_id),
30        info: Some(starnix_network_info(network_id)),
31        dns_servers: Some(Default::default()),
32        ..Default::default()
33    }
34}
35
36fn fuchsia_network(network_id: u32) -> Network {
37    Network {
38        network_id: Some(network_id),
39        info: Some(NetworkInfo::Fuchsia(FuchsiaNetworkInfo { ..Default::default() })),
40        dns_servers: Some(Default::default()),
41        ..Default::default()
42    }
43}
44
45pub trait ToNetwork {
46    fn to_network(self, registry: RegistryType) -> Network;
47}
48
49pub trait ToDnsServerList {
50    fn to_dns_server_list(self) -> DnsServerList;
51}
52
53impl ToNetwork for u32 {
54    fn to_network(self, registry: RegistryType) -> Network {
55        match registry {
56            RegistryType::Starnix => starnix_network(self),
57            RegistryType::Fuchsia => fuchsia_network(self),
58        }
59    }
60}
61
62impl ToDnsServerList for u32 {
63    fn to_dns_server_list(self) -> DnsServerList {
64        dns_server_list(self)
65    }
66}
67
68pub enum RegistryType {
69    Starnix,
70    Fuchsia,
71}
72
73impl ToNetwork for (u32, Vec<IpAddress>) {
74    fn to_network(self, registry: RegistryType) -> Network {
75        let (v4, v6) = self.1.iter().fold((Vec::new(), Vec::new()), |(mut v4s, mut v6s), s| {
76            match s {
77                IpAddress::Ipv4(v4) => v4s.push(*v4),
78                IpAddress::Ipv6(v6) => v6s.push(*v6),
79            }
80            (v4s, v6s)
81        });
82        let base = match registry {
83            RegistryType::Starnix => starnix_network(self.0),
84            RegistryType::Fuchsia => fuchsia_network(self.0),
85        };
86        Network {
87            dns_servers: Some(NetworkDnsServers {
88                v4: Some(v4),
89                v6: Some(v6),
90                ..Default::default()
91            }),
92            ..base
93        }
94    }
95}
96
97impl ToDnsServerList for (u32, Vec<SocketAddress>) {
98    fn to_dns_server_list(self) -> DnsServerList {
99        DnsServerList { addresses: Some(self.1), ..dns_server_list(self.0) }
100    }
101}
102
103impl<N: ToNetwork + Clone> ToNetwork for &N {
104    fn to_network(self, registry: RegistryType) -> Network {
105        self.clone().to_network(registry)
106    }
107}
108
109impl<D: ToDnsServerList + Clone> ToDnsServerList for &D {
110    fn to_dns_server_list(self) -> DnsServerList {
111        self.clone().to_dns_server_list()
112    }
113}
114
115pub trait NetworkRegistry {
116    fn set_default(
117        &self,
118        network_id: &OptionalUint32,
119    ) -> impl Future<Output = Result<NetworkRegistrySetDefaultResult, fidl::Error>>;
120    fn add(
121        &self,
122        network: &Network,
123    ) -> impl Future<Output = Result<NetworkRegistryAddResult, fidl::Error>>;
124    fn update(
125        &self,
126        network: &Network,
127    ) -> impl Future<Output = Result<NetworkRegistryUpdateResult, fidl::Error>>;
128    fn remove(
129        &self,
130        network_id: u32,
131    ) -> impl Future<Output = Result<NetworkRegistryRemoveResult, fidl::Error>>;
132}
133
134macro_rules! impl_network_registry {
135    ($($ty:ty),*) => {
136        $(
137            impl NetworkRegistry for $ty {
138                fn set_default(
139                    &self,
140                    network_id: &OptionalUint32,
141                ) -> impl Future<Output = Result<NetworkRegistrySetDefaultResult, fidl::Error>> {
142                    self.set_default(network_id)
143                }
144
145                fn add(
146                    &self,
147                    network: &Network,
148                ) -> impl Future<Output = Result<NetworkRegistryAddResult, fidl::Error>> {
149                    self.add(network)
150                }
151
152                fn update(
153                    &self,
154                    network: &Network,
155                ) -> impl Future<Output = Result<NetworkRegistryUpdateResult, fidl::Error>> {
156                    self.update(network)
157                }
158
159                fn remove(
160                    &self,
161                    network_id: u32,
162                ) -> impl Future<Output = Result<NetworkRegistryRemoveResult, fidl::Error>> {
163                    self.remove(network_id)
164                }
165            }
166        )*
167    };
168    ($($ty:ty),*,) => { impl_network_registry!($($ty),*); };
169}
170
171impl_network_registry!(StarnixNetworksProxy, FuchsiaNetworksProxy);