@@ -2,7 +2,7 @@ wit_bindgen::generate!("test-command-with-sockets" in "../../wasi/wit");
22
33use wasi:: io:: poll;
44use wasi:: io:: streams;
5- use wasi:: sockets:: { network, tcp, tcp_create_socket} ;
5+ use wasi:: sockets:: { network, tcp, tcp_create_socket, udp , udp_create_socket } ;
66
77pub fn write ( output : & streams:: OutputStream , mut bytes : & [ u8 ] ) -> Result < ( ) , streams:: StreamError > {
88 let pollable = output. subscribe ( ) ;
@@ -24,7 +24,7 @@ pub fn write(output: &streams::OutputStream, mut bytes: &[u8]) -> Result<(), str
2424 Ok ( ( ) )
2525}
2626
27- pub fn example_body ( net : tcp:: Network , sock : tcp:: TcpSocket , family : network:: IpAddressFamily ) {
27+ pub fn example_body_tcp ( net : tcp:: Network , sock : tcp:: TcpSocket , family : network:: IpAddressFamily ) {
2828 let first_message = b"Hello, world!" ;
2929 let second_message = b"Greetings, planet!" ;
3030
@@ -95,3 +95,90 @@ pub fn example_body(net: tcp::Network, sock: tcp::TcpSocket, family: network::Ip
9595 // Check that we sent and recieved our message!
9696 assert_eq ! ( data, second_message) ; // Not guaranteed to work but should work in practice.
9797}
98+
99+ pub fn example_body_udp ( net : udp:: Network , sock : udp:: UdpSocket , family : network:: IpAddressFamily ) {
100+ let first_message = b"Hello, world!" ;
101+ let second_message = b"Greetings, planet!" ;
102+
103+ let sub = sock. subscribe ( ) ;
104+
105+ let addr = sock. local_address ( ) . unwrap ( ) ;
106+
107+ let client = udp_create_socket:: create_udp_socket ( family) . unwrap ( ) ;
108+ let client_sub = client. subscribe ( ) ;
109+
110+ client. start_connect ( & net, addr) . unwrap ( ) ;
111+ poll:: poll_one ( & client_sub) ;
112+ client. finish_connect ( ) . unwrap ( ) ;
113+
114+ let _client_addr = client. local_address ( ) . unwrap ( ) ;
115+
116+ let n = client
117+ . send ( & [
118+ udp:: Datagram {
119+ data : vec ! [ ] ,
120+ remote_address : addr,
121+ } ,
122+ udp:: Datagram {
123+ data : first_message. to_vec ( ) ,
124+ remote_address : addr,
125+ } ,
126+ ] )
127+ . unwrap ( ) ;
128+ assert_eq ! ( n, 2 ) ;
129+
130+ drop ( client_sub) ;
131+ drop ( client) ;
132+
133+ poll:: poll_one ( & sub) ;
134+ let datagrams = sock. receive ( 2 ) . unwrap ( ) ;
135+ let mut datagrams = datagrams. into_iter ( ) ;
136+ let ( first, second) = match ( datagrams. next ( ) , datagrams. next ( ) , datagrams. next ( ) ) {
137+ ( Some ( first) , Some ( second) , None ) => ( first, second) ,
138+ ( Some ( _first) , None , None ) => panic ! ( "only one datagram received" ) ,
139+ ( None , None , None ) => panic ! ( "no datagrams received" ) ,
140+ _ => panic ! ( "invalid datagram sequence received" ) ,
141+ } ;
142+
143+ assert ! ( first. data. is_empty( ) ) ;
144+
145+ // TODO: Verify the `remote_address`
146+ //assert_eq!(first.remote_address, client_addr);
147+
148+ // Check that we sent and recieved our message!
149+ assert_eq ! ( second. data, first_message) ; // Not guaranteed to work but should work in practice.
150+
151+ // TODO: Verify the `remote_address`
152+ //assert_eq!(second.remote_address, client_addr);
153+
154+ // Another client
155+ let client = udp_create_socket:: create_udp_socket ( family) . unwrap ( ) ;
156+ let client_sub = client. subscribe ( ) ;
157+
158+ client. start_connect ( & net, addr) . unwrap ( ) ;
159+ poll:: poll_one ( & client_sub) ;
160+ client. finish_connect ( ) . unwrap ( ) ;
161+
162+ let n = client
163+ . send ( & [ udp:: Datagram {
164+ data : second_message. to_vec ( ) ,
165+ remote_address : addr,
166+ } ] )
167+ . unwrap ( ) ;
168+ assert_eq ! ( n, 1 ) ;
169+
170+ drop ( client_sub) ;
171+ drop ( client) ;
172+
173+ poll:: poll_one ( & sub) ;
174+ let datagrams = sock. receive ( 2 ) . unwrap ( ) ;
175+ let mut datagrams = datagrams. into_iter ( ) ;
176+ let first = match ( datagrams. next ( ) , datagrams. next ( ) ) {
177+ ( Some ( first) , None ) => first,
178+ ( None , None ) => panic ! ( "no datagrams received" ) ,
179+ _ => panic ! ( "invalid datagram sequence received" ) ,
180+ } ;
181+
182+ // Check that we sent and recieved our message!
183+ assert_eq ! ( first. data, second_message) ; // Not guaranteed to work but should work in practice.
184+ }
0 commit comments