1use 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#[derive(Debug, Default)]
50pub struct RecvBuf {
51 data: BTreeMap<u64, RangeBuf>,
54
55 off: u64,
57
58 len: u64,
60
61 flow_control: flowcontrol::FlowControl,
63
64 fin_off: Option<u64>,
66
67 error: Option<u64>,
69
70 drain: bool,
72}
73
74impl RecvBuf {
75 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 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 if buf.max_off() > fin_off {
100 return Err(Error::FinalSize);
101 }
102
103 if buf.fin() && fin_off != buf.max_off() {
105 return Err(Error::FinalSize);
106 }
107 }
108
109 if buf.fin() && buf.max_off() < self.len {
111 return Err(Error::FinalSize);
112 }
113
114 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 if !buf.fin() && buf.is_empty() {
130 self.len = cmp::max(self.len, buf.max_off());
131
132 if self.drain {
133 self.off = self.len;
135 }
136
137 return Ok(());
138 }
139
140 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 if self.off_front() > buf.off() {
162 buf = buf.split_off((self.off_front() - buf.off()) as usize);
163 }
164
165 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 if b.off() > buf.max_off() {
177 break;
178 }
179
180 if off >= b.off() && buf.max_off() <= b.max_off() {
182 continue 'tmp;
183 }
184
185 if off >= b.off() && off < b.max_off() {
187 buf = buf.split_off((b.max_off() - off) as usize);
188 }
189
190 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 self.off = self.len;
205 }
206 }
207
208 Ok(())
209 }
210
211 #[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 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 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 if let RecvAction::Emit { ref mut out } = action {
276 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 break;
297 }
298
299 entry.remove();
300 }
301
302 self.flow_control.add_consumed(len as u64);
304
305 Ok((len, self.is_fin()))
306 }
307
308 pub fn reset(
310 &mut self, error_code: u64, final_size: u64,
311 ) -> Result<RecvBufResetReturn> {
312 if let Some(fin_off) = self.fin_off {
314 if fin_off != final_size {
315 return Err(Error::FinalSize);
316 }
317 }
318
319 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 return Ok(RecvBufResetReturn::zero());
331 }
332
333 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 self.off = final_size;
348
349 self.data.clear();
350
351 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 pub fn update_max_data(&mut self, now: Instant) {
363 self.flow_control.update_max_data(now);
364 }
365
366 pub fn max_data_next(&mut self) -> u64 {
368 self.flow_control.max_data_next()
369 }
370
371 pub fn max_data(&self) -> u64 {
373 self.flow_control.max_data()
374 }
375
376 pub fn window(&self) -> u64 {
378 self.flow_control.window()
379 }
380
381 pub fn autotune_window(&mut self, now: Instant, rtt: Duration) {
383 self.flow_control.autotune_window(now, rtt);
384 }
385
386 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 pub fn off_front(&self) -> u64 {
406 self.off
407 }
408
409 pub fn almost_full(&self) -> bool {
411 self.fin_off.is_none() && self.flow_control.should_update_max_data()
412 }
413
414 pub fn max_off(&self) -> u64 {
416 self.len
417 }
418
419 pub fn is_fin(&self) -> bool {
424 if self.fin_off == Some(self.off) {
425 return true;
426 }
427
428 false
429 }
430
431 pub fn is_draining(&self) -> bool {
433 self.drain
434 }
435
436 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 pub fn readable_len(&self, max_len: usize) -> usize {
454 let mut contiguous = 0usize;
455 let mut next_off = self.off;
456
457 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 const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
488 use bytes::BufMut as _;
489 use rstest::rstest;
490
491 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 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 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 let buf = RangeBuf::from(b"", 16, false);
578 assert_eq!(recv.write(buf), Err(Error::FlowControl));
579
580 let buf = RangeBuf::from(b"", 5, true);
583 assert_eq!(recv.write(buf), Err(Error::FinalSize));
584
585 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 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 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 let buf = RangeBuf::from(b"aa", 3, true);
608 assert_eq!(recv.write(buf), Err(Error::FinalSize));
609
610 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 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 fn readable_len() {
664 let mut recv =
665 RecvBuf::new(u64::MAX, DEFAULT_STREAM_WINDOW, DEFAULT_STREAM_WINDOW);
666
667 assert_eq!(recv.readable_len(64 * 1024), 0);
669
670 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 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 #[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 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 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 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 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 #[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}