in neqo-transport/src/send_stream.rs [2588:2673]
fn send_stream_get_frame_data() {
let conn_fc = connection_fc(100);
let conn_events = ConnectionEvents::default();
let mut s = SendStream::new(0.into(), 100, conn_fc, conn_events);
s.send(&[0; 10]).unwrap();
s.close();
let mut ss = SendStreams::default();
ss.insert(StreamId::from(0), s);
let mut tokens = Vec::new();
let mut builder = PacketBuilder::short(Encoder::new(), false, None::<&[u8]>);
// Write a small frame: no fin.
let written = builder.len();
builder.set_limit(written + 6);
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
assert_eq!(builder.len(), written + 6);
assert_eq!(tokens.len(), 1);
let f1_token = tokens.remove(0);
assert!(!as_stream_token(&f1_token).fin);
// Write the rest: fin.
let written = builder.len();
builder.set_limit(written + 200);
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
assert_eq!(builder.len(), written + 10);
assert_eq!(tokens.len(), 1);
let f2_token = tokens.remove(0);
assert!(as_stream_token(&f2_token).fin);
// Should be no more data to frame.
let written = builder.len();
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
assert_eq!(builder.len(), written);
assert!(tokens.is_empty());
// Mark frame 1 as lost
ss.lost(as_stream_token(&f1_token));
// Next frame should not set fin even though stream has fin but frame
// does not include end of stream
let written = builder.len();
ss.write_frames(
TransmissionPriority::default() + RetransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
assert_eq!(builder.len(), written + 7); // Needs a length this time.
assert_eq!(tokens.len(), 1);
let f4_token = tokens.remove(0);
assert!(!as_stream_token(&f4_token).fin);
// Mark frame 2 as lost
ss.lost(as_stream_token(&f2_token));
// Next frame should set fin because it includes end of stream
let written = builder.len();
ss.write_frames(
TransmissionPriority::default() + RetransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
assert_eq!(builder.len(), written + 10);
assert_eq!(tokens.len(), 1);
let f5_token = tokens.remove(0);
assert!(as_stream_token(&f5_token).fin);
}