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