1use futures_core::stream::Stream;
2use std::{io, pin::Pin};
3use tokio_test::{assert_ready, io::Builder, task};
4use tokio_util::codec::{BytesCodec, FramedRead};
5
6macro_rules! pin {
7 ($id:ident) => {
8 Pin::new(&mut $id)
9 };
10}
11
12macro_rules! assert_read {
13 ($e:expr, $n:expr) => {{
14 let val = assert_ready!($e);
15 assert_eq!(val.unwrap().unwrap(), $n);
16 }};
17}
18
19#[tokio::test]
20async fn return_none_after_error() {
21 let mut io = FramedRead::new(
22 Builder::new()
23 .read(b"abcdef")
24 .read_error(io::Error::new(io::ErrorKind::Other, "Resource errored out"))
25 .read(b"more data")
26 .build(),
27 BytesCodec::new(),
28 );
29
30 let mut task = task::spawn(());
31
32 task.enter(|cx, _| {
33 assert_read!(pin!(io).poll_next(cx), b"abcdef".to_vec());
34 assert!(assert_ready!(pin!(io).poll_next(cx)).unwrap().is_err());
35 assert!(assert_ready!(pin!(io).poll_next(cx)).is_none());
36 assert_read!(pin!(io).poll_next(cx), b"more data".to_vec());
37 })
38}
39