Skip to main content

quiche/stream/
recv_buf.rs

1// Copyright (C) 2023, Cloudflare, Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright notice,
9//       this list of conditions and the following disclaimer.
10//
11//     * Redistributions in binary form must reproduce the above copyright
12//       notice, this list of conditions and the following disclaimer in the
13//       documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
19// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27use std::cmp;
28
29use std::collections::BTreeMap;
30use std::collections::VecDeque;
31
32use std::time::Duration;
33use std::time::Instant;
34
35use crate::stream::RecvAction;
36use crate::stream::RecvBufResetReturn;
37use crate::Error;
38use crate::Result;
39
40use crate::flowcontrol;
41
42use crate::range_buf::RangeBuf;
43
44/// Receive-side stream buffer.
45///
46/// Stream data received by the peer is buffered in a list of data chunks
47/// ordered by offset in ascending order. Contiguous data can then be read
48/// into a slice.
49#[derive(Debug, Default)]
50pub struct RecvBuf {
51    /// Chunks of data received from the peer that have not yet been read by
52    /// the application, ordered by offset.
53    data: BTreeMap<u64, RangeBuf>,
54
55    /// The lowest data offset that has yet to be read by the application.
56    off: u64,
57
58    /// The total length of data received on this stream.
59    len: u64,
60
61    /// Receiver flow controller.
62    flow_control: flowcontrol::FlowControl,
63
64    /// The final stream offset received from the peer, if any.
65    fin_off: Option<u64>,
66
67    /// The error code received via RESET_STREAM.
68    error: Option<u64>,
69
70    /// Whether incoming data is validated but not buffered.
71    drain: bool,
72}
73
74impl RecvBuf {
75    /// Creates a new receive buffer.
76    pub fn new(max_data: u64, initial_window: u64, max_window: u64) -> RecvBuf {
77        RecvBuf {
78            flow_control: flowcontrol::FlowControl::new(
79                max_data,
80                initial_window,
81                max_window,
82            ),
83            ..RecvBuf::default()
84        }
85    }
86
87    /// Inserts the given chunk of data in the buffer.
88    ///
89    /// This also takes care of enforcing stream flow control limits, as well
90    /// as handling incoming data that overlaps data that is already in the
91    /// buffer.
92    pub fn write(&mut self, mut buf: RangeBuf) -> Result<()> {
93        if buf.max_off() > self.max_data() {
94            return Err(Error::FlowControl);
95        }
96
97        if let Some(fin_off) = self.fin_off {
98            // Stream's size is known, forbid data beyond that point.
99            if buf.max_off() > fin_off {
100                return Err(Error::FinalSize);
101            }
102
103            // Stream's size is already known, forbid changing it.
104            if buf.fin() && fin_off != buf.max_off() {
105                return Err(Error::FinalSize);
106            }
107        }
108
109        // Stream's known size is lower than data already received.
110        if buf.fin() && buf.max_off() < self.len {
111            return Err(Error::FinalSize);
112        }
113
114        // We already saved the final offset, so there's nothing else we
115        // need to keep from the RangeBuf if it's empty.
116        if self.fin_off.is_some() && buf.is_empty() {
117            return Ok(());
118        }
119
120        let new_fin = buf.fin() && self.fin_off.is_none();
121
122        if new_fin {
123            self.fin_off = Some(buf.max_off());
124        }
125
126        // No need to store empty buffer that doesn't carry the fin flag, but
127        // its offset still advances the largest received offset used by flow
128        // control (RFC 9000 Section 19.8).
129        if !buf.fin() && buf.is_empty() {
130            self.len = cmp::max(self.len, buf.max_off());
131
132            if self.drain {
133                // we are not storing any data, off == len
134                self.off = self.len;
135            }
136
137            return Ok(());
138        }
139
140        // Discard consumed data unless it carries the first FIN. Such data is
141        // replaced with an empty buffer at the final size, so the application
142        // reads the FIN without receiving duplicate data and the queued buffer
143        // does not keep the duplicate payload alive.
144        if self.off >= buf.max_off() && !buf.is_empty() {
145            if !new_fin {
146                return Ok(());
147            }
148
149            buf = RangeBuf::from(b"", buf.max_off(), true);
150        }
151
152        let mut tmp_bufs = VecDeque::with_capacity(2);
153        tmp_bufs.push_back(buf);
154
155        'tmp: while let Some(mut buf) = tmp_bufs.pop_front() {
156            // Discard incoming data below current stream offset. Bytes up to
157            // `self.off` have already been received so we should not buffer
158            // them again. This is also important to make sure `ready()` doesn't
159            // get stuck when a buffer with lower offset than the stream's is
160            // buffered.
161            if self.off_front() > buf.off() {
162                buf = buf.split_off((self.off_front() - buf.off()) as usize);
163            }
164
165            // Handle overlapping data. If the incoming data's starting offset
166            // is above the previous maximum received offset, there is clearly
167            // no overlap so this logic can be skipped. However do still try to
168            // merge an empty final buffer (i.e. an empty buffer with the fin
169            // flag set, which is the only kind of empty buffer that should
170            // reach this point).
171            if buf.off() < self.max_off() || buf.is_empty() {
172                for (_, b) in self.data.range(buf.off()..) {
173                    let off = buf.off();
174
175                    // We are past the current buffer.
176                    if b.off() > buf.max_off() {
177                        break;
178                    }
179
180                    // New buffer is fully contained in existing buffer.
181                    if off >= b.off() && buf.max_off() <= b.max_off() {
182                        continue 'tmp;
183                    }
184
185                    // New buffer's start overlaps existing buffer.
186                    if off >= b.off() && off < b.max_off() {
187                        buf = buf.split_off((b.max_off() - off) as usize);
188                    }
189
190                    // New buffer's end overlaps existing buffer.
191                    if off < b.off() && buf.max_off() > b.off() {
192                        tmp_bufs
193                            .push_back(buf.split_off((b.off() - off) as usize));
194                    }
195                }
196            }
197
198            self.len = cmp::max(self.len, buf.max_off());
199
200            if !self.drain {
201                self.data.insert(buf.max_off(), buf);
202            } else {
203                // we are not storing any data, off == len
204                self.off = self.len;
205            }
206        }
207
208        Ok(())
209    }
210
211    /// Reads contiguous data from the receive buffer.
212    ///
213    /// Data is written into the given `out` buffer, up to the length of `out`.
214    ///
215    /// Only contiguous data is removed, starting from offset 0. The offset is
216    /// incremented as data is taken out of the receive buffer. If there is no
217    /// data at the expected read offset, the `Done` error is returned.
218    ///
219    /// On success the amount of data read and a flag indicating
220    /// if there is no more data in the buffer, are returned as a tuple.
221    #[inline]
222    pub fn emit(&mut self, mut out: &mut [u8]) -> Result<(usize, bool)> {
223        self.emit_or_discard(RecvAction::Emit { out: &mut out })
224    }
225
226    /// Reads or discards contiguous data from the receive buffer.
227    ///
228    /// Passing an `action` of `StreamRecvAction::Emit` results in data being
229    /// written into the provided buffer, up to its length.
230    ///
231    /// Passing an `action` of `StreamRecvAction::Discard` results in up to
232    /// the indicated number of bytes being discarded without copying.
233    ///
234    /// Only contiguous data is removed, starting from offset 0. The offset is
235    /// incremented as data is taken out of the receive buffer. If there is no
236    /// data at the expected read offset, the `Done` error is returned.
237    ///
238    /// On success the amount of data read or discarded, and a flag indicating
239    /// if there is no more data in the buffer, are returned as a tuple.
240    pub fn emit_or_discard<B: bytes::BufMut>(
241        &mut self, mut action: RecvAction<B>,
242    ) -> Result<(usize, bool)> {
243        let mut len = 0;
244        let mut cap = match &action {
245            RecvAction::Emit { out } => out.remaining_mut(),
246            RecvAction::Discard { len } => *len,
247        };
248
249        if !self.ready() {
250            return Err(Error::Done);
251        }
252
253        // The stream was reset, so clear its data and return the error code
254        // instead.
255        if let Some(e) = self.error {
256            self.data.clear();
257            return Err(Error::StreamReset(e));
258        }
259
260        while self.ready() {
261            let mut entry = match self.data.first_entry() {
262                Some(entry) => entry,
263                None => break,
264            };
265
266            let buf = entry.get_mut();
267
268            if cap == 0 && !buf.is_empty() {
269                break;
270            }
271
272            let buf_len = cmp::min(buf.len(), cap);
273
274            // Only copy data if we're emitting, not discarding.
275            if let RecvAction::Emit { ref mut out } = action {
276                // Note: `BufMut::remaining_mut()` cannot "shrink", but BufMut
277                // impls are allowed to grow the buffer, so we
278                // check here that we still have at least
279                // `cap` bytes, but we can't require equality
280                debug_assert!(
281                    cap <= out.remaining_mut(),
282                    "We updated `cap` incorrectly"
283                );
284                out.put_slice(&buf[..buf_len])
285            }
286
287            self.off += buf_len as u64;
288
289            len += buf_len;
290            cap -= buf_len;
291
292            if buf_len < buf.len() {
293                buf.consume(buf_len);
294
295                // We reached the maximum capacity, so end here.
296                break;
297            }
298
299            entry.remove();
300        }
301
302        // Update consumed bytes for flow control.
303        self.flow_control.add_consumed(len as u64);
304
305        Ok((len, self.is_fin()))
306    }
307
308    /// Resets the stream at the given offset.
309    pub fn reset(
310        &mut self, error_code: u64, final_size: u64,
311    ) -> Result<RecvBufResetReturn> {
312        // Stream's size is already known, forbid changing it.
313        if let Some(fin_off) = self.fin_off {
314            if fin_off != final_size {
315                return Err(Error::FinalSize);
316            }
317        }
318
319        // Stream's known size is lower than data already received.
320        if final_size < self.len {
321            return Err(Error::FinalSize);
322        }
323
324        if final_size > self.max_data() {
325            return Err(Error::FlowControl);
326        }
327
328        if self.error.is_some() {
329            // We already verified that the final size matches
330            return Ok(RecvBufResetReturn::zero());
331        }
332
333        // Calculate how many bytes need to be removed from the connection flow
334        // control.
335        let result = RecvBufResetReturn {
336            max_data_delta: final_size - self.len,
337            consumed_flowcontrol: final_size - self.off,
338        };
339
340        let notify = !self.drain && (!self.is_fin() || self.ready());
341
342        self.error = Some(error_code);
343        self.fin_off = Some(final_size);
344        self.len = final_size;
345
346        // Clear all data already buffered.
347        self.off = final_size;
348
349        self.data.clear();
350
351        // Preserve an unread terminal notification even if FIN already
352        // established the final size, but do not notify again after EOF.
353        if notify {
354            let buf = RangeBuf::from(b"", final_size, true);
355            self.data.insert(final_size, buf);
356        }
357
358        Ok(result)
359    }
360
361    /// Commits the new max_data limit.
362    pub fn update_max_data(&mut self, now: Instant) {
363        self.flow_control.update_max_data(now);
364    }
365
366    /// Return the new max_data limit.
367    pub fn max_data_next(&mut self) -> u64 {
368        self.flow_control.max_data_next()
369    }
370
371    /// Return the current flow control limit.
372    pub fn max_data(&self) -> u64 {
373        self.flow_control.max_data()
374    }
375
376    /// Return the current window.
377    pub fn window(&self) -> u64 {
378        self.flow_control.window()
379    }
380
381    /// Autotune the window size.
382    pub fn autotune_window(&mut self, now: Instant, rtt: Duration) {
383        self.flow_control.autotune_window(now, rtt);
384    }
385
386    /// Shuts down receiving data and returns the number of bytes
387    /// that should be returned to the connection level flow
388    /// control
389    pub fn shutdown(&mut self) -> Result<u64> {
390        if self.drain {
391            return Err(Error::Done);
392        }
393
394        self.drain = true;
395
396        self.data.clear();
397
398        let consumed = self.max_off() - self.off;
399        self.off = self.max_off();
400
401        Ok(consumed)
402    }
403
404    /// Returns the lowest offset of data buffered.
405    pub fn off_front(&self) -> u64 {
406        self.off
407    }
408
409    /// Returns true if we need to update the local flow control limit.
410    pub fn almost_full(&self) -> bool {
411        self.fin_off.is_none() && self.flow_control.should_update_max_data()
412    }
413
414    /// Returns the largest offset ever received.
415    pub fn max_off(&self) -> u64 {
416        self.len
417    }
418
419    /// Returns true if the receive-side of the stream is complete.
420    ///
421    /// This happens when the stream's receive final size is known, and the
422    /// application has read all data from the stream.
423    pub fn is_fin(&self) -> bool {
424        if self.fin_off == Some(self.off) {
425            return true;
426        }
427
428        false
429    }
430
431    /// Returns true if the stream is not storing incoming data.
432    pub fn is_draining(&self) -> bool {
433        self.drain
434    }
435
436    /// Returns true if the stream has data to be read.
437    pub fn ready(&self) -> bool {
438        let (_, buf) = match self.data.first_key_value() {
439            Some(v) => v,
440            None => return false,
441        };
442
443        buf.off() == self.off
444    }
445
446    /// Returns the number of bytes that can be read contiguously from the
447    /// current read offset, up to `max_len`.
448    ///
449    /// Data buffered behind a gap (received out of order) is not counted, so
450    /// this never reports bytes that are not yet readable. The cost is
451    /// proportional to the number of contiguous buffered chunks at the front
452    /// of the buffer, up to `max_len`; no data is copied.
453    pub fn readable_len(&self, max_len: usize) -> usize {
454        let mut contiguous = 0usize;
455        let mut next_off = self.off;
456
457        // `data` is ordered by offset, so walk from the front and stop at the
458        // first gap (a chunk that does not start where the contiguous run so
459        // far leaves off).
460        for buf in self.data.values() {
461            if buf.off() != next_off {
462                break;
463            }
464
465            contiguous = contiguous.saturating_add(buf.len()).min(max_len);
466            next_off = buf.max_off();
467
468            if contiguous == max_len {
469                break;
470            }
471        }
472
473        contiguous
474    }
475
476    #[cfg(test)]
477    pub(crate) fn flow_control_for_tests(&self) -> &flowcontrol::FlowControl {
478        &self.flow_control
479    }
480}
481
482#[cfg(test)]
483mod tests {
484    use super::*;
485
486    /// The default size of the receiver stream flow control window.
487    const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
488    use bytes::BufMut as _;
489    use rstest::rstest;
490
491    // Helper function for testing either buffer emit or discard.
492    //
493    // The `emit` parameter controls whether data is emitted or discarded from
494    // `recv`.
495    //
496    // The `target_len` parameter controls the maximum amount of bytes that
497    // could be read, up to the capacity of `recv`. The `result_len` is the
498    // actual number of bytes that were taken out of `recv`. An assert is
499    // performed on `result_len` to ensure the number of bytes read meets the
500    // caller expectations.
501    //
502    // The `is_fin` parameter relates to the buffer's finished status. An assert
503    // is performed on it to ensure the status meet the caller expectations.
504    //
505    // The `test_bytes` parameter carries an optional slice of bytes. Is set, an
506    // assert is performed against the bytes that were read out of the buffer,
507    // to ensure caller expectations are met.
508    fn assert_emit_discard(
509        recv: &mut RecvBuf, emit: bool, target_len: usize, result_len: usize,
510        is_fin: bool, test_bytes: Option<&[u8]>,
511    ) {
512        let mut buf = Vec::<u8>::with_capacity(512).limit(target_len);
513        let action = if emit {
514            RecvAction::Emit { out: &mut buf }
515        } else {
516            RecvAction::Discard { len: target_len }
517        };
518
519        let (read, fin) = recv.emit_or_discard(action).unwrap();
520
521        let buf = buf.into_inner();
522        if emit {
523            assert_eq!(buf.len(), read);
524            if let Some(v) = test_bytes {
525                assert_eq!(&buf, v);
526            }
527        }
528
529        assert_eq!(read, result_len);
530        assert_eq!(is_fin, fin);
531    }
532
533    // Helper function for testing buffer status for either emit or discard.
534    fn assert_emit_discard_done(recv: &mut RecvBuf, emit: bool) {
535        let mut buf = [0u8; 32];
536        let action = if emit {
537            RecvAction::Emit {
538                out: &mut buf.as_mut_slice(),
539            }
540        } else {
541            RecvAction::Discard { len: 32 }
542        };
543        assert_eq!(recv.emit_or_discard(action), Err(Error::Done));
544    }
545
546    #[rstest]
547    fn empty_read(#[values(true, false)] emit: bool) {
548        let mut recv =
549            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
550        assert_eq!(recv.len, 0);
551
552        assert_emit_discard_done(&mut recv, emit);
553    }
554
555    #[rstest]
556    fn empty_stream_frame(#[values(true, false)] emit: bool) {
557        let mut recv =
558            RecvBuf::new(15, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
559        assert_eq!(recv.len, 0);
560
561        let buf = RangeBuf::from(b"hello", 0, false);
562        assert!(recv.write(buf).is_ok());
563        assert_eq!(recv.len, 5);
564        assert_eq!(recv.off, 0);
565        assert_eq!(recv.data.len(), 1);
566
567        assert_emit_discard(&mut recv, emit, 32, 5, false, None);
568
569        // Don't store non-fin empty buffer, but track its offset.
570        let buf = RangeBuf::from(b"", 10, false);
571        assert!(recv.write(buf).is_ok());
572        assert_eq!(recv.len, 10);
573        assert_eq!(recv.off, 5);
574        assert_eq!(recv.data.len(), 0);
575
576        // Check flow control for empty buffer.
577        let buf = RangeBuf::from(b"", 16, false);
578        assert_eq!(recv.write(buf), Err(Error::FlowControl));
579
580        // A final size below the advanced largest offset is an error
581        // (RFC 9000 Section 4.5).
582        let buf = RangeBuf::from(b"", 5, true);
583        assert_eq!(recv.write(buf), Err(Error::FinalSize));
584
585        // Store fin empty buffer at the largest received offset.
586        let buf = RangeBuf::from(b"", 10, true);
587        assert!(recv.write(buf).is_ok());
588        assert_eq!(recv.len, 10);
589        assert_eq!(recv.off, 5);
590        assert_eq!(recv.data.len(), 1);
591
592        // Don't store additional fin empty buffers.
593        let buf = RangeBuf::from(b"", 10, true);
594        assert!(recv.write(buf).is_ok());
595        assert_eq!(recv.len, 10);
596        assert_eq!(recv.off, 5);
597        assert_eq!(recv.data.len(), 1);
598
599        // Accept another fin buffer with the same final size.
600        let buf = RangeBuf::from(b"aa", 8, true);
601        assert!(recv.write(buf).is_ok());
602        assert_eq!(recv.len, 10);
603        assert_eq!(recv.off, 5);
604        assert_eq!(recv.data.len(), 1);
605
606        // A fin buffer whose end disagrees with the known final size errors.
607        let buf = RangeBuf::from(b"aa", 3, true);
608        assert_eq!(recv.write(buf), Err(Error::FinalSize));
609
610        // Validate final size with fin empty buffers.
611        let buf = RangeBuf::from(b"", 11, true);
612        assert_eq!(recv.write(buf), Err(Error::FinalSize));
613        let buf = RangeBuf::from(b"", 9, true);
614        assert_eq!(recv.write(buf), Err(Error::FinalSize));
615
616        // The range (5..10) was never received, so the stream cannot reach
617        // its fin and nothing further is readable.
618        assert_emit_discard_done(&mut recv, emit);
619    }
620
621    #[rstest]
622    fn ordered_read(#[values(true, false)] emit: bool) {
623        let mut recv =
624            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
625        assert_eq!(recv.len, 0);
626
627        let first = RangeBuf::from(b"hello", 0, false);
628        let second = RangeBuf::from(b"world", 5, false);
629        let third = RangeBuf::from(b"something", 10, true);
630
631        assert!(recv.write(second).is_ok());
632        assert_eq!(recv.len, 10);
633        assert_eq!(recv.off, 0);
634
635        assert_emit_discard_done(&mut recv, emit);
636
637        assert!(recv.write(third).is_ok());
638        assert_eq!(recv.len, 19);
639        assert_eq!(recv.off, 0);
640
641        assert_emit_discard_done(&mut recv, emit);
642
643        assert!(recv.write(first).is_ok());
644        assert_eq!(recv.len, 19);
645        assert_eq!(recv.off, 0);
646
647        assert_emit_discard(
648            &mut recv,
649            emit,
650            32,
651            19,
652            true,
653            Some(b"helloworldsomething"),
654        );
655        assert_eq!(recv.len, 19);
656        assert_eq!(recv.off, 19);
657
658        assert_emit_discard_done(&mut recv, emit);
659    }
660
661    #[test]
662    /// `readable_len` counts only contiguous in-order data, up to its limit.
663    fn readable_len() {
664        let mut recv =
665            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
666
667        // Empty buffer: nothing readable.
668        assert_eq!(recv.readable_len(64 * 1024), 0);
669
670        // Data buffered behind a gap is not readable.
671        assert!(recv.write(RangeBuf::from(b"hello", 0, false)).is_ok());
672        assert!(recv.write(RangeBuf::from(b"something", 10, false)).is_ok());
673        assert_eq!(recv.readable_len(64 * 1024), 5);
674
675        // Filling the gap makes the full range readable, bounded by the limit.
676        assert!(recv.write(RangeBuf::from(b"world", 5, false)).is_ok());
677        assert_eq!(recv.readable_len(64 * 1024), 19);
678        assert_eq!(recv.readable_len(10), 10);
679    }
680
681    /// Test shutdown behavior
682    #[rstest]
683    fn shutdown(#[values(true, false)] emit: bool) {
684        let mut recv =
685            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
686        assert_eq!(recv.len, 0);
687
688        let first = RangeBuf::from(b"hello", 0, false);
689        let second = RangeBuf::from(b"world", 5, false);
690        let third = RangeBuf::from(b"something", 10, false);
691
692        assert!(recv.write(second).is_ok());
693        assert_eq!(recv.len, 10);
694        assert_eq!(recv.off, 0);
695
696        assert_emit_discard_done(&mut recv, emit);
697
698        // shutdown the buffer. Buffer is dropped.
699        assert_eq!(recv.shutdown(), Ok(10));
700        assert_eq!(recv.len, 10);
701        assert_eq!(recv.off, 10);
702        assert_eq!(recv.data.len(), 0);
703
704        assert_emit_discard_done(&mut recv, emit);
705
706        // subsequent writes are validated but not added to the buffer
707        assert!(recv.write(first).is_ok());
708        assert_eq!(recv.len, 10);
709        assert_eq!(recv.off, 10);
710        assert_eq!(recv.data.len(), 0);
711
712        // the max offset of received data can increase and
713        // the recv.off must increase with it
714        assert!(recv.write(third).is_ok());
715        assert_eq!(recv.len, 19);
716        assert_eq!(recv.off, 19);
717        assert_eq!(recv.data.len(), 0);
718
719        // Send a reset
720        assert_emit_discard_done(&mut recv, emit);
721        assert_eq!(
722            recv.reset(42, 123),
723            Ok(RecvBufResetReturn {
724                max_data_delta: 104,
725                consumed_flowcontrol: 104,
726            })
727        );
728        assert_eq!(recv.len, 123);
729        assert_eq!(recv.off, 123);
730        assert_eq!(recv.data.len(), 0);
731
732        assert_emit_discard_done(&mut recv, emit);
733    }
734
735    /// An empty non-fin buffer advances the largest received offset, which the
736    /// connection charges to flow control on arrival, so a draining stream must
737    /// consume it too and a later reset must not credit it again.
738    #[test]
739    fn shutdown_empty_stream_frame() {
740        let mut recv =
741            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
742
743        assert!(recv.write(RangeBuf::from(b"hello", 0, false)).is_ok());
744        assert_eq!(recv.shutdown(), Ok(5));
745
746        assert!(recv.write(RangeBuf::from(b"", 10, false)).is_ok());
747        assert_eq!(recv.len, 10);
748        assert_eq!(recv.off, 10);
749        assert_eq!(recv.data.len(), 0);
750
751        assert_eq!(
752            recv.reset(42, 10),
753            Ok(RecvBufResetReturn {
754                max_data_delta: 0,
755                consumed_flowcontrol: 0,
756            })
757        );
758    }
759
760    #[rstest]
761    fn reset_after_fin(
762        #[values("unread", "partial", "gap", "empty", "consumed", "draining")]
763        state: &str,
764    ) {
765        let mut recv =
766            RecvBuf::new(15, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
767        let mut out = [0; 5];
768        let (data, offset) = if state == "gap" {
769            (b"llo".as_slice(), 2)
770        } else {
771            (b"hello".as_slice(), 0)
772        };
773        recv.write(RangeBuf::from(data, offset, state != "empty"))
774            .unwrap();
775
776        match state {
777            "partial" => assert_eq!(recv.emit(&mut out[..2]), Ok((2, false))),
778            "consumed" => assert_eq!(recv.emit(&mut out), Ok((5, true))),
779            "empty" => {
780                assert_eq!(recv.emit(&mut out), Ok((5, false)));
781                recv.write(RangeBuf::from(b"", 5, true)).unwrap();
782            },
783            "draining" => assert_eq!(recv.shutdown(), Ok(5)),
784            _ => (),
785        }
786
787        let consumed = 5 - recv.off_front();
788        assert_eq!(
789            recv.reset(42, 5),
790            Ok(RecvBufResetReturn {
791                max_data_delta: 0,
792                consumed_flowcontrol: consumed,
793            })
794        );
795        assert!(recv.is_fin());
796        assert_eq!(recv.max_off(), 5);
797        assert_eq!(recv.ready(), state != "consumed" && state != "draining");
798        if recv.ready() {
799            assert_eq!(recv.emit(&mut out), Err(Error::StreamReset(42)));
800        }
801        assert_eq!(recv.emit(&mut out), Err(Error::Done));
802        assert_eq!(recv.reset(42, 5), Ok(RecvBufResetReturn::zero()));
803        recv.write(RangeBuf::from(b"hello", 0, true)).unwrap();
804        assert!(!recv.ready());
805    }
806
807    #[rstest]
808    fn duplicate_data_first_fin(#[values(true, false)] drain: bool) {
809        let mut recv =
810            RecvBuf::new(15, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
811        let mut out = [0; 5];
812        recv.write(RangeBuf::from(b"hello", 0, false)).unwrap();
813        assert_eq!(recv.emit(&mut out), Ok((5, false)));
814        if drain {
815            assert_eq!(recv.shutdown(), Ok(0));
816        }
817
818        recv.write(RangeBuf::from(b"hello", 0, false)).unwrap();
819        assert!(!recv.ready());
820        recv.write(RangeBuf::from(b"hello", 0, true)).unwrap();
821        assert!(recv.is_fin());
822        assert_eq!(recv.ready(), !drain);
823        assert!(recv.data.values().all(|buf| buf.data.as_ref().is_empty()));
824        if !drain {
825            assert_eq!(recv.emit(&mut out), Ok((0, true)));
826        }
827
828        recv.write(RangeBuf::from(b"hello", 0, true)).unwrap();
829        recv.write(RangeBuf::from(b"", 5, true)).unwrap();
830        assert!(!recv.ready());
831        assert_eq!(recv.emit(&mut out), Err(Error::Done));
832    }
833
834    #[rstest]
835    fn split_read(#[values(true, false)] emit: bool) {
836        let mut recv =
837            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
838        assert_eq!(recv.len, 0);
839
840        let first = RangeBuf::from(b"something", 0, false);
841        let second = RangeBuf::from(b"helloworld", 9, true);
842
843        assert!(recv.write(first).is_ok());
844        assert_eq!(recv.len, 9);
845        assert_eq!(recv.off, 0);
846
847        assert!(recv.write(second).is_ok());
848        assert_eq!(recv.len, 19);
849        assert_eq!(recv.off, 0);
850
851        assert_emit_discard(&mut recv, emit, 10, 10, false, Some(b"somethingh"));
852        assert_eq!(recv.len, 19);
853        assert_eq!(recv.off, 10);
854
855        assert_emit_discard(&mut recv, emit, 5, 5, false, Some(b"ellow"));
856        assert_eq!(recv.len, 19);
857        assert_eq!(recv.off, 15);
858
859        assert_emit_discard(&mut recv, emit, 5, 4, true, Some(b"orld"));
860        assert_eq!(recv.len, 19);
861        assert_eq!(recv.off, 19);
862    }
863
864    #[test]
865    fn split_read_incremental_buf() {
866        let mut recv =
867            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
868        assert_eq!(recv.len, 0);
869
870        let first = RangeBuf::from(b"something", 0, false);
871        let second = RangeBuf::from(b"helloworld", 9, true);
872
873        assert!(recv.write(first).is_ok());
874        assert_eq!(recv.len, 9);
875        assert_eq!(recv.off, 0);
876
877        assert!(recv.write(second).is_ok());
878        assert_eq!(recv.len, 19);
879        assert_eq!(recv.off, 0);
880
881        let mut buf = Vec::new().limit(10);
882        assert_eq!(
883            recv.emit_or_discard(RecvAction::Emit { out: &mut buf }),
884            Ok((10, false))
885        );
886        assert_eq!(recv.len, 19);
887        assert_eq!(recv.off, 10);
888        assert_eq!(buf.get_ref().len(), 10);
889        assert_eq!(buf.get_ref().as_slice(), b"somethingh");
890
891        buf.set_limit(5);
892        assert_eq!(
893            recv.emit_or_discard(RecvAction::Emit { out: &mut buf }),
894            Ok((5, false))
895        );
896        assert_eq!(recv.len, 19);
897        assert_eq!(recv.off, 15);
898        assert_eq!(buf.get_ref().len(), 15);
899        assert_eq!(buf.get_ref().as_slice(), b"somethinghellow");
900
901        buf.set_limit(42);
902        assert_eq!(
903            recv.emit_or_discard(RecvAction::Emit { out: &mut buf }),
904            Ok((4, true))
905        );
906        assert_eq!(recv.len, 19);
907        assert_eq!(recv.off, 19);
908        assert_eq!(buf.get_ref().len(), 19);
909        assert_eq!(buf.get_ref().as_slice(), b"somethinghelloworld");
910    }
911
912    #[rstest]
913    fn incomplete_read(#[values(true, false)] emit: bool) {
914        let mut recv =
915            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
916        assert_eq!(recv.len, 0);
917
918        let mut buf = [0u8; 32];
919
920        let first = RangeBuf::from(b"something", 0, false);
921        let second = RangeBuf::from(b"helloworld", 9, true);
922
923        assert!(recv.write(second).is_ok());
924        assert_eq!(recv.len, 19);
925        assert_eq!(recv.off, 0);
926
927        let action = if emit {
928            RecvAction::Emit {
929                out: &mut buf.as_mut_slice(),
930            }
931        } else {
932            RecvAction::Discard { len: 32 }
933        };
934        assert_eq!(recv.emit_or_discard(action), Err(Error::Done));
935
936        assert!(recv.write(first).is_ok());
937        assert_eq!(recv.len, 19);
938        assert_eq!(recv.off, 0);
939
940        assert_emit_discard(
941            &mut recv,
942            emit,
943            32,
944            19,
945            true,
946            Some(b"somethinghelloworld"),
947        );
948        assert_eq!(recv.len, 19);
949        assert_eq!(recv.off, 19);
950    }
951
952    #[rstest]
953    fn zero_len_read(#[values(true, false)] emit: bool) {
954        let mut recv =
955            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
956        assert_eq!(recv.len, 0);
957
958        let first = RangeBuf::from(b"something", 0, false);
959        let second = RangeBuf::from(b"", 9, true);
960
961        assert!(recv.write(first).is_ok());
962        assert_eq!(recv.len, 9);
963        assert_eq!(recv.off, 0);
964        assert_eq!(recv.data.len(), 1);
965
966        assert!(recv.write(second).is_ok());
967        assert_eq!(recv.len, 9);
968        assert_eq!(recv.off, 0);
969        assert_eq!(recv.data.len(), 1);
970
971        assert_emit_discard(&mut recv, emit, 32, 9, true, Some(b"something"));
972        assert_eq!(recv.len, 9);
973        assert_eq!(recv.off, 9);
974    }
975
976    #[rstest]
977    fn past_read(#[values(true, false)] emit: bool) {
978        let mut recv =
979            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
980        assert_eq!(recv.len, 0);
981
982        let first = RangeBuf::from(b"something", 0, false);
983        let second = RangeBuf::from(b"hello", 3, false);
984        let third = RangeBuf::from(b"ello", 4, true);
985        let fourth = RangeBuf::from(b"ello", 5, true);
986
987        assert!(recv.write(first).is_ok());
988        assert_eq!(recv.len, 9);
989        assert_eq!(recv.off, 0);
990        assert_eq!(recv.data.len(), 1);
991
992        assert_emit_discard(&mut recv, emit, 32, 9, false, Some(b"something"));
993        assert_eq!(recv.len, 9);
994        assert_eq!(recv.off, 9);
995
996        assert!(recv.write(second).is_ok());
997        assert_eq!(recv.len, 9);
998        assert_eq!(recv.off, 9);
999        assert_eq!(recv.data.len(), 0);
1000
1001        assert_eq!(recv.write(third), Err(Error::FinalSize));
1002
1003        assert!(recv.write(fourth).is_ok());
1004        assert_eq!(recv.len, 9);
1005        assert_eq!(recv.off, 9);
1006        assert_eq!(recv.data.len(), 1);
1007
1008        assert_emit_discard(&mut recv, emit, 32, 0, true, Some(b""));
1009        assert_emit_discard_done(&mut recv, emit);
1010    }
1011
1012    #[rstest]
1013    fn fully_overlapping_read(#[values(true, false)] emit: bool) {
1014        let mut recv =
1015            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1016        assert_eq!(recv.len, 0);
1017
1018        let first = RangeBuf::from(b"something", 0, false);
1019        let second = RangeBuf::from(b"hello", 4, false);
1020
1021        assert!(recv.write(first).is_ok());
1022        assert_eq!(recv.len, 9);
1023        assert_eq!(recv.off, 0);
1024        assert_eq!(recv.data.len(), 1);
1025
1026        assert!(recv.write(second).is_ok());
1027        assert_eq!(recv.len, 9);
1028        assert_eq!(recv.off, 0);
1029        assert_eq!(recv.data.len(), 1);
1030
1031        assert_emit_discard(&mut recv, emit, 32, 9, false, Some(b"something"));
1032        assert_eq!(recv.len, 9);
1033        assert_eq!(recv.off, 9);
1034        assert_eq!(recv.data.len(), 0);
1035
1036        assert_emit_discard_done(&mut recv, emit);
1037    }
1038
1039    #[rstest]
1040    fn fully_overlapping_read2(#[values(true, false)] emit: bool) {
1041        let mut recv =
1042            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1043        assert_eq!(recv.len, 0);
1044
1045        let first = RangeBuf::from(b"something", 0, false);
1046        let second = RangeBuf::from(b"hello", 4, false);
1047
1048        assert!(recv.write(second).is_ok());
1049        assert_eq!(recv.len, 9);
1050        assert_eq!(recv.off, 0);
1051        assert_eq!(recv.data.len(), 1);
1052
1053        assert!(recv.write(first).is_ok());
1054        assert_eq!(recv.len, 9);
1055        assert_eq!(recv.off, 0);
1056        assert_eq!(recv.data.len(), 2);
1057
1058        assert_emit_discard(&mut recv, emit, 32, 9, false, Some(b"somehello"));
1059        assert_eq!(recv.len, 9);
1060        assert_eq!(recv.off, 9);
1061        assert_eq!(recv.data.len(), 0);
1062
1063        assert_emit_discard_done(&mut recv, emit);
1064    }
1065
1066    #[rstest]
1067    fn fully_overlapping_read3(#[values(true, false)] emit: bool) {
1068        let mut recv =
1069            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1070        assert_eq!(recv.len, 0);
1071
1072        let first = RangeBuf::from(b"something", 0, false);
1073        let second = RangeBuf::from(b"hello", 3, false);
1074
1075        assert!(recv.write(second).is_ok());
1076        assert_eq!(recv.len, 8);
1077        assert_eq!(recv.off, 0);
1078        assert_eq!(recv.data.len(), 1);
1079
1080        assert!(recv.write(first).is_ok());
1081        assert_eq!(recv.len, 9);
1082        assert_eq!(recv.off, 0);
1083        assert_eq!(recv.data.len(), 3);
1084
1085        assert_emit_discard(&mut recv, emit, 32, 9, false, Some(b"somhellog"));
1086        assert_eq!(recv.len, 9);
1087        assert_eq!(recv.off, 9);
1088        assert_eq!(recv.data.len(), 0);
1089
1090        assert_emit_discard_done(&mut recv, emit);
1091    }
1092
1093    #[rstest]
1094    fn fully_overlapping_read_multi(#[values(true, false)] emit: bool) {
1095        let mut recv =
1096            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1097        assert_eq!(recv.len, 0);
1098
1099        let first = RangeBuf::from(b"somethingsomething", 0, false);
1100        let second = RangeBuf::from(b"hello", 3, false);
1101        let third = RangeBuf::from(b"hello", 12, false);
1102
1103        assert!(recv.write(second).is_ok());
1104        assert_eq!(recv.len, 8);
1105        assert_eq!(recv.off, 0);
1106        assert_eq!(recv.data.len(), 1);
1107
1108        assert!(recv.write(third).is_ok());
1109        assert_eq!(recv.len, 17);
1110        assert_eq!(recv.off, 0);
1111        assert_eq!(recv.data.len(), 2);
1112
1113        assert!(recv.write(first).is_ok());
1114        assert_eq!(recv.len, 18);
1115        assert_eq!(recv.off, 0);
1116        assert_eq!(recv.data.len(), 5);
1117
1118        assert_emit_discard(
1119            &mut recv,
1120            emit,
1121            32,
1122            18,
1123            false,
1124            Some(b"somhellogsomhellog"),
1125        );
1126        assert_eq!(recv.len, 18);
1127        assert_eq!(recv.off, 18);
1128        assert_eq!(recv.data.len(), 0);
1129
1130        assert_emit_discard_done(&mut recv, emit);
1131    }
1132
1133    #[rstest]
1134    fn overlapping_start_read(#[values(true, false)] emit: bool) {
1135        let mut recv =
1136            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1137        assert_eq!(recv.len, 0);
1138
1139        let first = RangeBuf::from(b"something", 0, false);
1140        let second = RangeBuf::from(b"hello", 8, true);
1141
1142        assert!(recv.write(first).is_ok());
1143        assert_eq!(recv.len, 9);
1144        assert_eq!(recv.off, 0);
1145        assert_eq!(recv.data.len(), 1);
1146
1147        assert!(recv.write(second).is_ok());
1148        assert_eq!(recv.len, 13);
1149        assert_eq!(recv.off, 0);
1150        assert_eq!(recv.data.len(), 2);
1151
1152        assert_emit_discard(
1153            &mut recv,
1154            emit,
1155            32,
1156            13,
1157            true,
1158            Some(b"somethingello"),
1159        );
1160
1161        assert_eq!(recv.len, 13);
1162        assert_eq!(recv.off, 13);
1163
1164        assert_emit_discard_done(&mut recv, emit);
1165    }
1166
1167    #[rstest]
1168    fn overlapping_end_read(#[values(true, false)] emit: bool) {
1169        let mut recv =
1170            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1171        assert_eq!(recv.len, 0);
1172
1173        let first = RangeBuf::from(b"hello", 0, false);
1174        let second = RangeBuf::from(b"something", 3, true);
1175
1176        assert!(recv.write(second).is_ok());
1177        assert_eq!(recv.len, 12);
1178        assert_eq!(recv.off, 0);
1179        assert_eq!(recv.data.len(), 1);
1180
1181        assert!(recv.write(first).is_ok());
1182        assert_eq!(recv.len, 12);
1183        assert_eq!(recv.off, 0);
1184        assert_eq!(recv.data.len(), 2);
1185
1186        assert_emit_discard(&mut recv, emit, 32, 12, true, Some(b"helsomething"));
1187        assert_eq!(recv.len, 12);
1188        assert_eq!(recv.off, 12);
1189
1190        assert_emit_discard_done(&mut recv, emit);
1191    }
1192
1193    #[rstest]
1194    fn overlapping_end_twice_read(#[values(true, false)] emit: bool) {
1195        let mut recv =
1196            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1197        assert_eq!(recv.len, 0);
1198
1199        let first = RangeBuf::from(b"he", 0, false);
1200        let second = RangeBuf::from(b"ow", 4, false);
1201        let third = RangeBuf::from(b"rl", 7, false);
1202        let fourth = RangeBuf::from(b"helloworld", 0, true);
1203
1204        assert!(recv.write(third).is_ok());
1205        assert_eq!(recv.len, 9);
1206        assert_eq!(recv.off, 0);
1207        assert_eq!(recv.data.len(), 1);
1208
1209        assert!(recv.write(second).is_ok());
1210        assert_eq!(recv.len, 9);
1211        assert_eq!(recv.off, 0);
1212        assert_eq!(recv.data.len(), 2);
1213
1214        assert!(recv.write(first).is_ok());
1215        assert_eq!(recv.len, 9);
1216        assert_eq!(recv.off, 0);
1217        assert_eq!(recv.data.len(), 3);
1218
1219        assert!(recv.write(fourth).is_ok());
1220        assert_eq!(recv.len, 10);
1221        assert_eq!(recv.off, 0);
1222        assert_eq!(recv.data.len(), 6);
1223
1224        assert_emit_discard(&mut recv, emit, 32, 10, true, Some(b"helloworld"));
1225        assert_eq!(recv.len, 10);
1226        assert_eq!(recv.off, 10);
1227
1228        assert_emit_discard_done(&mut recv, emit);
1229    }
1230
1231    #[rstest]
1232    fn overlapping_end_twice_and_contained_read(
1233        #[values(true, false)] emit: bool,
1234    ) {
1235        let mut recv =
1236            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1237        assert_eq!(recv.len, 0);
1238
1239        let first = RangeBuf::from(b"hellow", 0, false);
1240        let second = RangeBuf::from(b"barfoo", 10, true);
1241        let third = RangeBuf::from(b"rl", 7, false);
1242        let fourth = RangeBuf::from(b"elloworldbarfoo", 1, true);
1243
1244        assert!(recv.write(third).is_ok());
1245        assert_eq!(recv.len, 9);
1246        assert_eq!(recv.off, 0);
1247        assert_eq!(recv.data.len(), 1);
1248
1249        assert!(recv.write(second).is_ok());
1250        assert_eq!(recv.len, 16);
1251        assert_eq!(recv.off, 0);
1252        assert_eq!(recv.data.len(), 2);
1253
1254        assert!(recv.write(first).is_ok());
1255        assert_eq!(recv.len, 16);
1256        assert_eq!(recv.off, 0);
1257        assert_eq!(recv.data.len(), 3);
1258
1259        assert!(recv.write(fourth).is_ok());
1260        assert_eq!(recv.len, 16);
1261        assert_eq!(recv.off, 0);
1262        assert_eq!(recv.data.len(), 5);
1263
1264        assert_emit_discard(
1265            &mut recv,
1266            emit,
1267            32,
1268            16,
1269            true,
1270            Some(b"helloworldbarfoo"),
1271        );
1272        assert_eq!(recv.len, 16);
1273        assert_eq!(recv.off, 16);
1274
1275        assert_emit_discard_done(&mut recv, emit);
1276    }
1277
1278    #[rstest]
1279    fn partially_multi_overlapping_reordered_read(
1280        #[values(true, false)] emit: bool,
1281    ) {
1282        let mut recv =
1283            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1284        assert_eq!(recv.len, 0);
1285
1286        let first = RangeBuf::from(b"hello", 8, false);
1287        let second = RangeBuf::from(b"something", 0, false);
1288        let third = RangeBuf::from(b"moar", 11, true);
1289
1290        assert!(recv.write(first).is_ok());
1291        assert_eq!(recv.len, 13);
1292        assert_eq!(recv.off, 0);
1293        assert_eq!(recv.data.len(), 1);
1294
1295        assert!(recv.write(second).is_ok());
1296        assert_eq!(recv.len, 13);
1297        assert_eq!(recv.off, 0);
1298        assert_eq!(recv.data.len(), 2);
1299
1300        assert!(recv.write(third).is_ok());
1301        assert_eq!(recv.len, 15);
1302        assert_eq!(recv.off, 0);
1303        assert_eq!(recv.data.len(), 3);
1304
1305        assert_emit_discard(
1306            &mut recv,
1307            emit,
1308            32,
1309            15,
1310            true,
1311            Some(b"somethinhelloar"),
1312        );
1313        assert_eq!(recv.len, 15);
1314        assert_eq!(recv.off, 15);
1315        assert_eq!(recv.data.len(), 0);
1316
1317        assert_emit_discard_done(&mut recv, emit);
1318    }
1319
1320    #[rstest]
1321    fn partially_multi_overlapping_reordered_read2(
1322        #[values(true, false)] emit: bool,
1323    ) {
1324        let mut recv =
1325            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1326        assert_eq!(recv.len, 0);
1327
1328        let first = RangeBuf::from(b"aaa", 0, false);
1329        let second = RangeBuf::from(b"bbb", 2, false);
1330        let third = RangeBuf::from(b"ccc", 4, false);
1331        let fourth = RangeBuf::from(b"ddd", 6, false);
1332        let fifth = RangeBuf::from(b"eee", 9, false);
1333        let sixth = RangeBuf::from(b"fff", 11, false);
1334
1335        assert!(recv.write(second).is_ok());
1336        assert_eq!(recv.len, 5);
1337        assert_eq!(recv.off, 0);
1338        assert_eq!(recv.data.len(), 1);
1339
1340        assert!(recv.write(fourth).is_ok());
1341        assert_eq!(recv.len, 9);
1342        assert_eq!(recv.off, 0);
1343        assert_eq!(recv.data.len(), 2);
1344
1345        assert!(recv.write(third).is_ok());
1346        assert_eq!(recv.len, 9);
1347        assert_eq!(recv.off, 0);
1348        assert_eq!(recv.data.len(), 3);
1349
1350        assert!(recv.write(first).is_ok());
1351        assert_eq!(recv.len, 9);
1352        assert_eq!(recv.off, 0);
1353        assert_eq!(recv.data.len(), 4);
1354
1355        assert!(recv.write(sixth).is_ok());
1356        assert_eq!(recv.len, 14);
1357        assert_eq!(recv.off, 0);
1358        assert_eq!(recv.data.len(), 5);
1359
1360        assert!(recv.write(fifth).is_ok());
1361        assert_eq!(recv.len, 14);
1362        assert_eq!(recv.off, 0);
1363        assert_eq!(recv.data.len(), 6);
1364
1365        assert_emit_discard(
1366            &mut recv,
1367            emit,
1368            32,
1369            14,
1370            false,
1371            Some(b"aabbbcdddeefff"),
1372        );
1373        assert_eq!(recv.len, 14);
1374        assert_eq!(recv.off, 14);
1375        assert_eq!(recv.data.len(), 0);
1376
1377        assert_emit_discard_done(&mut recv, emit);
1378    }
1379
1380    #[test]
1381    fn mixed_read_actions() {
1382        let mut recv =
1383            RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
1384        assert_eq!(recv.len, 0);
1385
1386        let first = RangeBuf::from(b"hello", 0, false);
1387        let second = RangeBuf::from(b"world", 5, false);
1388        let third = RangeBuf::from(b"something", 10, true);
1389
1390        assert!(recv.write(second).is_ok());
1391        assert_eq!(recv.len, 10);
1392        assert_eq!(recv.off, 0);
1393
1394        assert_emit_discard_done(&mut recv, true);
1395        assert_emit_discard_done(&mut recv, false);
1396
1397        assert!(recv.write(third).is_ok());
1398        assert_eq!(recv.len, 19);
1399        assert_eq!(recv.off, 0);
1400
1401        assert_emit_discard_done(&mut recv, true);
1402        assert_emit_discard_done(&mut recv, false);
1403
1404        assert!(recv.write(first).is_ok());
1405        assert_eq!(recv.len, 19);
1406        assert_eq!(recv.off, 0);
1407
1408        assert_emit_discard(&mut recv, true, 5, 5, false, Some(b"hello"));
1409        assert_eq!(recv.len, 19);
1410        assert_eq!(recv.off, 5);
1411
1412        assert_emit_discard(&mut recv, false, 5, 5, false, None);
1413        assert_eq!(recv.len, 19);
1414        assert_eq!(recv.off, 10);
1415
1416        assert_emit_discard(&mut recv, true, 9, 9, true, Some(b"something"));
1417        assert_eq!(recv.len, 19);
1418        assert_eq!(recv.off, 19);
1419
1420        assert_emit_discard_done(&mut recv, true);
1421        assert_emit_discard_done(&mut recv, false);
1422    }
1423}