use futures_core::stream::Stream; use std::{io, pin::Pin}; use tokio_test::{assert_ready, io::Builder, task}; use tokio_util::codec::{BytesCodec, FramedRead}; macro_rules! pin { ($id:ident) => { Pin::new(&mut $id) }; } macro_rules! assert_read { ($e:expr, $n:expr) => {{ let val = assert_ready!($e); assert_eq!(val.unwrap().unwrap(), $n); }}; } #[tokio::test] async fn return_none_after_error() { let mut io = FramedRead::new( Builder::new() .read(b"abcdef") .read_error(io::Error::new(io::ErrorKind::Other, "Resource errored out")) .read(b"more data") .build(), BytesCodec::new(), ); let mut task = task::spawn(()); task.enter(|cx, _| { assert_read!(pin!(io).poll_next(cx), b"abcdef".to_vec()); assert!(assert_ready!(pin!(io).poll_next(cx)).unwrap().is_err()); assert!(assert_ready!(pin!(io).poll_next(cx)).is_none()); assert_read!(pin!(io).poll_next(cx), b"more data".to_vec()); }) }