fuchsia_async/net/
mod.rs
1#[cfg(target_os = "fuchsia")]
6mod fuchsia;
7
8#[cfg(target_os = "fuchsia")]
9pub use fuchsia::*;
10
11#[cfg(not(target_os = "fuchsia"))]
12mod portable;
13
14#[cfg(not(target_os = "fuchsia"))]
15pub use portable::*;
16
17#[cfg(test)]
18mod udp_tests {
19 use super::UdpSocket;
20 use crate::TestExecutor;
21
22 const MESSAGE: &[u8; 11] = b"hello world";
23
24 fn send_recv_same_socket(addr: std::net::IpAddr) {
25 let mut exec = TestExecutor::new();
26
27 let fut = async move {
28 let addr = std::net::SocketAddr::new(addr, 0);
29 let socket = UdpSocket::bind(&addr).expect("could not create socket");
30 let addr = socket.local_addr().expect("could not get local address");
31 assert_eq!(socket.send_to(MESSAGE, addr).await.expect("send_to failed"), MESSAGE.len());
32 let mut recvbuf = [0; MESSAGE.len()];
33 assert_eq!(
34 socket.recv_from(&mut recvbuf).await.expect("recv_from failed"),
35 (MESSAGE.len(), addr)
36 );
37 assert_eq!(recvbuf, *MESSAGE);
38 };
39
40 exec.run_singlethreaded(fut);
41 }
42
43 #[test]
44 fn send_recv_same_socket_ipv4() {
45 send_recv_same_socket(std::net::IpAddr::V4(std::net::Ipv4Addr::LOCALHOST))
46 }
47
48 #[test]
49 fn send_recv_same_socket_ipv6() {
50 send_recv_same_socket(std::net::IpAddr::V6(std::net::Ipv6Addr::LOCALHOST))
51 }
52
53 fn send_recv(addr: std::net::IpAddr) {
54 let mut exec = TestExecutor::new();
55
56 let fut = async move {
57 let socket_addr = std::net::SocketAddr::new(addr.into(), 0);
58 let client_socket =
59 UdpSocket::bind(&socket_addr).expect("could not create client socket");
60 let server_socket =
61 UdpSocket::bind(&socket_addr).expect("could not create server socket");
62 let client_addr =
63 client_socket.local_addr().expect("could not get client socket's local address");
64 let server_addr =
65 server_socket.local_addr().expect("could not get server socket's local address");
66
67 assert_eq!(
68 client_socket.send_to(MESSAGE, server_addr).await.expect("send_to failed"),
69 MESSAGE.len()
70 );
71 let mut recvbuf = [0; MESSAGE.len()];
72 assert_eq!(
73 server_socket.recv_from(&mut recvbuf).await.expect("recv_from failed"),
74 (MESSAGE.len(), client_addr)
75 );
76 assert_eq!(*MESSAGE, recvbuf);
77 };
78
79 exec.run_singlethreaded(fut);
80 }
81
82 #[test]
83 fn send_recv_ipv4() {
84 send_recv(std::net::IpAddr::V4(std::net::Ipv4Addr::LOCALHOST))
85 }
86
87 #[test]
88 fn send_recv_ipv6() {
89 send_recv(std::net::IpAddr::V6(std::net::Ipv6Addr::LOCALHOST))
90 }
91
92 #[test]
93 fn broadcast() {
94 let mut exec = TestExecutor::new();
95 exec.run_singlethreaded(async move {
96 let addr = "127.0.0.1:0".parse().expect("could not parse test address");
97 let socket = UdpSocket::bind(&addr).expect("could not create socket");
98 let initial = socket.broadcast().expect("could not get broadcast");
99 assert!(!initial);
100 socket.set_broadcast(true).expect("could not set broadcast");
101 let set = socket.broadcast().expect("could not get broadcast");
102 assert!(set);
103 });
104 }
105
106 #[test]
107 fn test_local_addr() {
108 let mut exec = TestExecutor::new();
109 exec.run_singlethreaded(async move {
110 let addr = "127.0.0.1:5432".parse().expect("could not parse test address");
111 let socket = UdpSocket::bind(&addr).expect("could not create socket");
112 assert_eq!(socket.local_addr().expect("could not get local address"), addr);
113 });
114 }
115}