1 use futures_core::stream::Stream;
2 use std::{io, pin::Pin};
3 use tokio_test::{assert_ready, io::Builder, task};
4 use tokio_util::codec::{BytesCodec, FramedRead};
5 
6 macro_rules! pin {
7     ($id:ident) => {
8         Pin::new(&mut $id)
9     };
10 }
11 
12 macro_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]
return_none_after_error()20 async 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