1 use test_programs::wasi::sockets::network::{IpAddress, IpAddressFamily, IpSocketAddress, Network};
2 use test_programs::wasi::sockets::udp::{OutgoingDatagram, UdpSocket};
3 
4 /// `outgoing-datagram-stream.send` should trap we attempt to send more
5 /// datagrams than `check-send` gave permission for.
main()6 fn main() {
7     let net = Network::default();
8     let family = IpAddressFamily::Ipv4;
9     let unspecified_port = IpSocketAddress::new(IpAddress::new_loopback(family), 0);
10     let remote = IpSocketAddress::new(IpAddress::new_loopback(family), 4320);
11 
12     let client = UdpSocket::new(family).unwrap();
13     client.blocking_bind(&net, unspecified_port).unwrap();
14 
15     let (_, tx) = client.stream(Some(remote)).unwrap();
16     assert_eq!(client.remote_address(), Ok(remote));
17 
18     tx.subscribe().block();
19 
20     let permits = tx.check_send().unwrap();
21     assert!(permits > 0);
22     // This should trap according to the `wasi-sockets` spec since we're trying
23     // to send more than `check_send` gave permission for:
24     tx.send(
25         &std::iter::repeat_with(|| OutgoingDatagram {
26             data: b"hello".into(),
27             remote_address: None,
28         })
29         .take(usize::try_from(permits + 1).unwrap())
30         .collect::<Vec<_>>(),
31     )
32     .unwrap();
33     unreachable!("attempt to send excess datagrams should have trapped");
34 }
35