use moonpool_sim::{NetworkProvider, TcpListenerTrait, TokioNetworkProvider};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
async fn echo_client<P>(provider: P, server_addr: &str, message: &str) -> std::io::Result<String>
where
P: NetworkProvider,
{
let mut stream = provider.connect(server_addr).await?;
stream.write_all(message.as_bytes()).await?;
let mut buf = [0; 1024];
let n = stream.read(&mut buf).await?;
Ok(String::from_utf8_lossy(&buf[..n]).to_string())
}
#[test]
fn test_tokio_echo_server() {
let local_runtime = tokio::runtime::Builder::new_current_thread()
.enable_io()
.enable_time()
.build_local(Default::default())
.expect("Failed to build local runtime");
local_runtime.block_on(async move {
let provider = TokioNetworkProvider::new();
let listener = provider.bind("127.0.0.1:0").await.unwrap();
let server_addr = listener.local_addr().unwrap();
let server_task = tokio::task::spawn_local(async move {
let (mut stream, _peer_addr) = listener.accept().await.unwrap();
let mut buf = [0; 1024];
let n = stream.read(&mut buf).await.unwrap();
stream.write_all(&buf[..n]).await.unwrap();
});
tokio::time::sleep(tokio::time::Duration::from_millis(1)).await;
let message = "Hello, echo server!";
let response = echo_client(provider, &server_addr, message).await.unwrap();
assert_eq!(response, message);
server_task.await.unwrap();
});
}
#[test]
fn test_provider_default() {
let local_runtime = tokio::runtime::Builder::new_current_thread()
.enable_io()
.enable_time()
.build_local(Default::default())
.expect("Failed to build local runtime");
local_runtime.block_on(async move {
let provider = TokioNetworkProvider;
let listener = provider.bind("127.0.0.1:0").await.unwrap();
let addr = listener.local_addr().unwrap();
println!("Bound to {}", addr);
});
}
#[test]
fn test_provider_clone() {
let local_runtime = tokio::runtime::Builder::new_current_thread()
.enable_io()
.enable_time()
.build_local(Default::default())
.expect("Failed to build local runtime");
local_runtime.block_on(async move {
let provider = TokioNetworkProvider::new();
let cloned_provider = provider.clone();
let listener1 = provider.bind("127.0.0.1:0").await.unwrap();
let listener2 = cloned_provider.bind("127.0.0.1:0").await.unwrap();
let addr1 = listener1.local_addr().unwrap();
let addr2 = listener2.local_addr().unwrap();
println!("Provider 1 bound to {}", addr1);
println!("Provider 2 bound to {}", addr2);
assert_ne!(addr1, addr2);
});
}