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(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}