1 use test_programs::sockets::supports_ipv6;
2 use test_programs::wasi::sockets::network::{
3 ErrorCode, IpAddress, IpAddressFamily, IpSocketAddress, Network,
4 };
5 use test_programs::wasi::sockets::udp::UdpSocket;
6
test_udp_unbound_state_invariants(family: IpAddressFamily)7 fn test_udp_unbound_state_invariants(family: IpAddressFamily) {
8 let sock = UdpSocket::new(family).unwrap();
9
10 // Skipping: udp::start_bind
11 assert!(matches!(sock.finish_bind(), Err(ErrorCode::NotInProgress)));
12
13 assert!(matches!(sock.stream(None), Err(ErrorCode::InvalidState)));
14
15 assert!(matches!(sock.local_address(), Err(ErrorCode::InvalidState)));
16 assert!(matches!(
17 sock.remote_address(),
18 Err(ErrorCode::InvalidState)
19 ));
20 assert_eq!(sock.address_family(), family);
21
22 assert!(matches!(sock.unicast_hop_limit(), Ok(_)));
23 assert!(matches!(sock.set_unicast_hop_limit(255), Ok(_)));
24 assert!(matches!(sock.receive_buffer_size(), Ok(_)));
25 assert!(matches!(sock.set_receive_buffer_size(16000), Ok(_)));
26 assert!(matches!(sock.send_buffer_size(), Ok(_)));
27 assert!(matches!(sock.set_send_buffer_size(16000), Ok(_)));
28 }
29
test_udp_bound_state_invariants(net: &Network, family: IpAddressFamily)30 fn test_udp_bound_state_invariants(net: &Network, family: IpAddressFamily) {
31 let bind_address = IpSocketAddress::new(IpAddress::new_loopback(family), 0);
32 let sock = UdpSocket::new(family).unwrap();
33 sock.blocking_bind(net, bind_address).unwrap();
34
35 assert!(matches!(
36 sock.start_bind(net, bind_address),
37 Err(ErrorCode::InvalidState)
38 ));
39 assert!(matches!(sock.finish_bind(), Err(ErrorCode::NotInProgress)));
40 // Skipping: udp::stream
41
42 assert!(matches!(sock.local_address(), Ok(_)));
43 assert!(matches!(
44 sock.remote_address(),
45 Err(ErrorCode::InvalidState)
46 ));
47 assert_eq!(sock.address_family(), family);
48
49 assert!(matches!(sock.unicast_hop_limit(), Ok(_)));
50 assert!(matches!(sock.set_unicast_hop_limit(255), Ok(_)));
51 assert!(matches!(sock.receive_buffer_size(), Ok(_)));
52 assert!(matches!(sock.set_receive_buffer_size(16000), Ok(_)));
53 assert!(matches!(sock.send_buffer_size(), Ok(_)));
54 assert!(matches!(sock.set_send_buffer_size(16000), Ok(_)));
55 }
56
test_udp_connected_state_invariants(net: &Network, family: IpAddressFamily)57 fn test_udp_connected_state_invariants(net: &Network, family: IpAddressFamily) {
58 let bind_address = IpSocketAddress::new(IpAddress::new_loopback(family), 0);
59 let connect_address = IpSocketAddress::new(IpAddress::new_loopback(family), 54321);
60 let sock = UdpSocket::new(family).unwrap();
61 sock.blocking_bind(net, bind_address).unwrap();
62 sock.stream(Some(connect_address)).unwrap();
63
64 assert!(matches!(
65 sock.start_bind(net, bind_address),
66 Err(ErrorCode::InvalidState)
67 ));
68 assert!(matches!(sock.finish_bind(), Err(ErrorCode::NotInProgress)));
69 // Skipping: udp::stream
70
71 assert!(matches!(sock.local_address(), Ok(_)));
72 assert!(matches!(sock.remote_address(), Ok(_)));
73 assert_eq!(sock.address_family(), family);
74
75 assert!(matches!(sock.unicast_hop_limit(), Ok(_)));
76 assert!(matches!(sock.set_unicast_hop_limit(255), Ok(_)));
77 assert!(matches!(sock.receive_buffer_size(), Ok(_)));
78 assert!(matches!(sock.set_receive_buffer_size(16000), Ok(_)));
79 assert!(matches!(sock.send_buffer_size(), Ok(_)));
80 assert!(matches!(sock.set_send_buffer_size(16000), Ok(_)));
81 }
82
main()83 fn main() {
84 let net = Network::default();
85
86 test_udp_unbound_state_invariants(IpAddressFamily::Ipv4);
87 test_udp_bound_state_invariants(&net, IpAddressFamily::Ipv4);
88 test_udp_connected_state_invariants(&net, IpAddressFamily::Ipv4);
89
90 if supports_ipv6() {
91 test_udp_unbound_state_invariants(IpAddressFamily::Ipv6);
92 test_udp_bound_state_invariants(&net, IpAddressFamily::Ipv6);
93 test_udp_connected_state_invariants(&net, IpAddressFamily::Ipv6);
94 }
95 }
96