diff options
Diffstat (limited to 'tests/io_buf_writer.rs')
-rw-r--r-- | tests/io_buf_writer.rs | 222 |
1 files changed, 131 insertions, 91 deletions
diff --git a/tests/io_buf_writer.rs b/tests/io_buf_writer.rs index 7bdcd16..935335b 100644 --- a/tests/io_buf_writer.rs +++ b/tests/io_buf_writer.rs @@ -1,13 +1,70 @@ -use futures::executor::block_on; -use futures::future::{Future, FutureExt}; -use futures::io::{AsyncSeek, AsyncSeekExt, AsyncWrite, AsyncWriteExt, BufWriter, Cursor, SeekFrom}; -use futures::task::{Context, Poll}; -use futures_test::task::noop_context; -use std::io; -use std::pin::Pin; +#[cfg(feature = "std")] +mod maybe_pending { + use futures::io::AsyncWrite; + use futures::task::{Context, Poll}; + use std::io; + use std::pin::Pin; + + pub struct MaybePending { + pub inner: Vec<u8>, + ready: bool, + } + + impl MaybePending { + pub fn new(inner: Vec<u8>) -> Self { + Self { inner, ready: false } + } + } + + impl AsyncWrite for MaybePending { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll<io::Result<usize>> { + if self.ready { + self.ready = false; + Pin::new(&mut self.inner).poll_write(cx, buf) + } else { + self.ready = true; + Poll::Pending + } + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { + Pin::new(&mut self.inner).poll_flush(cx) + } + + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { + Pin::new(&mut self.inner).poll_close(cx) + } + } +} + +#[cfg(any(feature = "std", feature = "executor"))] +mod util { + use futures::future::Future; + + pub fn run<F: Future + Unpin>(mut f: F) -> F::Output { + use futures::future::FutureExt; + use futures::task::Poll; + use futures_test::task::noop_context; + let mut cx = noop_context(); + loop { + if let Poll::Ready(x) = f.poll_unpin(&mut cx) { + return x; + } + } + } +} + +#[cfg(feature = "executor")] #[test] fn buf_writer() { + use futures::executor::block_on; + use futures::io::{AsyncWriteExt, BufWriter}; + let mut writer = BufWriter::with_capacity(2, Vec::new()); block_on(writer.write(&[0, 1])).unwrap(); @@ -48,8 +105,12 @@ fn buf_writer() { assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]); } +#[cfg(feature = "executor")] #[test] fn buf_writer_inner_flushes() { + use futures::executor::block_on; + use futures::io::{AsyncWriteExt, BufWriter}; + let mut w = BufWriter::with_capacity(3, Vec::new()); block_on(w.write(&[0, 1])).unwrap(); assert_eq!(*w.get_ref(), []); @@ -58,8 +119,12 @@ fn buf_writer_inner_flushes() { assert_eq!(w, [0, 1]); } +#[cfg(feature = "executor")] #[test] fn buf_writer_seek() { + use futures::executor::block_on; + use futures::io::{AsyncSeekExt, AsyncWriteExt, BufWriter, Cursor, SeekFrom}; + // FIXME: when https://github.com/rust-lang/futures-rs/issues/1510 fixed, // use `Vec::new` instead of `vec![0; 8]`. let mut w = BufWriter::with_capacity(3, Cursor::new(vec![0; 8])); @@ -73,52 +138,14 @@ fn buf_writer_seek() { assert_eq!(&w.into_inner().into_inner()[..], &[0, 1, 8, 9, 4, 5, 6, 7]); } -struct MaybePending { - inner: Vec<u8>, - ready: bool, -} - -impl MaybePending { - fn new(inner: Vec<u8>) -> Self { - Self { inner, ready: false } - } -} - -impl AsyncWrite for MaybePending { - fn poll_write( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll<io::Result<usize>> { - if self.ready { - self.ready = false; - Pin::new(&mut self.inner).poll_write(cx, buf) - } else { - self.ready = true; - Poll::Pending - } - } - - fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { - Pin::new(&mut self.inner).poll_flush(cx) - } - - fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { - Pin::new(&mut self.inner).poll_close(cx) - } -} - -fn run<F: Future + Unpin>(mut f: F) -> F::Output { - let mut cx = noop_context(); - loop { - if let Poll::Ready(x) = f.poll_unpin(&mut cx) { - return x; - } - } -} - +#[cfg(feature = "std")] #[test] fn maybe_pending_buf_writer() { + use futures::io::{AsyncWriteExt, BufWriter}; + + use maybe_pending::MaybePending; + use util::run; + let mut writer = BufWriter::with_capacity(2, MaybePending::new(Vec::new())); run(writer.write(&[0, 1])).unwrap(); @@ -159,8 +186,14 @@ fn maybe_pending_buf_writer() { assert_eq!(&writer.get_ref().inner, &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]); } +#[cfg(feature = "std")] #[test] fn maybe_pending_buf_writer_inner_flushes() { + use futures::io::{AsyncWriteExt, BufWriter}; + + use maybe_pending::MaybePending; + use util::run; + let mut w = BufWriter::with_capacity(3, MaybePending::new(Vec::new())); run(w.write(&[0, 1])).unwrap(); assert_eq!(&w.get_ref().inner, &[]); @@ -169,59 +202,66 @@ fn maybe_pending_buf_writer_inner_flushes() { assert_eq!(w, [0, 1]); } +#[cfg(feature = "std")] +#[test] +fn maybe_pending_buf_writer_seek() { + use futures::io::{AsyncSeek, AsyncSeekExt, AsyncWrite, AsyncWriteExt, BufWriter, Cursor, SeekFrom}; + use futures::task::{Context, Poll}; + use std::io; + use std::pin::Pin; -struct MaybePendingSeek { - inner: Cursor<Vec<u8>>, - ready_write: bool, - ready_seek: bool, -} + use util::run; -impl MaybePendingSeek { - fn new(inner: Vec<u8>) -> Self { - Self { inner: Cursor::new(inner), ready_write: false, ready_seek: false } + struct MaybePendingSeek { + inner: Cursor<Vec<u8>>, + ready_write: bool, + ready_seek: bool, } -} -impl AsyncWrite for MaybePendingSeek { - fn poll_write( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll<io::Result<usize>> { - if self.ready_write { - self.ready_write = false; - Pin::new(&mut self.inner).poll_write(cx, buf) - } else { - self.ready_write = true; - Poll::Pending + impl MaybePendingSeek { + fn new(inner: Vec<u8>) -> Self { + Self { inner: Cursor::new(inner), ready_write: false, ready_seek: false } } } - fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { - Pin::new(&mut self.inner).poll_flush(cx) - } + impl AsyncWrite for MaybePendingSeek { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll<io::Result<usize>> { + if self.ready_write { + self.ready_write = false; + Pin::new(&mut self.inner).poll_write(cx, buf) + } else { + self.ready_write = true; + Poll::Pending + } + } - fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { - Pin::new(&mut self.inner).poll_close(cx) + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { + Pin::new(&mut self.inner).poll_flush(cx) + } + + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> { + Pin::new(&mut self.inner).poll_close(cx) + } } -} -impl AsyncSeek for MaybePendingSeek { - fn poll_seek(mut self: Pin<&mut Self>, cx: &mut Context<'_>, pos: SeekFrom) - -> Poll<io::Result<u64>> - { - if self.ready_seek { - self.ready_seek = false; - Pin::new(&mut self.inner).poll_seek(cx, pos) - } else { - self.ready_seek = true; - Poll::Pending + impl AsyncSeek for MaybePendingSeek { + fn poll_seek(mut self: Pin<&mut Self>, cx: &mut Context<'_>, pos: SeekFrom) + -> Poll<io::Result<u64>> + { + if self.ready_seek { + self.ready_seek = false; + Pin::new(&mut self.inner).poll_seek(cx, pos) + } else { + self.ready_seek = true; + Poll::Pending + } } } -} -#[test] -fn maybe_pending_buf_writer_seek() { // FIXME: when https://github.com/rust-lang/futures-rs/issues/1510 fixed, // use `Vec::new` instead of `vec![0; 8]`. let mut w = BufWriter::with_capacity(3, MaybePendingSeek::new(vec![0; 8])); |