in neqo-transport/src/send_stream.rs [2677:2751]
fn send_stream_get_frame_zerolength_fin() {
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();
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]>);
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
let f1_token = tokens.remove(0);
assert_eq!(as_stream_token(&f1_token).offset, 0);
assert_eq!(as_stream_token(&f1_token).length, 10);
assert!(!as_stream_token(&f1_token).fin);
// Should be no more data to frame
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
assert!(tokens.is_empty());
ss.get_mut(StreamId::from(0)).unwrap().close();
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
let f2_token = tokens.remove(0);
assert_eq!(as_stream_token(&f2_token).offset, 10);
assert_eq!(as_stream_token(&f2_token).length, 0);
assert!(as_stream_token(&f2_token).fin);
// Mark frame 2 as lost
ss.lost(as_stream_token(&f2_token));
// Next frame should set fin
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
let f3_token = tokens.remove(0);
assert_eq!(as_stream_token(&f3_token).offset, 10);
assert_eq!(as_stream_token(&f3_token).length, 0);
assert!(as_stream_token(&f3_token).fin);
// Mark frame 1 as lost
ss.lost(as_stream_token(&f1_token));
// Next frame should set fin and include all data
ss.write_frames(
TransmissionPriority::default(),
&mut builder,
&mut tokens,
&mut FrameStats::default(),
);
let f4_token = tokens.remove(0);
assert_eq!(as_stream_token(&f4_token).offset, 0);
assert_eq!(as_stream_token(&f4_token).length, 10);
assert!(as_stream_token(&f4_token).fin);
}