1*b315a0a8SYosh use test_programs::sockets::supports_ipv6;
2*b315a0a8SYosh use test_programs::wasi::sockets::network::{
3*b315a0a8SYosh     IpAddressFamily, IpSocketAddress, Ipv4SocketAddress, Ipv6SocketAddress, Network,
4*b315a0a8SYosh };
5*b315a0a8SYosh use test_programs::wasi::sockets::tcp::TcpSocket;
6*b315a0a8SYosh 
test_tcp_sample_application(family: IpAddressFamily, bind_address: IpSocketAddress)7*b315a0a8SYosh fn test_tcp_sample_application(family: IpAddressFamily, bind_address: IpSocketAddress) {
8*b315a0a8SYosh     let first_message = b"Hello, world!";
9*b315a0a8SYosh     let second_message = b"Greetings, planet!";
10*b315a0a8SYosh 
11*b315a0a8SYosh     let net = Network::default();
12*b315a0a8SYosh     let listener = TcpSocket::new(family).unwrap();
13*b315a0a8SYosh 
14*b315a0a8SYosh     listener.blocking_bind(&net, bind_address).unwrap();
15*b315a0a8SYosh     listener.set_listen_backlog_size(32).unwrap();
16*b315a0a8SYosh     listener.blocking_listen().unwrap();
17*b315a0a8SYosh 
18*b315a0a8SYosh     let addr = listener.local_address().unwrap();
19*b315a0a8SYosh 
20*b315a0a8SYosh     {
21*b315a0a8SYosh         let client = TcpSocket::new(family).unwrap();
22*b315a0a8SYosh         let (_client_input, client_output) = client.blocking_connect(&net, addr).unwrap();
23*b315a0a8SYosh 
24*b315a0a8SYosh         client_output.blocking_write_util(&[]).unwrap();
25*b315a0a8SYosh         client_output.blocking_write_util(first_message).unwrap();
26*b315a0a8SYosh     }
27*b315a0a8SYosh 
28*b315a0a8SYosh     {
29*b315a0a8SYosh         let (_accepted, input, _output) = listener.blocking_accept().unwrap();
30*b315a0a8SYosh 
31*b315a0a8SYosh         let empty_data = input.read(0).unwrap();
32*b315a0a8SYosh         assert!(empty_data.is_empty());
33*b315a0a8SYosh 
34*b315a0a8SYosh         let data = input.blocking_read(first_message.len() as u64).unwrap();
35*b315a0a8SYosh 
36*b315a0a8SYosh         // Check that we sent and received our message!
37*b315a0a8SYosh         assert_eq!(data, first_message); // Not guaranteed to work but should work in practice.
38*b315a0a8SYosh     }
39*b315a0a8SYosh 
40*b315a0a8SYosh     // Another client
41*b315a0a8SYosh     {
42*b315a0a8SYosh         let client = TcpSocket::new(family).unwrap();
43*b315a0a8SYosh         let (_client_input, client_output) = client.blocking_connect(&net, addr).unwrap();
44*b315a0a8SYosh 
45*b315a0a8SYosh         client_output.blocking_write_util(second_message).unwrap();
46*b315a0a8SYosh     }
47*b315a0a8SYosh 
48*b315a0a8SYosh     {
49*b315a0a8SYosh         let (_accepted, input, _output) = listener.blocking_accept().unwrap();
50*b315a0a8SYosh         let data = input.blocking_read(second_message.len() as u64).unwrap();
51*b315a0a8SYosh 
52*b315a0a8SYosh         // Check that we sent and received our message!
53*b315a0a8SYosh         assert_eq!(data, second_message); // Not guaranteed to work but should work in practice.
54*b315a0a8SYosh     }
55*b315a0a8SYosh }
56*b315a0a8SYosh 
main()57*b315a0a8SYosh fn main() {
58*b315a0a8SYosh     test_tcp_sample_application(
59*b315a0a8SYosh         IpAddressFamily::Ipv4,
60*b315a0a8SYosh         IpSocketAddress::Ipv4(Ipv4SocketAddress {
61*b315a0a8SYosh             port: 0,                 // use any free port
62*b315a0a8SYosh             address: (127, 0, 0, 1), // localhost
63*b315a0a8SYosh         }),
64*b315a0a8SYosh     );
65*b315a0a8SYosh     if supports_ipv6() {
66*b315a0a8SYosh         test_tcp_sample_application(
67*b315a0a8SYosh             IpAddressFamily::Ipv6,
68*b315a0a8SYosh             IpSocketAddress::Ipv6(Ipv6SocketAddress {
69*b315a0a8SYosh                 port: 0,                           // use any free port
70*b315a0a8SYosh                 address: (0, 0, 0, 0, 0, 0, 0, 1), // localhost
71*b315a0a8SYosh                 flow_info: 0,
72*b315a0a8SYosh                 scope_id: 0,
73*b315a0a8SYosh             }),
74*b315a0a8SYosh         );
75*b315a0a8SYosh     }
76*b315a0a8SYosh }
77