From 0c6ada12bdb6218e822397bf20356097fcd683e6 Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 26 Oct 2026 21:25:20 +0100 Subject: add epoch retention tests --- src/remake/records.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src') 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(), -- cgit v1.3.1