in quic/s2n-quic-transport/src/recovery/manager/tests.rs [2371:2499]
fn persistent_congestion_multiple_periods() {
let space = PacketNumberSpace::ApplicationData;
let mut manager = ServerManager::new(space);
let mut path_manager = helper_generate_path_manager(Duration::from_millis(10));
let ecn = ExplicitCongestionNotification::default();
let mut context = MockContext::new(&mut path_manager);
let time_zero = time::now() + Duration::from_secs(10);
let mut publisher = Publisher::snapshot();
let outcome = transmission::Outcome {
ack_elicitation: AckElicitation::Eliciting,
is_congestion_controlled: true,
bytes_sent: 1,
bytes_progressed: 0,
};
// t=0: Send packet #1 (app data)
manager.on_packet_sent(
space.new_packet_number(VarInt::from_u8(1)),
outcome,
time_zero,
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
// t=1: Send packet #2 (app data)
manager.on_packet_sent(
space.new_packet_number(VarInt::from_u8(2)),
outcome,
time_zero + Duration::from_secs(1),
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
// t=1.2: Recv acknowledgement of #1
ack_packets(
1..=1,
time_zero + Duration::from_millis(1200),
&mut context,
&mut manager,
None,
&mut publisher,
);
// t=2-6: Send packets #3 - #7 (app data)
for t in 2..=6 {
manager.on_packet_sent(
space.new_packet_number(VarInt::from_u8(t + 1)),
outcome,
time_zero + Duration::from_secs(t.into()),
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
}
// Skip packet #8, which ends one persistent congestion period.
// t=8: Send packet #9 (app data)
manager.on_packet_sent(
space.new_packet_number(VarInt::from_u8(9)),
outcome,
time_zero + Duration::from_secs(8),
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
// t=20: Send packet #10 (app data)
manager.on_packet_sent(
space.new_packet_number(VarInt::from_u8(10)),
outcome,
time_zero + Duration::from_secs(20),
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
// t=30: Send packet #11 (app data)
manager.on_packet_sent(
space.new_packet_number(VarInt::from_u8(11)),
outcome,
time_zero + Duration::from_secs(30),
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
// t=30.2: Recv acknowledgement of #11
ack_packets(
11..=11,
time_zero + Duration::from_millis(30200),
&mut context,
&mut manager,
None,
&mut publisher,
);
// Packets 2 though 7 and 9-10 should be lost
assert_eq!(8, context.on_packet_loss_count);
// The largest contiguous period of lost packets is #9 (sent at t8) to #10 (sent at t20)
assert!(
context
.path()
.rtt_estimator
.persistent_congestion_threshold()
< Duration::from_secs(12)
);
assert_eq!(
Some(true),
context.path().congestion_controller.persistent_congestion
);
assert_eq!(2, context.path().congestion_controller.loss_bursts);
}