1 use test_programs::p3::wasi::sockets::types::{ErrorCode, IpAddressFamily, UdpSocket};
2 
3 struct Component;
4 
5 test_programs::p3::export!(Component);
6 
test_udp_sockopt_defaults(family: IpAddressFamily)7 fn test_udp_sockopt_defaults(family: IpAddressFamily) {
8     let sock = UdpSocket::create(family).unwrap();
9 
10     assert_eq!(sock.get_address_family(), family);
11 
12     assert!(sock.get_unicast_hop_limit().unwrap() > 0);
13     assert!(sock.get_receive_buffer_size().unwrap() > 0);
14     assert!(sock.get_send_buffer_size().unwrap() > 0);
15 }
16 
test_udp_sockopt_input_ranges(family: IpAddressFamily)17 fn test_udp_sockopt_input_ranges(family: IpAddressFamily) {
18     let sock = UdpSocket::create(family).unwrap();
19 
20     assert!(matches!(
21         sock.set_unicast_hop_limit(0),
22         Err(ErrorCode::InvalidArgument)
23     ));
24     assert!(matches!(sock.set_unicast_hop_limit(1), Ok(_)));
25     assert!(matches!(sock.set_unicast_hop_limit(u8::MAX), Ok(_)));
26 
27     assert!(matches!(
28         sock.set_receive_buffer_size(0),
29         Err(ErrorCode::InvalidArgument)
30     ));
31     assert!(matches!(sock.set_receive_buffer_size(1), Ok(_))); // Unsupported sizes should be silently capped.
32     assert!(matches!(sock.set_receive_buffer_size(u64::MAX), Ok(_))); // Unsupported sizes should be silently capped.
33     assert!(matches!(
34         sock.set_send_buffer_size(0),
35         Err(ErrorCode::InvalidArgument)
36     ));
37     assert!(matches!(sock.set_send_buffer_size(1), Ok(_))); // Unsupported sizes should be silently capped.
38     assert!(matches!(sock.set_send_buffer_size(u64::MAX), Ok(_))); // Unsupported sizes should be silently capped.
39 }
40 
test_udp_sockopt_readback(family: IpAddressFamily)41 fn test_udp_sockopt_readback(family: IpAddressFamily) {
42     let sock = UdpSocket::create(family).unwrap();
43 
44     sock.set_unicast_hop_limit(42).unwrap();
45     assert_eq!(sock.get_unicast_hop_limit().unwrap(), 42);
46 
47     sock.set_receive_buffer_size(0x10000).unwrap();
48     assert_eq!(sock.get_receive_buffer_size().unwrap(), 0x10000);
49 
50     sock.set_send_buffer_size(0x10000).unwrap();
51     assert_eq!(sock.get_send_buffer_size().unwrap(), 0x10000);
52 }
53 
54 impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
run() -> Result<(), ()>55     async fn run() -> Result<(), ()> {
56         test_udp_sockopt_defaults(IpAddressFamily::Ipv4);
57         test_udp_sockopt_defaults(IpAddressFamily::Ipv6);
58 
59         test_udp_sockopt_input_ranges(IpAddressFamily::Ipv4);
60         test_udp_sockopt_input_ranges(IpAddressFamily::Ipv6);
61 
62         test_udp_sockopt_readback(IpAddressFamily::Ipv4);
63         test_udp_sockopt_readback(IpAddressFamily::Ipv6);
64         Ok(())
65     }
66 }
67 
main()68 fn main() {}
69