blob: da1a68ef1a41dad263e61274465d471fa35373bb [file] [log] [blame]
// 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(())
}