smartbuf/
lib.rs

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,  // Absolute position where this buffer starts
14    end: usize,      // Valid data end in buffer
15    generation: u64, // Generation identifier for this buffer
16}
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                        // EOF
39                        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                    // Continue on interrupted, will be retried
47                    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
64/// A buffered reader with background thread pre-fetching and seek support.
65///
66/// `SmartBuf` wraps a `Read + Seek` implementation and provides:
67/// - Off-thread pre-fetch buffering for improved read performance
68/// - Full seek support, optimizing for seeks within buffered data
69///
70/// # Examples
71///
72/// ```
73/// use smartbuf::SmartBuf;
74/// use std::io::{Read, Seek, SeekFrom, Cursor};
75///
76/// let data = b"Hello, world!";
77/// let cursor = Cursor::new(data);
78/// let mut reader = SmartBuf::new(cursor);
79///
80/// let mut buf = vec![0; 5];
81/// reader.read(&mut buf).unwrap();
82/// assert_eq!(&buf, b"Hello");
83///
84/// reader.seek(SeekFrom::Start(0)).unwrap();
85/// let mut buf = vec![0; 5];
86/// reader.read(&mut buf).unwrap();
87/// assert_eq!(&buf, b"Hello");
88/// ```
89pub struct SmartBuf<R: Read + Seek + Send + 'static> {
90    // Channels for communication with background thread
91    cmd_send: Option<Sender<Command>>,
92    buf_recv: Receiver<io::Result<Buffer>>,
93    buf_send: Sender<Option<Buffer>>,
94
95    // Current buffer state
96    buffer: Option<Buffer>,
97    buf_pos: usize, // Position within current buffer
98    position: u64,  // Logical position in stream
99    current_generation: u64,
100    next_generation: u64,
101
102    // Configuration
103    bufsize: usize,
104
105    // Thread handle for cleanup
106    handle: Option<JoinHandle<Option<R>>>,
107
108    // Phantom data to track type parameter
109    _phantom: PhantomData<R>,
110}
111
112impl<R: Read + Seek + Send + 'static> SmartBuf<R> {
113    /// Creates a new `SmartBuf` with default buffer size (8KB) and queue length (2).
114    pub fn new(reader: R) -> Self {
115        Self::with_capacity(DEFAULT_BUF_SIZE, DEFAULT_QUEUE_LEN, reader)
116    }
117
118    /// Creates a new `SmartBuf` with the specified buffer size and queue length.
119    ///
120    /// `bufsize` is the size of each buffer chunk in bytes.
121    /// `queuelen` is the number of buffers to keep in the queue (must be >= 1).
122    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        // Pre-allocate buffers
131        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    /// Returns the current absolute position in the stream.
158    pub fn position(&self) -> u64 {
159        self.position
160    }
161
162    /// Returns the buffer size.
163    pub fn buffer_size(&self) -> usize {
164        self.bufsize
165    }
166
167    /// Consumes the `SmartBuf` and returns the underlying reader.
168    ///
169    /// This method stops the background thread and returns the reader that was
170    /// being used for buffering. After calling this method, the `SmartBuf` is
171    /// no longer usable.
172    ///
173    /// # Examples
174    ///
175    /// ```no_run
176    /// use smartbuf::SmartBuf;
177    /// use std::io::Cursor;
178    ///
179    /// let cursor = Cursor::new(vec![1, 2, 3, 4, 5]);
180    /// let smart_buf = SmartBuf::new(cursor);
181    ///
182    /// // Get the underlying reader back
183    /// let reader = smart_buf.into_inner().unwrap();
184    /// ```
185    pub fn into_inner(mut self) -> io::Result<R> {
186        // Return current buffer
187        self.return_current_buffer();
188
189        // Send stop command to background thread
190        if let Some(sender) = self.cmd_send.take() {
191            sender.send(Command::Stop).ok();
192        }
193
194        // Wait for background thread to finish and get the reader
195        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(&current.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        // Send stop command to background thread
397        if let Some(sender) = self.cmd_send.take() {
398            sender.send(Command::Stop).ok();
399        }
400        // Wait for background thread to finish and drop the reader
401        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            // Process any pending commands
435            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        // Read some data to fill buffer
519        let mut buf = vec![0; 5];
520        reader.read(&mut buf).unwrap();
521
522        // Seek back within the buffer
523        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        // Read initial data
537        let mut buf = vec![0; 5];
538        reader.read(&mut buf).unwrap();
539
540        // Seek to position outside current buffer
541        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        // Read forward
569        let mut buf = vec![0; 10];
570        reader.read(&mut buf).unwrap();
571        assert_eq!(reader.position(), 10);
572
573        // Seek backward within buffer
574        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        // Read first buffer
589        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        // Read second buffer
595        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        // Read past EOF
601        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        // Read again past EOF should return 0
607        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        // Seek to middle
641        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        // Seek back to start
647        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        // Seek forward again
653        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        // Seek back to start again
659        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        // Seek from end
672        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        // Seek to end
679        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        // Read to fill buffer starting at 0
703        let mut buf = vec![0; 5];
704        reader.read(&mut buf).unwrap();
705        assert_eq!(reader.position(), 5);
706
707        // Seek backward beyond buffer start (should trigger background seek)
708        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        // Seek forward beyond current buffer
714        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        // Read more than one buffer size
727        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        // Sequence of seeks and reads
741        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        // Initial read
769        let mut buf = vec![0; 5];
770        reader.read(&mut buf).unwrap();
771        assert_eq!(reader.position(), 5);
772
773        // Seek forward beyond buffer
774        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        // Read forward
789        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        // Seek backward beyond buffer (should trigger background seek)
795        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        // Read exactly one buffer
833        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        // Read exactly one more buffer
839        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        // Seek to same position
855        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        // Should fail on second read_exact since we've exhausted data
896        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        // Test various combinations of buffer sizes and queue lengths
906        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        // Seek to position 3 and read
930        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        // Seek back to start
936        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        // Seek to near end
942        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        // Seek back to start again
949        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        // Seek forward from start
962        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        // Seek forward again
968        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        // Read forward first
982        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        // Seek backward within buffer
988        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        // Read in small chunks
1001        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        // Read that spans exactly 2 buffers
1016        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        // Next read should get remaining data
1022        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        // Read, seek, read sequence
1035        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        // Seek to end
1079        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        // Seek from end with negative offset
1092        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        // Read some data
1106        let mut buf = [0; 5];
1107        reader.read(&mut buf).unwrap();
1108        assert_eq!(reader.position(), 5);
1109
1110        // Seek current by 0 (should be no-op)
1111        reader.seek(SeekFrom::Current(0)).unwrap();
1112        assert_eq!(reader.position(), 5);
1113
1114        // Should continue reading from same position
1115        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        // Seek to end
1137        reader.seek(SeekFrom::End(0)).unwrap();
1138
1139        // Try to read - should get 0 bytes
1140        let mut buf = [0; 10];
1141        let n = reader.read(&mut buf).unwrap();
1142        assert_eq!(n, 0);
1143
1144        // Seek back a bit
1145        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        // Test with minimal buffer pool
1154        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        // Read through multiple buffers with queue length of 1
1159        // This exercises the buffer return/acquire cycle
1160        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        // Test rapid successive seeks that might cause command queue issues
1170        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        // Rapid seeks without waiting for each to complete
1175        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        // Test seeks interspersed with reads
1188        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        // Read some data
1193        let mut buf = vec![0; 5];
1194        reader.read(&mut buf).unwrap();
1195        assert_eq!(buf, &[0, 1, 2, 3, 4]);
1196
1197        // Seek while we have a buffer
1198        reader.seek(SeekFrom::Start(50)).unwrap();
1199        reader.read(&mut buf).unwrap();
1200        assert_eq!(buf, &[50, 51, 52, 53, 54]);
1201
1202        // Read more, then seek again
1203        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        // Test multiple seeks in a row without reading
1212        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        // Chain seeks without reading
1217        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        // Now read to verify we're at the right position
1224        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        // Test rapid SeekFrom::Current operations
1232        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        // Rapid SeekFrom::Current operations
1237        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        // Test rapid SeekFrom::End operations
1251        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        // Multiple SeekFrom::End operations
1256        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        // Test interleaving reads and seeks
1268        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        // Test scenario where background thread is waiting for buffer during seek
1290        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        // Read to consume all buffers
1295        let mut buf = vec![0; 5];
1296        reader.read(&mut buf).unwrap();
1297
1298        // Seek - this should work even with queue length 1
1299        reader.seek(SeekFrom::Start(50)).unwrap();
1300
1301        // Read to verify seek worked
1302        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        // Test seek when we don't have a current buffer
1309        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        // Seek immediately without reading first (no buffer held)
1314        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        // Test dropping SmartBuf while background thread is processing
1324        // This should not deadlock - background thread should detect Stop command
1325        let data: Vec<u8> = (0..255).cycle().take(1000).collect();
1326        let cursor = Cursor::new(data);
1327
1328        // Create and immediately drop
1329        {
1330            let reader = SmartBuf::with_capacity(10, 2, cursor);
1331            drop(reader);
1332        }
1333        // If we get here, no deadlock occurred
1334    }
1335
1336    #[test]
1337    fn deadlock_test_drop_during_read() {
1338        // Test dropping while reading is in progress
1339        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        // Start reading
1344        let mut buf = vec![0; 5];
1345        reader.read(&mut buf).unwrap();
1346
1347        // Drop immediately after read
1348        drop(reader);
1349        // If we get here, no deadlock occurred
1350    }
1351
1352    #[test]
1353    fn deadlock_test_drop_during_seek() {
1354        // Test dropping while seek is in progress
1355        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        // Start seek
1360        reader.seek(SeekFrom::Start(50)).unwrap();
1361
1362        // Drop immediately after seek
1363        drop(reader);
1364        // If we get here, no deadlock occurred
1365    }
1366
1367    #[test]
1368    fn deadlock_test_stress_rapid_operations() {
1369        // Stress test with rapid operations
1370        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        // Mix of reads and seeks
1375        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        // Test seeking to the same position multiple times
1388        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        // Seek to same position multiple times
1393        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        // Test alternating forward and backward seeks
1405        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        // Alternate forward and backward
1410        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        // Test reading large amount that spans buffers after a seek
1424        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        // Seek to middle
1429        reader.seek(SeekFrom::Start(100)).unwrap();
1430
1431        // Read large amount that spans multiple buffers
1432        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        // Test seeking when we have a full buffer
1441        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        // Read to fill buffer
1446        let mut buf = vec![0; 10];
1447        reader.read(&mut buf).unwrap();
1448
1449        // Seek while we have a full buffer
1450        reader.seek(SeekFrom::Start(50)).unwrap();
1451
1452        // Read again
1453        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        // Test seeking when we have a partially read buffer
1460        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        // Read part of buffer
1465        let mut buf = vec![0; 5];
1466        reader.read(&mut buf).unwrap();
1467        assert_eq!(buf, &[0, 1, 2, 3, 4]);
1468
1469        // Seek while we have a partially read buffer
1470        reader.seek(SeekFrom::Start(50)).unwrap();
1471
1472        // Read again
1473        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        // Test multiple SeekFrom::Current operations in sequence
1480        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        // Chain SeekFrom::Current operations
1485        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        // Test seeking to end then to start
1498        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        // Test SeekFrom::Current with large negative value
1513        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        // Read forward
1518        reader.seek(SeekFrom::Start(50)).unwrap();
1519        let mut buf = vec![0; 5];
1520        reader.read(&mut buf).unwrap();
1521
1522        // Seek backward beyond current buffer
1523        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        // Test with minimal buffer size (1 byte)
1532        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        // Read and seek operations
1537        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        // Test scenario where all buffers are in use
1549        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        // Read through multiple buffers to ensure all are in use
1554        for _ in 0..10 {
1555            let mut buf = vec![0; 10];
1556            reader.read(&mut buf).unwrap();
1557        }
1558
1559        // Now seek - should still work
1560        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        // Test rapid SeekFrom::Current with forward and backward
1569        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        // Rapid forward and backward seeks
1574        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        // Test seeking after reaching EOF
1588        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        // Read to EOF
1593        let mut buf = vec![0; 100];
1594        reader.read(&mut buf).unwrap();
1595
1596        // Seek after EOF
1597        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        // Test with empty file
1605        let data: Vec<u8> = vec![];
1606        let cursor = Cursor::new(data);
1607        let mut reader = SmartBuf::with_capacity(10, 2, cursor);
1608
1609        // Read should return 0
1610        let mut buf = vec![0; 10];
1611        let n = reader.read(&mut buf).unwrap();
1612        assert_eq!(n, 0);
1613
1614        // Seek to start should work
1615        reader.seek(SeekFrom::Start(0)).unwrap();
1616        assert_eq!(reader.position(), 0);
1617
1618        // Read again should return 0
1619        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        // Test with buffer size larger than file size
1626        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        // Should read entire file in one buffer
1631        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        // Test seeking to exactly the end of file
1640        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        // Seek to end
1645        reader.seek(SeekFrom::Start(20)).unwrap();
1646        assert_eq!(reader.position(), 20);
1647
1648        // Read should return 0
1649        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        // Test seeking beyond file end
1657        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        // Seek beyond end
1662        reader.seek(SeekFrom::Start(50)).unwrap();
1663        assert_eq!(reader.position(), 50);
1664
1665        // Read should return 0 (EOF)
1666        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        // Test reading exactly buffer size
1674        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        // Read exactly one buffer
1679        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        // Next read should get next buffer
1685        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        // Test reading multiple times buffer size
1693        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        // Read exactly 5 buffers worth
1698        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        // Test SeekFrom::Current(0) - should be no-op
1707        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        // Read some
1712        let mut buf = vec![0; 5];
1713        reader.read(&mut buf).unwrap();
1714        assert_eq!(reader.position(), 5);
1715
1716        // Seek current by 0
1717        reader.seek(SeekFrom::Current(0)).unwrap();
1718        assert_eq!(reader.position(), 5);
1719
1720        // Should continue reading from same position
1721        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        // Test SeekFrom::Current with very large forward value
1728        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        // Test SeekFrom::Current with very large backward value
1743        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        // Move forward first
1748        reader.seek(SeekFrom::Start(100)).unwrap();
1749        assert_eq!(reader.position(), 100);
1750
1751        // Seek backward
1752        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        // Test SeekFrom::End with positive offset
1763        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        // Seek from end with positive offset (beyond end)
1768        let pos = reader.seek(SeekFrom::End(10)).unwrap();
1769        // The position should be file_size + offset = 20 + 10 = 30
1770        // The seek operation returns the actual position
1771        assert_eq!(pos, 30);
1772
1773        // Position should match what was returned
1774        assert_eq!(reader.position(), pos);
1775
1776        // Read should return 0 (EOF)
1777        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        // Test SeekFrom::End(-file_size) should go to start
1785        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        // Test SeekFrom::End with offset larger than file size
1800        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        // This should cause an error due to overflow
1805        assert!(reader.seek(SeekFrom::End(-100)).is_err());
1806    }
1807
1808    #[test]
1809    fn edge_case_position_tracking_through_multiple_operations() {
1810        // Test position tracking accuracy through complex operations
1811        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        // Read
1818        let mut buf = vec![0; 5];
1819        reader.read(&mut buf).unwrap();
1820        assert_eq!(reader.position(), 5);
1821
1822        // Seek
1823        reader.seek(SeekFrom::Start(20)).unwrap();
1824        assert_eq!(reader.position(), 20);
1825
1826        // Read
1827        reader.read(&mut buf).unwrap();
1828        assert_eq!(reader.position(), 25);
1829
1830        // Seek current
1831        reader.seek(SeekFrom::Current(-10)).unwrap();
1832        assert_eq!(reader.position(), 15);
1833
1834        // Read
1835        reader.read(&mut buf).unwrap();
1836        assert_eq!(reader.position(), 20);
1837    }
1838
1839    #[test]
1840    fn edge_case_read_zero_bytes() {
1841        // Test reading zero bytes
1842        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        // Read zero bytes should return 0 immediately
1847        let mut buf = vec![0; 0];
1848        let n = reader.read(&mut buf).unwrap();
1849        assert_eq!(n, 0);
1850
1851        // Position should not change
1852        assert_eq!(reader.position(), 0);
1853    }
1854
1855    #[test]
1856    fn edge_case_read_exact_insufficient_data() {
1857        // Test read_exact when there's insufficient data
1858        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        // Try to read more than available
1863        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        // Test read_exact with exact amount available
1871        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        // Read exact amount
1876        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        // Test seeking to same position repeatedly
1884        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        // Seek to same position multiple times
1889        for _ in 0..5 {
1890            reader.seek(SeekFrom::Start(10)).unwrap();
1891            assert_eq!(reader.position(), 10);
1892        }
1893
1894        // Should still read correctly
1895        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        // Test seeking within buffer multiple times
1903        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        // Read to fill buffer
1908        let mut buf = vec![0; 10];
1909        reader.read(&mut buf).unwrap();
1910
1911        // Seek within buffer multiple times
1912        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        // Should read from last seek position
1918        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        // Test read_to_end called multiple times
1925        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        // First read_to_end
1930        let mut result = Vec::new();
1931        reader.read_to_end(&mut result).unwrap();
1932        assert_eq!(result, data.clone());
1933
1934        // Second read_to_end should return empty
1935        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        // Test seeking after read_to_end
1943        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        // Read to end
1948        let mut result = Vec::new();
1949        reader.read_to_end(&mut result).unwrap();
1950
1951        // Seek back
1952        reader.seek(SeekFrom::Start(5)).unwrap();
1953
1954        // Should be able to read again
1955        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        // Test with very large queue length
1963        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        // Should work normally
1968        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        // Test with very small buffer size (1 byte)
1976        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        // Read should work
1981        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        // Test reading one byte at a time
1990        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        // Read one byte at a time
1995        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        // Test seeking then reading only part of buffer
2007        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        // Seek to middle
2012        reader.seek(SeekFrom::Start(10)).unwrap();
2013
2014        // Read only part of buffer
2015        let mut buf = vec![0; 3];
2016        reader.read(&mut buf).unwrap();
2017        assert_eq!(buf, &[10, 11, 12]);
2018
2019        // Seek again and read more
2020        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        // Test SeekFrom::Current at start of file
2028        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        // Seek from current at start
2033        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        // Test SeekFrom::Current with negative at start (should error)
2044        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        // Should error due to overflow
2049        assert!(reader.seek(SeekFrom::Current(-1)).is_err());
2050    }
2051
2052    #[test]
2053    fn edge_case_buffer_exactly_one_byte() {
2054        // Test with buffer size of 1 and queue length of 1
2055        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        // Should still work
2060        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        // Test SeekFrom::End(0) - should go to end
2068        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        // SeekFrom::End(0) should position at end of file
2073        let pos = reader.seek(SeekFrom::End(0)).unwrap();
2074        // The position should be file_size = 20
2075        assert_eq!(pos, 20);
2076        assert_eq!(reader.position(), 20);
2077
2078        // Read should return 0
2079        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        // Test reading after seeking to exact end
2087        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        // Read should return 0
2095        let mut buf = vec![0; 10];
2096        let n = reader.read(&mut buf).unwrap();
2097        assert_eq!(n, 0);
2098
2099        // Seek back and read should work
2100        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        // Unwrap to get the underlying reader back
2113        let reader = smart_buf.into_inner().unwrap();
2114
2115        // Verify we can use the reader again
2116        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        // Read some data
2130        let mut buf = vec![0; 10];
2131        smart_buf.read(&mut buf).unwrap();
2132        assert_eq!(&buf, &data[..10]);
2133
2134        // Unwrap to get the underlying reader back
2135        let reader = smart_buf.into_inner().unwrap();
2136
2137        // Verify we can create a new SmartBuf from the reader
2138        // Note: The reader's position might be at the end due to background buffering,
2139        // so we'll seek to start and read from there
2140        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}