1use crossbeam_channel::{Receiver, Sender, TryRecvError, unbounded as channel};
2use std::convert::TryFrom;
3use std::io::{self, Read, Seek, SeekFrom};
4use std::marker::PhantomData;
5use std::thread::{self, JoinHandle};
6
7const DEFAULT_BUF_SIZE: usize = 8 * 1024;
8const DEFAULT_QUEUE_LEN: usize = 2;
9
10#[derive(Debug)]
11struct Buffer {
12 data: Box<[u8]>,
13 start_pos: u64, end: usize, generation: u64, }
17
18impl Buffer {
19 fn new(size: usize, start_pos: u64) -> Buffer {
20 assert!(size > 0);
21 Buffer {
22 data: vec![0; size].into_boxed_slice(),
23 start_pos,
24 end: 0,
25 generation: 0,
26 }
27 }
28
29 fn refill<R: Read>(&mut self, mut reader: R) -> io::Result<()> {
30 let mut n_read = 0;
31 let mut buf = &mut *self.data;
32 self.end = 0;
33
34 while !buf.is_empty() {
35 match reader.read(buf) {
36 Ok(n) => {
37 if n == 0 {
38 break;
40 }
41 let tmp = buf;
42 buf = &mut tmp[n..];
43 n_read += n;
44 }
45 Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {
46 break;
48 }
49 Err(e) => return Err(e),
50 };
51 }
52
53 self.end = n_read;
54 Ok(())
55 }
56}
57
58#[derive(Debug)]
59enum Command {
60 Seek { generation: u64, pos: SeekFrom },
61 Stop,
62}
63
64pub struct SmartBuf<R: Read + Seek + Send + 'static> {
90 cmd_send: Option<Sender<Command>>,
92 buf_recv: Receiver<io::Result<Buffer>>,
93 buf_send: Sender<Option<Buffer>>,
94
95 buffer: Option<Buffer>,
97 buf_pos: usize, position: u64, current_generation: u64,
100 next_generation: u64,
101
102 bufsize: usize,
104
105 handle: Option<JoinHandle<Option<R>>>,
107
108 _phantom: PhantomData<R>,
110}
111
112impl<R: Read + Seek + Send + 'static> SmartBuf<R> {
113 pub fn new(reader: R) -> Self {
115 Self::with_capacity(DEFAULT_BUF_SIZE, DEFAULT_QUEUE_LEN, reader)
116 }
117
118 pub fn with_capacity(bufsize: usize, queuelen: usize, reader: R) -> Self {
123 assert!(bufsize > 0);
124 assert!(queuelen >= 1);
125
126 let (cmd_send, cmd_recv) = channel();
127 let (full_send, full_recv) = channel::<io::Result<Buffer>>();
128 let (empty_send, empty_recv) = channel::<Option<Buffer>>();
129
130 for i in 0..queuelen {
132 let buffer = Buffer::new(bufsize, (i * bufsize) as u64);
133 empty_send.send(Some(buffer)).ok();
134 }
135
136 let mut background_reader = BackgroundReader::new(empty_recv, full_send, cmd_recv, bufsize);
137
138 let handle = thread::spawn(move || {
139 background_reader.serve(reader)
140 });
141
142 SmartBuf {
143 cmd_send: Some(cmd_send),
144 buf_recv: full_recv,
145 buf_send: empty_send,
146 buffer: None,
147 buf_pos: 0,
148 position: 0,
149 current_generation: 0,
150 next_generation: 1,
151 bufsize,
152 handle: Some(handle),
153 _phantom: PhantomData,
154 }
155 }
156
157 pub fn position(&self) -> u64 {
159 self.position
160 }
161
162 pub fn buffer_size(&self) -> usize {
164 self.bufsize
165 }
166
167 pub fn into_inner(mut self) -> io::Result<R> {
186 self.return_current_buffer();
188
189 if let Some(sender) = self.cmd_send.take() {
191 sender.send(Command::Stop).ok();
192 }
193
194 if let Some(handle) = self.handle.take() {
196 match handle.join() {
197 Ok(Some(reader)) => Ok(reader),
198 Ok(None) => Err(io::Error::new(
199 io::ErrorKind::Other,
200 "background thread terminated without returning reader",
201 )),
202 Err(_) => Err(io::Error::new(
203 io::ErrorKind::Other,
204 "background thread panicked",
205 )),
206 }
207 } else {
208 Err(io::Error::new(
209 io::ErrorKind::Other,
210 "background thread handle already taken",
211 ))
212 }
213 }
214
215 fn return_current_buffer(&mut self) {
216 if let Some(buf) = self.buffer.take() {
217 self.buf_send.send(Some(buf)).ok();
218 }
219 self.buf_pos = 0;
220 }
221
222 fn get_next_buffer(&mut self) -> io::Result<()> {
223 self.return_current_buffer();
224
225 loop {
226 match self.buf_recv.recv() {
227 Ok(Ok(buffer)) => {
228 if buffer.generation != self.current_generation {
229 self.buf_send.send(Some(buffer)).ok();
230 continue;
231 }
232
233 self.position = buffer.start_pos;
234 self.buf_pos = 0;
235 self.buffer = Some(buffer);
236 return Ok(());
237 }
238 Ok(Err(e)) => return Err(e),
239 Err(_) => {
240 return Err(io::Error::new(
241 io::ErrorKind::UnexpectedEof,
242 "background thread terminated",
243 ));
244 }
245 }
246 }
247 }
248
249 fn ensure_buffer(&mut self) -> io::Result<()> {
250 if self.buffer.is_none() {
251 self.get_next_buffer()?;
252 }
253 Ok(())
254 }
255
256 fn advance_buffer(&mut self) -> io::Result<()> {
257 self.return_current_buffer();
258 self.get_next_buffer()
259 }
260}
261
262impl<R: Read + Seek + Send + 'static> Read for SmartBuf<R> {
263 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
264 if buf.is_empty() {
265 return Ok(0);
266 }
267
268 let mut total_read = 0;
269
270 while total_read < buf.len() {
271 self.ensure_buffer()?;
272
273 let current = match self.buffer.as_ref() {
274 Some(b) => b,
275 None => break,
276 };
277
278 if self.buf_pos >= current.end {
279 if current.end == 0 {
280 break;
281 }
282 self.advance_buffer()?;
283 continue;
284 }
285
286 let available = current.end - self.buf_pos;
287 let to_read = std::cmp::min(available, buf.len() - total_read);
288 let start = self.buf_pos;
289 let end = start + to_read;
290
291 buf[total_read..total_read + to_read].copy_from_slice(¤t.data[start..end]);
292
293 self.buf_pos += to_read;
294 self.position = current.start_pos + self.buf_pos as u64;
295 total_read += to_read;
296
297 if self.buf_pos >= current.end {
298 self.advance_buffer()?;
299 }
300 }
301
302 Ok(total_read)
303 }
304}
305
306impl<R: Read + Seek + Send + 'static> Seek for SmartBuf<R> {
307 fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
308 let (explicit_target, command_pos) = match pos {
309 SeekFrom::Start(n) => (Some(n), SeekFrom::Start(n)),
310 SeekFrom::Current(delta) => {
311 let base = self.position as i128;
312 let target = base + delta as i128;
313 if target < 0 {
314 return Err(io::Error::new(
315 io::ErrorKind::InvalidInput,
316 "seek before start",
317 ));
318 }
319 let target = target as u64;
320 (Some(target), SeekFrom::Start(target))
321 }
322 SeekFrom::End(offset) => (None, SeekFrom::End(offset)),
323 };
324
325 if let Some(target_pos) = explicit_target {
326 if let Some(ref buffer) = self.buffer {
327 if target_pos >= buffer.start_pos {
328 let offset = target_pos - buffer.start_pos;
329 if let Ok(offset_usize) = usize::try_from(offset) {
330 if offset_usize <= buffer.end {
331 self.buf_pos = offset_usize;
332 self.position = target_pos;
333 return Ok(target_pos);
334 }
335 }
336 }
337 }
338 }
339
340 let generation = self.next_generation;
341 self.next_generation += 1;
342 self.current_generation = generation;
343 self.return_current_buffer();
344 self.buffer = None;
345 self.buf_pos = 0;
346
347 let sender = self.cmd_send.as_ref().ok_or_else(|| {
348 io::Error::new(io::ErrorKind::BrokenPipe, "background thread terminated")
349 })?;
350
351 sender
352 .send(Command::Seek {
353 generation,
354 pos: command_pos,
355 })
356 .map_err(|_| {
357 io::Error::new(io::ErrorKind::BrokenPipe, "background thread terminated")
358 })?;
359
360 self.get_next_buffer()?;
361
362 let position = if let Some(target_pos) = explicit_target {
363 let buffer = self.buffer.as_ref().ok_or_else(|| {
364 io::Error::new(io::ErrorKind::UnexpectedEof, "missing buffer after seek")
365 })?;
366
367 let offset = target_pos
368 .checked_sub(buffer.start_pos)
369 .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "seek before buffer"))?;
370 let offset_usize = usize::try_from(offset).map_err(|_| {
371 io::Error::new(io::ErrorKind::InvalidInput, "seek offset too large")
372 })?;
373 if offset_usize > buffer.end {
374 return Err(io::Error::new(
375 io::ErrorKind::UnexpectedEof,
376 "background reader returned buffer not containing target position",
377 ));
378 }
379 self.buf_pos = offset_usize;
380 buffer.start_pos + offset
381 } else {
382 let buffer = self.buffer.as_ref().ok_or_else(|| {
383 io::Error::new(io::ErrorKind::UnexpectedEof, "missing buffer after seek")
384 })?;
385 buffer.start_pos
386 };
387
388 self.position = position;
389 Ok(position)
390 }
391}
392
393impl<R: Read + Seek + Send + 'static> Drop for SmartBuf<R> {
394 fn drop(&mut self) {
395 self.return_current_buffer();
396 if let Some(sender) = self.cmd_send.take() {
398 sender.send(Command::Stop).ok();
399 }
400 if let Some(handle) = self.handle.take() {
402 let _ = handle.join();
403 }
404 }
405}
406
407struct BackgroundReader {
408 empty_recv: Receiver<Option<Buffer>>,
409 full_send: Sender<io::Result<Buffer>>,
410 cmd_recv: Receiver<Command>,
411 current_generation: u64,
412}
413
414impl BackgroundReader {
415 fn new(
416 empty_recv: Receiver<Option<Buffer>>,
417 full_send: Sender<io::Result<Buffer>>,
418 cmd_recv: Receiver<Command>,
419 _bufsize: usize,
420 ) -> Self {
421 BackgroundReader {
422 empty_recv,
423 full_send,
424 cmd_recv,
425 current_generation: 0,
426 }
427 }
428
429 fn serve<R: Read + Seek>(&mut self, mut reader: R) -> Option<R> {
430 let mut current_pos = 0u64;
431 let mut pending_seek = false;
432
433 loop {
434 while let Ok(cmd) = self.cmd_recv.try_recv() {
436 match cmd {
437 Command::Seek { generation, pos } => match reader.seek(pos) {
438 Ok(new_pos) => {
439 current_pos = new_pos;
440 self.current_generation = generation;
441 pending_seek = true;
442 }
443 Err(e) => {
444 self.full_send.send(Err(e)).ok();
445 return None;
446 }
447 },
448 Command::Stop => return Some(reader),
449 }
450 }
451
452 let buffer_result = if pending_seek {
453 pending_seek = false;
454 self.empty_recv.recv()
455 } else {
456 match self.empty_recv.try_recv() {
457 Ok(b) => Ok(b),
458 Err(TryRecvError::Empty) => {
459 thread::yield_now();
460 continue;
461 }
462 Err(TryRecvError::Disconnected) => return None,
463 }
464 };
465
466 match buffer_result {
467 Ok(Some(mut buffer)) => {
468 buffer.start_pos = current_pos;
469 buffer.generation = self.current_generation;
470 match buffer.refill(&mut reader) {
471 Ok(()) => {
472 current_pos += buffer.end as u64;
473 if self.full_send.send(Ok(buffer)).is_err() {
474 return None;
475 }
476 }
477 Err(e) => {
478 let should_break = e.kind() != io::ErrorKind::Interrupted;
479 if self.full_send.send(Err(e)).is_err() {
480 return None;
481 }
482 if should_break {
483 return None;
484 }
485 }
486 }
487 }
488 Ok(None) => return Some(reader),
489 Err(_) => return None,
490 }
491 }
492 }
493}
494
495#[cfg(test)]
496mod tests {
497 use super::*;
498 use std::io::Cursor;
499
500 #[test]
501 fn basic_read() {
502 let data = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
503 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
504 let mut reader = SmartBuf::with_capacity(4, 2, cursor);
505
506 let mut buf = vec![0; 5];
507 let n = reader.read(&mut buf).unwrap();
508 assert_eq!(n, 5);
509 assert_eq!(&buf[..n], &data[..5]);
510 }
511
512 #[test]
513 fn seek_within_buffer() {
514 let data: Vec<u8> = (0..20).collect();
515 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
516 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
517
518 let mut buf = vec![0; 5];
520 reader.read(&mut buf).unwrap();
521
522 reader.seek(SeekFrom::Start(2)).unwrap();
524
525 let mut buf = vec![0; 3];
526 reader.read(&mut buf).unwrap();
527 assert_eq!(&buf, &[2, 3, 4]);
528 }
529
530 #[test]
531 fn seek_outside_buffer() {
532 let data: Vec<u8> = (0..30).collect();
533 let cursor = Cursor::new(data.clone());
534 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
535
536 let mut buf = vec![0; 5];
538 reader.read(&mut buf).unwrap();
539
540 reader.seek(SeekFrom::Start(20)).unwrap();
542
543 let mut buf = vec![0; 5];
544 reader.read(&mut buf).unwrap();
545 assert_eq!(&buf, &[20, 21, 22, 23, 24]);
546 }
547
548 #[test]
549 fn seek_current_forward() {
550 let data: Vec<u8> = (0..20).collect();
551 let cursor = Cursor::new(data.clone());
552 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
553
554 reader.seek(SeekFrom::Current(5)).unwrap();
555 assert_eq!(reader.position(), 5);
556
557 let mut buf = vec![0; 3];
558 reader.read(&mut buf).unwrap();
559 assert_eq!(&buf, &[5, 6, 7]);
560 }
561
562 #[test]
563 fn seek_current_backward() {
564 let data: Vec<u8> = (0..20).collect();
565 let cursor = Cursor::new(data.clone());
566 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
567
568 let mut buf = vec![0; 10];
570 reader.read(&mut buf).unwrap();
571 assert_eq!(reader.position(), 10);
572
573 reader.seek(SeekFrom::Current(-5)).unwrap();
575 assert_eq!(reader.position(), 5);
576
577 let mut buf = vec![0; 3];
578 reader.read(&mut buf).unwrap();
579 assert_eq!(&buf, &[5, 6, 7]);
580 }
581
582 #[test]
583 fn read_to_eof() {
584 let data: Vec<u8> = (0..25).collect();
585 let cursor = Cursor::new(data.clone());
586 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
587
588 let mut buf = vec![0; 10];
590 let n = reader.read(&mut buf).unwrap();
591 assert_eq!(n, 10);
592 assert_eq!(&buf[..n], &data[..10]);
593
594 let mut buf = vec![0; 10];
596 let n = reader.read(&mut buf).unwrap();
597 assert_eq!(n, 10);
598 assert_eq!(&buf[..n], &data[10..20]);
599
600 let mut buf = vec![0; 10];
602 let n = reader.read(&mut buf).unwrap();
603 assert_eq!(n, 5);
604 assert_eq!(&buf[..n], &data[20..25]);
605
606 let mut buf = vec![0; 10];
608 let n = reader.read(&mut buf).unwrap();
609 assert_eq!(n, 0);
610 }
611
612 #[test]
613 fn small_capacity() {
614 let data: Vec<u8> = (0..8).collect();
615 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
616 let mut reader = SmartBuf::with_capacity(2, 2, cursor);
617
618 let mut buf = vec![0; 3];
619 let n = reader.read(&mut buf).unwrap();
620 assert_eq!(n, 3);
621 assert_eq!(&buf[..n], &data[..3]);
622
623 let mut buf = vec![0; 2];
624 let n = reader.read(&mut buf).unwrap();
625 assert_eq!(n, 2);
626 assert_eq!(&buf[..n], &data[3..5]);
627
628 let mut buf = vec![0; 1];
629 let n = reader.read(&mut buf).unwrap();
630 assert_eq!(n, 1);
631 assert_eq!(&buf[..n], &data[5..6]);
632 }
633
634 #[test]
635 fn seek_start_multiple() {
636 let data: Vec<u8> = (0..20).collect();
637 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
638 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
639
640 reader.seek(SeekFrom::Start(5)).unwrap();
642 let mut buf = vec![0; 4];
643 reader.read(&mut buf).unwrap();
644 assert_eq!(&buf, &[5, 6, 7, 8]);
645
646 reader.seek(SeekFrom::Start(0)).unwrap();
648 let mut buf = vec![0; 4];
649 reader.read(&mut buf).unwrap();
650 assert_eq!(&buf, &[0, 1, 2, 3]);
651
652 reader.seek(SeekFrom::Start(15)).unwrap();
654 let mut buf = vec![0; 4];
655 reader.read(&mut buf).unwrap();
656 assert_eq!(&buf, &[15, 16, 17, 18]);
657
658 reader.seek(SeekFrom::Start(0)).unwrap();
660 let mut buf = vec![0; 4];
661 reader.read(&mut buf).unwrap();
662 assert_eq!(&buf, &[0, 1, 2, 3]);
663 }
664
665 #[test]
666 fn seek_end() {
667 let data: Vec<u8> = (0..17).collect();
668 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
669 let mut reader = SmartBuf::with_capacity(5, 2, cursor);
670
671 reader.seek(SeekFrom::End(-6)).unwrap();
673 let mut buf = vec![0; 8];
674 let n = reader.read(&mut buf).unwrap();
675 assert_eq!(n, 6);
676 assert_eq!(&buf[..n], &data[11..17]);
677
678 reader.seek(SeekFrom::End(0)).unwrap();
680 let mut buf = vec![0; 8];
681 let n = reader.read(&mut buf).unwrap();
682 assert_eq!(n, 0);
683 }
684
685 #[test]
686 fn read_empty_buffer() {
687 let data: Vec<u8> = (0..10).collect();
688 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
689 let mut reader = SmartBuf::with_capacity(5, 2, cursor);
690
691 let mut buf = vec![0; 0];
692 let n = reader.read(&mut buf).unwrap();
693 assert_eq!(n, 0);
694 }
695
696 #[test]
697 fn seek_beyond_buffer_boundary() {
698 let data: Vec<u8> = (0..30).collect();
699 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
700 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
701
702 let mut buf = vec![0; 5];
704 reader.read(&mut buf).unwrap();
705 assert_eq!(reader.position(), 5);
706
707 reader.seek(SeekFrom::Start(0)).unwrap();
709 let mut buf = vec![0; 3];
710 reader.read(&mut buf).unwrap();
711 assert_eq!(&buf, &[0, 1, 2]);
712
713 reader.seek(SeekFrom::Start(25)).unwrap();
715 let mut buf = vec![0; 5];
716 reader.read(&mut buf).unwrap();
717 assert_eq!(&buf, &[25, 26, 27, 28, 29]);
718 }
719
720 #[test]
721 fn large_read_spans_multiple_buffers() {
722 let data: Vec<u8> = (0..100).collect();
723 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
724 let mut reader = SmartBuf::with_capacity(10, 3, cursor);
725
726 let mut buf = vec![0; 25];
728 let n = reader.read(&mut buf).unwrap();
729 assert_eq!(n, 25);
730 assert_eq!(&buf[..n], &data[..25]);
731 assert_eq!(reader.position(), 25);
732 }
733
734 #[test]
735 fn multiple_sequential_seeks() {
736 let data: Vec<u8> = (0..50).collect();
737 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
738 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
739
740 reader.seek(SeekFrom::Start(10)).unwrap();
742 let mut buf = vec![0; 5];
743 reader.read(&mut buf).unwrap();
744 assert_eq!(&buf, &[10, 11, 12, 13, 14]);
745
746 reader.seek(SeekFrom::Start(20)).unwrap();
747 let mut buf = vec![0; 5];
748 reader.read(&mut buf).unwrap();
749 assert_eq!(&buf, &[20, 21, 22, 23, 24]);
750
751 reader.seek(SeekFrom::Start(5)).unwrap();
752 let mut buf = vec![0; 5];
753 reader.read(&mut buf).unwrap();
754 assert_eq!(&buf, &[5, 6, 7, 8, 9]);
755
756 reader.seek(SeekFrom::Start(40)).unwrap();
757 let mut buf = vec![0; 5];
758 reader.read(&mut buf).unwrap();
759 assert_eq!(&buf, &[40, 41, 42, 43, 44]);
760 }
761
762 #[test]
763 fn seek_current_large_forward() {
764 let data: Vec<u8> = (0..50).collect();
765 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
766 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
767
768 let mut buf = vec![0; 5];
770 reader.read(&mut buf).unwrap();
771 assert_eq!(reader.position(), 5);
772
773 reader.seek(SeekFrom::Current(20)).unwrap();
775 assert_eq!(reader.position(), 25);
776
777 let mut buf = vec![0; 5];
778 reader.read(&mut buf).unwrap();
779 assert_eq!(&buf, &[25, 26, 27, 28, 29]);
780 }
781
782 #[test]
783 fn seek_current_large_backward() {
784 let data: Vec<u8> = (0..50).collect();
785 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
786 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
787
788 reader.seek(SeekFrom::Start(30)).unwrap();
790 let mut buf = vec![0; 5];
791 reader.read(&mut buf).unwrap();
792 assert_eq!(reader.position(), 35);
793
794 reader.seek(SeekFrom::Current(-30)).unwrap();
796 assert_eq!(reader.position(), 5);
797
798 let mut buf = vec![0; 5];
799 reader.read(&mut buf).unwrap();
800 assert_eq!(&buf, &[5, 6, 7, 8, 9]);
801 }
802
803 #[test]
804 fn position_tracking() {
805 let data: Vec<u8> = (0..30).collect();
806 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
807 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
808
809 assert_eq!(reader.position(), 0);
810
811 reader.seek(SeekFrom::Start(10)).unwrap();
812 assert_eq!(reader.position(), 10);
813
814 let mut buf = vec![0; 5];
815 reader.read(&mut buf).unwrap();
816 assert_eq!(reader.position(), 15);
817
818 reader.seek(SeekFrom::Current(-3)).unwrap();
819 assert_eq!(reader.position(), 12);
820
821 let mut buf = vec![0; 2];
822 reader.read(&mut buf).unwrap();
823 assert_eq!(reader.position(), 14);
824 }
825
826 #[test]
827 fn read_at_buffer_boundary() {
828 let data: Vec<u8> = (0..30).collect();
829 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
830 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
831
832 let mut buf = vec![0; 10];
834 let n = reader.read(&mut buf).unwrap();
835 assert_eq!(n, 10);
836 assert_eq!(&buf, &data[..10]);
837
838 let mut buf = vec![0; 10];
840 let n = reader.read(&mut buf).unwrap();
841 assert_eq!(n, 10);
842 assert_eq!(&buf, &data[10..20]);
843 }
844
845 #[test]
846 fn seek_to_same_position() {
847 let data: Vec<u8> = (0..20).collect();
848 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
849 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
850
851 reader.seek(SeekFrom::Start(5)).unwrap();
852 assert_eq!(reader.position(), 5);
853
854 reader.seek(SeekFrom::Start(5)).unwrap();
856 assert_eq!(reader.position(), 5);
857
858 let mut buf = vec![0; 3];
859 reader.read(&mut buf).unwrap();
860 assert_eq!(&buf, &[5, 6, 7]);
861 }
862
863 #[test]
864 fn read_to_end() {
865 let data: Vec<u8> = (0..100).collect();
866 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
867 let mut reader = SmartBuf::with_capacity(20, 2, cursor);
868
869 let mut result = Vec::new();
870 reader.read_to_end(&mut result).unwrap();
871 assert_eq!(result, data);
872 }
873
874 #[test]
875 fn read_exact() {
876 let data: Vec<u8> = (0..50).collect();
877 let cursor: Cursor<Vec<u8>> = Cursor::new(data.clone());
878 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
879
880 let mut buf = vec![0; 30];
881 reader.read_exact(&mut buf).unwrap();
882 assert_eq!(&buf, &data[..30]);
883 assert_eq!(reader.position(), 30);
884 }
885
886 #[test]
887 fn read_exact_partial() {
888 let data: Vec<u8> = (0..15).collect();
889 let cursor: Cursor<Vec<u8>> = Cursor::new(data);
890 let mut reader = SmartBuf::with_capacity(5, 2, cursor);
891
892 let mut buf = vec![0; 10];
893 reader.read_exact(&mut buf).unwrap();
894
895 let mut buf2 = vec![0; 10];
897 assert!(reader.read_exact(&mut buf2).is_err());
898 }
899
900 #[test]
901 fn various_buffer_sizes() {
902 let text = b"The quick brown fox jumps over the lazy dog";
903 let n = text.len() + 3;
904
905 for channel_bufsize in (1..n.min(20)).step_by(3) {
907 for queuelen in (1..n.min(10)).step_by(2) {
908 let data = text.to_vec();
909 let cursor = Cursor::new(data.clone());
910 let mut reader = SmartBuf::with_capacity(channel_bufsize, queuelen, cursor);
911
912 let mut result = Vec::new();
913 reader.read_to_end(&mut result).unwrap();
914 assert_eq!(
915 result, data,
916 "Failed at bufsize: {}, queuelen: {}",
917 channel_bufsize, queuelen
918 );
919 }
920 }
921 }
922
923 #[test]
924 fn seek_start_comprehensive() {
925 let data: Vec<u8> = (0..17).collect();
926 let cursor = Cursor::new(data.clone());
927 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
928
929 reader.seek(SeekFrom::Start(3)).unwrap();
931 let mut buf = [0; 8];
932 reader.read(&mut buf).unwrap();
933 assert_eq!(&buf, &[3, 4, 5, 6, 7, 8, 9, 10]);
934
935 reader.seek(SeekFrom::Start(0)).unwrap();
937 let mut buf = [0; 8];
938 reader.read(&mut buf).unwrap();
939 assert_eq!(&buf, &[0, 1, 2, 3, 4, 5, 6, 7]);
940
941 reader.seek(SeekFrom::Start(13)).unwrap();
943 let mut buf = [0; 8];
944 let n = reader.read(&mut buf).unwrap();
945 assert_eq!(n, 4);
946 assert_eq!(&buf[..n], &[13, 14, 15, 16]);
947
948 reader.seek(SeekFrom::Start(0)).unwrap();
950 let mut buf = [0; 8];
951 reader.read(&mut buf).unwrap();
952 assert_eq!(&buf, &[0, 1, 2, 3, 4, 5, 6, 7]);
953 }
954
955 #[test]
956 fn seek_current_comprehensive() {
957 let data: Vec<u8> = (0..17).collect();
958 let cursor = Cursor::new(data.clone());
959 let mut reader = SmartBuf::with_capacity(20, 2, cursor);
960
961 reader.seek(SeekFrom::Current(2)).unwrap();
963 let mut buf = [0; 8];
964 reader.read(&mut buf).unwrap();
965 assert_eq!(&buf, &[2, 3, 4, 5, 6, 7, 8, 9]);
966
967 reader.seek(SeekFrom::Current(6)).unwrap();
969 let mut buf = [0; 8];
970 let n = reader.read(&mut buf).unwrap();
971 assert_eq!(n, 1);
972 assert_eq!(&buf[..n], &[16]);
973 }
974
975 #[test]
976 fn seek_current_negative_comprehensive() {
977 let data: Vec<u8> = (0..17).collect();
978 let cursor = Cursor::new(data.clone());
979 let mut reader = SmartBuf::with_capacity(3, 2, cursor);
980
981 reader.seek(SeekFrom::Current(4)).unwrap();
983 let mut buf = [0; 4];
984 reader.read(&mut buf).unwrap();
985 assert_eq!(&buf, &[4, 5, 6, 7]);
986
987 reader.seek(SeekFrom::Current(-2)).unwrap();
989 let mut buf = [0; 4];
990 reader.read(&mut buf).unwrap();
991 assert_eq!(&buf, &[6, 7, 8, 9]);
992 }
993
994 #[test]
995 fn multiple_small_reads() {
996 let data: Vec<u8> = (0..50).collect();
997 let cursor = Cursor::new(data.clone());
998 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
999
1000 for i in 0..10 {
1002 let mut buf = [0; 5];
1003 let n = reader.read(&mut buf).unwrap();
1004 assert_eq!(n, 5);
1005 assert_eq!(&buf, &data[i * 5..(i + 1) * 5]);
1006 }
1007 }
1008
1009 #[test]
1010 fn read_across_buffer_boundaries() {
1011 let data: Vec<u8> = (0..30).collect();
1012 let cursor = Cursor::new(data.clone());
1013 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1014
1015 let mut buf = vec![0; 20];
1017 let n = reader.read(&mut buf).unwrap();
1018 assert_eq!(n, 20);
1019 assert_eq!(&buf[..n], &data[..20]);
1020
1021 let mut buf = vec![0; 20];
1023 let n = reader.read(&mut buf).unwrap();
1024 assert_eq!(n, 10);
1025 assert_eq!(&buf[..n], &data[20..30]);
1026 }
1027
1028 #[test]
1029 fn seek_and_read_sequence() {
1030 let data: Vec<u8> = (0..40).collect();
1031 let cursor = Cursor::new(data.clone());
1032 let mut reader = SmartBuf::with_capacity(8, 2, cursor);
1033
1034 let mut buf = [0; 5];
1036 reader.read(&mut buf).unwrap();
1037 assert_eq!(&buf, &[0, 1, 2, 3, 4]);
1038
1039 reader.seek(SeekFrom::Start(20)).unwrap();
1040 reader.read(&mut buf).unwrap();
1041 assert_eq!(&buf, &[20, 21, 22, 23, 24]);
1042
1043 reader.seek(SeekFrom::Start(10)).unwrap();
1044 reader.read(&mut buf).unwrap();
1045 assert_eq!(&buf, &[10, 11, 12, 13, 14]);
1046
1047 reader.seek(SeekFrom::Start(0)).unwrap();
1048 reader.read(&mut buf).unwrap();
1049 assert_eq!(&buf, &[0, 1, 2, 3, 4]);
1050 }
1051
1052 #[test]
1053 fn default_constructor() {
1054 let data: Vec<u8> = (0..100).collect();
1055 let cursor = Cursor::new(data.clone());
1056 let mut reader = SmartBuf::new(cursor);
1057
1058 let mut result = Vec::new();
1059 reader.read_to_end(&mut result).unwrap();
1060 assert_eq!(result.len(), 100);
1061 assert_eq!(&result[..10], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1062 }
1063
1064 #[test]
1065 fn buffer_size_accessor() {
1066 let data: Vec<u8> = (0..10).collect();
1067 let cursor = Cursor::new(data);
1068 let reader = SmartBuf::with_capacity(123, 2, cursor);
1069 assert_eq!(reader.buffer_size(), 123);
1070 }
1071
1072 #[test]
1073 fn read_after_seek_to_end() {
1074 let data: Vec<u8> = (0..10).collect();
1075 let cursor = Cursor::new(data);
1076 let mut reader = SmartBuf::with_capacity(5, 2, cursor);
1077
1078 reader.seek(SeekFrom::End(0)).unwrap();
1080 let mut buf = [0; 5];
1081 let n = reader.read(&mut buf).unwrap();
1082 assert_eq!(n, 0);
1083 }
1084
1085 #[test]
1086 fn seek_from_end_negative() {
1087 let data: Vec<u8> = (0..20).collect();
1088 let cursor = Cursor::new(data.clone());
1089 let mut reader = SmartBuf::with_capacity(5, 2, cursor);
1090
1091 reader.seek(SeekFrom::End(-5)).unwrap();
1093 let mut buf = [0; 10];
1094 let n = reader.read(&mut buf).unwrap();
1095 assert_eq!(n, 5);
1096 assert_eq!(&buf[..n], &[15, 16, 17, 18, 19]);
1097 }
1098
1099 #[test]
1100 fn seek_current_zero() {
1101 let data: Vec<u8> = (0..20).collect();
1102 let cursor = Cursor::new(data.clone());
1103 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1104
1105 let mut buf = [0; 5];
1107 reader.read(&mut buf).unwrap();
1108 assert_eq!(reader.position(), 5);
1109
1110 reader.seek(SeekFrom::Current(0)).unwrap();
1112 assert_eq!(reader.position(), 5);
1113
1114 reader.read(&mut buf).unwrap();
1116 assert_eq!(&buf, &[5, 6, 7, 8, 9]);
1117 }
1118
1119 #[test]
1120 fn large_queue_length() {
1121 let data: Vec<u8> = (0..100).collect();
1122 let cursor = Cursor::new(data.clone());
1123 let mut reader = SmartBuf::with_capacity(10, 10, cursor);
1124
1125 let mut result = Vec::new();
1126 reader.read_to_end(&mut result).unwrap();
1127 assert_eq!(result, data);
1128 }
1129
1130 #[test]
1131 fn seek_to_very_end_then_read() {
1132 let data: Vec<u8> = (0..25).collect();
1133 let cursor = Cursor::new(data.clone());
1134 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1135
1136 reader.seek(SeekFrom::End(0)).unwrap();
1138
1139 let mut buf = [0; 10];
1141 let n = reader.read(&mut buf).unwrap();
1142 assert_eq!(n, 0);
1143
1144 reader.seek(SeekFrom::End(-5)).unwrap();
1146 let n = reader.read(&mut buf).unwrap();
1147 assert_eq!(n, 5);
1148 assert_eq!(&buf[..n], &[20, 21, 22, 23, 24]);
1149 }
1150
1151 #[test]
1152 fn deadlock_test_queue_length_one() {
1153 let data: Vec<u8> = (0..100).collect();
1155 let cursor = Cursor::new(data.clone());
1156 let mut reader = SmartBuf::with_capacity(10, 1, cursor);
1157
1158 for _ in 0..10 {
1161 let mut buf = vec![0; 10];
1162 let n = reader.read(&mut buf).unwrap();
1163 assert!(n > 0);
1164 }
1165 }
1166
1167 #[test]
1168 fn deadlock_test_rapid_successive_seeks() {
1169 let data: Vec<u8> = (0..100).collect();
1171 let cursor = Cursor::new(data.clone());
1172 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1173
1174 for i in 0..20 {
1176 let pos = (i * 5) % 100;
1177 reader.seek(SeekFrom::Start(pos)).unwrap();
1178 let mut buf = vec![0; 3];
1179 let n = reader.read(&mut buf).unwrap();
1180 assert!(n > 0);
1181 assert_eq!(buf[0], pos as u8);
1182 }
1183 }
1184
1185 #[test]
1186 fn deadlock_test_seek_while_reading() {
1187 let data: Vec<u8> = (0..200).collect();
1189 let cursor = Cursor::new(data.clone());
1190 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1191
1192 let mut buf = vec![0; 5];
1194 reader.read(&mut buf).unwrap();
1195 assert_eq!(buf, &[0, 1, 2, 3, 4]);
1196
1197 reader.seek(SeekFrom::Start(50)).unwrap();
1199 reader.read(&mut buf).unwrap();
1200 assert_eq!(buf, &[50, 51, 52, 53, 54]);
1201
1202 reader.read(&mut buf).unwrap();
1204 reader.seek(SeekFrom::Start(100)).unwrap();
1205 reader.read(&mut buf).unwrap();
1206 assert_eq!(buf, &[100, 101, 102, 103, 104]);
1207 }
1208
1209 #[test]
1210 fn deadlock_test_multiple_seeks_no_read() {
1211 let data: Vec<u8> = (0..100).collect();
1213 let cursor = Cursor::new(data.clone());
1214 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1215
1216 reader.seek(SeekFrom::Start(10)).unwrap();
1218 reader.seek(SeekFrom::Start(20)).unwrap();
1219 reader.seek(SeekFrom::Start(30)).unwrap();
1220 reader.seek(SeekFrom::Start(40)).unwrap();
1221 reader.seek(SeekFrom::Start(50)).unwrap();
1222
1223 let mut buf = vec![0; 5];
1225 reader.read(&mut buf).unwrap();
1226 assert_eq!(buf, &[50, 51, 52, 53, 54]);
1227 }
1228
1229 #[test]
1230 fn deadlock_test_seek_current_rapid() {
1231 let data: Vec<u8> = (0..100).collect();
1233 let cursor = Cursor::new(data.clone());
1234 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1235
1236 reader.seek(SeekFrom::Current(10)).unwrap();
1238 reader.seek(SeekFrom::Current(10)).unwrap();
1239 reader.seek(SeekFrom::Current(10)).unwrap();
1240 reader.seek(SeekFrom::Current(-10)).unwrap();
1241 reader.seek(SeekFrom::Current(5)).unwrap();
1242
1243 let mut buf = vec![0; 5];
1244 reader.read(&mut buf).unwrap();
1245 assert_eq!(buf, &[25, 26, 27, 28, 29]);
1246 }
1247
1248 #[test]
1249 fn deadlock_test_seek_end_rapid() {
1250 let data: Vec<u8> = (0..100).collect();
1252 let cursor = Cursor::new(data.clone());
1253 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1254
1255 reader.seek(SeekFrom::End(-10)).unwrap();
1257 reader.seek(SeekFrom::End(-20)).unwrap();
1258 reader.seek(SeekFrom::End(-5)).unwrap();
1259
1260 let mut buf = vec![0; 5];
1261 reader.read(&mut buf).unwrap();
1262 assert_eq!(buf, &[95, 96, 97, 98, 99]);
1263 }
1264
1265 #[test]
1266 fn deadlock_test_interleaved_read_seek() {
1267 let data: Vec<u8> = (0..200).collect();
1269 let cursor = Cursor::new(data.clone());
1270 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1271
1272 let mut buf = vec![0; 3];
1273
1274 reader.read(&mut buf).unwrap();
1275 reader.seek(SeekFrom::Start(50)).unwrap();
1276 reader.read(&mut buf).unwrap();
1277 reader.seek(SeekFrom::Start(100)).unwrap();
1278 reader.read(&mut buf).unwrap();
1279 reader.seek(SeekFrom::Start(150)).unwrap();
1280 reader.read(&mut buf).unwrap();
1281 reader.seek(SeekFrom::Start(0)).unwrap();
1282 reader.read(&mut buf).unwrap();
1283
1284 assert_eq!(buf, &[0, 1, 2]);
1285 }
1286
1287 #[test]
1288 fn deadlock_test_background_thread_waiting_on_seek() {
1289 let data: Vec<u8> = (0..100).collect();
1291 let cursor = Cursor::new(data.clone());
1292 let mut reader = SmartBuf::with_capacity(5, 1, cursor);
1293
1294 let mut buf = vec![0; 5];
1296 reader.read(&mut buf).unwrap();
1297
1298 reader.seek(SeekFrom::Start(50)).unwrap();
1300
1301 reader.read(&mut buf).unwrap();
1303 assert_eq!(buf, &[50, 51, 52, 53, 54]);
1304 }
1305
1306 #[test]
1307 fn deadlock_test_seek_without_buffer() {
1308 let data: Vec<u8> = (0..100).collect();
1310 let cursor = Cursor::new(data.clone());
1311 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1312
1313 reader.seek(SeekFrom::Start(50)).unwrap();
1315
1316 let mut buf = vec![0; 5];
1317 reader.read(&mut buf).unwrap();
1318 assert_eq!(buf, &[50, 51, 52, 53, 54]);
1319 }
1320
1321 #[test]
1322 fn deadlock_test_drop_while_processing() {
1323 let data: Vec<u8> = (0..255).cycle().take(1000).collect();
1326 let cursor = Cursor::new(data);
1327
1328 {
1330 let reader = SmartBuf::with_capacity(10, 2, cursor);
1331 drop(reader);
1332 }
1333 }
1335
1336 #[test]
1337 fn deadlock_test_drop_during_read() {
1338 let data: Vec<u8> = (0..100).collect();
1340 let cursor = Cursor::new(data);
1341 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1342
1343 let mut buf = vec![0; 5];
1345 reader.read(&mut buf).unwrap();
1346
1347 drop(reader);
1349 }
1351
1352 #[test]
1353 fn deadlock_test_drop_during_seek() {
1354 let data: Vec<u8> = (0..100).collect();
1356 let cursor = Cursor::new(data);
1357 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1358
1359 reader.seek(SeekFrom::Start(50)).unwrap();
1361
1362 drop(reader);
1364 }
1366
1367 #[test]
1368 fn deadlock_test_stress_rapid_operations() {
1369 let data: Vec<u8> = (0..255).cycle().take(500).collect();
1371 let cursor = Cursor::new(data.clone());
1372 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1373
1374 for i in 0..50 {
1376 if i % 3 == 0 {
1377 reader.seek(SeekFrom::Start((i * 10) as u64)).unwrap();
1378 }
1379 let mut buf = vec![0; 3];
1380 let n = reader.read(&mut buf).unwrap();
1381 assert!(n > 0);
1382 }
1383 }
1384
1385 #[test]
1386 fn deadlock_test_seek_to_same_position_multiple_times() {
1387 let data: Vec<u8> = (0..100).collect();
1389 let cursor = Cursor::new(data.clone());
1390 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1391
1392 for _ in 0..10 {
1394 reader.seek(SeekFrom::Start(50)).unwrap();
1395 }
1396
1397 let mut buf = vec![0; 5];
1398 reader.read(&mut buf).unwrap();
1399 assert_eq!(buf, &[50, 51, 52, 53, 54]);
1400 }
1401
1402 #[test]
1403 fn deadlock_test_seek_forward_then_backward_rapidly() {
1404 let data: Vec<u8> = (0..100).collect();
1406 let cursor = Cursor::new(data.clone());
1407 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1408
1409 reader.seek(SeekFrom::Start(50)).unwrap();
1411 reader.seek(SeekFrom::Start(10)).unwrap();
1412 reader.seek(SeekFrom::Start(80)).unwrap();
1413 reader.seek(SeekFrom::Start(20)).unwrap();
1414 reader.seek(SeekFrom::Start(90)).unwrap();
1415
1416 let mut buf = vec![0; 5];
1417 reader.read(&mut buf).unwrap();
1418 assert_eq!(buf, &[90, 91, 92, 93, 94]);
1419 }
1420
1421 #[test]
1422 fn deadlock_test_read_large_spanning_multiple_buffers_after_seek() {
1423 let data: Vec<u8> = (0..200).collect();
1425 let cursor = Cursor::new(data.clone());
1426 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1427
1428 reader.seek(SeekFrom::Start(100)).unwrap();
1430
1431 let mut buf = vec![0; 50];
1433 let n = reader.read(&mut buf).unwrap();
1434 assert_eq!(n, 50);
1435 assert_eq!(&buf, &data[100..150]);
1436 }
1437
1438 #[test]
1439 fn deadlock_test_seek_while_buffer_is_full() {
1440 let data: Vec<u8> = (0..100).collect();
1442 let cursor = Cursor::new(data.clone());
1443 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1444
1445 let mut buf = vec![0; 10];
1447 reader.read(&mut buf).unwrap();
1448
1449 reader.seek(SeekFrom::Start(50)).unwrap();
1451
1452 reader.read(&mut buf).unwrap();
1454 assert_eq!(buf, &[50, 51, 52, 53, 54, 55, 56, 57, 58, 59]);
1455 }
1456
1457 #[test]
1458 fn deadlock_test_seek_while_buffer_is_partially_read() {
1459 let data: Vec<u8> = (0..100).collect();
1461 let cursor = Cursor::new(data.clone());
1462 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1463
1464 let mut buf = vec![0; 5];
1466 reader.read(&mut buf).unwrap();
1467 assert_eq!(buf, &[0, 1, 2, 3, 4]);
1468
1469 reader.seek(SeekFrom::Start(50)).unwrap();
1471
1472 reader.read(&mut buf).unwrap();
1474 assert_eq!(buf, &[50, 51, 52, 53, 54]);
1475 }
1476
1477 #[test]
1478 fn deadlock_test_multiple_seek_current_operations() {
1479 let data: Vec<u8> = (0..100).collect();
1481 let cursor = Cursor::new(data.clone());
1482 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1483
1484 reader.seek(SeekFrom::Current(10)).unwrap();
1486 reader.seek(SeekFrom::Current(10)).unwrap();
1487 reader.seek(SeekFrom::Current(-5)).unwrap();
1488 reader.seek(SeekFrom::Current(15)).unwrap();
1489
1490 let mut buf = vec![0; 5];
1491 reader.read(&mut buf).unwrap();
1492 assert_eq!(buf, &[30, 31, 32, 33, 34]);
1493 }
1494
1495 #[test]
1496 fn deadlock_test_seek_end_then_seek_start() {
1497 let data: Vec<u8> = (0..100).collect();
1499 let cursor = Cursor::new(data.clone());
1500 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1501
1502 reader.seek(SeekFrom::End(0)).unwrap();
1503 reader.seek(SeekFrom::Start(0)).unwrap();
1504
1505 let mut buf = vec![0; 5];
1506 reader.read(&mut buf).unwrap();
1507 assert_eq!(buf, &[0, 1, 2, 3, 4]);
1508 }
1509
1510 #[test]
1511 fn deadlock_test_seek_current_negative_beyond_buffer() {
1512 let data: Vec<u8> = (0..100).collect();
1514 let cursor = Cursor::new(data.clone());
1515 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1516
1517 reader.seek(SeekFrom::Start(50)).unwrap();
1519 let mut buf = vec![0; 5];
1520 reader.read(&mut buf).unwrap();
1521
1522 reader.seek(SeekFrom::Current(-40)).unwrap();
1524
1525 reader.read(&mut buf).unwrap();
1526 assert_eq!(buf, &[15, 16, 17, 18, 19]);
1527 }
1528
1529 #[test]
1530 fn deadlock_test_minimal_buffer_size() {
1531 let data: Vec<u8> = (0..50).collect();
1533 let cursor = Cursor::new(data.clone());
1534 let mut reader = SmartBuf::with_capacity(1, 1, cursor);
1535
1536 for i in 0..10 {
1538 reader.seek(SeekFrom::Start(i)).unwrap();
1539 let mut buf = vec![0; 1];
1540 let n = reader.read(&mut buf).unwrap();
1541 assert_eq!(n, 1);
1542 assert_eq!(buf[0], i as u8);
1543 }
1544 }
1545
1546 #[test]
1547 fn deadlock_test_all_buffers_in_use() {
1548 let data: Vec<u8> = (0..200).collect();
1550 let cursor = Cursor::new(data.clone());
1551 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1552
1553 for _ in 0..10 {
1555 let mut buf = vec![0; 10];
1556 reader.read(&mut buf).unwrap();
1557 }
1558
1559 reader.seek(SeekFrom::Start(0)).unwrap();
1561 let mut buf = vec![0; 5];
1562 reader.read(&mut buf).unwrap();
1563 assert_eq!(buf, &[0, 1, 2, 3, 4]);
1564 }
1565
1566 #[test]
1567 fn deadlock_test_rapid_seek_current_forward_backward() {
1568 let data: Vec<u8> = (0..200).collect();
1570 let cursor = Cursor::new(data.clone());
1571 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1572
1573 reader.seek(SeekFrom::Current(20)).unwrap();
1575 reader.seek(SeekFrom::Current(20)).unwrap();
1576 reader.seek(SeekFrom::Current(-10)).unwrap();
1577 reader.seek(SeekFrom::Current(20)).unwrap();
1578 reader.seek(SeekFrom::Current(-15)).unwrap();
1579
1580 let mut buf = vec![0; 5];
1581 reader.read(&mut buf).unwrap();
1582 assert_eq!(buf, &[35, 36, 37, 38, 39]);
1583 }
1584
1585 #[test]
1586 fn deadlock_test_seek_after_eof() {
1587 let data: Vec<u8> = (0..50).collect();
1589 let cursor = Cursor::new(data.clone());
1590 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1591
1592 let mut buf = vec![0; 100];
1594 reader.read(&mut buf).unwrap();
1595
1596 reader.seek(SeekFrom::Start(10)).unwrap();
1598 reader.read(&mut buf).unwrap();
1599 assert_eq!(&buf[..40], &data[10..50]);
1600 }
1601
1602 #[test]
1603 fn edge_case_empty_file() {
1604 let data: Vec<u8> = vec![];
1606 let cursor = Cursor::new(data);
1607 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1608
1609 let mut buf = vec![0; 10];
1611 let n = reader.read(&mut buf).unwrap();
1612 assert_eq!(n, 0);
1613
1614 reader.seek(SeekFrom::Start(0)).unwrap();
1616 assert_eq!(reader.position(), 0);
1617
1618 let n = reader.read(&mut buf).unwrap();
1620 assert_eq!(n, 0);
1621 }
1622
1623 #[test]
1624 fn edge_case_buffer_larger_than_file() {
1625 let data: Vec<u8> = (0..10).collect();
1627 let cursor = Cursor::new(data.clone());
1628 let mut reader = SmartBuf::with_capacity(100, 2, cursor);
1629
1630 let mut buf = vec![0; 100];
1632 let n = reader.read(&mut buf).unwrap();
1633 assert_eq!(n, 10);
1634 assert_eq!(&buf[..n], &data[..]);
1635 }
1636
1637 #[test]
1638 fn edge_case_seek_to_file_end() {
1639 let data: Vec<u8> = (0..20).collect();
1641 let cursor = Cursor::new(data.clone());
1642 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1643
1644 reader.seek(SeekFrom::Start(20)).unwrap();
1646 assert_eq!(reader.position(), 20);
1647
1648 let mut buf = vec![0; 10];
1650 let n = reader.read(&mut buf).unwrap();
1651 assert_eq!(n, 0);
1652 }
1653
1654 #[test]
1655 fn edge_case_seek_beyond_file_end() {
1656 let data: Vec<u8> = (0..20).collect();
1658 let cursor = Cursor::new(data.clone());
1659 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1660
1661 reader.seek(SeekFrom::Start(50)).unwrap();
1663 assert_eq!(reader.position(), 50);
1664
1665 let mut buf = vec![0; 10];
1667 let n = reader.read(&mut buf).unwrap();
1668 assert_eq!(n, 0);
1669 }
1670
1671 #[test]
1672 fn edge_case_read_exactly_buffer_size() {
1673 let data: Vec<u8> = (0..30).collect();
1675 let cursor = Cursor::new(data.clone());
1676 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1677
1678 let mut buf = vec![0; 10];
1680 let n = reader.read(&mut buf).unwrap();
1681 assert_eq!(n, 10);
1682 assert_eq!(&buf, &data[..10]);
1683
1684 let n = reader.read(&mut buf).unwrap();
1686 assert_eq!(n, 10);
1687 assert_eq!(&buf, &data[10..20]);
1688 }
1689
1690 #[test]
1691 fn edge_case_read_multiple_of_buffer_size() {
1692 let data: Vec<u8> = (0..100).collect();
1694 let cursor = Cursor::new(data.clone());
1695 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1696
1697 let mut buf = vec![0; 50];
1699 let n = reader.read(&mut buf).unwrap();
1700 assert_eq!(n, 50);
1701 assert_eq!(&buf, &data[..50]);
1702 }
1703
1704 #[test]
1705 fn edge_case_seek_current_zero() {
1706 let data: Vec<u8> = (0..20).collect();
1708 let cursor = Cursor::new(data.clone());
1709 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1710
1711 let mut buf = vec![0; 5];
1713 reader.read(&mut buf).unwrap();
1714 assert_eq!(reader.position(), 5);
1715
1716 reader.seek(SeekFrom::Current(0)).unwrap();
1718 assert_eq!(reader.position(), 5);
1719
1720 reader.read(&mut buf).unwrap();
1722 assert_eq!(buf, &[5, 6, 7, 8, 9]);
1723 }
1724
1725 #[test]
1726 fn edge_case_seek_current_large_forward() {
1727 let data: Vec<u8> = (0..200).collect();
1729 let cursor = Cursor::new(data.clone());
1730 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1731
1732 reader.seek(SeekFrom::Current(100)).unwrap();
1733 assert_eq!(reader.position(), 100);
1734
1735 let mut buf = vec![0; 5];
1736 reader.read(&mut buf).unwrap();
1737 assert_eq!(buf, &[100, 101, 102, 103, 104]);
1738 }
1739
1740 #[test]
1741 fn edge_case_seek_current_large_backward() {
1742 let data: Vec<u8> = (0..200).collect();
1744 let cursor = Cursor::new(data.clone());
1745 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1746
1747 reader.seek(SeekFrom::Start(100)).unwrap();
1749 assert_eq!(reader.position(), 100);
1750
1751 reader.seek(SeekFrom::Current(-80)).unwrap();
1753 assert_eq!(reader.position(), 20);
1754
1755 let mut buf = vec![0; 5];
1756 reader.read(&mut buf).unwrap();
1757 assert_eq!(buf, &[20, 21, 22, 23, 24]);
1758 }
1759
1760 #[test]
1761 fn edge_case_seek_from_end_positive() {
1762 let data: Vec<u8> = (0..20).collect();
1764 let cursor = Cursor::new(data.clone());
1765 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1766
1767 let pos = reader.seek(SeekFrom::End(10)).unwrap();
1769 assert_eq!(pos, 30);
1772
1773 assert_eq!(reader.position(), pos);
1775
1776 let mut buf = vec![0; 10];
1778 let n = reader.read(&mut buf).unwrap();
1779 assert_eq!(n, 0);
1780 }
1781
1782 #[test]
1783 fn edge_case_seek_from_end_at_start() {
1784 let data: Vec<u8> = (0..20).collect();
1786 let cursor = Cursor::new(data.clone());
1787 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1788
1789 reader.seek(SeekFrom::End(-20)).unwrap();
1790 assert_eq!(reader.position(), 0);
1791
1792 let mut buf = vec![0; 5];
1793 reader.read(&mut buf).unwrap();
1794 assert_eq!(buf, &[0, 1, 2, 3, 4]);
1795 }
1796
1797 #[test]
1798 fn edge_case_seek_from_end_beyond_start() {
1799 let data: Vec<u8> = (0..20).collect();
1801 let cursor = Cursor::new(data.clone());
1802 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1803
1804 assert!(reader.seek(SeekFrom::End(-100)).is_err());
1806 }
1807
1808 #[test]
1809 fn edge_case_position_tracking_through_multiple_operations() {
1810 let data: Vec<u8> = (0..100).collect();
1812 let cursor = Cursor::new(data.clone());
1813 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1814
1815 assert_eq!(reader.position(), 0);
1816
1817 let mut buf = vec![0; 5];
1819 reader.read(&mut buf).unwrap();
1820 assert_eq!(reader.position(), 5);
1821
1822 reader.seek(SeekFrom::Start(20)).unwrap();
1824 assert_eq!(reader.position(), 20);
1825
1826 reader.read(&mut buf).unwrap();
1828 assert_eq!(reader.position(), 25);
1829
1830 reader.seek(SeekFrom::Current(-10)).unwrap();
1832 assert_eq!(reader.position(), 15);
1833
1834 reader.read(&mut buf).unwrap();
1836 assert_eq!(reader.position(), 20);
1837 }
1838
1839 #[test]
1840 fn edge_case_read_zero_bytes() {
1841 let data: Vec<u8> = (0..20).collect();
1843 let cursor = Cursor::new(data.clone());
1844 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1845
1846 let mut buf = vec![0; 0];
1848 let n = reader.read(&mut buf).unwrap();
1849 assert_eq!(n, 0);
1850
1851 assert_eq!(reader.position(), 0);
1853 }
1854
1855 #[test]
1856 fn edge_case_read_exact_insufficient_data() {
1857 let data: Vec<u8> = (0..10).collect();
1859 let cursor = Cursor::new(data.clone());
1860 let mut reader = SmartBuf::with_capacity(5, 2, cursor);
1861
1862 let mut buf = vec![0; 20];
1864 let result = reader.read_exact(&mut buf);
1865 assert!(result.is_err());
1866 }
1867
1868 #[test]
1869 fn edge_case_read_exact_exact_amount() {
1870 let data: Vec<u8> = (0..20).collect();
1872 let cursor = Cursor::new(data.clone());
1873 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1874
1875 let mut buf = vec![0; 20];
1877 reader.read_exact(&mut buf).unwrap();
1878 assert_eq!(&buf, &data[..]);
1879 }
1880
1881 #[test]
1882 fn edge_case_seek_to_same_position_multiple_times() {
1883 let data: Vec<u8> = (0..20).collect();
1885 let cursor = Cursor::new(data.clone());
1886 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1887
1888 for _ in 0..5 {
1890 reader.seek(SeekFrom::Start(10)).unwrap();
1891 assert_eq!(reader.position(), 10);
1892 }
1893
1894 let mut buf = vec![0; 5];
1896 reader.read(&mut buf).unwrap();
1897 assert_eq!(buf, &[10, 11, 12, 13, 14]);
1898 }
1899
1900 #[test]
1901 fn edge_case_seek_within_buffer_multiple_times() {
1902 let data: Vec<u8> = (0..20).collect();
1904 let cursor = Cursor::new(data.clone());
1905 let mut reader = SmartBuf::with_capacity(20, 2, cursor);
1906
1907 let mut buf = vec![0; 10];
1909 reader.read(&mut buf).unwrap();
1910
1911 reader.seek(SeekFrom::Start(5)).unwrap();
1913 reader.seek(SeekFrom::Start(3)).unwrap();
1914 reader.seek(SeekFrom::Start(7)).unwrap();
1915 reader.seek(SeekFrom::Start(2)).unwrap();
1916
1917 reader.read(&mut buf).unwrap();
1919 assert_eq!(&buf[..5], &[2, 3, 4, 5, 6]);
1920 }
1921
1922 #[test]
1923 fn edge_case_read_to_end_multiple_times() {
1924 let data: Vec<u8> = (0..20).collect();
1926 let cursor = Cursor::new(data.clone());
1927 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1928
1929 let mut result = Vec::new();
1931 reader.read_to_end(&mut result).unwrap();
1932 assert_eq!(result, data.clone());
1933
1934 let mut result2 = Vec::new();
1936 reader.read_to_end(&mut result2).unwrap();
1937 assert_eq!(result2, vec![]);
1938 }
1939
1940 #[test]
1941 fn edge_case_seek_after_read_to_end() {
1942 let data: Vec<u8> = (0..20).collect();
1944 let cursor = Cursor::new(data.clone());
1945 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1946
1947 let mut result = Vec::new();
1949 reader.read_to_end(&mut result).unwrap();
1950
1951 reader.seek(SeekFrom::Start(5)).unwrap();
1953
1954 let mut buf = vec![0; 5];
1956 reader.read(&mut buf).unwrap();
1957 assert_eq!(buf, &[5, 6, 7, 8, 9]);
1958 }
1959
1960 #[test]
1961 fn edge_case_large_queue_length() {
1962 let data: Vec<u8> = (0..100).collect();
1964 let cursor = Cursor::new(data.clone());
1965 let mut reader = SmartBuf::with_capacity(10, 20, cursor);
1966
1967 let mut result = Vec::new();
1969 reader.read_to_end(&mut result).unwrap();
1970 assert_eq!(result, data);
1971 }
1972
1973 #[test]
1974 fn edge_case_very_small_buffer_size() {
1975 let data: Vec<u8> = (0..20).collect();
1977 let cursor = Cursor::new(data.clone());
1978 let mut reader = SmartBuf::with_capacity(1, 2, cursor);
1979
1980 let mut buf = vec![0; 20];
1982 let n = reader.read(&mut buf).unwrap();
1983 assert_eq!(n, 20);
1984 assert_eq!(&buf[..n], &data[..]);
1985 }
1986
1987 #[test]
1988 fn edge_case_read_single_byte_multiple_times() {
1989 let data: Vec<u8> = (0..20).collect();
1991 let cursor = Cursor::new(data.clone());
1992 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1993
1994 for i in 0..20 {
1996 let mut buf = vec![0; 1];
1997 let n = reader.read(&mut buf).unwrap();
1998 assert_eq!(n, 1);
1999 assert_eq!(buf[0], i);
2000 assert_eq!(reader.position(), (i + 1) as u64);
2001 }
2002 }
2003
2004 #[test]
2005 fn edge_case_seek_then_read_partial() {
2006 let data: Vec<u8> = (0..20).collect();
2008 let cursor = Cursor::new(data.clone());
2009 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
2010
2011 reader.seek(SeekFrom::Start(10)).unwrap();
2013
2014 let mut buf = vec![0; 3];
2016 reader.read(&mut buf).unwrap();
2017 assert_eq!(buf, &[10, 11, 12]);
2018
2019 reader.seek(SeekFrom::Start(15)).unwrap();
2021 reader.read(&mut buf).unwrap();
2022 assert_eq!(buf, &[15, 16, 17]);
2023 }
2024
2025 #[test]
2026 fn edge_case_seek_current_at_start() {
2027 let data: Vec<u8> = (0..20).collect();
2029 let cursor = Cursor::new(data.clone());
2030 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
2031
2032 reader.seek(SeekFrom::Current(5)).unwrap();
2034 assert_eq!(reader.position(), 5);
2035
2036 let mut buf = vec![0; 5];
2037 reader.read(&mut buf).unwrap();
2038 assert_eq!(buf, &[5, 6, 7, 8, 9]);
2039 }
2040
2041 #[test]
2042 fn edge_case_seek_current_negative_at_start() {
2043 let data: Vec<u8> = (0..20).collect();
2045 let cursor = Cursor::new(data.clone());
2046 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
2047
2048 assert!(reader.seek(SeekFrom::Current(-1)).is_err());
2050 }
2051
2052 #[test]
2053 fn edge_case_buffer_exactly_one_byte() {
2054 let data: Vec<u8> = (0..10).collect();
2056 let cursor = Cursor::new(data.clone());
2057 let mut reader = SmartBuf::with_capacity(1, 1, cursor);
2058
2059 let mut result = Vec::new();
2061 reader.read_to_end(&mut result).unwrap();
2062 assert_eq!(result, data);
2063 }
2064
2065 #[test]
2066 fn edge_case_seek_from_end_zero() {
2067 let data: Vec<u8> = (0..20).collect();
2069 let cursor = Cursor::new(data.clone());
2070 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
2071
2072 let pos = reader.seek(SeekFrom::End(0)).unwrap();
2074 assert_eq!(pos, 20);
2076 assert_eq!(reader.position(), 20);
2077
2078 let mut buf = vec![0; 10];
2080 let n = reader.read(&mut buf).unwrap();
2081 assert_eq!(n, 0);
2082 }
2083
2084 #[test]
2085 fn edge_case_read_after_seek_to_exact_end() {
2086 let data: Vec<u8> = (0..20).collect();
2088 let cursor = Cursor::new(data.clone());
2089 let mut reader = SmartBuf::with_capacity(10, 2, cursor);
2090
2091 reader.seek(SeekFrom::Start(20)).unwrap();
2092 assert_eq!(reader.position(), 20);
2093
2094 let mut buf = vec![0; 10];
2096 let n = reader.read(&mut buf).unwrap();
2097 assert_eq!(n, 0);
2098
2099 reader.seek(SeekFrom::Start(10)).unwrap();
2101 let n = reader.read(&mut buf).unwrap();
2102 assert_eq!(n, 10);
2103 assert_eq!(&buf, &data[10..20]);
2104 }
2105
2106 #[test]
2107 fn test_into_inner() {
2108 let data: Vec<u8> = (0..20).collect();
2109 let cursor = Cursor::new(data.clone());
2110 let smart_buf = SmartBuf::with_capacity(10, 2, cursor);
2111
2112 let reader = smart_buf.into_inner().unwrap();
2114
2115 let mut new_smart_buf = SmartBuf::new(reader);
2117 let mut buf = vec![0; 5];
2118 let n = new_smart_buf.read(&mut buf).unwrap();
2119 assert_eq!(n, 5);
2120 assert_eq!(&buf, &[0, 1, 2, 3, 4]);
2121 }
2122
2123 #[test]
2124 fn test_into_inner_after_reads() {
2125 let data: Vec<u8> = (0..30).collect();
2126 let cursor = Cursor::new(data.clone());
2127 let mut smart_buf = SmartBuf::with_capacity(10, 2, cursor);
2128
2129 let mut buf = vec![0; 10];
2131 smart_buf.read(&mut buf).unwrap();
2132 assert_eq!(&buf, &data[..10]);
2133
2134 let reader = smart_buf.into_inner().unwrap();
2136
2137 let mut new_smart_buf = SmartBuf::new(reader);
2141 new_smart_buf.seek(SeekFrom::Start(0)).unwrap();
2142 let mut buf = vec![0; 5];
2143 let n = new_smart_buf.read(&mut buf).unwrap();
2144 assert_eq!(n, 5);
2145 assert_eq!(&buf, &[0, 1, 2, 3, 4]);
2146 }
2147}