|
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