futures_test/io/read/mod.rs
1//! Additional combinators for testing async readers.
2
3use futures_io::AsyncRead;
4
5pub use super::limited::Limited;
6pub use crate::interleave_pending::InterleavePending;
7
8/// Additional combinators for testing async readers.
9pub trait AsyncReadTestExt: AsyncRead {
10 /// Introduces an extra [`Poll::Pending`](futures_core::task::Poll::Pending)
11 /// in between each read of the reader.
12 ///
13 /// # Examples
14 ///
15 /// ```
16 /// use futures::task::Poll;
17 /// use futures::io::AsyncRead;
18 /// use futures_test::task::noop_context;
19 /// use futures_test::io::AsyncReadTestExt;
20 /// use futures::pin_mut;
21 ///
22 /// let reader = std::io::Cursor::new(&[1, 2, 3]).interleave_pending();
23 /// pin_mut!(reader);
24 ///
25 /// let mut cx = noop_context();
26 ///
27 /// let mut buf = [0, 0];
28 ///
29 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf[..])?, Poll::Pending);
30 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf[..])?, Poll::Ready(2));
31 /// assert_eq!(buf, [1, 2]);
32 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf[..])?, Poll::Pending);
33 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf[..])?, Poll::Ready(1));
34 /// assert_eq!(buf, [3, 2]);
35 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf[..])?, Poll::Pending);
36 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf[..])?, Poll::Ready(0));
37 ///
38 /// # Ok::<(), std::io::Error>(())
39 /// ```
40 ///
41 /// ## `AsyncBufRead`
42 ///
43 /// The returned reader will also implement `AsyncBufRead` if the underlying reader does.
44 ///
45 /// ```
46 /// use futures::task::Poll;
47 /// use futures::io::AsyncBufRead;
48 /// use futures_test::task::noop_context;
49 /// use futures_test::io::AsyncReadTestExt;
50 /// use futures::pin_mut;
51 ///
52 /// let reader = std::io::Cursor::new(&[1, 2, 3]).interleave_pending();
53 /// pin_mut!(reader);
54 ///
55 /// let mut cx = noop_context();
56 ///
57 /// assert_eq!(reader.as_mut().poll_fill_buf(&mut cx)?, Poll::Pending);
58 /// assert_eq!(reader.as_mut().poll_fill_buf(&mut cx)?, Poll::Ready(&[1, 2, 3][..]));
59 /// reader.as_mut().consume(2);
60 /// assert_eq!(reader.as_mut().poll_fill_buf(&mut cx)?, Poll::Pending);
61 /// assert_eq!(reader.as_mut().poll_fill_buf(&mut cx)?, Poll::Ready(&[3][..]));
62 /// reader.as_mut().consume(1);
63 /// assert_eq!(reader.as_mut().poll_fill_buf(&mut cx)?, Poll::Pending);
64 /// assert_eq!(reader.as_mut().poll_fill_buf(&mut cx)?, Poll::Ready(&[][..]));
65 ///
66 /// # Ok::<(), std::io::Error>(())
67 /// ```
68 fn interleave_pending(self) -> InterleavePending<Self>
69 where
70 Self: Sized,
71 {
72 InterleavePending::new(self)
73 }
74
75 /// Limit the number of bytes allowed to be read on each call to `poll_read`.
76 ///
77 /// # Examples
78 ///
79 /// ```
80 /// use futures::task::Poll;
81 /// use futures::io::AsyncRead;
82 /// use futures_test::task::noop_context;
83 /// use futures_test::io::AsyncReadTestExt;
84 /// use futures::pin_mut;
85 ///
86 /// let reader = std::io::Cursor::new(&[1, 2, 3, 4, 5]).limited(2);
87 /// pin_mut!(reader);
88 ///
89 /// let mut cx = noop_context();
90 ///
91 /// let mut buf = [0; 10];
92 ///
93 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf)?, Poll::Ready(2));
94 /// assert_eq!(&buf[..2], &[1, 2]);
95 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf)?, Poll::Ready(2));
96 /// assert_eq!(&buf[..2], &[3, 4]);
97 /// assert_eq!(reader.as_mut().poll_read(&mut cx, &mut buf)?, Poll::Ready(1));
98 /// assert_eq!(&buf[..1], &[5]);
99 ///
100 /// # Ok::<(), std::io::Error>(())
101 /// ```
102 fn limited(self, limit: usize) -> Limited<Self>
103 where
104 Self: Sized,
105 {
106 Limited::new(self, limit)
107 }
108}
109
110impl<R> AsyncReadTestExt for R where R: AsyncRead {}