1 use futures::join; 2 use test_programs::p3::wasi::sockets::types::{ 3 IpAddress, IpAddressFamily, IpSocketAddress, Ipv4SocketAddress, Ipv6SocketAddress, UdpSocket, 4 }; 5 use test_programs::sockets::supports_ipv6; 6 7 struct Component; 8 9 test_programs::p3::export!(Component); 10 11 async fn test_udp_sample_application(family: IpAddressFamily, bind_address: IpSocketAddress) { 12 let unspecified_addr = IpSocketAddress::new(IpAddress::new_unspecified(family), 0); 13 14 let first_message = &[]; 15 let second_message = b"Hello, world!"; 16 let third_message = b"Greetings, planet!"; 17 18 let server = UdpSocket::create(family).unwrap(); 19 20 server.bind(bind_address).unwrap(); 21 let addr = server.get_local_address().unwrap(); 22 23 let client = UdpSocket::create(family).unwrap(); 24 client.bind(unspecified_addr).unwrap(); 25 client.connect(addr).unwrap(); 26 let client_addr = client.get_local_address().unwrap(); 27 join!( 28 async { 29 client.send(first_message.to_vec(), None).await.unwrap(); 30 client 31 .send(second_message.to_vec(), Some(addr)) 32 .await 33 .unwrap(); 34 }, 35 async { 36 // Check that we've received our sent messages. 37 let (buf, addr) = server.receive().await.unwrap(); 38 assert_eq!(buf, first_message); 39 assert_eq!(addr, client_addr); 40 41 let (buf, addr) = server.receive().await.unwrap(); 42 assert_eq!(buf, second_message); 43 assert_eq!(addr, client_addr); 44 } 45 ); 46 join!( 47 async { 48 // Another client 49 let client = UdpSocket::create(family).unwrap(); 50 client.bind(unspecified_addr).unwrap(); 51 client 52 .send(third_message.to_vec(), Some(addr)) 53 .await 54 .unwrap(); 55 }, 56 async { 57 // Check that we sent and received our message! 58 let (buf, _) = server.receive().await.unwrap(); 59 assert_eq!(buf, third_message); 60 }, 61 ); 62 } 63 64 impl test_programs::p3::exports::wasi::cli::run::Guest for Component { 65 async fn run() -> Result<(), ()> { 66 test_udp_sample_application( 67 IpAddressFamily::Ipv4, 68 IpSocketAddress::Ipv4(Ipv4SocketAddress { 69 port: 0, // use any free port 70 address: (127, 0, 0, 1), // localhost 71 }), 72 ) 73 .await; 74 if supports_ipv6() { 75 test_udp_sample_application( 76 IpAddressFamily::Ipv6, 77 IpSocketAddress::Ipv6(Ipv6SocketAddress { 78 port: 0, // use any free port 79 address: (0, 0, 0, 0, 0, 0, 0, 1), // localhost 80 flow_info: 0, 81 scope_id: 0, 82 }), 83 ) 84 .await; 85 } 86 Ok(()) 87 } 88 } 89 90 fn main() {} 91