Skip to main content

quiche/stream/
mod.rs

1// Copyright (C) 2018-2019, Cloudflare, Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright notice,
9//       this list of conditions and the following disclaimer.
10//
11//     * Redistributions in binary form must reproduce the above copyright
12//       notice, this list of conditions and the following disclaimer in the
13//       documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
19// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27use std::cmp;
28
29use std::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::ranges::RangeSet;
44use crate::BufFactory;
45use crate::Error;
46use crate::Result;
47
48pub(crate) use self::send_buf::PeerStopSendingState;
49
50const DEFAULT_URGENCY: u8 = 127;
51
52/// The maximum size of the receiver stream flow control window.
53pub const MAX_STREAM_WINDOW: u64 = 16 * 1024 * 1024;
54
55/// A simple no-op hasher for Stream IDs.
56///
57/// The QUIC protocol and quiche library guarantees stream ID uniqueness, so
58/// we can save effort by avoiding using a more complicated algorithm.
59#[derive(Default)]
60pub struct StreamIdHasher {
61    id: u64,
62}
63
64/// Return value type of `RecvBuf::reset()`
65#[derive(Debug, PartialEq, Clone, Copy)]
66pub struct RecvBufResetReturn {
67    /// Returns the difference between the previous max_data offset
68    /// received and the final size reported by the reset
69    pub max_data_delta: u64,
70
71    /// The amount of flow control credit that should be returned to the
72    /// connection level flow control.
73    pub consumed_flowcontrol: u64,
74}
75
76impl RecvBufResetReturn {
77    pub fn zero() -> Self {
78        Self {
79            max_data_delta: 0,
80            consumed_flowcontrol: 0,
81        }
82    }
83}
84
85/// Action to perform when reading from a stream's receive buffer.
86pub enum RecvAction<T: bytes::BufMut> {
87    /// Emit data by copying it into the provided buffer.
88    Emit { out: T },
89    /// Discard up to the specified number of bytes without copying.
90    Discard { len: usize },
91}
92
93impl std::hash::Hasher for StreamIdHasher {
94    #[inline]
95    fn finish(&self) -> u64 {
96        self.id
97    }
98
99    #[inline]
100    fn write_u64(&mut self, id: u64) {
101        self.id = id;
102    }
103
104    #[inline]
105    fn write(&mut self, _: &[u8]) {
106        // We need a default write() for the trait but stream IDs will always
107        // be a u64 so we just delegate to write_u64.
108        unimplemented!()
109    }
110}
111
112type BuildStreamIdHasher = std::hash::BuildHasherDefault<StreamIdHasher>;
113
114pub type StreamIdHashMap<V> = HashMap<u64, V, BuildStreamIdHasher>;
115pub type StreamIdHashSet = HashSet<u64, BuildStreamIdHasher>;
116
117/// Tracks collected stream sequences separately for each stream type.
118#[derive(Default)]
119struct CollectedStreams {
120    // Defer allocation until the first stream is collected. The range capacity
121    // is unlimited because evicting a tombstone would allow a collected stream
122    // to be recreated.
123    ranges: Option<Box<[RangeSet; 4]>>,
124}
125
126impl CollectedStreams {
127    fn insert(&mut self, stream_id: u64) {
128        // Same-type stream IDs advance by four, so store their sequences to
129        // allow adjacent collected streams to merge into a single range.
130        let ranges = self.ranges.get_or_insert_with(Default::default);
131        ranges[(stream_id & 0x3) as usize].push_item(stream_id >> 2);
132    }
133
134    fn contains(&self, stream_id: u64) -> bool {
135        let Some(ranges) = &self.ranges else {
136            return false;
137        };
138
139        ranges[(stream_id & 0x3) as usize].contains(stream_id >> 2)
140    }
141}
142
143/// Keeps track of QUIC streams and enforces stream limits.
144#[derive(Default)]
145pub struct StreamMap<F: BufFactory = DefaultBufFactory> {
146    /// Map of streams indexed by stream ID.
147    streams: StreamIdHashMap<Stream<F>>,
148
149    /// Set of streams that were completed and garbage collected.
150    ///
151    /// Instead of keeping the full stream state forever, we collect completed
152    /// streams to save memory, but we still need to keep track of previously
153    /// created streams, to prevent peers from re-creating them.
154    collected: CollectedStreams,
155
156    /// Peer's maximum bidirectional stream count limit.
157    peer_max_streams_bidi: u64,
158
159    /// Peer's maximum unidirectional stream count limit.
160    peer_max_streams_uni: u64,
161
162    /// The total number of bidirectional streams opened by the peer.
163    peer_opened_streams_bidi: u64,
164
165    /// The total number of unidirectional streams opened by the peer.
166    peer_opened_streams_uni: u64,
167
168    /// Local maximum bidirectional stream count limit.
169    local_max_streams_bidi: u64,
170    local_max_streams_bidi_next: u64,
171
172    /// Initial maximum bidirectional stream count.
173    initial_max_streams_bidi: u64,
174
175    /// Local maximum unidirectional stream count limit.
176    local_max_streams_uni: u64,
177    local_max_streams_uni_next: u64,
178
179    /// Initial maximum unidirectional stream count.
180    initial_max_streams_uni: u64,
181
182    /// The total number of bidirectional streams opened by the local endpoint.
183    local_opened_streams_bidi: u64,
184
185    /// The total number of unidirectional streams opened by the local endpoint.
186    local_opened_streams_uni: u64,
187
188    /// Queue of stream IDs corresponding to streams that have buffered data
189    /// ready to be sent to the peer. This also implies that the stream has
190    /// enough flow control credits to send at least some of that data.
191    flushable: RBTree<StreamFlushablePriorityAdapter>,
192
193    /// Set of stream IDs corresponding to streams that have outstanding data
194    /// to read. This is used to generate a `StreamIter` of streams without
195    /// having to iterate over the full list of streams.
196    pub readable: RBTree<StreamReadablePriorityAdapter>,
197
198    /// Set of streams queued for writable notification. A stopped stream can
199    /// be removed before its error is reported to the application.
200    pub writable: RBTree<StreamWritablePriorityAdapter>,
201
202    /// Stopped streams still queued for writable notification.
203    stopped_writable: RBTree<StreamStoppedWritablePriorityAdapter>,
204
205    /// Set of stream IDs corresponding to streams that are almost out of flow
206    /// control credit and need to send MAX_STREAM_DATA. This is used to
207    /// generate a `StreamIter` of streams without having to iterate over the
208    /// full list of streams.
209    almost_full: StreamIdHashSet,
210
211    /// Set of stream IDs corresponding to streams that are blocked. The value
212    /// of the map elements represents the offset of the stream at which the
213    /// blocking occurred.
214    blocked: StreamIdHashMap<u64>,
215
216    /// Set of stream IDs corresponding to streams that are reset. The value
217    /// of the map elements is a tuple of the error code and final size values
218    /// to include in the RESET_STREAM frame.
219    reset: StreamIdHashMap<(u64, u64)>,
220
221    /// Set of stream IDs corresponding to streams that are shutdown on the
222    /// receive side, and need to send a STOP_SENDING frame. The value of the
223    /// map elements is the error code to include in the STOP_SENDING frame.
224    stopped: StreamIdHashMap<u64>,
225
226    /// The maximum size of a stream window.
227    max_stream_window: u64,
228
229    /// Total number of bytes in send buffers across all streams.
230    tx_buffered: usize,
231}
232
233impl<F: BufFactory> StreamMap<F> {
234    pub fn new(
235        max_streams_bidi: u64, max_streams_uni: u64, max_stream_window: u64,
236    ) -> Self {
237        StreamMap {
238            local_max_streams_bidi: max_streams_bidi,
239            local_max_streams_bidi_next: max_streams_bidi,
240            initial_max_streams_bidi: max_streams_bidi,
241
242            local_max_streams_uni: max_streams_uni,
243            local_max_streams_uni_next: max_streams_uni,
244            initial_max_streams_uni: max_streams_uni,
245
246            max_stream_window,
247
248            ..StreamMap::default()
249        }
250    }
251
252    /// Returns the stream with the given ID if it exists.
253    pub fn get(&self, id: u64) -> Option<&Stream<F>> {
254        self.streams.get(&id)
255    }
256
257    /// Returns the mutable stream with the given ID if it exists.
258    pub fn get_mut(&mut self, id: u64) -> Option<&mut Stream<F>> {
259        self.streams.get_mut(&id)
260    }
261
262    /// Returns the mutable stream with the given ID if it exists, or creates
263    /// a new one otherwise.
264    ///
265    /// The `local` parameter indicates whether the stream is locally
266    /// initiated. It validates the stream ID and selects the initial flow
267    /// control values from the local and remote transport parameters.
268    ///
269    /// This also takes care of enforcing both local and the peer's stream
270    /// count limits. If one of these limits is violated, the `StreamLimit`
271    /// error is returned.
272    pub(crate) fn get_or_create(
273        &mut self, id: u64, local_params: &crate::TransportParams,
274        peer_params: &crate::TransportParams, local: bool, is_server: bool,
275    ) -> Result<&mut Stream<F>> {
276        let (stream, is_new_and_writable) = match self.streams.entry(id) {
277            hash_map::Entry::Vacant(v) => {
278                // Stream has already been closed and garbage collected.
279                if self.collected.contains(id) {
280                    return Err(Error::Done);
281                }
282
283                if local != is_local(id, is_server) {
284                    return Err(Error::InvalidStreamState(id));
285                }
286
287                let (max_rx_data, max_tx_data) = match (local, is_bidi(id)) {
288                    // Locally-initiated bidirectional stream.
289                    (true, true) => (
290                        local_params.initial_max_stream_data_bidi_local,
291                        peer_params.initial_max_stream_data_bidi_remote,
292                    ),
293
294                    // Locally-initiated unidirectional stream.
295                    (true, false) => (0, peer_params.initial_max_stream_data_uni),
296
297                    // Remotely-initiated bidirectional stream.
298                    (false, true) => (
299                        local_params.initial_max_stream_data_bidi_remote,
300                        peer_params.initial_max_stream_data_bidi_local,
301                    ),
302
303                    // Remotely-initiated unidirectional stream.
304                    (false, false) =>
305                        (local_params.initial_max_stream_data_uni, 0),
306                };
307
308                // The two least significant bits from a stream id identify the
309                // type of stream. Truncate those bits to get the sequence for
310                // that stream type.
311                let stream_sequence = id >> 2;
312
313                // Enforce stream count limits.
314                match (is_local(id, is_server), is_bidi(id)) {
315                    (true, true) => {
316                        let n = cmp::max(
317                            self.local_opened_streams_bidi,
318                            stream_sequence + 1,
319                        );
320
321                        if n > self.peer_max_streams_bidi {
322                            return Err(Error::StreamLimit);
323                        }
324
325                        self.local_opened_streams_bidi = n;
326                    },
327
328                    (true, false) => {
329                        let n = cmp::max(
330                            self.local_opened_streams_uni,
331                            stream_sequence + 1,
332                        );
333
334                        if n > self.peer_max_streams_uni {
335                            return Err(Error::StreamLimit);
336                        }
337
338                        self.local_opened_streams_uni = n;
339                    },
340
341                    (false, true) => {
342                        let n = cmp::max(
343                            self.peer_opened_streams_bidi,
344                            stream_sequence + 1,
345                        );
346
347                        if n > self.local_max_streams_bidi {
348                            return Err(Error::StreamLimit);
349                        }
350
351                        self.peer_opened_streams_bidi = n;
352                    },
353
354                    (false, false) => {
355                        let n = cmp::max(
356                            self.peer_opened_streams_uni,
357                            stream_sequence + 1,
358                        );
359
360                        if n > self.local_max_streams_uni {
361                            return Err(Error::StreamLimit);
362                        }
363
364                        self.peer_opened_streams_uni = n;
365                    },
366                };
367
368                let initial_window = max_rx_data;
369                let s = Stream::new(
370                    id,
371                    max_rx_data,
372                    max_tx_data,
373                    local,
374                    initial_window,
375                    self.max_stream_window,
376                );
377
378                let is_writable = s.is_writable();
379
380                (v.insert(s), is_writable)
381            },
382
383            hash_map::Entry::Occupied(v) => (v.into_mut(), false),
384        };
385
386        // Newly created stream might already be writable due to initial flow
387        // control limits.
388        if is_new_and_writable {
389            self.writable.insert(Arc::clone(&stream.priority_key));
390        }
391
392        Ok(stream)
393    }
394
395    /// Adds the stream ID to the readable streams set.
396    ///
397    /// If the stream was already in the list, this does nothing.
398    pub fn insert_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
399        if !priority_key.readable.is_linked() {
400            self.readable.insert(Arc::clone(priority_key));
401        }
402    }
403
404    /// Removes the stream ID from the readable streams set.
405    pub fn remove_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
406        if !priority_key.readable.is_linked() {
407            return;
408        }
409
410        let mut c = {
411            let ptr = Arc::as_ptr(priority_key);
412            unsafe { self.readable.cursor_mut_from_ptr(ptr) }
413        };
414
415        c.remove();
416    }
417
418    /// Adds the stream ID to the writable streams set.
419    ///
420    /// This should also be called anytime a new stream is created, in addition
421    /// to when an existing stream becomes writable.
422    ///
423    /// If the stream was already in the list, this does nothing.
424    pub fn insert_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
425        if !priority_key.writable.is_linked() {
426            self.writable.insert(Arc::clone(priority_key));
427        }
428    }
429
430    /// Marks a newly stopped stream as queued for writable notification.
431    pub fn insert_stopped_writable(
432        &mut self, priority_key: &Arc<StreamPriorityKey>,
433    ) {
434        if !priority_key.stopped_writable.is_linked() {
435            self.stopped_writable.insert(Arc::clone(priority_key));
436        }
437
438        self.insert_writable(priority_key);
439    }
440
441    /// Removes the stream ID from the writable streams set.
442    ///
443    /// This should also be called anytime an existing stream stops being
444    /// writable.
445    pub fn remove_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
446        if priority_key.stopped_writable.is_linked() {
447            let ptr = Arc::as_ptr(priority_key);
448            // SAFETY: `priority_key` originates from this `StreamMap`, and its
449            // `stopped_writable` link is only inserted into this map's
450            // corresponding tree. The link is linked, and the `Arc` keeps the
451            // allocation alive, so `ptr` identifies an element of this tree.
452            let mut c = unsafe { self.stopped_writable.cursor_mut_from_ptr(ptr) };
453            c.remove();
454        }
455
456        if !priority_key.writable.is_linked() {
457            return;
458        }
459
460        let mut c = {
461            let ptr = Arc::as_ptr(priority_key);
462            unsafe { self.writable.cursor_mut_from_ptr(ptr) }
463        };
464
465        c.remove();
466    }
467
468    /// Adds the stream ID to the flushable streams set.
469    ///
470    /// If the stream was already in the list, this does nothing.
471    pub fn insert_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
472        if !priority_key.flushable.is_linked() {
473            self.flushable.insert(Arc::clone(priority_key));
474        }
475    }
476
477    /// Removes the stream ID from the flushable streams set.
478    pub fn remove_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
479        if !priority_key.flushable.is_linked() {
480            return;
481        }
482
483        let mut c = {
484            let ptr = Arc::as_ptr(priority_key);
485            unsafe { self.flushable.cursor_mut_from_ptr(ptr) }
486        };
487
488        c.remove();
489    }
490
491    pub fn peek_flushable(&self) -> Option<Arc<StreamPriorityKey>> {
492        self.flushable.front().clone_pointer()
493    }
494
495    /// Updates the priorities of a stream.
496    pub fn update_priority(
497        &mut self, old: &Arc<StreamPriorityKey>, new: &Arc<StreamPriorityKey>,
498    ) {
499        if old.readable.is_linked() {
500            self.remove_readable(old);
501            self.readable.insert(Arc::clone(new));
502        }
503
504        if old.writable.is_linked() {
505            let stopped = old.stopped_writable.is_linked();
506            self.remove_writable(old);
507            if stopped {
508                self.insert_stopped_writable(new);
509            } else {
510                self.insert_writable(new);
511            }
512        }
513
514        if old.flushable.is_linked() {
515            self.remove_flushable(old);
516            self.flushable.insert(Arc::clone(new));
517        }
518    }
519
520    /// Adds the stream ID to the almost full streams set.
521    ///
522    /// If the stream was already in the list, this does nothing.
523    pub fn insert_almost_full(&mut self, stream_id: u64) {
524        self.almost_full.insert(stream_id);
525    }
526
527    /// Removes the stream ID from the almost full streams set.
528    pub fn remove_almost_full(&mut self, stream_id: u64) {
529        self.almost_full.remove(&stream_id);
530    }
531
532    /// Adds the stream ID to the blocked streams set with the
533    /// given offset value.
534    ///
535    /// If the stream was already in the list, this does nothing.
536    pub fn insert_blocked(&mut self, stream_id: u64, off: u64) {
537        self.blocked.insert(stream_id, off);
538    }
539
540    /// Removes the stream ID from the blocked streams set.
541    pub fn remove_blocked(&mut self, stream_id: u64) {
542        self.blocked.remove(&stream_id);
543    }
544
545    /// Adds the stream ID to the reset streams set with the
546    /// given error code and final size values.
547    ///
548    /// If the stream was already in the list, this does nothing.
549    pub fn insert_reset(
550        &mut self, stream_id: u64, error_code: u64, final_size: u64,
551    ) {
552        self.reset.insert(stream_id, (error_code, final_size));
553    }
554
555    /// Removes the stream ID from the reset streams set.
556    pub fn remove_reset(&mut self, stream_id: u64) {
557        self.reset.remove(&stream_id);
558    }
559
560    /// Adds the stream ID to the stopped streams set with the
561    /// given error code.
562    ///
563    /// If the stream was already in the list, this does nothing.
564    pub fn insert_stopped(&mut self, stream_id: u64, error_code: u64) {
565        self.stopped.insert(stream_id, error_code);
566    }
567
568    /// Removes the stream ID from the stopped streams set.
569    pub fn remove_stopped(&mut self, stream_id: u64) {
570        self.stopped.remove(&stream_id);
571    }
572
573    /// Updates the peer's maximum bidirectional stream count limit.
574    pub fn update_peer_max_streams_bidi(&mut self, v: u64) {
575        self.peer_max_streams_bidi = cmp::max(self.peer_max_streams_bidi, v);
576    }
577
578    /// Updates the peer's maximum unidirectional stream count limit.
579    pub fn update_peer_max_streams_uni(&mut self, v: u64) {
580        self.peer_max_streams_uni = cmp::max(self.peer_max_streams_uni, v);
581    }
582
583    /// Commits the new max_streams_bidi limit.
584    pub fn update_max_streams_bidi(&mut self) {
585        self.local_max_streams_bidi = self.local_max_streams_bidi_next;
586    }
587
588    /// Sets the max_streams_bidi limit to the given value.
589    pub fn set_max_streams_bidi(&mut self, max: u64) {
590        self.local_max_streams_bidi = max;
591        self.local_max_streams_bidi_next = max;
592        self.initial_max_streams_bidi = max;
593    }
594
595    /// Returns the current max_streams_bidi limit.
596    pub fn max_streams_bidi(&self) -> u64 {
597        self.local_max_streams_bidi
598    }
599
600    /// Returns the new max_streams_bidi limit.
601    pub fn max_streams_bidi_next(&mut self) -> u64 {
602        self.local_max_streams_bidi_next
603    }
604
605    /// Commits the new max_streams_uni limit.
606    pub fn update_max_streams_uni(&mut self) {
607        self.local_max_streams_uni = self.local_max_streams_uni_next;
608    }
609
610    /// Returns the new max_streams_uni limit.
611    pub fn max_streams_uni_next(&mut self) -> u64 {
612        self.local_max_streams_uni_next
613    }
614
615    /// Returns the peer's current maximum bidirectional stream count limit.
616    pub fn peer_max_streams_bidi(&self) -> u64 {
617        self.peer_max_streams_bidi
618    }
619
620    /// Returns the number of bidirectional streams that can be created
621    /// before the peer's stream count limit is reached.
622    pub fn peer_streams_left_bidi(&self) -> u64 {
623        self.peer_max_streams_bidi - self.local_opened_streams_bidi
624    }
625
626    /// Returns the peer's current maximum unidirectional stream count limit.
627    pub fn peer_max_streams_uni(&self) -> u64 {
628        self.peer_max_streams_uni
629    }
630
631    /// Returns the number of unidirectional streams that can be created
632    /// before the peer's stream count limit is reached.
633    pub fn peer_streams_left_uni(&self) -> u64 {
634        self.peer_max_streams_uni - self.local_opened_streams_uni
635    }
636
637    /// Collects or disarms a stream after reporting STOP_SENDING to the caller.
638    pub fn on_stop_sending_reported(&mut self, stream_id: u64) {
639        let Some(stream) = self.streams.get_mut(&stream_id) else {
640            return;
641        };
642
643        if stream.state() == StreamState::Collectable {
644            let local = stream.local;
645            self.collect(stream_id, local);
646        } else {
647            let priority_key = Arc::clone(&stream.priority_key);
648            self.remove_writable(&priority_key);
649        }
650    }
651
652    /// Drops completed stream.
653    ///
654    /// This should only be called when Stream::state() returns Collectable
655    /// for the given stream.
656    pub fn collect(&mut self, stream_id: u64, local: bool) {
657        if !local {
658            // If the stream was created by the peer, give back a max streams
659            // credit.
660            if is_bidi(stream_id) {
661                self.local_max_streams_bidi_next =
662                    self.local_max_streams_bidi_next.saturating_add(1);
663            } else {
664                self.local_max_streams_uni_next =
665                    self.local_max_streams_uni_next.saturating_add(1);
666            }
667        }
668
669        let s = self.streams.remove(&stream_id).unwrap();
670
671        self.remove_readable(&s.priority_key);
672
673        self.remove_writable(&s.priority_key);
674
675        self.remove_flushable(&s.priority_key);
676
677        self.collected.insert(stream_id);
678    }
679
680    /// Collects a completed stream when no application notification remains.
681    pub(crate) fn try_collect(&mut self, stream_id: u64) {
682        let Some(stream) = self.get(stream_id) else {
683            return;
684        };
685
686        let local = stream.local;
687
688        if stream.state() == StreamState::Collectable {
689            self.collect(stream_id, local);
690        }
691    }
692
693    /// Creates an iterator over streams that have outstanding data to read.
694    pub fn readable(&self) -> StreamIter {
695        StreamIter {
696            streams: self.readable.iter().map(|s| s.id).collect(),
697            index: 0,
698        }
699    }
700
701    /// Creates an iterator over streams that can be written to.
702    pub fn writable(&self) -> StreamIter {
703        StreamIter {
704            streams: self.writable.iter().map(|s| s.id).collect(),
705            index: 0,
706        }
707    }
708
709    /// Creates an iterator over stopped streams in the writable queue.
710    pub fn stopped_writable(&self) -> StreamIter {
711        if self.stopped_writable.is_empty() {
712            return StreamIter::default();
713        }
714
715        StreamIter {
716            streams: self.stopped_writable.iter().map(|key| key.id).collect(),
717            index: 0,
718        }
719    }
720
721    /// Returns and unlinks the next stopped stream awaiting notification.
722    pub fn pop_stopped_writable(&mut self) -> Option<u64> {
723        let priority_key = self.stopped_writable.front().clone_pointer()?;
724        self.remove_writable(&priority_key);
725        Some(priority_key.id)
726    }
727
728    /// Returns true if the given local stream has been opened.
729    ///
730    /// Opening a local stream implicitly opens all lower-numbered local streams
731    /// of the same type, even if they do not have `Stream` objects yet.
732    pub fn local_stream_opened(&self, stream_id: u64) -> bool {
733        let opened = if is_bidi(stream_id) {
734            self.local_opened_streams_bidi
735        } else {
736            self.local_opened_streams_uni
737        };
738
739        stream_id >> 2 < opened
740    }
741
742    /// Creates an iterator over streams that need to send MAX_STREAM_DATA.
743    pub fn almost_full(&self) -> StreamIter {
744        StreamIter::from(&self.almost_full)
745    }
746
747    /// Creates an iterator over streams that need to send STREAM_DATA_BLOCKED.
748    pub fn blocked(&self) -> hash_map::Iter<'_, u64, u64> {
749        self.blocked.iter()
750    }
751
752    /// Creates an iterator over streams that need to send RESET_STREAM.
753    pub fn reset(&self) -> hash_map::Iter<'_, u64, (u64, u64)> {
754        self.reset.iter()
755    }
756
757    /// Creates an iterator over streams that need to send STOP_SENDING.
758    pub fn stopped(&self) -> hash_map::Iter<'_, u64, u64> {
759        self.stopped.iter()
760    }
761
762    /// Returns true if the stream has been collected.
763    pub fn is_collected(&self, stream_id: u64) -> bool {
764        self.collected.contains(stream_id)
765    }
766
767    /// Returns true if there are any streams that have data to write.
768    pub fn has_flushable(&self) -> bool {
769        !self.flushable.is_empty()
770    }
771
772    /// Returns true if there are any streams that have data to read.
773    pub fn has_readable(&self) -> bool {
774        !self.readable.is_empty()
775    }
776
777    /// Returns true if there are any streams that need to update the local
778    /// flow control limit.
779    pub fn has_almost_full(&self) -> bool {
780        !self.almost_full.is_empty()
781    }
782
783    /// Returns true if there are any streams that are blocked.
784    pub fn has_blocked(&self) -> bool {
785        !self.blocked.is_empty()
786    }
787
788    /// Returns true if there are any streams that are reset.
789    pub fn has_reset(&self) -> bool {
790        !self.reset.is_empty()
791    }
792
793    /// Returns true if there are any streams that need to send STOP_SENDING.
794    pub fn has_stopped(&self) -> bool {
795        !self.stopped.is_empty()
796    }
797
798    /// Returns true if the max bidirectional streams count needs to be updated
799    /// by sending a MAX_STREAMS frame to the peer.
800    ///
801    /// This only sends MAX_STREAMS when available capacity is at or below 50%
802    /// of the initial maximum streams target.
803    pub fn should_update_max_streams_bidi(&self) -> bool {
804        let available = self
805            .local_max_streams_bidi
806            .saturating_sub(self.peer_opened_streams_bidi);
807        self.local_max_streams_bidi_next != self.local_max_streams_bidi &&
808            available <= self.initial_max_streams_bidi / 2
809    }
810
811    /// Returns true if the max unidirectional streams count needs to be updated
812    /// by sending a MAX_STREAMS frame to the peer.
813    ///
814    /// This only send MAX_STREAMS when available capacity is at or below 50% of
815    /// the initial maximum streams target.
816    pub fn should_update_max_streams_uni(&self) -> bool {
817        let available = self
818            .local_max_streams_uni
819            .saturating_sub(self.peer_opened_streams_uni);
820        self.local_max_streams_uni_next != self.local_max_streams_uni &&
821            available <= self.initial_max_streams_uni / 2
822    }
823
824    /// Returns the number of active streams in the map.
825    #[cfg(test)]
826    pub fn len(&self) -> usize {
827        self.streams.len()
828    }
829
830    /// Returns the total number of bytes buffered across all streams.
831    pub(crate) fn tx_buffered(&self) -> usize {
832        self.tx_buffered
833    }
834
835    /// Computes the actual number of bytes in send buffers by summing across
836    /// all streams. This is used for debugging to verify that tx_buffered
837    /// is accurate.
838    fn tx_buffered_actual(&self) -> usize {
839        self.streams
840            .values()
841            .map(|s| s.send.buffered_bytes() as usize)
842            .sum()
843    }
844
845    /// Checks if the stored tx_buffered matches the actual value.
846    /// Returns true if they match, false otherwise.
847    pub(crate) fn tx_buffered_is_consistent(&self) -> bool {
848        self.tx_buffered == self.tx_buffered_actual()
849    }
850
851    /// Updates the tx_buffered value by adding the delta.
852    pub(crate) fn add_tx_buffered(&mut self, delta: usize) {
853        self.tx_buffered += delta;
854
855        #[cfg(debug_assertions)]
856        self.debug_check_tx_buffered_consistency();
857    }
858
859    /// Updates the tx_buffered value by subtracting the delta.
860    pub(crate) fn sub_tx_buffered(&mut self, delta: usize) {
861        debug_assert!(self.tx_buffered >= delta);
862        self.tx_buffered = self.tx_buffered.saturating_sub(delta);
863
864        #[cfg(debug_assertions)]
865        self.debug_check_tx_buffered_consistency();
866    }
867
868    /// Verifies that the stored tx_buffered value matches the actual bytes in
869    /// send buffers across all streams. Enabled in debug builds to catch
870    /// inconsistencies early.
871    #[cfg(debug_assertions)]
872    pub(crate) fn debug_check_tx_buffered_consistency(&self) {
873        if !self.tx_buffered_is_consistent() {
874            let buffered_per_stream = self
875                .streams
876                .iter()
877                .map(|(id, s)| (*id, s.send.buffered_bytes()))
878                .collect::<Vec<_>>();
879
880            let actual = self.tx_buffered_actual();
881            let stored = self.tx_buffered;
882            panic!(
883                "tx_buffered mismatch: stored={}, actual={}, diff={}, buffered_per_stream={:?}",
884                stored,
885                actual,
886                stored as i64 - actual as i64,
887                buffered_per_stream
888            );
889        }
890    }
891}
892
893/// Completion derived from transport buffers and pending app notifications.
894#[derive(Clone, Copy, Debug, PartialEq, Eq)]
895pub(crate) enum StreamState {
896    /// At least one relevant direction is not complete.
897    Incomplete,
898    /// Directions are complete, but receive data or a STOP error remains.
899    CompleteWithPendingDelivery,
900    /// No transport work or application notification remains.
901    Collectable,
902}
903
904/// A QUIC stream.
905pub struct Stream<F: BufFactory = DefaultBufFactory> {
906    /// Receive-side stream buffer.
907    pub recv: recv_buf::RecvBuf,
908
909    /// Send-side stream buffer.
910    pub send: send_buf::SendBuf<F>,
911
912    pub send_lowat: usize,
913
914    /// Whether the stream is bidirectional.
915    pub bidi: bool,
916
917    /// Whether the stream was created by the local endpoint.
918    pub local: bool,
919
920    /// The stream's urgency (lower is better). Default is `DEFAULT_URGENCY`.
921    pub urgency: u8,
922
923    /// Whether the stream can be flushed incrementally. Default is `true`.
924    pub incremental: bool,
925
926    pub priority_key: Arc<StreamPriorityKey>,
927}
928
929impl<F: BufFactory> Stream<F> {
930    /// Creates a new stream with the given flow control limits.
931    pub fn new(
932        id: u64, max_rx_data: u64, max_tx_data: u64, local: bool,
933        initial_window: u64, max_window: u64,
934    ) -> Self {
935        let priority_key = Arc::new(StreamPriorityKey {
936            id,
937            ..Default::default()
938        });
939
940        Stream {
941            recv: recv_buf::RecvBuf::new(max_rx_data, initial_window, max_window),
942            send: send_buf::SendBuf::new(max_tx_data),
943            send_lowat: 1,
944            bidi: is_bidi(id),
945            local,
946            urgency: priority_key.urgency,
947            incremental: priority_key.incremental,
948            priority_key,
949        }
950    }
951
952    /// Returns true if the stream has data to read.
953    pub fn is_readable(&self) -> bool {
954        self.recv.ready()
955    }
956
957    /// Returns true if the stream has enough flow control capacity to be
958    /// written to, and is not finished.
959    pub fn is_writable(&self) -> bool {
960        !self.send.is_shutdown() &&
961            !self.send.is_fin() &&
962            (self.send.off_back() + self.send_lowat as u64) <
963                self.send.max_off()
964    }
965
966    /// Returns true if the stream has data to send and is allowed to send at
967    /// least some of it.
968    pub fn is_flushable(&self) -> bool {
969        let off_front = self.send.off_front();
970
971        !self.send.is_empty() &&
972            off_front < self.send.off_back() &&
973            off_front < self.send.max_off()
974    }
975
976    /// Derives completion without duplicating buffer or acknowledgement state.
977    ///
978    /// For bidirectional streams this happens when both the receive and send
979    /// sides are complete. That is when all incoming data has been read by the
980    /// application, and when all outgoing data has been acked by the peer.
981    ///
982    /// For unidirectional streams this happens when either the receive or send
983    /// side is complete, depending on whether the stream was created locally
984    /// or not.
985    pub(crate) fn state(&self) -> StreamState {
986        let complete = match (self.bidi, self.local) {
987            // For bidirectional streams we need to check both receive and send
988            // sides for completion.
989            (true, _) => self.recv.is_fin() && self.send.is_complete(),
990
991            // For unidirectional streams generated locally, we only need to
992            // check the send side for completion.
993            (false, true) => self.send.is_complete(),
994
995            // For unidirectional streams generated by the peer, we only need
996            // to check the receive side for completion.
997            (false, false) => self.recv.is_fin(),
998        };
999
1000        let pending_stop_sending = match self.send.peer_stop_sending_state() {
1001            PeerStopSendingState::NotReported(_) => !self.send.is_shutdown(),
1002            PeerStopSendingState::NotReceived |
1003            PeerStopSendingState::Reported(_) => false,
1004        };
1005
1006        if !complete {
1007            StreamState::Incomplete
1008        } else if self.is_readable() || pending_stop_sending {
1009            StreamState::CompleteWithPendingDelivery
1010        } else {
1011            StreamState::Collectable
1012        }
1013    }
1014}
1015
1016/// Returns true if the stream was created locally.
1017pub fn is_local(stream_id: u64, is_server: bool) -> bool {
1018    (stream_id & 0x1) == (is_server as u64)
1019}
1020
1021/// Returns true if the stream is bidirectional.
1022pub fn is_bidi(stream_id: u64) -> bool {
1023    (stream_id & 0x2) == 0
1024}
1025
1026#[derive(Clone, Debug)]
1027pub struct StreamPriorityKey {
1028    pub urgency: u8,
1029    pub incremental: bool,
1030    pub id: u64,
1031
1032    pub readable: RBTreeAtomicLink,
1033    pub writable: RBTreeAtomicLink,
1034    pub stopped_writable: RBTreeAtomicLink,
1035    pub flushable: RBTreeAtomicLink,
1036}
1037
1038impl Default for StreamPriorityKey {
1039    fn default() -> Self {
1040        Self {
1041            urgency: DEFAULT_URGENCY,
1042            incremental: true,
1043            id: Default::default(),
1044            readable: Default::default(),
1045            writable: Default::default(),
1046            stopped_writable: Default::default(),
1047            flushable: Default::default(),
1048        }
1049    }
1050}
1051
1052impl PartialEq for StreamPriorityKey {
1053    fn eq(&self, other: &Self) -> bool {
1054        self.id == other.id
1055    }
1056}
1057
1058impl Eq for StreamPriorityKey {}
1059
1060impl PartialOrd for StreamPriorityKey {
1061    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
1062        Some(self.cmp(other))
1063    }
1064}
1065
1066impl Ord for StreamPriorityKey {
1067    fn cmp(&self, other: &Self) -> cmp::Ordering {
1068        // Ignore priority if ID matches.
1069        if self.id == other.id {
1070            return cmp::Ordering::Equal;
1071        }
1072
1073        // First, order by urgency...
1074        if self.urgency != other.urgency {
1075            return self.urgency.cmp(&other.urgency);
1076        }
1077
1078        // ...when the urgency is the same, and both are not incremental, order
1079        // by stream ID...
1080        if !self.incremental && !other.incremental {
1081            return self.id.cmp(&other.id);
1082        }
1083
1084        // ...non-incremental takes priority over incremental...
1085        if self.incremental && !other.incremental {
1086            return cmp::Ordering::Greater;
1087        }
1088        if !self.incremental && other.incremental {
1089            return cmp::Ordering::Less;
1090        }
1091
1092        // ...finally, when both are incremental, `other` takes precedence (so
1093        // `self` is always sorted after other same-urgency incremental
1094        // entries).
1095        cmp::Ordering::Greater
1096    }
1097}
1098
1099intrusive_adapter!(pub StreamWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { writable => RBTreeAtomicLink });
1100
1101impl KeyAdapter<'_> for StreamWritablePriorityAdapter {
1102    type Key = StreamPriorityKey;
1103
1104    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1105        s.clone()
1106    }
1107}
1108
1109intrusive_adapter!(pub StreamStoppedWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { stopped_writable => RBTreeAtomicLink });
1110
1111impl KeyAdapter<'_> for StreamStoppedWritablePriorityAdapter {
1112    type Key = StreamPriorityKey;
1113
1114    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1115        s.clone()
1116    }
1117}
1118
1119intrusive_adapter!(pub StreamReadablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { readable => RBTreeAtomicLink });
1120
1121impl KeyAdapter<'_> for StreamReadablePriorityAdapter {
1122    type Key = StreamPriorityKey;
1123
1124    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1125        s.clone()
1126    }
1127}
1128
1129intrusive_adapter!(pub StreamFlushablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { flushable => RBTreeAtomicLink });
1130
1131impl KeyAdapter<'_> for StreamFlushablePriorityAdapter {
1132    type Key = StreamPriorityKey;
1133
1134    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1135        s.clone()
1136    }
1137}
1138
1139/// An iterator over QUIC streams.
1140#[derive(Default)]
1141pub struct StreamIter {
1142    streams: SmallVec<[u64; 8]>,
1143    index: usize,
1144}
1145
1146impl StreamIter {
1147    #[inline]
1148    fn from(streams: &StreamIdHashSet) -> Self {
1149        StreamIter {
1150            streams: streams.iter().copied().collect(),
1151            index: 0,
1152        }
1153    }
1154}
1155
1156impl Iterator for StreamIter {
1157    type Item = u64;
1158
1159    #[inline]
1160    fn next(&mut self) -> Option<Self::Item> {
1161        let v = self.streams.get(self.index)?;
1162        self.index += 1;
1163        Some(*v)
1164    }
1165}
1166
1167impl ExactSizeIterator for StreamIter {
1168    #[inline]
1169    fn len(&self) -> usize {
1170        self.streams.len() - self.index
1171    }
1172}
1173
1174#[cfg(test)]
1175mod tests {
1176    use rstest::rstest;
1177
1178    use crate::range_buf::RangeBuf;
1179    use crate::test_utils::Pipe;
1180
1181    use super::*;
1182
1183    /// The default size of the receiver stream flow control window.
1184    const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
1185
1186    #[rstest]
1187    fn collected_streams_per_type(#[values(0, 1, 2, 3)] stream_type: u64) {
1188        let mut collected = CollectedStreams::default();
1189        assert!(collected.ranges.is_none());
1190
1191        for id in 0..4 {
1192            assert!(!collected.contains(id));
1193        }
1194        assert!(collected.ranges.is_none());
1195
1196        collected.insert(stream_type);
1197        assert!(collected.ranges.is_some());
1198
1199        for id in 0..4 {
1200            assert_eq!(collected.contains(id), id == stream_type);
1201        }
1202
1203        collected.insert(8 | stream_type);
1204        assert!(!collected.contains(4 | stream_type));
1205        assert_eq!(
1206            collected.ranges.as_ref().unwrap()[stream_type as usize].len(),
1207            2
1208        );
1209
1210        collected.insert(4 | stream_type);
1211        collected.insert(4 | stream_type);
1212        assert_eq!(
1213            collected.ranges.as_ref().unwrap()[stream_type as usize],
1214            0..3
1215        );
1216
1217        for id in 0..12 {
1218            assert_eq!(collected.contains(id), id & 0x3 == stream_type);
1219        }
1220    }
1221
1222    #[test]
1223    fn collected_streams_preserve_fragmented_and_large_ids() {
1224        let mut collected = CollectedStreams::default();
1225
1226        for sequence in (0..2048).step_by(2) {
1227            for stream_type in 0..4 {
1228                collected.insert((sequence << 2) | stream_type);
1229            }
1230        }
1231
1232        for sequence in 0..2048 {
1233            for stream_type in 0..4 {
1234                assert_eq!(
1235                    collected.contains((sequence << 2) | stream_type),
1236                    sequence % 2 == 0
1237                );
1238            }
1239        }
1240
1241        for stream_type in 0..4 {
1242            assert_eq!(
1243                collected.ranges.as_ref().unwrap()[stream_type as usize].len(),
1244                1024
1245            );
1246
1247            let stream_id = ((1u64 << 62) - 4) | stream_type;
1248            assert!(!collected.contains(stream_id));
1249            collected.insert(stream_id);
1250            assert!(collected.contains(stream_id));
1251            assert!(!collected.contains(stream_id - 4));
1252            assert!(!collected.contains((1u64 << 40) | stream_type));
1253        }
1254    }
1255
1256    /// Completes a client-initiated stream and processes returned stream
1257    /// credit.
1258    fn collect_pipe_stream(pipe: &mut Pipe, stream_id: u64) {
1259        let mut buf = [0; 1];
1260
1261        assert_eq!(pipe.client.stream_send(stream_id, b"a", true), Ok(1));
1262        assert_eq!(pipe.advance(), Ok(()));
1263        assert_eq!(pipe.server.stream_recv(stream_id, &mut buf), Ok((1, true)));
1264
1265        if is_bidi(stream_id) {
1266            assert_eq!(pipe.server.stream_send(stream_id, b"a", true), Ok(1));
1267            assert_eq!(pipe.advance(), Ok(()));
1268            assert_eq!(
1269                pipe.client.stream_recv(stream_id, &mut buf),
1270                Ok((1, true))
1271            );
1272        }
1273
1274        assert_eq!(pipe.advance(), Ok(()));
1275    }
1276
1277    #[rstest]
1278    fn collected_streams_out_of_order(
1279        #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1280        #[values(0, 2)] stream_type: u64,
1281    ) {
1282        let mut pipe = Pipe::new(cc_algorithm_name).unwrap();
1283        assert_eq!(pipe.handshake(), Ok(()));
1284
1285        for sequence in [2, 0, 1] {
1286            let stream_id = (sequence << 2) | stream_type;
1287            collect_pipe_stream(&mut pipe, stream_id);
1288
1289            for conn in [&mut pipe.client, &mut pipe.server] {
1290                assert!(conn.streams.get(stream_id).is_none());
1291                assert!(conn.streams.is_collected(stream_id));
1292                assert!(conn.stream_closed(stream_id));
1293                assert_eq!(
1294                    conn.streams
1295                        .get_or_create(
1296                            stream_id,
1297                            &conn.local_transport_params,
1298                            &conn.peer_transport_params,
1299                            !conn.is_server,
1300                            conn.is_server,
1301                        )
1302                        .err(),
1303                    Some(Error::Done)
1304                );
1305            }
1306        }
1307
1308        assert_eq!(
1309            pipe.server.streams.collected.ranges.as_ref().unwrap()
1310                [stream_type as usize],
1311            0..3
1312        );
1313
1314        // Late STREAM frames must not materialize a collected stream again.
1315        let frames = [crate::frame::Frame::Stream {
1316            stream_id: 8 | stream_type,
1317            data: RangeBuf::from(b"a", 0, true),
1318        }];
1319        assert!(pipe
1320            .send_pkt_to_server(crate::Type::Short, &frames, &mut [0; 1280])
1321            .is_ok());
1322        assert_eq!(pipe.server.streams.len(), 0);
1323    }
1324
1325    #[rstest]
1326    fn collected_streams_sparse_peer_credit(
1327        #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1328        #[values(0, 2)] stream_type: u64, #[values(1, 8)] initial_limit: u64,
1329    ) {
1330        let mut config = Pipe::default_config(cc_algorithm_name).unwrap();
1331        config.set_initial_max_streams_bidi(initial_limit);
1332        config.set_initial_max_streams_uni(initial_limit);
1333
1334        let mut pipe = Pipe::with_config(&mut config).unwrap();
1335        assert_eq!(pipe.handshake(), Ok(()));
1336
1337        for index in 0..initial_limit {
1338            let stream_id = (index << 3) | stream_type;
1339            collect_pipe_stream(&mut pipe, stream_id);
1340
1341            assert_eq!(
1342                pipe.server.streams.collected.ranges.as_ref().unwrap()
1343                    [stream_type as usize]
1344                    .len(),
1345                index as usize + 1
1346            );
1347            assert!(pipe.server.stream_closed(stream_id));
1348            assert!(pipe.client.stream_closed(stream_id));
1349            assert_eq!(pipe.server.streams.len(), 0);
1350        }
1351
1352        let peer_limit = if is_bidi(stream_type) {
1353            pipe.client.streams.peer_max_streams_bidi()
1354        } else {
1355            pipe.client.streams.peer_max_streams_uni()
1356        };
1357        assert_eq!(peer_limit, 2 * initial_limit);
1358
1359        // The odd sequences consume credit but have never had Stream objects.
1360        for sequence in (1..2 * initial_limit - 1).step_by(2) {
1361            let stream_id = (sequence << 2) | stream_type;
1362
1363            for conn in [&pipe.client, &pipe.server] {
1364                assert!(conn.streams.get(stream_id).is_none());
1365                assert!(!conn.streams.is_collected(stream_id));
1366                assert!(!conn.stream_closed(stream_id));
1367            }
1368        }
1369
1370        // Filling the implicit gaps is still permitted and merges all ranges.
1371        for sequence in (1..2 * initial_limit - 1).step_by(2) {
1372            collect_pipe_stream(&mut pipe, (sequence << 2) | stream_type);
1373        }
1374
1375        assert_eq!(
1376            pipe.server.streams.collected.ranges.as_ref().unwrap()
1377                [stream_type as usize],
1378            0..2 * initial_limit - 1
1379        );
1380    }
1381
1382    #[rstest]
1383    fn collected_streams_fragmented_local(
1384        #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1385        #[values(0, 2)] stream_type: u64,
1386    ) {
1387        let mut client_config = Pipe::default_config(cc_algorithm_name).unwrap();
1388        client_config.set_initial_max_streams_bidi(1);
1389        client_config.set_initial_max_streams_uni(1);
1390
1391        let mut server_config = Pipe::default_config(cc_algorithm_name).unwrap();
1392        server_config.set_initial_max_streams_bidi(32);
1393        server_config.set_initial_max_streams_uni(32);
1394
1395        let mut pipe = Pipe::with_client_and_server_config(
1396            &mut client_config,
1397            &mut server_config,
1398        )
1399        .unwrap();
1400        assert_eq!(pipe.handshake(), Ok(()));
1401
1402        // Local fragmentation follows the peer's allowance and application
1403        // behavior, not the client's initial incoming stream limit of one.
1404        for index in 0..32 {
1405            collect_pipe_stream(&mut pipe, (index << 3) | stream_type);
1406            assert_eq!(
1407                pipe.client.streams.collected.ranges.as_ref().unwrap()
1408                    [stream_type as usize]
1409                    .len(),
1410                index as usize + 1
1411            );
1412            assert_eq!(pipe.client.streams.len(), 0);
1413        }
1414    }
1415
1416    #[rstest]
1417    fn stream_limit_does_not_collect(
1418        #[values(0, 1, 2, 3)] stream_type: u64,
1419        #[values(true, false)] local: bool,
1420    ) {
1421        let params = crate::TransportParams::default();
1422        let mut streams = <StreamMap>::new(1, 1, DEFAULT_STREAM_WINDOW);
1423        streams.update_peer_max_streams_bidi(1);
1424        streams.update_peer_max_streams_uni(1);
1425
1426        let stream_id = 4 | stream_type;
1427        let is_server = (stream_type & 1 != 0) == local;
1428        assert_eq!(
1429            streams
1430                .get_or_create(stream_id, &params, &params, local, is_server)
1431                .err(),
1432            Some(Error::StreamLimit)
1433        );
1434        assert!(!streams.is_collected(stream_id));
1435        assert_eq!(streams.len(), 0);
1436        assert!(streams.collected.ranges.is_none());
1437
1438        if local {
1439            streams.update_peer_max_streams_bidi(2);
1440            streams.update_peer_max_streams_uni(2);
1441        } else {
1442            streams.local_max_streams_bidi_next = 2;
1443            streams.local_max_streams_uni_next = 2;
1444            streams.update_max_streams_bidi();
1445            streams.update_max_streams_uni();
1446        }
1447
1448        assert!(streams
1449            .get_or_create(stream_id, &params, &params, local, is_server)
1450            .is_ok());
1451        assert!(streams.collected.ranges.is_none());
1452    }
1453
1454    #[test]
1455    fn recv_flow_control() {
1456        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1457        assert!(!stream.recv.almost_full());
1458
1459        let mut buf = [0; 32];
1460
1461        let first = RangeBuf::from(b"hello", 0, false);
1462        let second = RangeBuf::from(b"world", 5, false);
1463        let third = RangeBuf::from(b"something", 10, false);
1464
1465        assert_eq!(stream.recv.write(second), Ok(()));
1466        assert_eq!(stream.recv.write(first), Ok(()));
1467        assert!(!stream.recv.almost_full());
1468
1469        assert_eq!(stream.recv.write(third), Err(Error::FlowControl));
1470
1471        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1472        assert_eq!(&buf[..len], b"helloworld");
1473        assert!(!fin);
1474
1475        assert!(stream.recv.almost_full());
1476
1477        stream.recv.update_max_data(std::time::Instant::now());
1478        assert_eq!(stream.recv.max_data_next(), 25);
1479        assert!(!stream.recv.almost_full());
1480
1481        let third = RangeBuf::from(b"something", 10, false);
1482        assert_eq!(stream.recv.write(third), Ok(()));
1483    }
1484
1485    #[test]
1486    fn recv_past_fin() {
1487        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1488        assert!(!stream.recv.almost_full());
1489
1490        let first = RangeBuf::from(b"hello", 0, true);
1491        let second = RangeBuf::from(b"world", 5, false);
1492
1493        assert_eq!(stream.recv.write(first), Ok(()));
1494        assert_eq!(stream.recv.write(second), Err(Error::FinalSize));
1495    }
1496
1497    #[test]
1498    fn recv_fin_dup() {
1499        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1500        assert!(!stream.recv.almost_full());
1501
1502        let first = RangeBuf::from(b"hello", 0, true);
1503        let second = RangeBuf::from(b"hello", 0, true);
1504
1505        assert_eq!(stream.recv.write(first), Ok(()));
1506        assert_eq!(stream.recv.write(second), Ok(()));
1507
1508        let mut buf = [0; 32];
1509
1510        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1511        assert_eq!(&buf[..len], b"hello");
1512        assert!(fin);
1513    }
1514
1515    #[test]
1516    fn recv_fin_change() {
1517        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1518        assert!(!stream.recv.almost_full());
1519
1520        let first = RangeBuf::from(b"hello", 0, true);
1521        let second = RangeBuf::from(b"world", 5, true);
1522
1523        assert_eq!(stream.recv.write(second), Ok(()));
1524        assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1525    }
1526
1527    #[test]
1528    fn recv_fin_lower_than_received() {
1529        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1530        assert!(!stream.recv.almost_full());
1531
1532        let first = RangeBuf::from(b"hello", 0, true);
1533        let second = RangeBuf::from(b"world", 5, false);
1534
1535        assert_eq!(stream.recv.write(second), Ok(()));
1536        assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1537    }
1538
1539    #[test]
1540    fn recv_fin_flow_control() {
1541        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1542        assert!(!stream.recv.almost_full());
1543
1544        let mut buf = [0; 32];
1545
1546        let first = RangeBuf::from(b"hello", 0, false);
1547        let second = RangeBuf::from(b"world", 5, true);
1548
1549        assert_eq!(stream.recv.write(first), Ok(()));
1550        assert_eq!(stream.recv.write(second), Ok(()));
1551
1552        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1553        assert_eq!(&buf[..len], b"helloworld");
1554        assert!(fin);
1555
1556        assert!(!stream.recv.almost_full());
1557    }
1558
1559    #[test]
1560    fn recv_fin_reset_mismatch() {
1561        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1562        assert!(!stream.recv.almost_full());
1563
1564        let first = RangeBuf::from(b"hello", 0, true);
1565
1566        assert_eq!(stream.recv.write(first), Ok(()));
1567        assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1568    }
1569
1570    #[test]
1571    fn recv_reset_with_gap() {
1572        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1573        assert!(!stream.recv.almost_full());
1574
1575        let first = RangeBuf::from(b"hello", 0, false);
1576
1577        assert_eq!(stream.recv.write(first), Ok(()));
1578        // Read one byte.
1579        assert_eq!(stream.recv.emit(&mut [0; 1]), Ok((1, false)));
1580        // Reset with a final size > than max previously received
1581        assert_eq!(
1582            stream.recv.reset(0, 10),
1583            Ok(RecvBufResetReturn {
1584                max_data_delta: 5,
1585                // consumed_flowcontrol is 9, since we already read 1 byte
1586                consumed_flowcontrol: 9
1587            })
1588        );
1589        assert_eq!(stream.recv.reset(0, 10), Ok(RecvBufResetReturn::zero()));
1590    }
1591
1592    #[test]
1593    fn recv_reset_dup() {
1594        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1595        assert!(!stream.recv.almost_full());
1596
1597        let first = RangeBuf::from(b"hello", 0, false);
1598
1599        assert_eq!(stream.recv.write(first), Ok(()));
1600        assert_eq!(
1601            stream.recv.reset(0, 5),
1602            Ok(RecvBufResetReturn {
1603                max_data_delta: 0,
1604                consumed_flowcontrol: 5
1605            })
1606        );
1607        assert_eq!(stream.recv.reset(0, 5), Ok(RecvBufResetReturn::zero()));
1608    }
1609
1610    #[test]
1611    fn recv_reset_change() {
1612        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1613        assert!(!stream.recv.almost_full());
1614
1615        let first = RangeBuf::from(b"hello", 0, false);
1616
1617        assert_eq!(stream.recv.write(first), Ok(()));
1618        assert_eq!(
1619            stream.recv.reset(0, 5),
1620            Ok(RecvBufResetReturn {
1621                max_data_delta: 0,
1622                consumed_flowcontrol: 5
1623            })
1624        );
1625        assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1626    }
1627
1628    #[test]
1629    fn recv_reset_lower_than_received() {
1630        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1631        assert!(!stream.recv.almost_full());
1632
1633        let first = RangeBuf::from(b"hello", 0, false);
1634
1635        assert_eq!(stream.recv.write(first), Ok(()));
1636        assert_eq!(stream.recv.reset(0, 4), Err(Error::FinalSize));
1637    }
1638
1639    #[test]
1640    fn send_flow_control() {
1641        let mut buf = [0; 25];
1642
1643        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1644
1645        let first = b"hello";
1646        let second = b"world";
1647        let third = b"something";
1648
1649        assert!(stream.send.write(first, false).is_ok());
1650        assert!(stream.send.write(second, false).is_ok());
1651        assert!(stream.send.write(third, false).is_ok());
1652
1653        assert_eq!(stream.send.off_front(), 0);
1654
1655        let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1656        assert_eq!(written, 15);
1657        assert!(!fin);
1658        assert_eq!(&buf[..written], b"helloworldsomet");
1659
1660        assert_eq!(stream.send.off_front(), 15);
1661
1662        let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1663        assert_eq!(written, 0);
1664        assert!(!fin);
1665        assert_eq!(&buf[..written], b"");
1666
1667        stream.send.retransmit(0, 15);
1668
1669        assert_eq!(stream.send.off_front(), 0);
1670
1671        let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1672        assert_eq!(written, 10);
1673        assert!(!fin);
1674        assert_eq!(&buf[..written], b"helloworld");
1675
1676        assert_eq!(stream.send.off_front(), 10);
1677
1678        let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1679        assert_eq!(written, 5);
1680        assert!(!fin);
1681        assert_eq!(&buf[..written], b"somet");
1682    }
1683
1684    #[test]
1685    fn send_past_fin() {
1686        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1687
1688        let first = b"hello";
1689        let second = b"world";
1690        let third = b"third";
1691
1692        assert_eq!(stream.send.write(first, false), Ok(5));
1693
1694        assert_eq!(stream.send.write(second, true), Ok(5));
1695        assert!(stream.send.is_fin());
1696
1697        assert_eq!(stream.send.write(third, false), Err(Error::FinalSize));
1698    }
1699
1700    #[test]
1701    fn send_fin_dup() {
1702        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1703
1704        assert_eq!(stream.send.write(b"hello", true), Ok(5));
1705        assert!(stream.send.is_fin());
1706
1707        assert_eq!(stream.send.write(b"", true), Ok(0));
1708        assert!(stream.send.is_fin());
1709    }
1710
1711    #[test]
1712    fn send_undo_fin() {
1713        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1714
1715        assert_eq!(stream.send.write(b"hello", true), Ok(5));
1716        assert!(stream.send.is_fin());
1717
1718        assert_eq!(
1719            stream.send.write(b"helloworld", true),
1720            Err(Error::FinalSize)
1721        );
1722    }
1723
1724    #[test]
1725    fn send_fin_max_data_match() {
1726        let mut buf = [0; 15];
1727
1728        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1729
1730        let slice = b"hellohellohello";
1731
1732        assert!(stream.send.write(slice, true).is_ok());
1733
1734        let (written, fin) = stream.send.emit(&mut buf[..15]).unwrap();
1735        assert_eq!(written, 15);
1736        assert!(fin);
1737        assert_eq!(&buf[..written], slice);
1738    }
1739
1740    #[test]
1741    fn send_fin_zero_length() {
1742        let mut buf = [0; 5];
1743
1744        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1745
1746        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1747        assert_eq!(stream.send.write(b"", true), Ok(0));
1748        assert!(stream.send.is_fin());
1749
1750        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1751        assert_eq!(written, 5);
1752        assert!(fin);
1753        assert_eq!(&buf[..written], b"hello");
1754    }
1755
1756    #[test]
1757    fn send_ack() {
1758        let mut buf = [0; 5];
1759
1760        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1761
1762        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1763        assert_eq!(stream.send.write(b"world", false), Ok(5));
1764        assert_eq!(stream.send.write(b"", true), Ok(0));
1765        assert!(stream.send.is_fin());
1766
1767        assert_eq!(stream.send.off_front(), 0);
1768
1769        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1770        assert_eq!(written, 5);
1771        assert!(!fin);
1772        assert_eq!(&buf[..written], b"hello");
1773
1774        stream.send.ack_and_drop(0, 5);
1775
1776        stream.send.retransmit(0, 5);
1777
1778        assert_eq!(stream.send.off_front(), 5);
1779
1780        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1781        assert_eq!(written, 5);
1782        assert!(fin);
1783        assert_eq!(&buf[..written], b"world");
1784    }
1785
1786    #[test]
1787    fn send_ack_reordering() {
1788        let mut buf = [0; 5];
1789
1790        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1791
1792        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1793        assert_eq!(stream.send.write(b"world", false), Ok(5));
1794        assert_eq!(stream.send.write(b"", true), Ok(0));
1795        assert!(stream.send.is_fin());
1796
1797        assert_eq!(stream.send.off_front(), 0);
1798
1799        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1800        assert_eq!(written, 5);
1801        assert!(!fin);
1802        assert_eq!(&buf[..written], b"hello");
1803
1804        assert_eq!(stream.send.off_front(), 5);
1805
1806        let (written, fin) = stream.send.emit(&mut buf[..1]).unwrap();
1807        assert_eq!(written, 1);
1808        assert!(!fin);
1809        assert_eq!(&buf[..written], b"w");
1810
1811        stream.send.ack_and_drop(5, 1);
1812        stream.send.ack_and_drop(0, 5);
1813
1814        stream.send.retransmit(0, 5);
1815        stream.send.retransmit(5, 1);
1816
1817        assert_eq!(stream.send.off_front(), 6);
1818
1819        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1820        assert_eq!(written, 4);
1821        assert!(fin);
1822        assert_eq!(&buf[..written], b"orld");
1823    }
1824
1825    #[test]
1826    fn recv_data_below_off() {
1827        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1828
1829        let first = RangeBuf::from(b"hello", 0, false);
1830
1831        assert_eq!(stream.recv.write(first), Ok(()));
1832
1833        let mut buf = [0; 10];
1834
1835        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1836        assert_eq!(&buf[..len], b"hello");
1837        assert!(!fin);
1838
1839        let first = RangeBuf::from(b"elloworld", 1, true);
1840        assert_eq!(stream.recv.write(first), Ok(()));
1841
1842        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1843        assert_eq!(&buf[..len], b"world");
1844        assert!(fin);
1845    }
1846
1847    #[test]
1848    fn stream_complete() {
1849        let mut stream =
1850            <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1851
1852        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1853        assert_eq!(stream.send.write(b"world", false), Ok(5));
1854
1855        assert!(!stream.send.is_complete());
1856        assert!(!stream.send.is_fin());
1857
1858        assert_eq!(stream.send.write(b"", true), Ok(0));
1859
1860        assert!(!stream.send.is_complete());
1861        assert!(stream.send.is_fin());
1862
1863        assert_eq!(stream.send.emit(&mut [0; 10]), Ok((10, true)));
1864
1865        let buf = RangeBuf::from(b"hello", 0, true);
1866        assert!(stream.recv.write(buf).is_ok());
1867        assert!(!stream.recv.is_fin());
1868
1869        stream.send.ack(6, 4);
1870        assert!(!stream.send.is_complete());
1871
1872        let mut buf = [0; 2];
1873        assert_eq!(stream.recv.emit(&mut buf), Ok((2, false)));
1874        assert!(!stream.recv.is_fin());
1875
1876        stream.send.ack(1, 5);
1877        assert!(!stream.send.is_complete());
1878
1879        stream.send.ack(0, 1);
1880        assert!(!stream.send.is_complete());
1881
1882        stream.send.ack_fin();
1883        assert!(stream.send.is_complete());
1884
1885        assert_eq!(stream.state(), StreamState::Incomplete);
1886
1887        let mut buf = [0; 3];
1888        assert_eq!(stream.recv.emit(&mut buf), Ok((3, true)));
1889        assert!(stream.recv.is_fin());
1890
1891        assert_eq!(stream.state(), StreamState::Collectable);
1892
1893        // A completed stream must retain each undelivered terminal event.
1894        stream.send.stop(42).unwrap();
1895        assert_eq!(stream.state(), StreamState::CompleteWithPendingDelivery);
1896        assert_eq!(
1897            stream.send.cap_and_report_stop_sending(),
1898            Err(Error::StreamStopped(42))
1899        );
1900        assert_eq!(stream.state(), StreamState::Collectable);
1901
1902        let mut stream =
1903            <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1904        stream.send.shutdown().unwrap();
1905        stream.recv.reset(43, 5).unwrap();
1906        assert_eq!(stream.state(), StreamState::CompleteWithPendingDelivery);
1907        assert_eq!(stream.recv.emit(&mut buf), Err(Error::StreamReset(43)));
1908        assert_eq!(stream.state(), StreamState::Collectable);
1909
1910        // Local shutdown permits collection without reporting a later peer
1911        // STOP.
1912        stream.send.stop(42).unwrap();
1913        assert_eq!(stream.state(), StreamState::Collectable);
1914        assert_eq!(
1915            stream.send.peer_stop_sending_state(),
1916            PeerStopSendingState::NotReported(42)
1917        );
1918    }
1919
1920    #[test]
1921    fn send_fin_zero_length_output() {
1922        let mut buf = [0; 5];
1923
1924        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1925
1926        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1927        assert_eq!(stream.send.off_front(), 0);
1928        assert!(!stream.send.is_fin());
1929
1930        let (written, fin) = stream.send.emit(&mut buf).unwrap();
1931        assert_eq!(written, 5);
1932        assert!(!fin);
1933        assert_eq!(&buf[..written], b"hello");
1934
1935        assert_eq!(stream.send.write(b"", true), Ok(0));
1936        assert!(stream.send.is_fin());
1937        assert_eq!(stream.send.off_front(), 5);
1938
1939        let (written, fin) = stream.send.emit(&mut buf).unwrap();
1940        assert_eq!(written, 0);
1941        assert!(fin);
1942        assert_eq!(&buf[..written], b"");
1943    }
1944
1945    fn stream_send_ready(stream: &Stream) -> bool {
1946        !stream.send.is_empty() &&
1947            stream.send.off_front() < stream.send.off_back()
1948    }
1949
1950    #[test]
1951    fn send_emit() {
1952        let mut buf = [0; 5];
1953
1954        let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1955
1956        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1957        assert_eq!(stream.send.write(b"world", false), Ok(5));
1958        assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1959        assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1960        assert_eq!(stream.send.off_front(), 0);
1961        assert_eq!(stream.send.bufs_count(), 4);
1962
1963        assert!(stream.is_flushable());
1964
1965        assert!(stream_send_ready(&stream));
1966        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1967        assert_eq!(stream.send.off_front(), 4);
1968        assert_eq!(&buf[..4], b"hell");
1969
1970        assert!(stream_send_ready(&stream));
1971        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1972        assert_eq!(stream.send.off_front(), 8);
1973        assert_eq!(&buf[..4], b"owor");
1974
1975        assert!(stream_send_ready(&stream));
1976        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1977        assert_eq!(stream.send.off_front(), 10);
1978        assert_eq!(&buf[..2], b"ld");
1979
1980        assert!(stream_send_ready(&stream));
1981        assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1982        assert_eq!(stream.send.off_front(), 11);
1983        assert_eq!(&buf[..1], b"o");
1984
1985        assert!(stream_send_ready(&stream));
1986        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1987        assert_eq!(stream.send.off_front(), 16);
1988        assert_eq!(&buf[..5], b"llehd");
1989
1990        assert!(stream_send_ready(&stream));
1991        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1992        assert_eq!(stream.send.off_front(), 20);
1993        assert_eq!(&buf[..4], b"lrow");
1994
1995        assert!(!stream.is_flushable());
1996
1997        assert!(!stream_send_ready(&stream));
1998        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1999        assert_eq!(stream.send.off_front(), 20);
2000    }
2001
2002    #[test]
2003    fn send_emit_ack() {
2004        let mut buf = [0; 5];
2005
2006        let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
2007
2008        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2009        assert_eq!(stream.send.write(b"world", false), Ok(5));
2010        assert_eq!(stream.send.write(b"olleh", false), Ok(5));
2011        assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
2012        assert_eq!(stream.send.off_front(), 0);
2013        assert_eq!(stream.send.bufs_count(), 4);
2014
2015        assert!(stream.is_flushable());
2016
2017        assert!(stream_send_ready(&stream));
2018        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2019        assert_eq!(stream.send.off_front(), 4);
2020        assert_eq!(&buf[..4], b"hell");
2021
2022        assert!(stream_send_ready(&stream));
2023        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2024        assert_eq!(stream.send.off_front(), 8);
2025        assert_eq!(&buf[..4], b"owor");
2026
2027        stream.send.ack_and_drop(0, 5);
2028        assert_eq!(stream.send.bufs_count(), 3);
2029
2030        assert!(stream_send_ready(&stream));
2031        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2032        assert_eq!(stream.send.off_front(), 10);
2033        assert_eq!(&buf[..2], b"ld");
2034
2035        stream.send.ack_and_drop(7, 5);
2036        assert_eq!(stream.send.bufs_count(), 3);
2037
2038        assert!(stream_send_ready(&stream));
2039        assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
2040        assert_eq!(stream.send.off_front(), 11);
2041        assert_eq!(&buf[..1], b"o");
2042
2043        assert!(stream_send_ready(&stream));
2044        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2045        assert_eq!(stream.send.off_front(), 16);
2046        assert_eq!(&buf[..5], b"llehd");
2047
2048        stream.send.ack_and_drop(5, 7);
2049        assert_eq!(stream.send.bufs_count(), 2);
2050
2051        assert!(stream_send_ready(&stream));
2052        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
2053        assert_eq!(stream.send.off_front(), 20);
2054        assert_eq!(&buf[..4], b"lrow");
2055
2056        assert!(!stream.is_flushable());
2057
2058        assert!(!stream_send_ready(&stream));
2059        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
2060        assert_eq!(stream.send.off_front(), 20);
2061
2062        stream.send.ack_and_drop(22, 4);
2063        assert_eq!(stream.send.bufs_count(), 2);
2064
2065        stream.send.ack_and_drop(20, 1);
2066        assert_eq!(stream.send.bufs_count(), 2);
2067    }
2068
2069    #[test]
2070    fn send_emit_retransmit() {
2071        let mut buf = [0; 5];
2072
2073        let mut stream = <Stream>::new(
2074            0,
2075            0,
2076            20,
2077            true,
2078            DEFAULT_STREAM_WINDOW,
2079            DEFAULT_STREAM_WINDOW,
2080        );
2081
2082        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2083        assert_eq!(stream.send.write(b"world", false), Ok(5));
2084        assert_eq!(stream.send.write(b"olleh", false), Ok(5));
2085        assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
2086        assert_eq!(stream.send.off_front(), 0);
2087        assert_eq!(stream.send.bufs_count(), 4);
2088
2089        assert!(stream.is_flushable());
2090
2091        assert!(stream_send_ready(&stream));
2092        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2093        assert_eq!(stream.send.off_front(), 4);
2094        assert_eq!(&buf[..4], b"hell");
2095
2096        assert!(stream_send_ready(&stream));
2097        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2098        assert_eq!(stream.send.off_front(), 8);
2099        assert_eq!(&buf[..4], b"owor");
2100
2101        stream.send.retransmit(3, 3);
2102        assert_eq!(stream.send.off_front(), 3);
2103
2104        assert!(stream_send_ready(&stream));
2105        assert_eq!(stream.send.emit(&mut buf[..3]), Ok((3, false)));
2106        assert_eq!(stream.send.off_front(), 8);
2107        assert_eq!(&buf[..3], b"low");
2108
2109        assert!(stream_send_ready(&stream));
2110        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2111        assert_eq!(stream.send.off_front(), 10);
2112        assert_eq!(&buf[..2], b"ld");
2113
2114        stream.send.ack_and_drop(7, 2);
2115
2116        stream.send.retransmit(8, 2);
2117
2118        assert!(stream_send_ready(&stream));
2119        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2120        assert_eq!(stream.send.off_front(), 10);
2121        assert_eq!(&buf[..2], b"ld");
2122
2123        assert!(stream_send_ready(&stream));
2124        assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
2125        assert_eq!(stream.send.off_front(), 11);
2126        assert_eq!(&buf[..1], b"o");
2127
2128        assert!(stream_send_ready(&stream));
2129        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2130        assert_eq!(stream.send.off_front(), 16);
2131        assert_eq!(&buf[..5], b"llehd");
2132
2133        stream.send.retransmit(12, 2);
2134
2135        assert!(stream_send_ready(&stream));
2136        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2137        assert_eq!(stream.send.off_front(), 16);
2138        assert_eq!(&buf[..2], b"le");
2139
2140        assert!(stream_send_ready(&stream));
2141        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
2142        assert_eq!(stream.send.off_front(), 20);
2143        assert_eq!(&buf[..4], b"lrow");
2144
2145        assert!(!stream.is_flushable());
2146
2147        assert!(!stream_send_ready(&stream));
2148        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
2149        assert_eq!(stream.send.off_front(), 20);
2150
2151        stream.send.retransmit(7, 12);
2152
2153        assert!(stream_send_ready(&stream));
2154        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2155        assert_eq!(stream.send.off_front(), 12);
2156        assert_eq!(&buf[..5], b"rldol");
2157
2158        assert!(stream_send_ready(&stream));
2159        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2160        assert_eq!(stream.send.off_front(), 17);
2161        assert_eq!(&buf[..5], b"lehdl");
2162
2163        assert!(stream_send_ready(&stream));
2164        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
2165        assert_eq!(stream.send.off_front(), 20);
2166        assert_eq!(&buf[..2], b"ro");
2167
2168        stream.send.ack_and_drop(12, 7);
2169
2170        stream.send.retransmit(7, 12);
2171
2172        assert!(stream_send_ready(&stream));
2173        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2174        assert_eq!(stream.send.off_front(), 12);
2175        assert_eq!(&buf[..5], b"rldol");
2176
2177        assert!(stream_send_ready(&stream));
2178        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2179        assert_eq!(stream.send.off_front(), 17);
2180        assert_eq!(&buf[..5], b"lehdl");
2181
2182        assert!(stream_send_ready(&stream));
2183        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
2184        assert_eq!(stream.send.off_front(), 20);
2185        assert_eq!(&buf[..2], b"ro");
2186    }
2187
2188    #[test]
2189    fn send_buf_empty_fin_next() {
2190        let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
2191
2192        assert!(!stream.send.empty_fin_next());
2193        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2194
2195        let mut buf = [0; 5];
2196        assert_eq!(stream.send.emit(&mut buf), Ok((5, false)));
2197        assert!(!stream.send.empty_fin_next());
2198
2199        assert_eq!(stream.send.write(b"", true), Ok(0));
2200        assert!(stream.send.empty_fin_next());
2201
2202        let mut empty = [];
2203        assert_eq!(stream.send.emit(&mut empty), Ok((0, true)));
2204    }
2205
2206    #[test]
2207    fn rangebuf_split_off() {
2208        let mut buf = <RangeBuf>::from(b"helloworld", 5, true);
2209        assert_eq!(buf.start, 0);
2210        assert_eq!(buf.pos, 0);
2211        assert_eq!(buf.len, 10);
2212        assert_eq!(buf.off, 5);
2213        assert!(buf.fin);
2214
2215        assert_eq!(buf.len(), 10);
2216        assert_eq!(buf.off(), 5);
2217        assert!(buf.fin());
2218
2219        assert_eq!(&buf[..], b"helloworld");
2220
2221        // Advance buffer.
2222        buf.consume(5);
2223
2224        assert_eq!(buf.start, 0);
2225        assert_eq!(buf.pos, 5);
2226        assert_eq!(buf.len, 10);
2227        assert_eq!(buf.off, 5);
2228        assert!(buf.fin);
2229
2230        assert_eq!(buf.len(), 5);
2231        assert_eq!(buf.off(), 10);
2232        assert!(buf.fin());
2233
2234        assert_eq!(&buf[..], b"world");
2235
2236        // Split buffer before position.
2237        let mut new_buf = buf.split_off(3);
2238
2239        assert_eq!(buf.start, 0);
2240        assert_eq!(buf.pos, 3);
2241        assert_eq!(buf.len, 3);
2242        assert_eq!(buf.off, 5);
2243        assert!(!buf.fin);
2244
2245        assert_eq!(buf.len(), 0);
2246        assert_eq!(buf.off(), 8);
2247        assert!(!buf.fin());
2248
2249        assert_eq!(&buf[..], b"");
2250
2251        assert_eq!(new_buf.start, 3);
2252        assert_eq!(new_buf.pos, 5);
2253        assert_eq!(new_buf.len, 7);
2254        assert_eq!(new_buf.off, 8);
2255        assert!(new_buf.fin);
2256
2257        assert_eq!(new_buf.len(), 5);
2258        assert_eq!(new_buf.off(), 10);
2259        assert!(new_buf.fin());
2260
2261        assert_eq!(&new_buf[..], b"world");
2262
2263        // Advance buffer.
2264        new_buf.consume(2);
2265
2266        assert_eq!(new_buf.start, 3);
2267        assert_eq!(new_buf.pos, 7);
2268        assert_eq!(new_buf.len, 7);
2269        assert_eq!(new_buf.off, 8);
2270        assert!(new_buf.fin);
2271
2272        assert_eq!(new_buf.len(), 3);
2273        assert_eq!(new_buf.off(), 12);
2274        assert!(new_buf.fin());
2275
2276        assert_eq!(&new_buf[..], b"rld");
2277
2278        // Split buffer after position.
2279        let mut new_new_buf = new_buf.split_off(5);
2280
2281        assert_eq!(new_buf.start, 3);
2282        assert_eq!(new_buf.pos, 7);
2283        assert_eq!(new_buf.len, 5);
2284        assert_eq!(new_buf.off, 8);
2285        assert!(!new_buf.fin);
2286
2287        assert_eq!(new_buf.len(), 1);
2288        assert_eq!(new_buf.off(), 12);
2289        assert!(!new_buf.fin());
2290
2291        assert_eq!(&new_buf[..], b"r");
2292
2293        assert_eq!(new_new_buf.start, 8);
2294        assert_eq!(new_new_buf.pos, 8);
2295        assert_eq!(new_new_buf.len, 2);
2296        assert_eq!(new_new_buf.off, 13);
2297        assert!(new_new_buf.fin);
2298
2299        assert_eq!(new_new_buf.len(), 2);
2300        assert_eq!(new_new_buf.off(), 13);
2301        assert!(new_new_buf.fin());
2302
2303        assert_eq!(&new_new_buf[..], b"ld");
2304
2305        // Advance buffer.
2306        new_new_buf.consume(2);
2307
2308        assert_eq!(new_new_buf.start, 8);
2309        assert_eq!(new_new_buf.pos, 10);
2310        assert_eq!(new_new_buf.len, 2);
2311        assert_eq!(new_new_buf.off, 13);
2312        assert!(new_new_buf.fin);
2313
2314        assert_eq!(new_new_buf.len(), 0);
2315        assert_eq!(new_new_buf.off(), 15);
2316        assert!(new_new_buf.fin());
2317
2318        assert_eq!(&new_new_buf[..], b"");
2319    }
2320
2321    /// RFC9000 2.1: A stream ID that is used out of order results in all
2322    /// streams of that type with lower-numbered stream IDs also being opened.
2323    #[test]
2324    fn stream_limit_auto_open() {
2325        let local_tp = crate::TransportParams::default();
2326        let peer_tp = crate::TransportParams::default();
2327
2328        let mut streams = <StreamMap>::new(5, 5, 5);
2329
2330        let stream_id = 500;
2331        assert!(!is_local(stream_id, true), "stream id is peer initiated");
2332        assert!(is_bidi(stream_id), "stream id is bidirectional");
2333        assert_eq!(
2334            streams
2335                .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2336                .err(),
2337            Some(Error::StreamLimit),
2338            "stream limit should be exceeded"
2339        );
2340    }
2341
2342    /// Stream limit should be satisfied regardless of what order we open
2343    /// streams
2344    #[test]
2345    fn stream_create_out_of_order() {
2346        let local_tp = crate::TransportParams::default();
2347        let peer_tp = crate::TransportParams::default();
2348
2349        let mut streams = <StreamMap>::new(5, 5, 5);
2350
2351        for stream_id in [8, 12, 4] {
2352            assert!(is_local(stream_id, false), "stream id is client initiated");
2353            assert!(is_bidi(stream_id), "stream id is bidirectional");
2354            assert!(streams
2355                .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2356                .is_ok());
2357        }
2358    }
2359
2360    /// Check stream limit boundary cases
2361    #[test]
2362    fn stream_limit_edge() {
2363        let local_tp = crate::TransportParams::default();
2364        let peer_tp = crate::TransportParams::default();
2365
2366        let mut streams = <StreamMap>::new(3, 3, 3);
2367
2368        // Highest permitted
2369        let stream_id = 8;
2370        assert!(streams
2371            .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2372            .is_ok());
2373
2374        // One more than highest permitted
2375        let stream_id = 12;
2376        assert_eq!(
2377            streams
2378                .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2379                .err(),
2380            Some(Error::StreamLimit)
2381        );
2382    }
2383
2384    fn cycle_stream_priority(stream_id: u64, streams: &mut StreamMap) {
2385        let key = streams.get(stream_id).unwrap().priority_key.clone();
2386        streams.update_priority(&key.clone(), &key);
2387    }
2388
2389    #[test]
2390    fn writable_prioritized_default_priority() {
2391        let local_tp = crate::TransportParams::default();
2392        let peer_tp = crate::TransportParams {
2393            initial_max_stream_data_bidi_local: 100,
2394            initial_max_stream_data_uni: 100,
2395            ..Default::default()
2396        };
2397
2398        let mut streams = StreamMap::new(100, 100, 100);
2399
2400        for id in [0, 4, 8, 12] {
2401            assert!(streams
2402                .get_or_create(id, &local_tp, &peer_tp, false, true)
2403                .is_ok());
2404        }
2405
2406        let walk_1: Vec<u64> = streams.writable().collect();
2407        cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
2408        let walk_2: Vec<u64> = streams.writable().collect();
2409        cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
2410        let walk_3: Vec<u64> = streams.writable().collect();
2411        cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
2412        let walk_4: Vec<u64> = streams.writable().collect();
2413        cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
2414        let walk_5: Vec<u64> = streams.writable().collect();
2415
2416        // All streams are non-incremental and same urgency by default. Multiple
2417        // visits shuffle their order.
2418        assert_eq!(walk_1, vec![0, 4, 8, 12]);
2419        assert_eq!(walk_2, vec![4, 8, 12, 0]);
2420        assert_eq!(walk_3, vec![8, 12, 0, 4]);
2421        assert_eq!(walk_4, vec![12, 0, 4, 8,]);
2422        assert_eq!(walk_5, vec![0, 4, 8, 12]);
2423    }
2424
2425    #[test]
2426    fn writable_prioritized_insert_order() {
2427        let local_tp = crate::TransportParams::default();
2428        let peer_tp = crate::TransportParams {
2429            initial_max_stream_data_bidi_local: 100,
2430            initial_max_stream_data_uni: 100,
2431            ..Default::default()
2432        };
2433
2434        let mut streams = StreamMap::new(100, 100, 100);
2435
2436        // Inserting same-urgency incremental streams in a "random" order yields
2437        // same order to start with.
2438        for id in [12, 4, 8, 0] {
2439            assert!(streams
2440                .get_or_create(id, &local_tp, &peer_tp, false, true)
2441                .is_ok());
2442        }
2443
2444        let walk_1: Vec<u64> = streams.writable().collect();
2445        cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
2446        let walk_2: Vec<u64> = streams.writable().collect();
2447        cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
2448        let walk_3: Vec<u64> = streams.writable().collect();
2449        cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
2450        let walk_4: Vec<u64> = streams.writable().collect();
2451        cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
2452        let walk_5: Vec<u64> = streams.writable().collect();
2453        assert_eq!(walk_1, vec![12, 4, 8, 0]);
2454        assert_eq!(walk_2, vec![4, 8, 0, 12]);
2455        assert_eq!(walk_3, vec![8, 0, 12, 4,]);
2456        assert_eq!(walk_4, vec![0, 12, 4, 8]);
2457        assert_eq!(walk_5, vec![12, 4, 8, 0]);
2458    }
2459
2460    #[test]
2461    fn writable_prioritized_mixed_urgency() {
2462        let local_tp = crate::TransportParams::default();
2463        let peer_tp = crate::TransportParams {
2464            initial_max_stream_data_bidi_local: 100,
2465            initial_max_stream_data_uni: 100,
2466            ..Default::default()
2467        };
2468
2469        let mut streams = <StreamMap>::new(100, 100, 100);
2470
2471        // Streams where the urgency descends (becomes more important). No
2472        // stream shares an urgency.
2473        let input = vec![
2474            (0, 100),
2475            (4, 90),
2476            (8, 80),
2477            (12, 70),
2478            (16, 60),
2479            (20, 50),
2480            (24, 40),
2481            (28, 30),
2482            (32, 20),
2483            (36, 10),
2484            (40, 0),
2485        ];
2486
2487        for (id, urgency) in input.clone() {
2488            // this duplicates some code from stream_priority in order to access
2489            // streams and the collection they're in
2490            let stream = streams
2491                .get_or_create(id, &local_tp, &peer_tp, false, true)
2492                .unwrap();
2493
2494            stream.urgency = urgency;
2495
2496            let new_priority_key = Arc::new(StreamPriorityKey {
2497                urgency: stream.urgency,
2498                incremental: stream.incremental,
2499                id,
2500                ..Default::default()
2501            });
2502
2503            let old_priority_key = std::mem::replace(
2504                &mut stream.priority_key,
2505                new_priority_key.clone(),
2506            );
2507
2508            streams.update_priority(&old_priority_key, &new_priority_key);
2509        }
2510
2511        let walk_1: Vec<u64> = streams.writable().collect();
2512        assert_eq!(walk_1, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2513
2514        // Re-applying priority to a stream does not cause duplication.
2515        for (id, urgency) in input {
2516            // this duplicates some code from stream_priority in order to access
2517            // streams and the collection they're in
2518            let stream = streams
2519                .get_or_create(id, &local_tp, &peer_tp, false, true)
2520                .unwrap();
2521
2522            stream.urgency = urgency;
2523
2524            let new_priority_key = Arc::new(StreamPriorityKey {
2525                urgency: stream.urgency,
2526                incremental: stream.incremental,
2527                id,
2528                ..Default::default()
2529            });
2530
2531            let old_priority_key = std::mem::replace(
2532                &mut stream.priority_key,
2533                new_priority_key.clone(),
2534            );
2535
2536            streams.update_priority(&old_priority_key, &new_priority_key);
2537        }
2538
2539        let walk_2: Vec<u64> = streams.writable().collect();
2540        assert_eq!(walk_2, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2541
2542        // Removing streams doesn't break expected ordering.
2543        streams.collect(24, true);
2544
2545        let walk_3: Vec<u64> = streams.writable().collect();
2546        assert_eq!(walk_3, vec![40, 36, 32, 28, 20, 16, 12, 8, 4, 0]);
2547
2548        streams.collect(40, true);
2549        streams.collect(0, true);
2550
2551        let walk_4: Vec<u64> = streams.writable().collect();
2552        assert_eq!(walk_4, vec![36, 32, 28, 20, 16, 12, 8, 4]);
2553
2554        // Adding streams doesn't break expected ordering.
2555        streams
2556            .get_or_create(44, &local_tp, &peer_tp, false, true)
2557            .unwrap();
2558
2559        let walk_5: Vec<u64> = streams.writable().collect();
2560        assert_eq!(walk_5, vec![36, 32, 28, 20, 16, 12, 8, 4, 44]);
2561    }
2562
2563    #[test]
2564    fn writable_prioritized_mixed_urgencies_incrementals() {
2565        let local_tp = crate::TransportParams::default();
2566        let peer_tp = crate::TransportParams {
2567            initial_max_stream_data_bidi_local: 100,
2568            initial_max_stream_data_uni: 100,
2569            ..Default::default()
2570        };
2571
2572        let mut streams = StreamMap::new(100, 100, 100);
2573
2574        // Streams that share some urgency level
2575        let input = vec![
2576            (0, 100),
2577            (4, 20),
2578            (8, 100),
2579            (12, 20),
2580            (16, 90),
2581            (20, 25),
2582            (24, 90),
2583            (28, 30),
2584            (32, 80),
2585            (36, 20),
2586            (40, 0),
2587        ];
2588
2589        for (id, urgency) in input.clone() {
2590            // this duplicates some code from stream_priority in order to access
2591            // streams and the collection they're in
2592            let stream = streams
2593                .get_or_create(id, &local_tp, &peer_tp, false, true)
2594                .unwrap();
2595
2596            stream.urgency = urgency;
2597
2598            let new_priority_key = Arc::new(StreamPriorityKey {
2599                urgency: stream.urgency,
2600                incremental: stream.incremental,
2601                id,
2602                ..Default::default()
2603            });
2604
2605            let old_priority_key = std::mem::replace(
2606                &mut stream.priority_key,
2607                new_priority_key.clone(),
2608            );
2609
2610            streams.update_priority(&old_priority_key, &new_priority_key);
2611        }
2612
2613        let walk_1: Vec<u64> = streams.writable().collect();
2614        cycle_stream_priority(4, &mut streams);
2615        cycle_stream_priority(16, &mut streams);
2616        cycle_stream_priority(0, &mut streams);
2617        let walk_2: Vec<u64> = streams.writable().collect();
2618        cycle_stream_priority(12, &mut streams);
2619        cycle_stream_priority(24, &mut streams);
2620        cycle_stream_priority(8, &mut streams);
2621        let walk_3: Vec<u64> = streams.writable().collect();
2622        cycle_stream_priority(36, &mut streams);
2623        cycle_stream_priority(16, &mut streams);
2624        cycle_stream_priority(0, &mut streams);
2625        let walk_4: Vec<u64> = streams.writable().collect();
2626        cycle_stream_priority(4, &mut streams);
2627        cycle_stream_priority(24, &mut streams);
2628        cycle_stream_priority(8, &mut streams);
2629        let walk_5: Vec<u64> = streams.writable().collect();
2630        cycle_stream_priority(12, &mut streams);
2631        cycle_stream_priority(16, &mut streams);
2632        cycle_stream_priority(0, &mut streams);
2633        let walk_6: Vec<u64> = streams.writable().collect();
2634        cycle_stream_priority(36, &mut streams);
2635        cycle_stream_priority(24, &mut streams);
2636        cycle_stream_priority(8, &mut streams);
2637        let walk_7: Vec<u64> = streams.writable().collect();
2638        cycle_stream_priority(4, &mut streams);
2639        cycle_stream_priority(16, &mut streams);
2640        cycle_stream_priority(0, &mut streams);
2641        let walk_8: Vec<u64> = streams.writable().collect();
2642        cycle_stream_priority(12, &mut streams);
2643        cycle_stream_priority(24, &mut streams);
2644        cycle_stream_priority(8, &mut streams);
2645        let walk_9: Vec<u64> = streams.writable().collect();
2646        cycle_stream_priority(36, &mut streams);
2647        cycle_stream_priority(16, &mut streams);
2648        cycle_stream_priority(0, &mut streams);
2649
2650        assert_eq!(walk_1, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2651        assert_eq!(walk_2, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2652        assert_eq!(walk_3, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2653        assert_eq!(walk_4, vec![40, 4, 12, 36, 20, 28, 32, 24, 16, 8, 0]);
2654        assert_eq!(walk_5, vec![40, 12, 36, 4, 20, 28, 32, 16, 24, 0, 8]);
2655        assert_eq!(walk_6, vec![40, 36, 4, 12, 20, 28, 32, 24, 16, 8, 0]);
2656        assert_eq!(walk_7, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2657        assert_eq!(walk_8, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2658        assert_eq!(walk_9, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2659
2660        // Removing streams doesn't break expected ordering.
2661        streams.collect(20, true);
2662
2663        let walk_10: Vec<u64> = streams.writable().collect();
2664        assert_eq!(walk_10, vec![40, 4, 12, 36, 28, 32, 24, 16, 8, 0]);
2665
2666        // Adding streams doesn't break expected ordering.
2667        let stream = streams
2668            .get_or_create(44, &local_tp, &peer_tp, false, true)
2669            .unwrap();
2670
2671        stream.urgency = 20;
2672        stream.incremental = true;
2673
2674        let new_priority_key = Arc::new(StreamPriorityKey {
2675            urgency: stream.urgency,
2676            incremental: stream.incremental,
2677            id: 44,
2678            ..Default::default()
2679        });
2680
2681        let old_priority_key =
2682            std::mem::replace(&mut stream.priority_key, new_priority_key.clone());
2683
2684        streams.update_priority(&old_priority_key, &new_priority_key);
2685
2686        let walk_11: Vec<u64> = streams.writable().collect();
2687        assert_eq!(walk_11, vec![40, 4, 12, 36, 44, 28, 32, 24, 16, 8, 0]);
2688    }
2689
2690    #[test]
2691    fn priority_tree_dupes() {
2692        let mut prioritized_writable: RBTree<StreamWritablePriorityAdapter> =
2693            Default::default();
2694
2695        for id in [0, 4, 8, 12] {
2696            let s = Arc::new(StreamPriorityKey {
2697                urgency: 0,
2698                incremental: false,
2699                id,
2700                ..Default::default()
2701            });
2702
2703            prioritized_writable.insert(s);
2704        }
2705
2706        let walk_1: Vec<u64> =
2707            prioritized_writable.iter().map(|s| s.id).collect();
2708        assert_eq!(walk_1, vec![0, 4, 8, 12]);
2709
2710        // Default keys could cause duplicate entries. `StreamMap` normally
2711        // prevents this.
2712        for id in [0, 4, 8, 12] {
2713            let s = Arc::new(StreamPriorityKey {
2714                urgency: 0,
2715                incremental: false,
2716                id,
2717                ..Default::default()
2718            });
2719
2720            prioritized_writable.insert(s);
2721        }
2722
2723        let walk_2: Vec<u64> =
2724            prioritized_writable.iter().map(|s| s.id).collect();
2725        assert_eq!(walk_2, vec![0, 0, 4, 4, 8, 8, 12, 12]);
2726    }
2727
2728    #[test]
2729    fn retransmit_returns_zero_when_already_acked() {
2730        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2731
2732        // Write and emit some data.
2733        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2734        assert_eq!(stream.send.buffered_bytes(), 5);
2735
2736        let mut buf = [0; 10];
2737        let (written, _) = stream.send.emit(&mut buf).unwrap();
2738        assert_eq!(written, 5);
2739        assert_eq!(stream.send.buffered_bytes(), 0);
2740
2741        // Mark data for retransmission.
2742        let retransmitted = stream.send.retransmit(0, 5);
2743        assert_eq!(retransmitted, 5);
2744        assert_eq!(stream.send.buffered_bytes(), 5);
2745
2746        // Ack the data.
2747        stream.send.ack_and_drop(0, 5);
2748        assert_eq!(stream.send.buffered_bytes(), 0);
2749
2750        // Try to retransmit again - should return 0 since data is acked.
2751        let retransmitted = stream.send.retransmit(0, 5);
2752        assert_eq!(retransmitted, 0);
2753        assert_eq!(stream.send.buffered_bytes(), 0);
2754    }
2755
2756    #[test]
2757    fn retransmit_returns_partial_when_some_acked() {
2758        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2759
2760        // Write and emit 10 bytes.
2761        assert_eq!(stream.send.write(b"helloworld", false), Ok(10));
2762        assert_eq!(stream.send.buffered_bytes(), 10);
2763
2764        let mut buf = [0; 10];
2765        let (written, _) = stream.send.emit(&mut buf).unwrap();
2766        assert_eq!(written, 10);
2767        assert_eq!(stream.send.buffered_bytes(), 0);
2768
2769        // Mark all data for retransmission.
2770        let retransmitted = stream.send.retransmit(0, 10);
2771        assert_eq!(retransmitted, 10);
2772        assert_eq!(stream.send.buffered_bytes(), 10);
2773
2774        // Ack first 5 bytes and drop them.
2775        let dropped = stream.send.ack_and_drop(0, 5);
2776        assert_eq!(dropped, 5);
2777        assert_eq!(stream.send.buffered_bytes(), 5);
2778
2779        // Try to retransmit all 10 bytes - should return 5 since first 5 are
2780        // acked.
2781        let retransmitted = stream.send.retransmit(0, 10);
2782        assert_eq!(retransmitted, 0); // Already marked, so no change
2783        assert_eq!(stream.send.buffered_bytes(), 5);
2784    }
2785
2786    #[test]
2787    fn ack_and_drop_decrements_len_and_returns_dropped() {
2788        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2789
2790        // Write some data.
2791        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2792        assert_eq!(stream.send.buffered_bytes(), 5);
2793
2794        // Emit it.
2795        let mut buf = [0; 10];
2796        let (written, _) = stream.send.emit(&mut buf).unwrap();
2797        assert_eq!(written, 5);
2798        assert_eq!(stream.send.buffered_bytes(), 0);
2799
2800        // Mark for retransmission.
2801        let retransmitted = stream.send.retransmit(0, 5);
2802        assert_eq!(retransmitted, 5);
2803        assert_eq!(stream.send.buffered_bytes(), 5);
2804
2805        // Ack and drop - should decrement len and return dropped amount.
2806        let dropped = stream.send.ack_and_drop(0, 5);
2807        assert_eq!(dropped, 5);
2808        assert_eq!(stream.send.buffered_bytes(), 0);
2809    }
2810
2811    #[test]
2812    fn ack_and_drop_partial_buffer() {
2813        let mut stream = <Stream>::new(0, 30, 30, true, 0, 30);
2814
2815        // Write and emit two chunks.
2816        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2817        assert_eq!(stream.send.write(b"world", false), Ok(5));
2818        assert_eq!(stream.send.buffered_bytes(), 10);
2819
2820        let mut buf = [0; 10];
2821        let (written, _) = stream.send.emit(&mut buf).unwrap();
2822        assert_eq!(written, 10);
2823        assert_eq!(stream.send.buffered_bytes(), 0);
2824
2825        // Mark both chunks for retransmission.
2826        let retransmitted = stream.send.retransmit(0, 10);
2827        assert_eq!(retransmitted, 10);
2828        assert_eq!(stream.send.buffered_bytes(), 10);
2829
2830        // Ack and drop only first chunk.
2831        let dropped = stream.send.ack_and_drop(0, 5);
2832        assert_eq!(dropped, 5);
2833        assert_eq!(stream.send.buffered_bytes(), 5);
2834
2835        // Ack and drop second chunk.
2836        let dropped = stream.send.ack_and_drop(5, 5);
2837        assert_eq!(dropped, 5);
2838        assert_eq!(stream.send.buffered_bytes(), 0);
2839    }
2840
2841    #[test]
2842    fn ack_and_drop_returns_zero_when_nothing_dropped() {
2843        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2844
2845        // Write and emit data.
2846        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2847        let mut buf = [0; 10];
2848        let (written, _) = stream.send.emit(&mut buf).unwrap();
2849        assert_eq!(written, 5);
2850
2851        // Ack data that's already been fully emitted and not retransmitted.
2852        // Nothing should be dropped since there's no buffered data.
2853        let dropped = stream.send.ack_and_drop(0, 5);
2854        assert_eq!(dropped, 0);
2855        assert_eq!(stream.send.buffered_bytes(), 0);
2856    }
2857
2858    #[test]
2859    fn cache_consistency_through_full_lifecycle() {
2860        // This test verifies that StreamMap.tx_buffered stays in sync with
2861        // actual buffered data through a full lifecycle: write → emit →
2862        // retransmit → ack.
2863        let mut streams = <StreamMap>::new(5, 5, 15);
2864
2865        // Create a stream using low-level StreamMap interface.
2866        let local_params = crate::TransportParams {
2867            initial_max_data: 30,
2868            initial_max_stream_data_bidi_local: 15,
2869            initial_max_stream_data_bidi_remote: 15,
2870            initial_max_stream_data_uni: 10,
2871            initial_max_streams_bidi: 5,
2872            initial_max_streams_uni: 5,
2873            ..Default::default()
2874        };
2875        let peer_params = local_params.clone();
2876
2877        // Update peer stream limits to allow locally-initiated streams.
2878        streams.update_peer_max_streams_bidi(5);
2879        streams.update_peer_max_streams_uni(5);
2880
2881        let stream_id = 0u64;
2882
2883        // Writing raises `stream.send.buffered_bytes()` and `tx_buffered`.
2884        {
2885            let stream = streams
2886                .get_or_create(
2887                    stream_id,
2888                    &local_params,
2889                    &peer_params,
2890                    true,
2891                    false,
2892                )
2893                .unwrap();
2894            assert_eq!(stream.send.write(b"hello", false), Ok(5));
2895        }
2896        streams.add_tx_buffered(5);
2897        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2898        assert_eq!(streams.tx_buffered(), 5);
2899        assert!(streams.tx_buffered_is_consistent());
2900
2901        // Emitting lowers `stream.send.buffered_bytes()` and `tx_buffered`.
2902        let mut buf = [0; 10];
2903        let written = {
2904            let stream = streams.get_mut(stream_id).unwrap();
2905            let (written, _) = stream.send.emit(&mut buf).unwrap();
2906            written
2907        };
2908        assert_eq!(written, 5);
2909        streams.sub_tx_buffered(5);
2910        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2911        assert_eq!(streams.tx_buffered(), 0);
2912        assert!(streams.tx_buffered_is_consistent());
2913
2914        // Retransmitting raises both values by the amount retransmitted.
2915        let retransmitted = {
2916            let stream = streams.get_mut(stream_id).unwrap();
2917            stream.send.retransmit(0, 5)
2918        };
2919        assert_eq!(retransmitted, 5);
2920        streams.add_tx_buffered(retransmitted);
2921        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2922        assert_eq!(streams.tx_buffered(), 5);
2923        assert!(streams.tx_buffered_is_consistent());
2924
2925        // Ack and drop: both stream.send.buffered_bytes() and tx_buffered
2926        // decrease by actual amount dropped.
2927        let dropped = {
2928            let stream = streams.get_mut(stream_id).unwrap();
2929            stream.send.ack_and_drop(0, 5)
2930        };
2931        assert_eq!(dropped, 5);
2932        streams.sub_tx_buffered(dropped);
2933        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2934        assert_eq!(streams.tx_buffered(), 0);
2935        assert!(streams.tx_buffered_is_consistent());
2936    }
2937
2938    #[test]
2939    fn send_buf_len_reflects_buffered_data() {
2940        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2941
2942        // Initially empty.
2943        assert_eq!(stream.send.buffered_bytes(), 0);
2944
2945        // After write.
2946        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2947        assert_eq!(stream.send.buffered_bytes(), 5);
2948
2949        // After emit.
2950        let mut buf = [0; 10];
2951        let (written, _) = stream.send.emit(&mut buf).unwrap();
2952        assert_eq!(written, 5);
2953        assert_eq!(stream.send.buffered_bytes(), 0);
2954
2955        // After retransmit.
2956        let retransmitted = stream.send.retransmit(0, 5);
2957        assert_eq!(retransmitted, 5);
2958        assert_eq!(stream.send.buffered_bytes(), 5);
2959
2960        // After ack_and_drop.
2961        let dropped = stream.send.ack_and_drop(0, 5);
2962        assert_eq!(dropped, 5);
2963        assert_eq!(stream.send.buffered_bytes(), 0);
2964    }
2965}
2966
2967mod recv_buf;
2968mod send_buf;