fuchsia_async/net/
mod.rs

1// Copyright 2020 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
5#[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}