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