| #![warn(rust_2018_idioms)] |
| #![cfg(feature = "full")] |
| |
| use tokio::io::{AsyncRead, AsyncReadExt, ReadBuf}; |
| use tokio_test::assert_ok; |
| |
| use std::io; |
| use std::pin::Pin; |
| use std::task::{Context, Poll}; |
| |
| #[tokio::test] |
| async fn read_buf() { |
| struct Rd { |
| cnt: usize, |
| } |
| |
| impl AsyncRead for Rd { |
| fn poll_read( |
| mut self: Pin<&mut Self>, |
| _cx: &mut Context<'_>, |
| buf: &mut ReadBuf<'_>, |
| ) -> Poll<io::Result<()>> { |
| self.cnt += 1; |
| buf.put_slice(b"hello world"); |
| Poll::Ready(Ok(())) |
| } |
| } |
| |
| let mut buf = vec![]; |
| let mut rd = Rd { cnt: 0 }; |
| |
| let n = assert_ok!(rd.read_buf(&mut buf).await); |
| assert_eq!(1, rd.cnt); |
| assert_eq!(n, 11); |
| assert_eq!(buf[..], b"hello world"[..]); |
| } |
| |
| #[tokio::test] |
| #[cfg(feature = "io-util")] |
| async fn issue_5588() { |
| use bytes::BufMut; |
| |
| // steps to zero |
| let mut buf = [0; 8]; |
| let mut read_buf = ReadBuf::new(&mut buf); |
| assert_eq!(read_buf.remaining_mut(), 8); |
| assert_eq!(read_buf.chunk_mut().len(), 8); |
| unsafe { |
| read_buf.advance_mut(1); |
| } |
| assert_eq!(read_buf.remaining_mut(), 7); |
| assert_eq!(read_buf.chunk_mut().len(), 7); |
| unsafe { |
| read_buf.advance_mut(5); |
| } |
| assert_eq!(read_buf.remaining_mut(), 2); |
| assert_eq!(read_buf.chunk_mut().len(), 2); |
| unsafe { |
| read_buf.advance_mut(2); |
| } |
| assert_eq!(read_buf.remaining_mut(), 0); |
| assert_eq!(read_buf.chunk_mut().len(), 0); |
| |
| // directly to zero |
| let mut buf = [0; 8]; |
| let mut read_buf = ReadBuf::new(&mut buf); |
| assert_eq!(read_buf.remaining_mut(), 8); |
| assert_eq!(read_buf.chunk_mut().len(), 8); |
| unsafe { |
| read_buf.advance_mut(8); |
| } |
| assert_eq!(read_buf.remaining_mut(), 0); |
| assert_eq!(read_buf.chunk_mut().len(), 0); |
| |
| // uninit |
| let mut buf = [std::mem::MaybeUninit::new(1); 8]; |
| let mut uninit = ReadBuf::uninit(&mut buf); |
| assert_eq!(uninit.remaining_mut(), 8); |
| assert_eq!(uninit.chunk_mut().len(), 8); |
| |
| let mut buf = [std::mem::MaybeUninit::uninit(); 8]; |
| let mut uninit = ReadBuf::uninit(&mut buf); |
| unsafe { |
| uninit.advance_mut(4); |
| } |
| assert_eq!(uninit.remaining_mut(), 4); |
| assert_eq!(uninit.chunk_mut().len(), 4); |
| uninit.put_u8(1); |
| assert_eq!(uninit.remaining_mut(), 3); |
| assert_eq!(uninit.chunk_mut().len(), 3); |
| uninit.put_slice(&[1, 2, 3]); |
| assert_eq!(uninit.remaining_mut(), 0); |
| assert_eq!(uninit.chunk_mut().len(), 0); |
| } |