in quic/s2n-quic-transport/src/recovery/manager/tests.rs [1882:2014]
fn remove_lost_packets_persistent_congestion_path_aware() {
// Setup:
let space = PacketNumberSpace::ApplicationData;
let mut publisher = Publisher::snapshot();
let (_first_addr, first_path_id, _second_addr, second_path_id, mut manager, mut path_manager) =
helper_generate_multi_path_manager(space, &mut publisher);
let ecn = ExplicitCongestionNotification::default();
let mut context = MockContext::new(&mut path_manager);
let mut now = time::now();
let random = &mut random::testing::Generator::default();
assert_eq!(
context
.path_by_id(first_path_id)
.congestion_controller
.persistent_congestion,
None
);
assert_eq!(
context
.path_by_id(second_path_id)
.congestion_controller
.persistent_congestion,
None
);
// create first rtt samples so we can check it later
context
.path_mut_by_id(first_path_id)
.rtt_estimator
.update_rtt(
Duration::from_secs(0),
Duration::from_secs(0),
now,
true,
space,
);
context
.path_mut_by_id(second_path_id)
.rtt_estimator
.update_rtt(
Duration::from_secs(0),
Duration::from_secs(0),
now,
true,
space,
);
assert!(context
.path_by_id(first_path_id)
.rtt_estimator
.first_rtt_sample()
.is_some());
assert!(context
.path_by_id(second_path_id)
.rtt_estimator
.first_rtt_sample()
.is_some());
now += Duration::from_secs(10);
let sent_packets_to_remove = PacketNumberRange::new(
space.new_packet_number(VarInt::from_u8(9)),
space.new_packet_number(VarInt::from_u8(10)),
);
context.set_path_id(first_path_id);
manager.on_packet_sent(
sent_packets_to_remove.start(),
Outcome {
ack_elicitation: AckElicitation::Eliciting,
is_congestion_controlled: true,
bytes_sent: 1,
bytes_progressed: 0,
},
now,
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
context.set_path_id(second_path_id);
manager.on_packet_sent(
sent_packets_to_remove.end(),
Outcome {
ack_elicitation: AckElicitation::Eliciting,
is_congestion_controlled: true,
bytes_sent: 1,
bytes_progressed: 0,
},
now,
ecn,
transmission::Mode::Normal,
None,
&mut context,
&mut publisher,
);
// Trigger:
context.set_path_id(second_path_id);
manager.remove_lost_packets(
now,
Duration::from_secs(20),
sent_packets_to_remove,
random,
&mut context,
&mut publisher,
);
// Expectation:
assert_eq!(
context
.path_by_id(first_path_id)
.congestion_controller
.persistent_congestion,
Some(false)
);
assert!(context
.path_by_id(first_path_id)
.rtt_estimator
.first_rtt_sample()
.is_some());
assert_eq!(
context
.path_by_id(second_path_id)
.congestion_controller
.persistent_congestion,
Some(true)
);
assert!(context
.path_by_id(second_path_id)
.rtt_estimator
.first_rtt_sample()
.is_none());
}