From f6c2a9bfe056e08a85b49c8bf8de7761672056b2 Mon Sep 17 00:00:00 2001 From: houseme Date: Mon, 7 Sep 2026 05:29:59 +0800 Subject: [PATCH] test(scanner): cover overflow service cohort rotation (#7324) --- crates/scanner/src/scanner_io/guards.rs | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/crates/scanner/src/scanner_io/guards.rs b/crates/scanner/src/scanner_io/guards.rs index 580fccb81..afe35a126 100644 --- a/crates/scanner/src/scanner_io/guards.rs +++ b/crates/scanner/src/scanner_io/guards.rs @@ -863,6 +863,41 @@ mod tests { assert_eq!(cohort.members[&source].len(), 1); } + #[test] + #[serial_test::serial] + fn service_cohort_overflow_eventually_services_every_stable_member() { + let source = DataUsageCacheSource::new(0, 0); + let inventory = cohort_inventory(&["aa", "bb", "cc", "dd", "ee", "ff"]); + let mut cohort = ScannerServiceCohort { + max_members: 2, + max_name_bytes: 4, + ..Default::default() + }; + let mut admitted = HashSet::new(); + for _ in 0..3 { + cohort.refresh(&inventory); + let mut buckets = inventory[&source].clone(); + cohort.order_buckets(source, &mut buckets); + for bucket in buckets.iter().take(2) { + admitted.insert(bucket.name.clone()); + cohort.record_admitted(source, &bucket.name); + } + } + assert_eq!( + admitted, + HashSet::from([ + "aa".to_string(), + "bb".to_string(), + "cc".to_string(), + "dd".to_string(), + "ee".to_string(), + "ff".to_string(), + ]), + "stable overflow inventory must rotate every member through the tracked window" + ); + assert!(cohort.overflowed); + } + #[test] #[serial_test::serial] fn service_cohort_bounds_names_and_does_not_reset_duplicate_dirty_age() {