summaryrefslogtreecommitdiffstats
path: root/third_party/rust/neqo-transport/src/tracking.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/neqo-transport/src/tracking.rs')
-rw-r--r--third_party/rust/neqo-transport/src/tracking.rs166
1 files changed, 80 insertions, 86 deletions
diff --git a/third_party/rust/neqo-transport/src/tracking.rs b/third_party/rust/neqo-transport/src/tracking.rs
index 64d00257d3..bdd0f250c7 100644
--- a/third_party/rust/neqo-transport/src/tracking.rs
+++ b/third_party/rust/neqo-transport/src/tracking.rs
@@ -6,12 +6,9 @@
// Tracking of received packets and generating acks thereof.
-#![deny(clippy::pedantic)]
-
use std::{
cmp::min,
collections::VecDeque,
- convert::TryFrom,
ops::{Index, IndexMut},
time::{Duration, Instant},
};
@@ -746,8 +743,8 @@ impl Default for AckTracker {
mod tests {
use std::collections::HashSet;
- use lazy_static::lazy_static;
use neqo_common::Encoder;
+ use test_fixture::now;
use super::{
AckTracker, Duration, Instant, PacketNumberSpace, PacketNumberSpaceSet, RecoveryToken,
@@ -760,16 +757,13 @@ mod tests {
};
const RTT: Duration = Duration::from_millis(100);
- lazy_static! {
- static ref NOW: Instant = Instant::now();
- }
fn test_ack_range(pns: &[PacketNumber], nranges: usize) {
let mut rp = RecvdPackets::new(PacketNumberSpace::Initial); // Any space will do.
let mut packets = HashSet::new();
for pn in pns {
- rp.set_received(*NOW, *pn, true);
+ rp.set_received(now(), *pn, true);
packets.insert(*pn);
}
@@ -824,7 +818,7 @@ mod tests {
// This will add one too many disjoint ranges.
for i in 0..=MAX_TRACKED_RANGES {
- rp.set_received(*NOW, (i * 2) as u64, true);
+ rp.set_received(now(), (i * 2) as u64, true);
}
assert_eq!(rp.ranges.len(), MAX_TRACKED_RANGES);
@@ -843,22 +837,22 @@ mod tests {
// Only application data packets are delayed.
let mut rp = RecvdPackets::new(PacketNumberSpace::ApplicationData);
assert!(rp.ack_time().is_none());
- assert!(!rp.ack_now(*NOW, RTT));
+ assert!(!rp.ack_now(now(), RTT));
rp.ack_freq(0, COUNT, DELAY, false);
// Some packets won't cause an ACK to be needed.
for i in 0..COUNT {
- rp.set_received(*NOW, i, true);
- assert_eq!(Some(*NOW + DELAY), rp.ack_time());
- assert!(!rp.ack_now(*NOW, RTT));
- assert!(rp.ack_now(*NOW + DELAY, RTT));
+ rp.set_received(now(), i, true);
+ assert_eq!(Some(now() + DELAY), rp.ack_time());
+ assert!(!rp.ack_now(now(), RTT));
+ assert!(rp.ack_now(now() + DELAY, RTT));
}
// Exceeding COUNT will move the ACK time to now.
- rp.set_received(*NOW, COUNT, true);
- assert_eq!(Some(*NOW), rp.ack_time());
- assert!(rp.ack_now(*NOW, RTT));
+ rp.set_received(now(), COUNT, true);
+ assert_eq!(Some(now()), rp.ack_time());
+ assert!(rp.ack_now(now(), RTT));
}
#[test]
@@ -866,12 +860,12 @@ mod tests {
for space in &[PacketNumberSpace::Initial, PacketNumberSpace::Handshake] {
let mut rp = RecvdPackets::new(*space);
assert!(rp.ack_time().is_none());
- assert!(!rp.ack_now(*NOW, RTT));
+ assert!(!rp.ack_now(now(), RTT));
// Any packet in these spaces is acknowledged straight away.
- rp.set_received(*NOW, 0, true);
- assert_eq!(Some(*NOW), rp.ack_time());
- assert!(rp.ack_now(*NOW, RTT));
+ rp.set_received(now(), 0, true);
+ assert_eq!(Some(now()), rp.ack_time());
+ assert!(rp.ack_now(now(), RTT));
}
}
@@ -879,12 +873,12 @@ mod tests {
fn ooo_no_ack_delay_new() {
let mut rp = RecvdPackets::new(PacketNumberSpace::ApplicationData);
assert!(rp.ack_time().is_none());
- assert!(!rp.ack_now(*NOW, RTT));
+ assert!(!rp.ack_now(now(), RTT));
// Anything other than packet 0 is acknowledged immediately.
- rp.set_received(*NOW, 1, true);
- assert_eq!(Some(*NOW), rp.ack_time());
- assert!(rp.ack_now(*NOW, RTT));
+ rp.set_received(now(), 1, true);
+ assert_eq!(Some(now()), rp.ack_time());
+ assert!(rp.ack_now(now(), RTT));
}
fn write_frame_at(rp: &mut RecvdPackets, now: Instant) {
@@ -897,37 +891,37 @@ mod tests {
}
fn write_frame(rp: &mut RecvdPackets) {
- write_frame_at(rp, *NOW);
+ write_frame_at(rp, now());
}
#[test]
fn ooo_no_ack_delay_fill() {
let mut rp = RecvdPackets::new(PacketNumberSpace::ApplicationData);
- rp.set_received(*NOW, 1, true);
+ rp.set_received(now(), 1, true);
write_frame(&mut rp);
// Filling in behind the largest acknowledged causes immediate ACK.
- rp.set_received(*NOW, 0, true);
+ rp.set_received(now(), 0, true);
write_frame(&mut rp);
// Receiving the next packet won't elicit an ACK.
- rp.set_received(*NOW, 2, true);
- assert!(!rp.ack_now(*NOW, RTT));
+ rp.set_received(now(), 2, true);
+ assert!(!rp.ack_now(now(), RTT));
}
#[test]
fn immediate_ack_after_rtt() {
let mut rp = RecvdPackets::new(PacketNumberSpace::ApplicationData);
- rp.set_received(*NOW, 1, true);
+ rp.set_received(now(), 1, true);
write_frame(&mut rp);
// Filling in behind the largest acknowledged causes immediate ACK.
- rp.set_received(*NOW, 0, true);
+ rp.set_received(now(), 0, true);
write_frame(&mut rp);
// A new packet ordinarily doesn't result in an ACK, but this time it does.
- rp.set_received(*NOW + RTT, 2, true);
- write_frame_at(&mut rp, *NOW + RTT);
+ rp.set_received(now() + RTT, 2, true);
+ write_frame_at(&mut rp, now() + RTT);
}
#[test]
@@ -937,29 +931,29 @@ mod tests {
// Set tolerance to 2 and then it takes three packets.
rp.ack_freq(0, 2, Duration::from_millis(10), true);
- rp.set_received(*NOW, 1, true);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 2, true);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 3, true);
- assert_eq!(Some(*NOW), rp.ack_time());
+ rp.set_received(now(), 1, true);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 2, true);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 3, true);
+ assert_eq!(Some(now()), rp.ack_time());
}
#[test]
fn ooo_no_ack_delay_threshold_gap() {
let mut rp = RecvdPackets::new(PacketNumberSpace::ApplicationData);
- rp.set_received(*NOW, 1, true);
+ rp.set_received(now(), 1, true);
write_frame(&mut rp);
// Set tolerance to 2 and then it takes three packets.
rp.ack_freq(0, 2, Duration::from_millis(10), true);
- rp.set_received(*NOW, 3, true);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 4, true);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 5, true);
- assert_eq!(Some(*NOW), rp.ack_time());
+ rp.set_received(now(), 3, true);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 4, true);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 5, true);
+ assert_eq!(Some(now()), rp.ack_time());
}
/// Test that an in-order packet that is not ack-eliciting doesn't
@@ -970,13 +964,13 @@ mod tests {
rp.ack_freq(0, 1, Duration::from_millis(10), true);
// This should be ignored.
- rp.set_received(*NOW, 0, false);
- assert_ne!(Some(*NOW), rp.ack_time());
+ rp.set_received(now(), 0, false);
+ assert_ne!(Some(now()), rp.ack_time());
// Skip 1 (it has no effect).
- rp.set_received(*NOW, 2, true);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 3, true);
- assert_eq!(Some(*NOW), rp.ack_time());
+ rp.set_received(now(), 2, true);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 3, true);
+ assert_eq!(Some(now()), rp.ack_time());
}
/// If a packet that is not ack-eliciting is reordered, that's fine too.
@@ -986,16 +980,16 @@ mod tests {
rp.ack_freq(0, 1, Duration::from_millis(10), false);
// These are out of order, but they are not ack-eliciting.
- rp.set_received(*NOW, 1, false);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 0, false);
- assert_ne!(Some(*NOW), rp.ack_time());
+ rp.set_received(now(), 1, false);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 0, false);
+ assert_ne!(Some(now()), rp.ack_time());
// These are in order.
- rp.set_received(*NOW, 2, true);
- assert_ne!(Some(*NOW), rp.ack_time());
- rp.set_received(*NOW, 3, true);
- assert_eq!(Some(*NOW), rp.ack_time());
+ rp.set_received(now(), 2, true);
+ assert_ne!(Some(now()), rp.ack_time());
+ rp.set_received(now(), 3, true);
+ assert_eq!(Some(now()), rp.ack_time());
}
#[test]
@@ -1007,23 +1001,23 @@ mod tests {
tracker
.get_mut(PacketNumberSpace::Handshake)
.unwrap()
- .set_received(*NOW, 0, false);
- assert_eq!(None, tracker.ack_time(*NOW));
+ .set_received(now(), 0, false);
+ assert_eq!(None, tracker.ack_time(now()));
// This should be delayed.
tracker
.get_mut(PacketNumberSpace::ApplicationData)
.unwrap()
- .set_received(*NOW, 0, true);
- assert_eq!(Some(*NOW + DELAY), tracker.ack_time(*NOW));
+ .set_received(now(), 0, true);
+ assert_eq!(Some(now() + DELAY), tracker.ack_time(now()));
// This should move the time forward.
- let later = *NOW + (DELAY / 2);
+ let later = now() + (DELAY / 2);
tracker
.get_mut(PacketNumberSpace::Initial)
.unwrap()
.set_received(later, 0, true);
- assert_eq!(Some(later), tracker.ack_time(*NOW));
+ assert_eq!(Some(later), tracker.ack_time(now()));
}
#[test]
@@ -1047,17 +1041,17 @@ mod tests {
tracker
.get_mut(PacketNumberSpace::Initial)
.unwrap()
- .set_received(*NOW, 0, true);
+ .set_received(now(), 0, true);
// The reference time for `ack_time` has to be in the past or we filter out the timer.
assert!(tracker
- .ack_time(NOW.checked_sub(Duration::from_millis(1)).unwrap())
+ .ack_time(now().checked_sub(Duration::from_millis(1)).unwrap())
.is_some());
let mut tokens = Vec::new();
let mut stats = FrameStats::default();
tracker.write_frame(
PacketNumberSpace::Initial,
- *NOW,
+ now(),
RTT,
&mut builder,
&mut tokens,
@@ -1069,9 +1063,9 @@ mod tests {
tracker
.get_mut(PacketNumberSpace::Initial)
.unwrap()
- .set_received(*NOW, 1, true);
+ .set_received(now(), 1, true);
assert!(tracker
- .ack_time(NOW.checked_sub(Duration::from_millis(1)).unwrap())
+ .ack_time(now().checked_sub(Duration::from_millis(1)).unwrap())
.is_some());
// Now drop that space.
@@ -1079,11 +1073,11 @@ mod tests {
assert!(tracker.get_mut(PacketNumberSpace::Initial).is_none());
assert!(tracker
- .ack_time(NOW.checked_sub(Duration::from_millis(1)).unwrap())
+ .ack_time(now().checked_sub(Duration::from_millis(1)).unwrap())
.is_none());
tracker.write_frame(
PacketNumberSpace::Initial,
- *NOW,
+ now(),
RTT,
&mut builder,
&mut tokens,
@@ -1103,9 +1097,9 @@ mod tests {
tracker
.get_mut(PacketNumberSpace::Initial)
.unwrap()
- .set_received(*NOW, 0, true);
+ .set_received(now(), 0, true);
assert!(tracker
- .ack_time(NOW.checked_sub(Duration::from_millis(1)).unwrap())
+ .ack_time(now().checked_sub(Duration::from_millis(1)).unwrap())
.is_some());
let mut builder = PacketBuilder::short(Encoder::new(), false, []);
@@ -1114,7 +1108,7 @@ mod tests {
let mut stats = FrameStats::default();
tracker.write_frame(
PacketNumberSpace::Initial,
- *NOW,
+ now(),
RTT,
&mut builder,
&mut Vec::new(),
@@ -1130,13 +1124,13 @@ mod tests {
tracker
.get_mut(PacketNumberSpace::Initial)
.unwrap()
- .set_received(*NOW, 0, true);
+ .set_received(now(), 0, true);
tracker
.get_mut(PacketNumberSpace::Initial)
.unwrap()
- .set_received(*NOW, 2, true);
+ .set_received(now(), 2, true);
assert!(tracker
- .ack_time(NOW.checked_sub(Duration::from_millis(1)).unwrap())
+ .ack_time(now().checked_sub(Duration::from_millis(1)).unwrap())
.is_some());
let mut builder = PacketBuilder::short(Encoder::new(), false, []);
@@ -1145,7 +1139,7 @@ mod tests {
let mut stats = FrameStats::default();
tracker.write_frame(
PacketNumberSpace::Initial,
- *NOW,
+ now(),
RTT,
&mut builder,
&mut Vec::new(),
@@ -1168,19 +1162,19 @@ mod tests {
let mut tracker = AckTracker::default();
// While we have multiple PN spaces, we ignore ACK timers from the past.
- // Send out of order to cause the delayed ack timer to be set to `*NOW`.
+ // Send out of order to cause the delayed ack timer to be set to `now()`.
tracker
.get_mut(PacketNumberSpace::ApplicationData)
.unwrap()
- .set_received(*NOW, 3, true);
- assert!(tracker.ack_time(*NOW + Duration::from_millis(1)).is_none());
+ .set_received(now(), 3, true);
+ assert!(tracker.ack_time(now() + Duration::from_millis(1)).is_none());
// When we are reduced to one space, that filter is off.
tracker.drop_space(PacketNumberSpace::Initial);
tracker.drop_space(PacketNumberSpace::Handshake);
assert_eq!(
- tracker.ack_time(*NOW + Duration::from_millis(1)),
- Some(*NOW)
+ tracker.ack_time(now() + Duration::from_millis(1)),
+ Some(now())
);
}