diff options
| author | tv <tv@krebsco.de> | 2026-10-26 21:25:20 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-26 21:25:20 +0100 |
| commit | 0c6ada12bdb6218e822397bf20356097fcd683e6 (patch) | |
| tree | 800395a2ba2ca7d3546000f63de0a1978ae0643d /src/remake | |
| parent | 8a58bc48be3f13af6e3690302c228d18b1e6f702 (diff) | |
add epoch retention tests
Diffstat (limited to 'src/remake')
| -rw-r--r-- | src/remake/records.rs | 29 |
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(), |
