| 
1 | 1 | use crate::io::prelude::*;  | 
2 | 2 | use crate::io::{self, BufReader, BufWriter, ErrorKind, IoSlice, LineWriter, SeekFrom};  | 
 | 3 | +use crate::panic;  | 
3 | 4 | use crate::sync::atomic::{AtomicUsize, Ordering};  | 
4 | 5 | use crate::thread;  | 
5 | 6 | 
 
  | 
@@ -86,6 +87,47 @@ fn test_buffered_reader_seek_relative() {  | 
86 | 87 |     assert_eq!(reader.fill_buf().ok(), Some(&[2, 3][..]));  | 
87 | 88 | }  | 
88 | 89 | 
 
  | 
 | 90 | +#[test]  | 
 | 91 | +fn test_buffered_reader_stream_position() {  | 
 | 92 | +    let inner: &[u8] = &[5, 6, 7, 0, 1, 2, 3, 4];  | 
 | 93 | +    let mut reader = BufReader::with_capacity(2, io::Cursor::new(inner));  | 
 | 94 | + | 
 | 95 | +    assert_eq!(reader.stream_position().ok(), Some(0));  | 
 | 96 | +    assert_eq!(reader.seek(SeekFrom::Start(3)).ok(), Some(3));  | 
 | 97 | +    assert_eq!(reader.stream_position().ok(), Some(3));  | 
 | 98 | +    // relative seeking within the buffer and reading position should keep the buffer  | 
 | 99 | +    assert_eq!(reader.fill_buf().ok(), Some(&[0, 1][..]));  | 
 | 100 | +    assert!(reader.seek_relative(0).is_ok());  | 
 | 101 | +    assert_eq!(reader.stream_position().ok(), Some(3));  | 
 | 102 | +    assert_eq!(reader.buffer(), &[0, 1][..]);  | 
 | 103 | +    assert!(reader.seek_relative(1).is_ok());  | 
 | 104 | +    assert_eq!(reader.stream_position().ok(), Some(4));  | 
 | 105 | +    assert_eq!(reader.buffer(), &[1][..]);  | 
 | 106 | +    assert!(reader.seek_relative(-1).is_ok());  | 
 | 107 | +    assert_eq!(reader.stream_position().ok(), Some(3));  | 
 | 108 | +    assert_eq!(reader.buffer(), &[0, 1][..]);  | 
 | 109 | +    // relative seeking outside the buffer will discard it  | 
 | 110 | +    assert!(reader.seek_relative(2).is_ok());  | 
 | 111 | +    assert_eq!(reader.stream_position().ok(), Some(5));  | 
 | 112 | +    assert_eq!(reader.buffer(), &[][..]);  | 
 | 113 | +}  | 
 | 114 | + | 
 | 115 | +#[test]  | 
 | 116 | +fn test_buffered_reader_stream_position_panic() {  | 
 | 117 | +    let inner: &[u8] = &[5, 6, 7, 0, 1, 2, 3, 4];  | 
 | 118 | +    let mut reader = BufReader::with_capacity(4, io::Cursor::new(inner));  | 
 | 119 | + | 
 | 120 | +    // cause internal buffer to be filled but read only partially  | 
 | 121 | +    let mut buffer = [0, 0];  | 
 | 122 | +    assert!(reader.read_exact(&mut buffer).is_ok());  | 
 | 123 | +    // rewinding the internal reader will cause buffer to loose sync  | 
 | 124 | +    let inner = reader.get_mut();  | 
 | 125 | +    assert!(inner.seek(SeekFrom::Start(0)).is_ok());  | 
 | 126 | +    // overflow when subtracting the remaining buffer size from current position  | 
 | 127 | +    let result = panic::catch_unwind(panic::AssertUnwindSafe(|| reader.stream_position().ok()));  | 
 | 128 | +    assert!(result.is_err());  | 
 | 129 | +}  | 
 | 130 | + | 
89 | 131 | #[test]  | 
90 | 132 | fn test_buffered_reader_invalidated_after_read() {  | 
91 | 133 |     let inner: &[u8] = &[5, 6, 7, 0, 1, 2, 3, 4];  | 
 | 
0 commit comments