|
|
|
#![cfg(not(target_os = "unknown"))]
|
|
|
|
|
|
|
|
use async_std::io;
|
|
|
|
use async_std::net::{TcpListener, TcpStream};
|
|
|
|
use async_std::prelude::*;
|
|
|
|
use async_std::task;
|
|
|
|
|
|
|
|
const THE_WINTERS_TALE: &[u8] = b"
|
|
|
|
Each your doing,
|
|
|
|
So singular in each particular,
|
|
|
|
Crowns what you are doing in the present deed,
|
|
|
|
That all your acts are queens.
|
|
|
|
";
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn connect() -> io::Result<()> {
|
|
|
|
task::block_on(async {
|
|
|
|
let listener = TcpListener::bind("127.0.0.1:0").await?;
|
|
|
|
let addr = listener.local_addr()?;
|
|
|
|
let t = task::spawn(async move { listener.accept().await });
|
|
|
|
|
|
|
|
let stream2 = TcpStream::connect(&addr).await?;
|
|
|
|
let stream1 = t.await?.0;
|
|
|
|
|
|
|
|
assert_eq!(stream1.peer_addr()?, stream2.local_addr()?);
|
|
|
|
assert_eq!(stream2.peer_addr()?, stream1.local_addr()?);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn incoming_read() -> io::Result<()> {
|
|
|
|
task::block_on(async {
|
|
|
|
let listener = TcpListener::bind("127.0.0.1:0").await?;
|
|
|
|
let addr = listener.local_addr()?;
|
|
|
|
|
|
|
|
task::spawn(async move {
|
|
|
|
let mut stream = TcpStream::connect(&addr).await?;
|
|
|
|
stream.write_all(THE_WINTERS_TALE).await?;
|
|
|
|
io::Result::Ok(())
|
|
|
|
});
|
|
|
|
|
|
|
|
let mut buf = vec![0; 1024];
|
|
|
|
let mut incoming = listener.incoming();
|
|
|
|
let mut stream = incoming.next().await.unwrap()?;
|
|
|
|
|
|
|
|
let n = stream.read(&mut buf).await?;
|
|
|
|
assert_eq!(&buf[..n], THE_WINTERS_TALE);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn smoke_std_stream_to_async_listener() -> io::Result<()> {
|
|
|
|
use std::io::Write;
|
|
|
|
|
|
|
|
task::block_on(async {
|
|
|
|
let listener = TcpListener::bind("127.0.0.1:0").await?;
|
|
|
|
let addr = listener.local_addr()?;
|
|
|
|
|
|
|
|
let mut std_stream = std::net::TcpStream::connect(&addr)?;
|
|
|
|
std_stream.write_all(THE_WINTERS_TALE)?;
|
|
|
|
|
|
|
|
let mut buf = vec![0; 1024];
|
|
|
|
let mut incoming = listener.incoming();
|
|
|
|
let mut stream = incoming.next().await.unwrap()?;
|
|
|
|
|
|
|
|
let n = stream.read(&mut buf).await?;
|
|
|
|
assert_eq!(&buf[..n], THE_WINTERS_TALE);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn smoke_async_stream_to_std_listener() -> io::Result<()> {
|
|
|
|
use std::io::Read;
|
|
|
|
|
|
|
|
let std_listener = std::net::TcpListener::bind("127.0.0.1:0")?;
|
|
|
|
let addr = std_listener.local_addr()?;
|
|
|
|
|
|
|
|
task::block_on(async move {
|
|
|
|
let mut stream = TcpStream::connect(&addr).await?;
|
|
|
|
stream.write_all(THE_WINTERS_TALE).await?;
|
|
|
|
io::Result::Ok(())
|
|
|
|
})?;
|
|
|
|
|
|
|
|
let mut buf = vec![0; 1024];
|
|
|
|
let mut incoming = std_listener.incoming();
|
|
|
|
let mut stream = incoming.next().unwrap()?;
|
|
|
|
|
|
|
|
let n = stream.read(&mut buf).unwrap();
|
|
|
|
assert_eq!(&buf[..n], THE_WINTERS_TALE);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn cloned_streams() -> io::Result<()> {
|
|
|
|
task::block_on(async {
|
|
|
|
let listener = TcpListener::bind("127.0.0.1:0").await?;
|
|
|
|
let addr = listener.local_addr()?;
|
|
|
|
|
|
|
|
let mut stream = TcpStream::connect(&addr).await?;
|
|
|
|
let mut cloned_stream = stream.clone();
|
|
|
|
let mut incoming = listener.incoming();
|
|
|
|
let mut write_stream = incoming.next().await.unwrap()?;
|
|
|
|
write_stream.write_all(b"Each your doing").await?;
|
|
|
|
|
|
|
|
let mut buf = [0; 15];
|
|
|
|
stream.read_exact(&mut buf[..8]).await?;
|
|
|
|
cloned_stream.read_exact(&mut buf[8..]).await?;
|
|
|
|
|
|
|
|
assert_eq!(&buf[..15], b"Each your doing");
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
})
|
|
|
|
}
|