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