summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/remake/records.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/remake/records.rs b/src/remake/records.rs
index 84286f3..720aea1 100644
--- a/src/remake/records.rs
+++ b/src/remake/records.rs
@@ -531,6 +531,35 @@ mod tests {
assert!(!none.covers(0, 0));
}
+ /// Over random limits and ages: covered exactly while some given limit holds, and
+ /// what is covered stays covered when it is younger in either measure.
+ #[test]
+ fn retention_covers_while_a_limit_holds() {
+ crate::testrand::for_seeds(500, |rng| {
+ let limit =
+ |rng: &mut crate::testrand::Rng| rng.chance(0.7).then(|| rng.below(10) as u64);
+ let retention = Retention {
+ epochs: limit(rng),
+ age_ms: limit(rng).map(|ms| ms * 1_000),
+ };
+ let (epochs, age_ms) = (rng.below(12) as u64, rng.below(12_000) as u64);
+ let covered = retention.covers(epochs, age_ms);
+ let holds = retention.epochs.is_some_and(|limit| epochs <= limit)
+ || retention.age_ms.is_some_and(|limit| age_ms <= limit);
+ assert_eq!(
+ covered, holds,
+ "{retention:?} at {epochs} epochs, {age_ms} ms"
+ );
+ if covered {
+ let younger = (
+ rng.below(epochs as usize + 1) as u64,
+ rng.below(age_ms as usize + 1) as u64,
+ );
+ assert!(retention.covers(younger.0, younger.1));
+ }
+ });
+ }
+
fn proposal(settle_until: u64) -> Proposal {
Proposal {
coordinator: "node-a".into(),