]> git.lizzy.rs Git - rust.git/commitdiff
Add test that impl Seek for BufReader correctly invalidates buffer between seeks
authorChris Gregory <czipperz@gmail.com>
Sat, 25 May 2019 20:02:35 +0000 (15:02 -0500)
committerChris Gregory <czipperz@gmail.com>
Sat, 25 May 2019 20:02:35 +0000 (15:02 -0500)
src/libstd/io/buffered.rs

index e309f81192cf3ffb7322bd4540da7beb5c384461..3bdb1e34a8b736946f85406a0c08a5459415fffe 100644 (file)
@@ -1162,6 +1162,40 @@ fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
         assert_eq!(reader.get_ref().pos, expected);
     }
 
+    fn test_buffered_reader_seek_underflow_discard_buffer_between_seeks() {
+        // gimmick reader that returns Err after first seek
+        struct ErrAfterFirstSeekReader {
+            first_seek: bool,
+        }
+        impl Read for ErrAfterFirstSeekReader {
+            fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+                for x in &mut *buf {
+                    *x = 0;
+                }
+                Ok(buf.len())
+            }
+        }
+        impl Seek for ErrAfterFirstSeekReader {
+            fn seek(&mut self, _: SeekFrom) -> io::Result<u64> {
+                if self.first_seek {
+                    self.first_seek = false;
+                    Ok(0)
+                } else {
+                    Err(io::Error::new(io::ErrorKind::Other, "oh no!"))
+                }
+            }
+        }
+
+        let mut reader = BufReader::with_capacity(5, ErrAfterFirstSeekReader { first_seek: true });
+        assert_eq!(reader.fill_buf().ok(), Some(&[0, 0, 0, 0, 0][..]));
+
+        // The following seek will require two underlying seeks.  The first will
+        // succeed but the second will fail.  This should still invalidate the
+        // buffer.
+        assert!(reader.seek(SeekFrom::Current(i64::min_value())).is_err());
+        assert_eq!(reader.buffer().len(), 0);
+    }
+
     #[test]
     fn test_buffered_writer() {
         let inner = Vec::new();