diff --git a/src/io/buf_read/mod.rs b/src/io/buf_read/mod.rs index bcb9d907c..177ba55bb 100644 --- a/src/io/buf_read/mod.rs +++ b/src/io/buf_read/mod.rs @@ -264,3 +264,29 @@ pub(crate) fn read_until_internal( } } } + +#[cfg(all(test, not(target_os = "unknown")))] +mod tests { + use crate::io; + use crate::prelude::*; + + #[test] + fn test_read_until_eof_no_delimiter() -> std::io::Result<()> { + crate::task::block_on(async { + // read_until on an empty source with no delimiter returns Ok(0) + let mut reader = io::Cursor::new(Vec::new()); + let mut buf = Vec::new(); + assert_eq!(reader.read_until(b'\n', &mut buf).await?, 0); + assert!(buf.is_empty()); + + // read_until on a source that does not contain the delimiter + // reads all bytes and returns the total count at EOF + let mut reader = io::Cursor::new(vec![b'a', b'b', b'c']); + let mut buf = Vec::new(); + assert_eq!(reader.read_until(b'\n', &mut buf).await?, 3); + assert_eq!(buf, b"abc"); + + Ok(()) + }) + } +} diff --git a/src/io/read/mod.rs b/src/io/read/mod.rs index 405422585..ddd622058 100644 --- a/src/io/read/mod.rs +++ b/src/io/read/mod.rs @@ -409,4 +409,32 @@ mod tests { assert_eq!(&other_buffer, &[5, 6, 7, 8]); }); } + + #[test] + fn test_read_edge_cases() -> std::io::Result<()> { + crate::task::block_on(async { + // take(0) returns Ok(0) immediately without touching the inner reader + let f = io::Cursor::new(vec![0u8, 1, 2, 3]); + let mut buf = [0u8; 4]; + assert_eq!(f.take(0).read(&mut buf).await?, 0); + + // read_exact with an empty buffer returns Ok immediately + let mut f = io::Cursor::new(vec![0u8, 1, 2, 3]); + f.read_exact(&mut []).await?; + + // read_to_end on an empty source returns Ok(0) + let mut f = io::Cursor::new(Vec::new()); + let mut buf = Vec::new(); + assert_eq!(f.read_to_end(&mut buf).await?, 0); + assert!(buf.is_empty()); + + // read_to_string on an empty source returns Ok(0) + let mut f = io::Cursor::new(Vec::new()); + let mut buf = String::new(); + assert_eq!(f.read_to_string(&mut buf).await?, 0); + assert!(buf.is_empty()); + + Ok(()) + }) + } }