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