1 use test_programs::sockets::supports_ipv6;
2 use test_programs::wasi::sockets::network::{
3 IpAddress, IpAddressFamily, IpSocketAddress, Ipv4SocketAddress, Ipv6SocketAddress, Network,
4 };
5 use test_programs::wasi::sockets::udp::{OutgoingDatagram, UdpSocket};
6
test_udp_sample_application(family: IpAddressFamily, bind_address: IpSocketAddress)7 fn test_udp_sample_application(family: IpAddressFamily, bind_address: IpSocketAddress) {
8 let unspecified_addr = IpSocketAddress::new(IpAddress::new_unspecified(family), 0);
9
10 let first_message = &[];
11 let second_message = b"Hello, world!";
12 let third_message = b"Greetings, planet!";
13
14 let net = Network::default();
15
16 let server = UdpSocket::new(family).unwrap();
17
18 server.blocking_bind(&net, bind_address).unwrap();
19 let (server_incoming, _) = server.stream(None).unwrap();
20 let addr = server.local_address().unwrap();
21
22 let client_addr = {
23 let client = UdpSocket::new(family).unwrap();
24 client.blocking_bind(&net, unspecified_addr).unwrap();
25 let (_, client_outgoing) = client.stream(Some(addr)).unwrap();
26
27 let datagrams = [
28 OutgoingDatagram {
29 data: first_message.to_vec(),
30 remote_address: None,
31 },
32 OutgoingDatagram {
33 data: second_message.to_vec(),
34 remote_address: Some(addr),
35 },
36 ];
37 client_outgoing.blocking_send(&datagrams).unwrap();
38
39 client.local_address().unwrap()
40 };
41
42 {
43 // Check that we've received our sent messages.
44 let datagrams = server_incoming.blocking_receive(2..100).unwrap();
45 assert_eq!(datagrams.len(), 2);
46
47 assert_eq!(datagrams[0].data, first_message);
48 assert_eq!(datagrams[0].remote_address, client_addr);
49
50 assert_eq!(datagrams[1].data, second_message);
51 assert_eq!(datagrams[1].remote_address, client_addr);
52 }
53
54 // Another client
55 {
56 let client = UdpSocket::new(family).unwrap();
57 client.blocking_bind(&net, unspecified_addr).unwrap();
58 let (_, client_outgoing) = client.stream(None).unwrap();
59
60 let datagrams = [OutgoingDatagram {
61 data: third_message.to_vec(),
62 remote_address: Some(addr),
63 }];
64 client_outgoing.blocking_send(&datagrams).unwrap();
65 }
66
67 {
68 // Check that we sent and received our message!
69 let datagrams = server_incoming.blocking_receive(1..100).unwrap();
70 assert_eq!(datagrams.len(), 1);
71
72 assert_eq!(datagrams[0].data, third_message);
73 }
74 }
75
main()76 fn main() {
77 test_udp_sample_application(
78 IpAddressFamily::Ipv4,
79 IpSocketAddress::Ipv4(Ipv4SocketAddress {
80 port: 0, // use any free port
81 address: (127, 0, 0, 1), // localhost
82 }),
83 );
84 if supports_ipv6() {
85 test_udp_sample_application(
86 IpAddressFamily::Ipv6,
87 IpSocketAddress::Ipv6(Ipv6SocketAddress {
88 port: 0, // use any free port
89 address: (0, 0, 0, 0, 0, 0, 0, 1), // localhost
90 flow_info: 0,
91 scope_id: 0,
92 }),
93 );
94 }
95 }
96