| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #![cfg(test)] |
| |
| use fidl_fuchsia_net as fnet; |
| use net_declare::{fidl_subnet, std_socket_addr}; |
| use netemul::RealmUdpSocket as _; |
| use netstack_testing_common::realms::{Netstack2, TestSandboxExt as _}; |
| |
| // NB: typically we prefer to panic in tests rather than returning `Result`; |
| // see https://fuchsia.dev/fuchsia-src/contribute/contributing-to-netstack/rust-patterns#prefer_panics. |
| // However, we return a `Result` here so we can use the try operator `?` for better readability. |
| #[fuchsia::test] |
| async fn test() -> Result<(), anyhow::Error> { |
| let sandbox = netemul::TestSandbox::new()?; |
| let network = sandbox.create_network("net").await?; |
| |
| const CLIENT_SUBNET: fnet::Subnet = fidl_subnet!("192.168.0.1/24"); |
| const SERVER_SUBNET: fnet::Subnet = fidl_subnet!("192.168.0.2/24"); |
| let client_addr = std_socket_addr!("192.168.0.1:1234"); |
| let server_addr = std_socket_addr!("192.168.0.2:8080"); |
| |
| let client = sandbox.create_netstack_realm::<Netstack2, _>("client")?; |
| let client_interface = client.join_network(&network, "client-ep").await?; |
| client_interface.add_address_and_subnet_route(CLIENT_SUBNET).await?; |
| let client_socket = fuchsia_async::net::UdpSocket::bind_in_realm(&client, client_addr).await?; |
| |
| let server = sandbox.create_netstack_realm::<Netstack2, _>("server")?; |
| let server_interface = server.join_network(&network, "server-ep").await?; |
| server_interface.add_address_and_subnet_route(SERVER_SUBNET).await?; |
| let server_socket = fuchsia_async::net::UdpSocket::bind_in_realm(&server, server_addr).await?; |
| |
| const PAYLOAD: &'static str = "hello, world!"; |
| |
| let client_fut = async { |
| let written = client_socket.send_to(PAYLOAD.as_bytes(), server_addr).await.expect("sendto"); |
| assert_eq!(written, PAYLOAD.as_bytes().len()); |
| }; |
| let server_fut = async { |
| let mut buf = [0u8; 1024]; |
| let (read, from) = server_socket.recv_from(&mut buf[..]).await.expect("recvfrom"); |
| assert_eq!(read, PAYLOAD.as_bytes().len()); |
| assert_eq!(&buf[..read], PAYLOAD.as_bytes()); |
| assert_eq!(from, client_addr); |
| }; |
| |
| let ((), ()) = futures_util::future::join(client_fut, server_fut).await; |
| |
| Ok(()) |
| } |