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