1use std::cmp;
28
29use std::sync::Arc;
30
31use std::collections::hash_map;
32use std::collections::HashMap;
33use std::collections::HashSet;
34
35use intrusive_collections::intrusive_adapter;
36use intrusive_collections::KeyAdapter;
37use intrusive_collections::RBTree;
38use intrusive_collections::RBTreeAtomicLink;
39
40use smallvec::SmallVec;
41
42use crate::buffers::DefaultBufFactory;
43use crate::BufFactory;
44use crate::Error;
45use crate::Result;
46
47const DEFAULT_URGENCY: u8 = 127;
48
49pub const MAX_STREAM_WINDOW: u64 = 16 * 1024 * 1024;
51
52#[derive(Default)]
57pub struct StreamIdHasher {
58 id: u64,
59}
60
61#[derive(Debug, PartialEq, Clone, Copy)]
63pub struct RecvBufResetReturn {
64 pub max_data_delta: u64,
67
68 pub consumed_flowcontrol: u64,
71}
72
73impl RecvBufResetReturn {
74 pub fn zero() -> Self {
75 Self {
76 max_data_delta: 0,
77 consumed_flowcontrol: 0,
78 }
79 }
80}
81
82pub enum RecvAction<T: bytes::BufMut> {
84 Emit { out: T },
86 Discard { len: usize },
88}
89
90impl std::hash::Hasher for StreamIdHasher {
91 #[inline]
92 fn finish(&self) -> u64 {
93 self.id
94 }
95
96 #[inline]
97 fn write_u64(&mut self, id: u64) {
98 self.id = id;
99 }
100
101 #[inline]
102 fn write(&mut self, _: &[u8]) {
103 unimplemented!()
106 }
107}
108
109type BuildStreamIdHasher = std::hash::BuildHasherDefault<StreamIdHasher>;
110
111pub type StreamIdHashMap<V> = HashMap<u64, V, BuildStreamIdHasher>;
112pub type StreamIdHashSet = HashSet<u64, BuildStreamIdHasher>;
113
114#[derive(Default)]
116pub struct StreamMap<F: BufFactory = DefaultBufFactory> {
117 streams: StreamIdHashMap<Stream<F>>,
119
120 collected: StreamIdHashSet,
126
127 peer_max_streams_bidi: u64,
129
130 peer_max_streams_uni: u64,
132
133 peer_opened_streams_bidi: u64,
135
136 peer_opened_streams_uni: u64,
138
139 local_max_streams_bidi: u64,
141 local_max_streams_bidi_next: u64,
142
143 initial_max_streams_bidi: u64,
145
146 local_max_streams_uni: u64,
148 local_max_streams_uni_next: u64,
149
150 initial_max_streams_uni: u64,
152
153 local_opened_streams_bidi: u64,
155
156 local_opened_streams_uni: u64,
158
159 flushable: RBTree<StreamFlushablePriorityAdapter>,
163
164 pub readable: RBTree<StreamReadablePriorityAdapter>,
168
169 pub writable: RBTree<StreamWritablePriorityAdapter>,
174
175 almost_full: StreamIdHashSet,
180
181 blocked: StreamIdHashMap<u64>,
185
186 reset: StreamIdHashMap<(u64, u64)>,
190
191 stopped: StreamIdHashMap<u64>,
195
196 max_stream_window: u64,
198
199 tx_buffered: usize,
201}
202
203impl<F: BufFactory> StreamMap<F> {
204 pub fn new(
205 max_streams_bidi: u64, max_streams_uni: u64, max_stream_window: u64,
206 ) -> Self {
207 StreamMap {
208 local_max_streams_bidi: max_streams_bidi,
209 local_max_streams_bidi_next: max_streams_bidi,
210 initial_max_streams_bidi: max_streams_bidi,
211
212 local_max_streams_uni: max_streams_uni,
213 local_max_streams_uni_next: max_streams_uni,
214 initial_max_streams_uni: max_streams_uni,
215
216 max_stream_window,
217
218 ..StreamMap::default()
219 }
220 }
221
222 pub fn get(&self, id: u64) -> Option<&Stream<F>> {
224 self.streams.get(&id)
225 }
226
227 pub fn get_mut(&mut self, id: u64) -> Option<&mut Stream<F>> {
229 self.streams.get_mut(&id)
230 }
231
232 pub(crate) fn get_or_create(
245 &mut self, id: u64, local_params: &crate::TransportParams,
246 peer_params: &crate::TransportParams, local: bool, is_server: bool,
247 ) -> Result<&mut Stream<F>> {
248 let (stream, is_new_and_writable) = match self.streams.entry(id) {
249 hash_map::Entry::Vacant(v) => {
250 if self.collected.contains(&id) {
252 return Err(Error::Done);
253 }
254
255 if local != is_local(id, is_server) {
256 return Err(Error::InvalidStreamState(id));
257 }
258
259 let (max_rx_data, max_tx_data) = match (local, is_bidi(id)) {
260 (true, true) => (
262 local_params.initial_max_stream_data_bidi_local,
263 peer_params.initial_max_stream_data_bidi_remote,
264 ),
265
266 (true, false) => (0, peer_params.initial_max_stream_data_uni),
268
269 (false, true) => (
271 local_params.initial_max_stream_data_bidi_remote,
272 peer_params.initial_max_stream_data_bidi_local,
273 ),
274
275 (false, false) =>
277 (local_params.initial_max_stream_data_uni, 0),
278 };
279
280 let stream_sequence = id >> 2;
284
285 match (is_local(id, is_server), is_bidi(id)) {
287 (true, true) => {
288 let n = cmp::max(
289 self.local_opened_streams_bidi,
290 stream_sequence + 1,
291 );
292
293 if n > self.peer_max_streams_bidi {
294 return Err(Error::StreamLimit);
295 }
296
297 self.local_opened_streams_bidi = n;
298 },
299
300 (true, false) => {
301 let n = cmp::max(
302 self.local_opened_streams_uni,
303 stream_sequence + 1,
304 );
305
306 if n > self.peer_max_streams_uni {
307 return Err(Error::StreamLimit);
308 }
309
310 self.local_opened_streams_uni = n;
311 },
312
313 (false, true) => {
314 let n = cmp::max(
315 self.peer_opened_streams_bidi,
316 stream_sequence + 1,
317 );
318
319 if n > self.local_max_streams_bidi {
320 return Err(Error::StreamLimit);
321 }
322
323 self.peer_opened_streams_bidi = n;
324 },
325
326 (false, false) => {
327 let n = cmp::max(
328 self.peer_opened_streams_uni,
329 stream_sequence + 1,
330 );
331
332 if n > self.local_max_streams_uni {
333 return Err(Error::StreamLimit);
334 }
335
336 self.peer_opened_streams_uni = n;
337 },
338 };
339
340 let initial_window = max_rx_data;
341 let s = Stream::new(
342 id,
343 max_rx_data,
344 max_tx_data,
345 local,
346 initial_window,
347 self.max_stream_window,
348 );
349
350 let is_writable = s.is_writable();
351
352 (v.insert(s), is_writable)
353 },
354
355 hash_map::Entry::Occupied(v) => (v.into_mut(), false),
356 };
357
358 if is_new_and_writable {
361 self.writable.insert(Arc::clone(&stream.priority_key));
362 }
363
364 Ok(stream)
365 }
366
367 pub fn insert_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
371 if !priority_key.readable.is_linked() {
372 self.readable.insert(Arc::clone(priority_key));
373 }
374 }
375
376 pub fn remove_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
378 if !priority_key.readable.is_linked() {
379 return;
380 }
381
382 let mut c = {
383 let ptr = Arc::as_ptr(priority_key);
384 unsafe { self.readable.cursor_mut_from_ptr(ptr) }
385 };
386
387 c.remove();
388 }
389
390 pub fn insert_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
397 if !priority_key.writable.is_linked() {
398 self.writable.insert(Arc::clone(priority_key));
399 }
400 }
401
402 pub fn remove_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
407 if !priority_key.writable.is_linked() {
408 return;
409 }
410
411 let mut c = {
412 let ptr = Arc::as_ptr(priority_key);
413 unsafe { self.writable.cursor_mut_from_ptr(ptr) }
414 };
415
416 c.remove();
417 }
418
419 pub fn insert_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
423 if !priority_key.flushable.is_linked() {
424 self.flushable.insert(Arc::clone(priority_key));
425 }
426 }
427
428 pub fn remove_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
430 if !priority_key.flushable.is_linked() {
431 return;
432 }
433
434 let mut c = {
435 let ptr = Arc::as_ptr(priority_key);
436 unsafe { self.flushable.cursor_mut_from_ptr(ptr) }
437 };
438
439 c.remove();
440 }
441
442 pub fn peek_flushable(&self) -> Option<Arc<StreamPriorityKey>> {
443 self.flushable.front().clone_pointer()
444 }
445
446 pub fn update_priority(
448 &mut self, old: &Arc<StreamPriorityKey>, new: &Arc<StreamPriorityKey>,
449 ) {
450 if old.readable.is_linked() {
451 self.remove_readable(old);
452 self.readable.insert(Arc::clone(new));
453 }
454
455 if old.writable.is_linked() {
456 self.remove_writable(old);
457 self.writable.insert(Arc::clone(new));
458 }
459
460 if old.flushable.is_linked() {
461 self.remove_flushable(old);
462 self.flushable.insert(Arc::clone(new));
463 }
464 }
465
466 pub fn insert_almost_full(&mut self, stream_id: u64) {
470 self.almost_full.insert(stream_id);
471 }
472
473 pub fn remove_almost_full(&mut self, stream_id: u64) {
475 self.almost_full.remove(&stream_id);
476 }
477
478 pub fn insert_blocked(&mut self, stream_id: u64, off: u64) {
483 self.blocked.insert(stream_id, off);
484 }
485
486 pub fn remove_blocked(&mut self, stream_id: u64) {
488 self.blocked.remove(&stream_id);
489 }
490
491 pub fn insert_reset(
496 &mut self, stream_id: u64, error_code: u64, final_size: u64,
497 ) {
498 self.reset.insert(stream_id, (error_code, final_size));
499 }
500
501 pub fn remove_reset(&mut self, stream_id: u64) {
503 self.reset.remove(&stream_id);
504 }
505
506 pub fn insert_stopped(&mut self, stream_id: u64, error_code: u64) {
511 self.stopped.insert(stream_id, error_code);
512 }
513
514 pub fn remove_stopped(&mut self, stream_id: u64) {
516 self.stopped.remove(&stream_id);
517 }
518
519 pub fn update_peer_max_streams_bidi(&mut self, v: u64) {
521 self.peer_max_streams_bidi = cmp::max(self.peer_max_streams_bidi, v);
522 }
523
524 pub fn update_peer_max_streams_uni(&mut self, v: u64) {
526 self.peer_max_streams_uni = cmp::max(self.peer_max_streams_uni, v);
527 }
528
529 pub fn update_max_streams_bidi(&mut self) {
531 self.local_max_streams_bidi = self.local_max_streams_bidi_next;
532 }
533
534 pub fn set_max_streams_bidi(&mut self, max: u64) {
536 self.local_max_streams_bidi = max;
537 self.local_max_streams_bidi_next = max;
538 self.initial_max_streams_bidi = max;
539 }
540
541 pub fn max_streams_bidi(&self) -> u64 {
543 self.local_max_streams_bidi
544 }
545
546 pub fn max_streams_bidi_next(&mut self) -> u64 {
548 self.local_max_streams_bidi_next
549 }
550
551 pub fn update_max_streams_uni(&mut self) {
553 self.local_max_streams_uni = self.local_max_streams_uni_next;
554 }
555
556 pub fn max_streams_uni_next(&mut self) -> u64 {
558 self.local_max_streams_uni_next
559 }
560
561 pub fn peer_max_streams_bidi(&self) -> u64 {
563 self.peer_max_streams_bidi
564 }
565
566 pub fn peer_streams_left_bidi(&self) -> u64 {
569 self.peer_max_streams_bidi - self.local_opened_streams_bidi
570 }
571
572 pub fn peer_max_streams_uni(&self) -> u64 {
574 self.peer_max_streams_uni
575 }
576
577 pub fn peer_streams_left_uni(&self) -> u64 {
580 self.peer_max_streams_uni - self.local_opened_streams_uni
581 }
582
583 pub fn collect(&mut self, stream_id: u64, local: bool) {
588 if !local {
589 if is_bidi(stream_id) {
592 self.local_max_streams_bidi_next =
593 self.local_max_streams_bidi_next.saturating_add(1);
594 } else {
595 self.local_max_streams_uni_next =
596 self.local_max_streams_uni_next.saturating_add(1);
597 }
598 }
599
600 let s = self.streams.remove(&stream_id).unwrap();
601
602 self.remove_readable(&s.priority_key);
603
604 self.remove_writable(&s.priority_key);
605
606 self.remove_flushable(&s.priority_key);
607
608 self.collected.insert(stream_id);
609 }
610
611 pub fn readable(&self) -> StreamIter {
613 StreamIter {
614 streams: self.readable.iter().map(|s| s.id).collect(),
615 index: 0,
616 }
617 }
618
619 pub fn writable(&self) -> StreamIter {
621 StreamIter {
622 streams: self.writable.iter().map(|s| s.id).collect(),
623 index: 0,
624 }
625 }
626
627 pub fn almost_full(&self) -> StreamIter {
629 StreamIter::from(&self.almost_full)
630 }
631
632 pub fn blocked(&self) -> hash_map::Iter<'_, u64, u64> {
634 self.blocked.iter()
635 }
636
637 pub fn reset(&self) -> hash_map::Iter<'_, u64, (u64, u64)> {
639 self.reset.iter()
640 }
641
642 pub fn stopped(&self) -> hash_map::Iter<'_, u64, u64> {
644 self.stopped.iter()
645 }
646
647 pub fn is_collected(&self, stream_id: u64) -> bool {
649 self.collected.contains(&stream_id)
650 }
651
652 pub fn has_flushable(&self) -> bool {
654 !self.flushable.is_empty()
655 }
656
657 pub fn has_readable(&self) -> bool {
659 !self.readable.is_empty()
660 }
661
662 pub fn has_almost_full(&self) -> bool {
665 !self.almost_full.is_empty()
666 }
667
668 pub fn has_blocked(&self) -> bool {
670 !self.blocked.is_empty()
671 }
672
673 pub fn has_reset(&self) -> bool {
675 !self.reset.is_empty()
676 }
677
678 pub fn has_stopped(&self) -> bool {
680 !self.stopped.is_empty()
681 }
682
683 pub fn should_update_max_streams_bidi(&self) -> bool {
689 let available = self
690 .local_max_streams_bidi
691 .saturating_sub(self.peer_opened_streams_bidi);
692 self.local_max_streams_bidi_next != self.local_max_streams_bidi &&
693 available <= self.initial_max_streams_bidi / 2
694 }
695
696 pub fn should_update_max_streams_uni(&self) -> bool {
702 let available = self
703 .local_max_streams_uni
704 .saturating_sub(self.peer_opened_streams_uni);
705 self.local_max_streams_uni_next != self.local_max_streams_uni &&
706 available <= self.initial_max_streams_uni / 2
707 }
708
709 #[cfg(test)]
711 pub fn len(&self) -> usize {
712 self.streams.len()
713 }
714
715 pub(crate) fn tx_buffered(&self) -> usize {
717 self.tx_buffered
718 }
719
720 fn tx_buffered_actual(&self) -> usize {
724 self.streams
725 .values()
726 .map(|s| s.send.buffered_bytes() as usize)
727 .sum()
728 }
729
730 pub(crate) fn tx_buffered_is_consistent(&self) -> bool {
733 self.tx_buffered == self.tx_buffered_actual()
734 }
735
736 pub(crate) fn add_tx_buffered(&mut self, delta: usize) {
738 self.tx_buffered += delta;
739
740 #[cfg(debug_assertions)]
741 self.debug_check_tx_buffered_consistency();
742 }
743
744 pub(crate) fn sub_tx_buffered(&mut self, delta: usize) {
746 debug_assert!(self.tx_buffered >= delta);
747 self.tx_buffered = self.tx_buffered.saturating_sub(delta);
748
749 #[cfg(debug_assertions)]
750 self.debug_check_tx_buffered_consistency();
751 }
752
753 #[cfg(debug_assertions)]
757 pub(crate) fn debug_check_tx_buffered_consistency(&self) {
758 if !self.tx_buffered_is_consistent() {
759 let buffered_per_stream = self
760 .streams
761 .iter()
762 .map(|(id, s)| (*id, s.send.buffered_bytes()))
763 .collect::<Vec<_>>();
764
765 let actual = self.tx_buffered_actual();
766 let stored = self.tx_buffered;
767 panic!(
768 "tx_buffered mismatch: stored={}, actual={}, diff={}, buffered_per_stream={:?}",
769 stored,
770 actual,
771 stored as i64 - actual as i64,
772 buffered_per_stream
773 );
774 }
775 }
776}
777
778pub struct Stream<F: BufFactory = DefaultBufFactory> {
780 pub recv: recv_buf::RecvBuf,
782
783 pub send: send_buf::SendBuf<F>,
785
786 pub send_lowat: usize,
787
788 pub bidi: bool,
790
791 pub local: bool,
793
794 pub urgency: u8,
796
797 pub incremental: bool,
799
800 pub priority_key: Arc<StreamPriorityKey>,
801}
802
803impl<F: BufFactory> Stream<F> {
804 pub fn new(
806 id: u64, max_rx_data: u64, max_tx_data: u64, local: bool,
807 initial_window: u64, max_window: u64,
808 ) -> Self {
809 let priority_key = Arc::new(StreamPriorityKey {
810 id,
811 ..Default::default()
812 });
813
814 Stream {
815 recv: recv_buf::RecvBuf::new(max_rx_data, initial_window, max_window),
816 send: send_buf::SendBuf::new(max_tx_data),
817 send_lowat: 1,
818 bidi: is_bidi(id),
819 local,
820 urgency: priority_key.urgency,
821 incremental: priority_key.incremental,
822 priority_key,
823 }
824 }
825
826 pub fn is_readable(&self) -> bool {
828 self.recv.ready()
829 }
830
831 pub fn is_writable(&self) -> bool {
834 !self.send.is_shutdown() &&
835 !self.send.is_fin() &&
836 (self.send.off_back() + self.send_lowat as u64) <
837 self.send.max_off()
838 }
839
840 pub fn is_flushable(&self) -> bool {
843 let off_front = self.send.off_front();
844
845 !self.send.is_empty() &&
846 off_front < self.send.off_back() &&
847 off_front < self.send.max_off()
848 }
849
850 pub fn is_complete(&self) -> bool {
860 match (self.bidi, self.local) {
861 (true, _) => self.recv.is_fin() && self.send.is_complete(),
864
865 (false, true) => self.send.is_complete(),
868
869 (false, false) => self.recv.is_fin(),
872 }
873 }
874}
875
876pub fn is_local(stream_id: u64, is_server: bool) -> bool {
878 (stream_id & 0x1) == (is_server as u64)
879}
880
881pub fn is_bidi(stream_id: u64) -> bool {
883 (stream_id & 0x2) == 0
884}
885
886#[derive(Clone, Debug)]
887pub struct StreamPriorityKey {
888 pub urgency: u8,
889 pub incremental: bool,
890 pub id: u64,
891
892 pub readable: RBTreeAtomicLink,
893 pub writable: RBTreeAtomicLink,
894 pub flushable: RBTreeAtomicLink,
895}
896
897impl Default for StreamPriorityKey {
898 fn default() -> Self {
899 Self {
900 urgency: DEFAULT_URGENCY,
901 incremental: true,
902 id: Default::default(),
903 readable: Default::default(),
904 writable: Default::default(),
905 flushable: Default::default(),
906 }
907 }
908}
909
910impl PartialEq for StreamPriorityKey {
911 fn eq(&self, other: &Self) -> bool {
912 self.id == other.id
913 }
914}
915
916impl Eq for StreamPriorityKey {}
917
918impl PartialOrd for StreamPriorityKey {
919 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
920 Some(self.cmp(other))
921 }
922}
923
924impl Ord for StreamPriorityKey {
925 fn cmp(&self, other: &Self) -> cmp::Ordering {
926 if self.id == other.id {
928 return cmp::Ordering::Equal;
929 }
930
931 if self.urgency != other.urgency {
933 return self.urgency.cmp(&other.urgency);
934 }
935
936 if !self.incremental && !other.incremental {
939 return self.id.cmp(&other.id);
940 }
941
942 if self.incremental && !other.incremental {
944 return cmp::Ordering::Greater;
945 }
946 if !self.incremental && other.incremental {
947 return cmp::Ordering::Less;
948 }
949
950 cmp::Ordering::Greater
954 }
955}
956
957intrusive_adapter!(pub StreamWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { writable: RBTreeAtomicLink });
958
959impl KeyAdapter<'_> for StreamWritablePriorityAdapter {
960 type Key = StreamPriorityKey;
961
962 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
963 s.clone()
964 }
965}
966
967intrusive_adapter!(pub StreamReadablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { readable: RBTreeAtomicLink });
968
969impl KeyAdapter<'_> for StreamReadablePriorityAdapter {
970 type Key = StreamPriorityKey;
971
972 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
973 s.clone()
974 }
975}
976
977intrusive_adapter!(pub StreamFlushablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { flushable: RBTreeAtomicLink });
978
979impl KeyAdapter<'_> for StreamFlushablePriorityAdapter {
980 type Key = StreamPriorityKey;
981
982 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
983 s.clone()
984 }
985}
986
987#[derive(Default)]
989pub struct StreamIter {
990 streams: SmallVec<[u64; 8]>,
991 index: usize,
992}
993
994impl StreamIter {
995 #[inline]
996 fn from(streams: &StreamIdHashSet) -> Self {
997 StreamIter {
998 streams: streams.iter().copied().collect(),
999 index: 0,
1000 }
1001 }
1002}
1003
1004impl Iterator for StreamIter {
1005 type Item = u64;
1006
1007 #[inline]
1008 fn next(&mut self) -> Option<Self::Item> {
1009 let v = self.streams.get(self.index)?;
1010 self.index += 1;
1011 Some(*v)
1012 }
1013}
1014
1015impl ExactSizeIterator for StreamIter {
1016 #[inline]
1017 fn len(&self) -> usize {
1018 self.streams.len() - self.index
1019 }
1020}
1021
1022#[cfg(test)]
1023mod tests {
1024 use crate::range_buf::RangeBuf;
1025
1026 use super::*;
1027
1028 const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
1030
1031 #[test]
1032 fn recv_flow_control() {
1033 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1034 assert!(!stream.recv.almost_full());
1035
1036 let mut buf = [0; 32];
1037
1038 let first = RangeBuf::from(b"hello", 0, false);
1039 let second = RangeBuf::from(b"world", 5, false);
1040 let third = RangeBuf::from(b"something", 10, false);
1041
1042 assert_eq!(stream.recv.write(second), Ok(()));
1043 assert_eq!(stream.recv.write(first), Ok(()));
1044 assert!(!stream.recv.almost_full());
1045
1046 assert_eq!(stream.recv.write(third), Err(Error::FlowControl));
1047
1048 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1049 assert_eq!(&buf[..len], b"helloworld");
1050 assert!(!fin);
1051
1052 assert!(stream.recv.almost_full());
1053
1054 stream.recv.update_max_data(std::time::Instant::now());
1055 assert_eq!(stream.recv.max_data_next(), 25);
1056 assert!(!stream.recv.almost_full());
1057
1058 let third = RangeBuf::from(b"something", 10, false);
1059 assert_eq!(stream.recv.write(third), Ok(()));
1060 }
1061
1062 #[test]
1063 fn recv_past_fin() {
1064 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1065 assert!(!stream.recv.almost_full());
1066
1067 let first = RangeBuf::from(b"hello", 0, true);
1068 let second = RangeBuf::from(b"world", 5, false);
1069
1070 assert_eq!(stream.recv.write(first), Ok(()));
1071 assert_eq!(stream.recv.write(second), Err(Error::FinalSize));
1072 }
1073
1074 #[test]
1075 fn recv_fin_dup() {
1076 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1077 assert!(!stream.recv.almost_full());
1078
1079 let first = RangeBuf::from(b"hello", 0, true);
1080 let second = RangeBuf::from(b"hello", 0, true);
1081
1082 assert_eq!(stream.recv.write(first), Ok(()));
1083 assert_eq!(stream.recv.write(second), Ok(()));
1084
1085 let mut buf = [0; 32];
1086
1087 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1088 assert_eq!(&buf[..len], b"hello");
1089 assert!(fin);
1090 }
1091
1092 #[test]
1093 fn recv_fin_change() {
1094 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1095 assert!(!stream.recv.almost_full());
1096
1097 let first = RangeBuf::from(b"hello", 0, true);
1098 let second = RangeBuf::from(b"world", 5, true);
1099
1100 assert_eq!(stream.recv.write(second), Ok(()));
1101 assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1102 }
1103
1104 #[test]
1105 fn recv_fin_lower_than_received() {
1106 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1107 assert!(!stream.recv.almost_full());
1108
1109 let first = RangeBuf::from(b"hello", 0, true);
1110 let second = RangeBuf::from(b"world", 5, false);
1111
1112 assert_eq!(stream.recv.write(second), Ok(()));
1113 assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1114 }
1115
1116 #[test]
1117 fn recv_fin_flow_control() {
1118 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1119 assert!(!stream.recv.almost_full());
1120
1121 let mut buf = [0; 32];
1122
1123 let first = RangeBuf::from(b"hello", 0, false);
1124 let second = RangeBuf::from(b"world", 5, true);
1125
1126 assert_eq!(stream.recv.write(first), Ok(()));
1127 assert_eq!(stream.recv.write(second), Ok(()));
1128
1129 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1130 assert_eq!(&buf[..len], b"helloworld");
1131 assert!(fin);
1132
1133 assert!(!stream.recv.almost_full());
1134 }
1135
1136 #[test]
1137 fn recv_fin_reset_mismatch() {
1138 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1139 assert!(!stream.recv.almost_full());
1140
1141 let first = RangeBuf::from(b"hello", 0, true);
1142
1143 assert_eq!(stream.recv.write(first), Ok(()));
1144 assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1145 }
1146
1147 #[test]
1148 fn recv_reset_with_gap() {
1149 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1150 assert!(!stream.recv.almost_full());
1151
1152 let first = RangeBuf::from(b"hello", 0, false);
1153
1154 assert_eq!(stream.recv.write(first), Ok(()));
1155 assert_eq!(stream.recv.emit(&mut [0; 1]), Ok((1, false)));
1157 assert_eq!(
1159 stream.recv.reset(0, 10),
1160 Ok(RecvBufResetReturn {
1161 max_data_delta: 5,
1162 consumed_flowcontrol: 9
1164 })
1165 );
1166 assert_eq!(stream.recv.reset(0, 10), Ok(RecvBufResetReturn::zero()));
1167 }
1168
1169 #[test]
1170 fn recv_reset_dup() {
1171 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1172 assert!(!stream.recv.almost_full());
1173
1174 let first = RangeBuf::from(b"hello", 0, false);
1175
1176 assert_eq!(stream.recv.write(first), Ok(()));
1177 assert_eq!(
1178 stream.recv.reset(0, 5),
1179 Ok(RecvBufResetReturn {
1180 max_data_delta: 0,
1181 consumed_flowcontrol: 5
1182 })
1183 );
1184 assert_eq!(stream.recv.reset(0, 5), Ok(RecvBufResetReturn::zero()));
1185 }
1186
1187 #[test]
1188 fn recv_reset_change() {
1189 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1190 assert!(!stream.recv.almost_full());
1191
1192 let first = RangeBuf::from(b"hello", 0, false);
1193
1194 assert_eq!(stream.recv.write(first), Ok(()));
1195 assert_eq!(
1196 stream.recv.reset(0, 5),
1197 Ok(RecvBufResetReturn {
1198 max_data_delta: 0,
1199 consumed_flowcontrol: 5
1200 })
1201 );
1202 assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1203 }
1204
1205 #[test]
1206 fn recv_reset_lower_than_received() {
1207 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1208 assert!(!stream.recv.almost_full());
1209
1210 let first = RangeBuf::from(b"hello", 0, false);
1211
1212 assert_eq!(stream.recv.write(first), Ok(()));
1213 assert_eq!(stream.recv.reset(0, 4), Err(Error::FinalSize));
1214 }
1215
1216 #[test]
1217 fn send_flow_control() {
1218 let mut buf = [0; 25];
1219
1220 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1221
1222 let first = b"hello";
1223 let second = b"world";
1224 let third = b"something";
1225
1226 assert!(stream.send.write(first, false).is_ok());
1227 assert!(stream.send.write(second, false).is_ok());
1228 assert!(stream.send.write(third, false).is_ok());
1229
1230 assert_eq!(stream.send.off_front(), 0);
1231
1232 let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1233 assert_eq!(written, 15);
1234 assert!(!fin);
1235 assert_eq!(&buf[..written], b"helloworldsomet");
1236
1237 assert_eq!(stream.send.off_front(), 15);
1238
1239 let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1240 assert_eq!(written, 0);
1241 assert!(!fin);
1242 assert_eq!(&buf[..written], b"");
1243
1244 stream.send.retransmit(0, 15);
1245
1246 assert_eq!(stream.send.off_front(), 0);
1247
1248 let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1249 assert_eq!(written, 10);
1250 assert!(!fin);
1251 assert_eq!(&buf[..written], b"helloworld");
1252
1253 assert_eq!(stream.send.off_front(), 10);
1254
1255 let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1256 assert_eq!(written, 5);
1257 assert!(!fin);
1258 assert_eq!(&buf[..written], b"somet");
1259 }
1260
1261 #[test]
1262 fn send_past_fin() {
1263 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1264
1265 let first = b"hello";
1266 let second = b"world";
1267 let third = b"third";
1268
1269 assert_eq!(stream.send.write(first, false), Ok(5));
1270
1271 assert_eq!(stream.send.write(second, true), Ok(5));
1272 assert!(stream.send.is_fin());
1273
1274 assert_eq!(stream.send.write(third, false), Err(Error::FinalSize));
1275 }
1276
1277 #[test]
1278 fn send_fin_dup() {
1279 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1280
1281 assert_eq!(stream.send.write(b"hello", true), Ok(5));
1282 assert!(stream.send.is_fin());
1283
1284 assert_eq!(stream.send.write(b"", true), Ok(0));
1285 assert!(stream.send.is_fin());
1286 }
1287
1288 #[test]
1289 fn send_undo_fin() {
1290 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1291
1292 assert_eq!(stream.send.write(b"hello", true), Ok(5));
1293 assert!(stream.send.is_fin());
1294
1295 assert_eq!(
1296 stream.send.write(b"helloworld", true),
1297 Err(Error::FinalSize)
1298 );
1299 }
1300
1301 #[test]
1302 fn send_fin_max_data_match() {
1303 let mut buf = [0; 15];
1304
1305 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1306
1307 let slice = b"hellohellohello";
1308
1309 assert!(stream.send.write(slice, true).is_ok());
1310
1311 let (written, fin) = stream.send.emit(&mut buf[..15]).unwrap();
1312 assert_eq!(written, 15);
1313 assert!(fin);
1314 assert_eq!(&buf[..written], slice);
1315 }
1316
1317 #[test]
1318 fn send_fin_zero_length() {
1319 let mut buf = [0; 5];
1320
1321 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1322
1323 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1324 assert_eq!(stream.send.write(b"", true), Ok(0));
1325 assert!(stream.send.is_fin());
1326
1327 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1328 assert_eq!(written, 5);
1329 assert!(fin);
1330 assert_eq!(&buf[..written], b"hello");
1331 }
1332
1333 #[test]
1334 fn send_ack() {
1335 let mut buf = [0; 5];
1336
1337 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1338
1339 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1340 assert_eq!(stream.send.write(b"world", false), Ok(5));
1341 assert_eq!(stream.send.write(b"", true), Ok(0));
1342 assert!(stream.send.is_fin());
1343
1344 assert_eq!(stream.send.off_front(), 0);
1345
1346 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1347 assert_eq!(written, 5);
1348 assert!(!fin);
1349 assert_eq!(&buf[..written], b"hello");
1350
1351 stream.send.ack_and_drop(0, 5);
1352
1353 stream.send.retransmit(0, 5);
1354
1355 assert_eq!(stream.send.off_front(), 5);
1356
1357 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1358 assert_eq!(written, 5);
1359 assert!(fin);
1360 assert_eq!(&buf[..written], b"world");
1361 }
1362
1363 #[test]
1364 fn send_ack_reordering() {
1365 let mut buf = [0; 5];
1366
1367 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1368
1369 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1370 assert_eq!(stream.send.write(b"world", false), Ok(5));
1371 assert_eq!(stream.send.write(b"", true), Ok(0));
1372 assert!(stream.send.is_fin());
1373
1374 assert_eq!(stream.send.off_front(), 0);
1375
1376 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1377 assert_eq!(written, 5);
1378 assert!(!fin);
1379 assert_eq!(&buf[..written], b"hello");
1380
1381 assert_eq!(stream.send.off_front(), 5);
1382
1383 let (written, fin) = stream.send.emit(&mut buf[..1]).unwrap();
1384 assert_eq!(written, 1);
1385 assert!(!fin);
1386 assert_eq!(&buf[..written], b"w");
1387
1388 stream.send.ack_and_drop(5, 1);
1389 stream.send.ack_and_drop(0, 5);
1390
1391 stream.send.retransmit(0, 5);
1392 stream.send.retransmit(5, 1);
1393
1394 assert_eq!(stream.send.off_front(), 6);
1395
1396 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1397 assert_eq!(written, 4);
1398 assert!(fin);
1399 assert_eq!(&buf[..written], b"orld");
1400 }
1401
1402 #[test]
1403 fn recv_data_below_off() {
1404 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1405
1406 let first = RangeBuf::from(b"hello", 0, false);
1407
1408 assert_eq!(stream.recv.write(first), Ok(()));
1409
1410 let mut buf = [0; 10];
1411
1412 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1413 assert_eq!(&buf[..len], b"hello");
1414 assert!(!fin);
1415
1416 let first = RangeBuf::from(b"elloworld", 1, true);
1417 assert_eq!(stream.recv.write(first), Ok(()));
1418
1419 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1420 assert_eq!(&buf[..len], b"world");
1421 assert!(fin);
1422 }
1423
1424 #[test]
1425 fn stream_complete() {
1426 let mut stream =
1427 <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1428
1429 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1430 assert_eq!(stream.send.write(b"world", false), Ok(5));
1431
1432 assert!(!stream.send.is_complete());
1433 assert!(!stream.send.is_fin());
1434
1435 assert_eq!(stream.send.write(b"", true), Ok(0));
1436
1437 assert!(!stream.send.is_complete());
1438 assert!(stream.send.is_fin());
1439
1440 let buf = RangeBuf::from(b"hello", 0, true);
1441 assert!(stream.recv.write(buf).is_ok());
1442 assert!(!stream.recv.is_fin());
1443
1444 stream.send.ack(6, 4);
1445 assert!(!stream.send.is_complete());
1446
1447 let mut buf = [0; 2];
1448 assert_eq!(stream.recv.emit(&mut buf), Ok((2, false)));
1449 assert!(!stream.recv.is_fin());
1450
1451 stream.send.ack(1, 5);
1452 assert!(!stream.send.is_complete());
1453
1454 stream.send.ack(0, 1);
1455 assert!(stream.send.is_complete());
1456
1457 assert!(!stream.is_complete());
1458
1459 let mut buf = [0; 3];
1460 assert_eq!(stream.recv.emit(&mut buf), Ok((3, true)));
1461 assert!(stream.recv.is_fin());
1462
1463 assert!(stream.is_complete());
1464 }
1465
1466 #[test]
1467 fn send_fin_zero_length_output() {
1468 let mut buf = [0; 5];
1469
1470 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1471
1472 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1473 assert_eq!(stream.send.off_front(), 0);
1474 assert!(!stream.send.is_fin());
1475
1476 let (written, fin) = stream.send.emit(&mut buf).unwrap();
1477 assert_eq!(written, 5);
1478 assert!(!fin);
1479 assert_eq!(&buf[..written], b"hello");
1480
1481 assert_eq!(stream.send.write(b"", true), Ok(0));
1482 assert!(stream.send.is_fin());
1483 assert_eq!(stream.send.off_front(), 5);
1484
1485 let (written, fin) = stream.send.emit(&mut buf).unwrap();
1486 assert_eq!(written, 0);
1487 assert!(fin);
1488 assert_eq!(&buf[..written], b"");
1489 }
1490
1491 fn stream_send_ready(stream: &Stream) -> bool {
1492 !stream.send.is_empty() &&
1493 stream.send.off_front() < stream.send.off_back()
1494 }
1495
1496 #[test]
1497 fn send_emit() {
1498 let mut buf = [0; 5];
1499
1500 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1501
1502 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1503 assert_eq!(stream.send.write(b"world", false), Ok(5));
1504 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1505 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1506 assert_eq!(stream.send.off_front(), 0);
1507 assert_eq!(stream.send.bufs_count(), 4);
1508
1509 assert!(stream.is_flushable());
1510
1511 assert!(stream_send_ready(&stream));
1512 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1513 assert_eq!(stream.send.off_front(), 4);
1514 assert_eq!(&buf[..4], b"hell");
1515
1516 assert!(stream_send_ready(&stream));
1517 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1518 assert_eq!(stream.send.off_front(), 8);
1519 assert_eq!(&buf[..4], b"owor");
1520
1521 assert!(stream_send_ready(&stream));
1522 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1523 assert_eq!(stream.send.off_front(), 10);
1524 assert_eq!(&buf[..2], b"ld");
1525
1526 assert!(stream_send_ready(&stream));
1527 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1528 assert_eq!(stream.send.off_front(), 11);
1529 assert_eq!(&buf[..1], b"o");
1530
1531 assert!(stream_send_ready(&stream));
1532 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1533 assert_eq!(stream.send.off_front(), 16);
1534 assert_eq!(&buf[..5], b"llehd");
1535
1536 assert!(stream_send_ready(&stream));
1537 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1538 assert_eq!(stream.send.off_front(), 20);
1539 assert_eq!(&buf[..4], b"lrow");
1540
1541 assert!(!stream.is_flushable());
1542
1543 assert!(!stream_send_ready(&stream));
1544 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1545 assert_eq!(stream.send.off_front(), 20);
1546 }
1547
1548 #[test]
1549 fn send_emit_ack() {
1550 let mut buf = [0; 5];
1551
1552 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1553
1554 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1555 assert_eq!(stream.send.write(b"world", false), Ok(5));
1556 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1557 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1558 assert_eq!(stream.send.off_front(), 0);
1559 assert_eq!(stream.send.bufs_count(), 4);
1560
1561 assert!(stream.is_flushable());
1562
1563 assert!(stream_send_ready(&stream));
1564 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1565 assert_eq!(stream.send.off_front(), 4);
1566 assert_eq!(&buf[..4], b"hell");
1567
1568 assert!(stream_send_ready(&stream));
1569 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1570 assert_eq!(stream.send.off_front(), 8);
1571 assert_eq!(&buf[..4], b"owor");
1572
1573 stream.send.ack_and_drop(0, 5);
1574 assert_eq!(stream.send.bufs_count(), 3);
1575
1576 assert!(stream_send_ready(&stream));
1577 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1578 assert_eq!(stream.send.off_front(), 10);
1579 assert_eq!(&buf[..2], b"ld");
1580
1581 stream.send.ack_and_drop(7, 5);
1582 assert_eq!(stream.send.bufs_count(), 3);
1583
1584 assert!(stream_send_ready(&stream));
1585 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1586 assert_eq!(stream.send.off_front(), 11);
1587 assert_eq!(&buf[..1], b"o");
1588
1589 assert!(stream_send_ready(&stream));
1590 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1591 assert_eq!(stream.send.off_front(), 16);
1592 assert_eq!(&buf[..5], b"llehd");
1593
1594 stream.send.ack_and_drop(5, 7);
1595 assert_eq!(stream.send.bufs_count(), 2);
1596
1597 assert!(stream_send_ready(&stream));
1598 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1599 assert_eq!(stream.send.off_front(), 20);
1600 assert_eq!(&buf[..4], b"lrow");
1601
1602 assert!(!stream.is_flushable());
1603
1604 assert!(!stream_send_ready(&stream));
1605 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1606 assert_eq!(stream.send.off_front(), 20);
1607
1608 stream.send.ack_and_drop(22, 4);
1609 assert_eq!(stream.send.bufs_count(), 2);
1610
1611 stream.send.ack_and_drop(20, 1);
1612 assert_eq!(stream.send.bufs_count(), 2);
1613 }
1614
1615 #[test]
1616 fn send_emit_retransmit() {
1617 let mut buf = [0; 5];
1618
1619 let mut stream = <Stream>::new(
1620 0,
1621 0,
1622 20,
1623 true,
1624 DEFAULT_STREAM_WINDOW,
1625 DEFAULT_STREAM_WINDOW,
1626 );
1627
1628 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1629 assert_eq!(stream.send.write(b"world", false), Ok(5));
1630 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1631 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1632 assert_eq!(stream.send.off_front(), 0);
1633 assert_eq!(stream.send.bufs_count(), 4);
1634
1635 assert!(stream.is_flushable());
1636
1637 assert!(stream_send_ready(&stream));
1638 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1639 assert_eq!(stream.send.off_front(), 4);
1640 assert_eq!(&buf[..4], b"hell");
1641
1642 assert!(stream_send_ready(&stream));
1643 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1644 assert_eq!(stream.send.off_front(), 8);
1645 assert_eq!(&buf[..4], b"owor");
1646
1647 stream.send.retransmit(3, 3);
1648 assert_eq!(stream.send.off_front(), 3);
1649
1650 assert!(stream_send_ready(&stream));
1651 assert_eq!(stream.send.emit(&mut buf[..3]), Ok((3, false)));
1652 assert_eq!(stream.send.off_front(), 8);
1653 assert_eq!(&buf[..3], b"low");
1654
1655 assert!(stream_send_ready(&stream));
1656 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1657 assert_eq!(stream.send.off_front(), 10);
1658 assert_eq!(&buf[..2], b"ld");
1659
1660 stream.send.ack_and_drop(7, 2);
1661
1662 stream.send.retransmit(8, 2);
1663
1664 assert!(stream_send_ready(&stream));
1665 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1666 assert_eq!(stream.send.off_front(), 10);
1667 assert_eq!(&buf[..2], b"ld");
1668
1669 assert!(stream_send_ready(&stream));
1670 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1671 assert_eq!(stream.send.off_front(), 11);
1672 assert_eq!(&buf[..1], b"o");
1673
1674 assert!(stream_send_ready(&stream));
1675 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1676 assert_eq!(stream.send.off_front(), 16);
1677 assert_eq!(&buf[..5], b"llehd");
1678
1679 stream.send.retransmit(12, 2);
1680
1681 assert!(stream_send_ready(&stream));
1682 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1683 assert_eq!(stream.send.off_front(), 16);
1684 assert_eq!(&buf[..2], b"le");
1685
1686 assert!(stream_send_ready(&stream));
1687 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1688 assert_eq!(stream.send.off_front(), 20);
1689 assert_eq!(&buf[..4], b"lrow");
1690
1691 assert!(!stream.is_flushable());
1692
1693 assert!(!stream_send_ready(&stream));
1694 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1695 assert_eq!(stream.send.off_front(), 20);
1696
1697 stream.send.retransmit(7, 12);
1698
1699 assert!(stream_send_ready(&stream));
1700 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1701 assert_eq!(stream.send.off_front(), 12);
1702 assert_eq!(&buf[..5], b"rldol");
1703
1704 assert!(stream_send_ready(&stream));
1705 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1706 assert_eq!(stream.send.off_front(), 17);
1707 assert_eq!(&buf[..5], b"lehdl");
1708
1709 assert!(stream_send_ready(&stream));
1710 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
1711 assert_eq!(stream.send.off_front(), 20);
1712 assert_eq!(&buf[..2], b"ro");
1713
1714 stream.send.ack_and_drop(12, 7);
1715
1716 stream.send.retransmit(7, 12);
1717
1718 assert!(stream_send_ready(&stream));
1719 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1720 assert_eq!(stream.send.off_front(), 12);
1721 assert_eq!(&buf[..5], b"rldol");
1722
1723 assert!(stream_send_ready(&stream));
1724 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1725 assert_eq!(stream.send.off_front(), 17);
1726 assert_eq!(&buf[..5], b"lehdl");
1727
1728 assert!(stream_send_ready(&stream));
1729 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
1730 assert_eq!(stream.send.off_front(), 20);
1731 assert_eq!(&buf[..2], b"ro");
1732 }
1733
1734 #[test]
1735 fn rangebuf_split_off() {
1736 let mut buf = <RangeBuf>::from(b"helloworld", 5, true);
1737 assert_eq!(buf.start, 0);
1738 assert_eq!(buf.pos, 0);
1739 assert_eq!(buf.len, 10);
1740 assert_eq!(buf.off, 5);
1741 assert!(buf.fin);
1742
1743 assert_eq!(buf.len(), 10);
1744 assert_eq!(buf.off(), 5);
1745 assert!(buf.fin());
1746
1747 assert_eq!(&buf[..], b"helloworld");
1748
1749 buf.consume(5);
1751
1752 assert_eq!(buf.start, 0);
1753 assert_eq!(buf.pos, 5);
1754 assert_eq!(buf.len, 10);
1755 assert_eq!(buf.off, 5);
1756 assert!(buf.fin);
1757
1758 assert_eq!(buf.len(), 5);
1759 assert_eq!(buf.off(), 10);
1760 assert!(buf.fin());
1761
1762 assert_eq!(&buf[..], b"world");
1763
1764 let mut new_buf = buf.split_off(3);
1766
1767 assert_eq!(buf.start, 0);
1768 assert_eq!(buf.pos, 3);
1769 assert_eq!(buf.len, 3);
1770 assert_eq!(buf.off, 5);
1771 assert!(!buf.fin);
1772
1773 assert_eq!(buf.len(), 0);
1774 assert_eq!(buf.off(), 8);
1775 assert!(!buf.fin());
1776
1777 assert_eq!(&buf[..], b"");
1778
1779 assert_eq!(new_buf.start, 3);
1780 assert_eq!(new_buf.pos, 5);
1781 assert_eq!(new_buf.len, 7);
1782 assert_eq!(new_buf.off, 8);
1783 assert!(new_buf.fin);
1784
1785 assert_eq!(new_buf.len(), 5);
1786 assert_eq!(new_buf.off(), 10);
1787 assert!(new_buf.fin());
1788
1789 assert_eq!(&new_buf[..], b"world");
1790
1791 new_buf.consume(2);
1793
1794 assert_eq!(new_buf.start, 3);
1795 assert_eq!(new_buf.pos, 7);
1796 assert_eq!(new_buf.len, 7);
1797 assert_eq!(new_buf.off, 8);
1798 assert!(new_buf.fin);
1799
1800 assert_eq!(new_buf.len(), 3);
1801 assert_eq!(new_buf.off(), 12);
1802 assert!(new_buf.fin());
1803
1804 assert_eq!(&new_buf[..], b"rld");
1805
1806 let mut new_new_buf = new_buf.split_off(5);
1808
1809 assert_eq!(new_buf.start, 3);
1810 assert_eq!(new_buf.pos, 7);
1811 assert_eq!(new_buf.len, 5);
1812 assert_eq!(new_buf.off, 8);
1813 assert!(!new_buf.fin);
1814
1815 assert_eq!(new_buf.len(), 1);
1816 assert_eq!(new_buf.off(), 12);
1817 assert!(!new_buf.fin());
1818
1819 assert_eq!(&new_buf[..], b"r");
1820
1821 assert_eq!(new_new_buf.start, 8);
1822 assert_eq!(new_new_buf.pos, 8);
1823 assert_eq!(new_new_buf.len, 2);
1824 assert_eq!(new_new_buf.off, 13);
1825 assert!(new_new_buf.fin);
1826
1827 assert_eq!(new_new_buf.len(), 2);
1828 assert_eq!(new_new_buf.off(), 13);
1829 assert!(new_new_buf.fin());
1830
1831 assert_eq!(&new_new_buf[..], b"ld");
1832
1833 new_new_buf.consume(2);
1835
1836 assert_eq!(new_new_buf.start, 8);
1837 assert_eq!(new_new_buf.pos, 10);
1838 assert_eq!(new_new_buf.len, 2);
1839 assert_eq!(new_new_buf.off, 13);
1840 assert!(new_new_buf.fin);
1841
1842 assert_eq!(new_new_buf.len(), 0);
1843 assert_eq!(new_new_buf.off(), 15);
1844 assert!(new_new_buf.fin());
1845
1846 assert_eq!(&new_new_buf[..], b"");
1847 }
1848
1849 #[test]
1852 fn stream_limit_auto_open() {
1853 let local_tp = crate::TransportParams::default();
1854 let peer_tp = crate::TransportParams::default();
1855
1856 let mut streams = <StreamMap>::new(5, 5, 5);
1857
1858 let stream_id = 500;
1859 assert!(!is_local(stream_id, true), "stream id is peer initiated");
1860 assert!(is_bidi(stream_id), "stream id is bidirectional");
1861 assert_eq!(
1862 streams
1863 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1864 .err(),
1865 Some(Error::StreamLimit),
1866 "stream limit should be exceeded"
1867 );
1868 }
1869
1870 #[test]
1873 fn stream_create_out_of_order() {
1874 let local_tp = crate::TransportParams::default();
1875 let peer_tp = crate::TransportParams::default();
1876
1877 let mut streams = <StreamMap>::new(5, 5, 5);
1878
1879 for stream_id in [8, 12, 4] {
1880 assert!(is_local(stream_id, false), "stream id is client initiated");
1881 assert!(is_bidi(stream_id), "stream id is bidirectional");
1882 assert!(streams
1883 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1884 .is_ok());
1885 }
1886 }
1887
1888 #[test]
1890 fn stream_limit_edge() {
1891 let local_tp = crate::TransportParams::default();
1892 let peer_tp = crate::TransportParams::default();
1893
1894 let mut streams = <StreamMap>::new(3, 3, 3);
1895
1896 let stream_id = 8;
1898 assert!(streams
1899 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1900 .is_ok());
1901
1902 let stream_id = 12;
1904 assert_eq!(
1905 streams
1906 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1907 .err(),
1908 Some(Error::StreamLimit)
1909 );
1910 }
1911
1912 fn cycle_stream_priority(stream_id: u64, streams: &mut StreamMap) {
1913 let key = streams.get(stream_id).unwrap().priority_key.clone();
1914 streams.update_priority(&key.clone(), &key);
1915 }
1916
1917 #[test]
1918 fn writable_prioritized_default_priority() {
1919 let local_tp = crate::TransportParams::default();
1920 let peer_tp = crate::TransportParams {
1921 initial_max_stream_data_bidi_local: 100,
1922 initial_max_stream_data_uni: 100,
1923 ..Default::default()
1924 };
1925
1926 let mut streams = StreamMap::new(100, 100, 100);
1927
1928 for id in [0, 4, 8, 12] {
1929 assert!(streams
1930 .get_or_create(id, &local_tp, &peer_tp, false, true)
1931 .is_ok());
1932 }
1933
1934 let walk_1: Vec<u64> = streams.writable().collect();
1935 cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
1936 let walk_2: Vec<u64> = streams.writable().collect();
1937 cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
1938 let walk_3: Vec<u64> = streams.writable().collect();
1939 cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
1940 let walk_4: Vec<u64> = streams.writable().collect();
1941 cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
1942 let walk_5: Vec<u64> = streams.writable().collect();
1943
1944 assert_eq!(walk_1, vec![0, 4, 8, 12]);
1947 assert_eq!(walk_2, vec![4, 8, 12, 0]);
1948 assert_eq!(walk_3, vec![8, 12, 0, 4]);
1949 assert_eq!(walk_4, vec![12, 0, 4, 8,]);
1950 assert_eq!(walk_5, vec![0, 4, 8, 12]);
1951 }
1952
1953 #[test]
1954 fn writable_prioritized_insert_order() {
1955 let local_tp = crate::TransportParams::default();
1956 let peer_tp = crate::TransportParams {
1957 initial_max_stream_data_bidi_local: 100,
1958 initial_max_stream_data_uni: 100,
1959 ..Default::default()
1960 };
1961
1962 let mut streams = StreamMap::new(100, 100, 100);
1963
1964 for id in [12, 4, 8, 0] {
1967 assert!(streams
1968 .get_or_create(id, &local_tp, &peer_tp, false, true)
1969 .is_ok());
1970 }
1971
1972 let walk_1: Vec<u64> = streams.writable().collect();
1973 cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
1974 let walk_2: Vec<u64> = streams.writable().collect();
1975 cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
1976 let walk_3: Vec<u64> = streams.writable().collect();
1977 cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
1978 let walk_4: Vec<u64> = streams.writable().collect();
1979 cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
1980 let walk_5: Vec<u64> = streams.writable().collect();
1981 assert_eq!(walk_1, vec![12, 4, 8, 0]);
1982 assert_eq!(walk_2, vec![4, 8, 0, 12]);
1983 assert_eq!(walk_3, vec![8, 0, 12, 4,]);
1984 assert_eq!(walk_4, vec![0, 12, 4, 8]);
1985 assert_eq!(walk_5, vec![12, 4, 8, 0]);
1986 }
1987
1988 #[test]
1989 fn writable_prioritized_mixed_urgency() {
1990 let local_tp = crate::TransportParams::default();
1991 let peer_tp = crate::TransportParams {
1992 initial_max_stream_data_bidi_local: 100,
1993 initial_max_stream_data_uni: 100,
1994 ..Default::default()
1995 };
1996
1997 let mut streams = <StreamMap>::new(100, 100, 100);
1998
1999 let input = vec![
2002 (0, 100),
2003 (4, 90),
2004 (8, 80),
2005 (12, 70),
2006 (16, 60),
2007 (20, 50),
2008 (24, 40),
2009 (28, 30),
2010 (32, 20),
2011 (36, 10),
2012 (40, 0),
2013 ];
2014
2015 for (id, urgency) in input.clone() {
2016 let stream = streams
2019 .get_or_create(id, &local_tp, &peer_tp, false, true)
2020 .unwrap();
2021
2022 stream.urgency = urgency;
2023
2024 let new_priority_key = Arc::new(StreamPriorityKey {
2025 urgency: stream.urgency,
2026 incremental: stream.incremental,
2027 id,
2028 ..Default::default()
2029 });
2030
2031 let old_priority_key = std::mem::replace(
2032 &mut stream.priority_key,
2033 new_priority_key.clone(),
2034 );
2035
2036 streams.update_priority(&old_priority_key, &new_priority_key);
2037 }
2038
2039 let walk_1: Vec<u64> = streams.writable().collect();
2040 assert_eq!(walk_1, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2041
2042 for (id, urgency) in input {
2044 let stream = streams
2047 .get_or_create(id, &local_tp, &peer_tp, false, true)
2048 .unwrap();
2049
2050 stream.urgency = urgency;
2051
2052 let new_priority_key = Arc::new(StreamPriorityKey {
2053 urgency: stream.urgency,
2054 incremental: stream.incremental,
2055 id,
2056 ..Default::default()
2057 });
2058
2059 let old_priority_key = std::mem::replace(
2060 &mut stream.priority_key,
2061 new_priority_key.clone(),
2062 );
2063
2064 streams.update_priority(&old_priority_key, &new_priority_key);
2065 }
2066
2067 let walk_2: Vec<u64> = streams.writable().collect();
2068 assert_eq!(walk_2, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2069
2070 streams.collect(24, true);
2072
2073 let walk_3: Vec<u64> = streams.writable().collect();
2074 assert_eq!(walk_3, vec![40, 36, 32, 28, 20, 16, 12, 8, 4, 0]);
2075
2076 streams.collect(40, true);
2077 streams.collect(0, true);
2078
2079 let walk_4: Vec<u64> = streams.writable().collect();
2080 assert_eq!(walk_4, vec![36, 32, 28, 20, 16, 12, 8, 4]);
2081
2082 streams
2084 .get_or_create(44, &local_tp, &peer_tp, false, true)
2085 .unwrap();
2086
2087 let walk_5: Vec<u64> = streams.writable().collect();
2088 assert_eq!(walk_5, vec![36, 32, 28, 20, 16, 12, 8, 4, 44]);
2089 }
2090
2091 #[test]
2092 fn writable_prioritized_mixed_urgencies_incrementals() {
2093 let local_tp = crate::TransportParams::default();
2094 let peer_tp = crate::TransportParams {
2095 initial_max_stream_data_bidi_local: 100,
2096 initial_max_stream_data_uni: 100,
2097 ..Default::default()
2098 };
2099
2100 let mut streams = StreamMap::new(100, 100, 100);
2101
2102 let input = vec![
2104 (0, 100),
2105 (4, 20),
2106 (8, 100),
2107 (12, 20),
2108 (16, 90),
2109 (20, 25),
2110 (24, 90),
2111 (28, 30),
2112 (32, 80),
2113 (36, 20),
2114 (40, 0),
2115 ];
2116
2117 for (id, urgency) in input.clone() {
2118 let stream = streams
2121 .get_or_create(id, &local_tp, &peer_tp, false, true)
2122 .unwrap();
2123
2124 stream.urgency = urgency;
2125
2126 let new_priority_key = Arc::new(StreamPriorityKey {
2127 urgency: stream.urgency,
2128 incremental: stream.incremental,
2129 id,
2130 ..Default::default()
2131 });
2132
2133 let old_priority_key = std::mem::replace(
2134 &mut stream.priority_key,
2135 new_priority_key.clone(),
2136 );
2137
2138 streams.update_priority(&old_priority_key, &new_priority_key);
2139 }
2140
2141 let walk_1: Vec<u64> = streams.writable().collect();
2142 cycle_stream_priority(4, &mut streams);
2143 cycle_stream_priority(16, &mut streams);
2144 cycle_stream_priority(0, &mut streams);
2145 let walk_2: Vec<u64> = streams.writable().collect();
2146 cycle_stream_priority(12, &mut streams);
2147 cycle_stream_priority(24, &mut streams);
2148 cycle_stream_priority(8, &mut streams);
2149 let walk_3: Vec<u64> = streams.writable().collect();
2150 cycle_stream_priority(36, &mut streams);
2151 cycle_stream_priority(16, &mut streams);
2152 cycle_stream_priority(0, &mut streams);
2153 let walk_4: Vec<u64> = streams.writable().collect();
2154 cycle_stream_priority(4, &mut streams);
2155 cycle_stream_priority(24, &mut streams);
2156 cycle_stream_priority(8, &mut streams);
2157 let walk_5: Vec<u64> = streams.writable().collect();
2158 cycle_stream_priority(12, &mut streams);
2159 cycle_stream_priority(16, &mut streams);
2160 cycle_stream_priority(0, &mut streams);
2161 let walk_6: Vec<u64> = streams.writable().collect();
2162 cycle_stream_priority(36, &mut streams);
2163 cycle_stream_priority(24, &mut streams);
2164 cycle_stream_priority(8, &mut streams);
2165 let walk_7: Vec<u64> = streams.writable().collect();
2166 cycle_stream_priority(4, &mut streams);
2167 cycle_stream_priority(16, &mut streams);
2168 cycle_stream_priority(0, &mut streams);
2169 let walk_8: Vec<u64> = streams.writable().collect();
2170 cycle_stream_priority(12, &mut streams);
2171 cycle_stream_priority(24, &mut streams);
2172 cycle_stream_priority(8, &mut streams);
2173 let walk_9: Vec<u64> = streams.writable().collect();
2174 cycle_stream_priority(36, &mut streams);
2175 cycle_stream_priority(16, &mut streams);
2176 cycle_stream_priority(0, &mut streams);
2177
2178 assert_eq!(walk_1, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2179 assert_eq!(walk_2, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2180 assert_eq!(walk_3, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2181 assert_eq!(walk_4, vec![40, 4, 12, 36, 20, 28, 32, 24, 16, 8, 0]);
2182 assert_eq!(walk_5, vec![40, 12, 36, 4, 20, 28, 32, 16, 24, 0, 8]);
2183 assert_eq!(walk_6, vec![40, 36, 4, 12, 20, 28, 32, 24, 16, 8, 0]);
2184 assert_eq!(walk_7, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2185 assert_eq!(walk_8, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2186 assert_eq!(walk_9, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2187
2188 streams.collect(20, true);
2190
2191 let walk_10: Vec<u64> = streams.writable().collect();
2192 assert_eq!(walk_10, vec![40, 4, 12, 36, 28, 32, 24, 16, 8, 0]);
2193
2194 let stream = streams
2196 .get_or_create(44, &local_tp, &peer_tp, false, true)
2197 .unwrap();
2198
2199 stream.urgency = 20;
2200 stream.incremental = true;
2201
2202 let new_priority_key = Arc::new(StreamPriorityKey {
2203 urgency: stream.urgency,
2204 incremental: stream.incremental,
2205 id: 44,
2206 ..Default::default()
2207 });
2208
2209 let old_priority_key =
2210 std::mem::replace(&mut stream.priority_key, new_priority_key.clone());
2211
2212 streams.update_priority(&old_priority_key, &new_priority_key);
2213
2214 let walk_11: Vec<u64> = streams.writable().collect();
2215 assert_eq!(walk_11, vec![40, 4, 12, 36, 44, 28, 32, 24, 16, 8, 0]);
2216 }
2217
2218 #[test]
2219 fn priority_tree_dupes() {
2220 let mut prioritized_writable: RBTree<StreamWritablePriorityAdapter> =
2221 Default::default();
2222
2223 for id in [0, 4, 8, 12] {
2224 let s = Arc::new(StreamPriorityKey {
2225 urgency: 0,
2226 incremental: false,
2227 id,
2228 ..Default::default()
2229 });
2230
2231 prioritized_writable.insert(s);
2232 }
2233
2234 let walk_1: Vec<u64> =
2235 prioritized_writable.iter().map(|s| s.id).collect();
2236 assert_eq!(walk_1, vec![0, 4, 8, 12]);
2237
2238 for id in [0, 4, 8, 12] {
2241 let s = Arc::new(StreamPriorityKey {
2242 urgency: 0,
2243 incremental: false,
2244 id,
2245 ..Default::default()
2246 });
2247
2248 prioritized_writable.insert(s);
2249 }
2250
2251 let walk_2: Vec<u64> =
2252 prioritized_writable.iter().map(|s| s.id).collect();
2253 assert_eq!(walk_2, vec![0, 0, 4, 4, 8, 8, 12, 12]);
2254 }
2255
2256 #[test]
2257 fn retransmit_returns_zero_when_already_acked() {
2258 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2259
2260 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2262 assert_eq!(stream.send.buffered_bytes(), 5);
2263
2264 let mut buf = [0; 10];
2265 let (written, _) = stream.send.emit(&mut buf).unwrap();
2266 assert_eq!(written, 5);
2267 assert_eq!(stream.send.buffered_bytes(), 0);
2268
2269 let retransmitted = stream.send.retransmit(0, 5);
2271 assert_eq!(retransmitted, 5);
2272 assert_eq!(stream.send.buffered_bytes(), 5);
2273
2274 stream.send.ack_and_drop(0, 5);
2276 assert_eq!(stream.send.buffered_bytes(), 0);
2277
2278 let retransmitted = stream.send.retransmit(0, 5);
2280 assert_eq!(retransmitted, 0);
2281 assert_eq!(stream.send.buffered_bytes(), 0);
2282 }
2283
2284 #[test]
2285 fn retransmit_returns_partial_when_some_acked() {
2286 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2287
2288 assert_eq!(stream.send.write(b"helloworld", false), Ok(10));
2290 assert_eq!(stream.send.buffered_bytes(), 10);
2291
2292 let mut buf = [0; 10];
2293 let (written, _) = stream.send.emit(&mut buf).unwrap();
2294 assert_eq!(written, 10);
2295 assert_eq!(stream.send.buffered_bytes(), 0);
2296
2297 let retransmitted = stream.send.retransmit(0, 10);
2299 assert_eq!(retransmitted, 10);
2300 assert_eq!(stream.send.buffered_bytes(), 10);
2301
2302 let dropped = stream.send.ack_and_drop(0, 5);
2304 assert_eq!(dropped, 5);
2305 assert_eq!(stream.send.buffered_bytes(), 5);
2306
2307 let retransmitted = stream.send.retransmit(0, 10);
2310 assert_eq!(retransmitted, 0); assert_eq!(stream.send.buffered_bytes(), 5);
2312 }
2313
2314 #[test]
2315 fn ack_and_drop_decrements_len_and_returns_dropped() {
2316 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2317
2318 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2320 assert_eq!(stream.send.buffered_bytes(), 5);
2321
2322 let mut buf = [0; 10];
2324 let (written, _) = stream.send.emit(&mut buf).unwrap();
2325 assert_eq!(written, 5);
2326 assert_eq!(stream.send.buffered_bytes(), 0);
2327
2328 let retransmitted = stream.send.retransmit(0, 5);
2330 assert_eq!(retransmitted, 5);
2331 assert_eq!(stream.send.buffered_bytes(), 5);
2332
2333 let dropped = stream.send.ack_and_drop(0, 5);
2335 assert_eq!(dropped, 5);
2336 assert_eq!(stream.send.buffered_bytes(), 0);
2337 }
2338
2339 #[test]
2340 fn ack_and_drop_partial_buffer() {
2341 let mut stream = <Stream>::new(0, 30, 30, true, 0, 30);
2342
2343 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2345 assert_eq!(stream.send.write(b"world", false), Ok(5));
2346 assert_eq!(stream.send.buffered_bytes(), 10);
2347
2348 let mut buf = [0; 10];
2349 let (written, _) = stream.send.emit(&mut buf).unwrap();
2350 assert_eq!(written, 10);
2351 assert_eq!(stream.send.buffered_bytes(), 0);
2352
2353 let retransmitted = stream.send.retransmit(0, 10);
2355 assert_eq!(retransmitted, 10);
2356 assert_eq!(stream.send.buffered_bytes(), 10);
2357
2358 let dropped = stream.send.ack_and_drop(0, 5);
2360 assert_eq!(dropped, 5);
2361 assert_eq!(stream.send.buffered_bytes(), 5);
2362
2363 let dropped = stream.send.ack_and_drop(5, 5);
2365 assert_eq!(dropped, 5);
2366 assert_eq!(stream.send.buffered_bytes(), 0);
2367 }
2368
2369 #[test]
2370 fn ack_and_drop_returns_zero_when_nothing_dropped() {
2371 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2372
2373 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2375 let mut buf = [0; 10];
2376 let (written, _) = stream.send.emit(&mut buf).unwrap();
2377 assert_eq!(written, 5);
2378
2379 let dropped = stream.send.ack_and_drop(0, 5);
2382 assert_eq!(dropped, 0);
2383 assert_eq!(stream.send.buffered_bytes(), 0);
2384 }
2385
2386 #[test]
2387 fn cache_consistency_through_full_lifecycle() {
2388 let mut streams = <StreamMap>::new(5, 5, 15);
2392
2393 let local_params = crate::TransportParams {
2395 initial_max_data: 30,
2396 initial_max_stream_data_bidi_local: 15,
2397 initial_max_stream_data_bidi_remote: 15,
2398 initial_max_stream_data_uni: 10,
2399 initial_max_streams_bidi: 5,
2400 initial_max_streams_uni: 5,
2401 ..Default::default()
2402 };
2403 let peer_params = local_params.clone();
2404
2405 streams.update_peer_max_streams_bidi(5);
2407 streams.update_peer_max_streams_uni(5);
2408
2409 let stream_id = 0u64;
2410
2411 {
2413 let stream = streams
2414 .get_or_create(
2415 stream_id,
2416 &local_params,
2417 &peer_params,
2418 true,
2419 false,
2420 )
2421 .unwrap();
2422 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2423 }
2424 streams.add_tx_buffered(5);
2425 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2426 assert_eq!(streams.tx_buffered(), 5);
2427 assert!(streams.tx_buffered_is_consistent());
2428
2429 let mut buf = [0; 10];
2431 let written = {
2432 let stream = streams.get_mut(stream_id).unwrap();
2433 let (written, _) = stream.send.emit(&mut buf).unwrap();
2434 written
2435 };
2436 assert_eq!(written, 5);
2437 streams.sub_tx_buffered(5);
2438 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2439 assert_eq!(streams.tx_buffered(), 0);
2440 assert!(streams.tx_buffered_is_consistent());
2441
2442 let retransmitted = {
2445 let stream = streams.get_mut(stream_id).unwrap();
2446 stream.send.retransmit(0, 5)
2447 };
2448 assert_eq!(retransmitted, 5);
2449 streams.add_tx_buffered(retransmitted);
2450 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2451 assert_eq!(streams.tx_buffered(), 5);
2452 assert!(streams.tx_buffered_is_consistent());
2453
2454 let dropped = {
2457 let stream = streams.get_mut(stream_id).unwrap();
2458 stream.send.ack_and_drop(0, 5)
2459 };
2460 assert_eq!(dropped, 5);
2461 streams.sub_tx_buffered(dropped);
2462 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2463 assert_eq!(streams.tx_buffered(), 0);
2464 assert!(streams.tx_buffered_is_consistent());
2465 }
2466
2467 #[test]
2468 fn send_buf_len_reflects_buffered_data() {
2469 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2470
2471 assert_eq!(stream.send.buffered_bytes(), 0);
2473
2474 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2476 assert_eq!(stream.send.buffered_bytes(), 5);
2477
2478 let mut buf = [0; 10];
2480 let (written, _) = stream.send.emit(&mut buf).unwrap();
2481 assert_eq!(written, 5);
2482 assert_eq!(stream.send.buffered_bytes(), 0);
2483
2484 let retransmitted = stream.send.retransmit(0, 5);
2486 assert_eq!(retransmitted, 5);
2487 assert_eq!(stream.send.buffered_bytes(), 5);
2488
2489 let dropped = stream.send.ack_and_drop(0, 5);
2491 assert_eq!(dropped, 5);
2492 assert_eq!(stream.send.buffered_bytes(), 0);
2493 }
2494}
2495
2496mod recv_buf;
2497mod send_buf;