#![deny(warnings, rust_2018_idioms)] #![feature(async_await)] use tokio_io::{AsyncRead, AsyncReadExt, AsyncWrite}; use tokio_test::assert_ok; use bytes::BytesMut; use std::io; use std::pin::Pin; use std::task::{Context, Poll}; #[tokio::test] async fn copy() { struct Rd(bool); impl AsyncRead for Rd { fn poll_read( mut self: Pin<&mut Self>, _cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll> { if self.0 { buf[0..11].copy_from_slice(b"hello world"); self.0 = false; Poll::Ready(Ok(11)) } else { Poll::Ready(Ok(0)) } } } struct Wr(BytesMut); impl Unpin for Wr {} impl AsyncWrite for Wr { fn poll_write( mut self: Pin<&mut Self>, _cx: &mut Context<'_>, buf: &[u8], ) -> Poll> { self.0.extend(buf); Ok(buf.len()).into() } fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { Ok(()).into() } fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { Ok(()).into() } } let buf = BytesMut::with_capacity(64); let mut rd = Rd(true); let mut wr = Wr(buf); let n = assert_ok!(rd.copy(&mut wr).await); assert_eq!(n, 11); assert_eq!(wr.0[..], b"hello world"[..]); }