use super::*;
#[test]
fn weighted_percentile_matches_percentile_under_unit_weights() {
let shapes: Vec<Vec<u64>> = vec![
vec![42_000],
vec![1_000, 2_000, 3_000, 4_000, 5_000],
(1..=100u64).map(|v| v * 1000).collect(),
vec![5_000, 5_000, 5_000],
];
for values in shapes {
let pairs: Vec<(u64, f64)> = values.iter().map(|&v| (v, 1.0)).collect();
for &p in &[0.0_f64, 0.25, 0.5, 0.9, 0.99, 1.0] {
assert_eq!(
weighted_percentile(&pairs, p),
percentile(&values, p),
"unit-weight weighted_percentile must equal percentile at p={p} for {values:?}",
);
}
}
}
#[test]
fn weighted_percentile_empty_is_zero() {
assert_eq!(weighted_percentile(&[], 0.99), 0);
}
#[test]
fn reduce_weighted_matches_unweighted_under_unit_weights() {
let values: Vec<u64> = vec![1_000, 2_000, 3_000, 4_000, 5_000, 60_000];
let pairs: Vec<(u64, f64)> = values.iter().map(|&v| (v, 1.0)).collect();
for r in [
SampleReduction::P99,
SampleReduction::Median,
SampleReduction::Mean,
SampleReduction::Worst,
] {
assert_eq!(
reduce_weighted_sorted_distribution(&pairs, r),
reduce_sorted_distribution(&values, r),
"{r:?} must be byte-identical under unit weights",
);
}
let wcv = reduce_weighted_sorted_distribution(&pairs, SampleReduction::Cv);
let ucv = reduce_sorted_distribution(&values, SampleReduction::Cv);
assert!(
(wcv - ucv).abs() < 1e-9,
"Cv parity within 1e-9: weighted {wcv} vs unweighted {ucv}",
);
}
#[test]
fn weighted_reduction_shifts_with_population_weight() {
let weighted = vec![(10_000u64, 1.0_f64), (100_000u64, 20.0)];
assert_eq!(
reduce_weighted_sorted_distribution(&weighted, SampleReduction::Median),
100.0,
"population-weighted median is the high value (20/21 of the population)",
);
let unit = vec![(10_000u64, 1.0_f64), (100_000u64, 1.0)];
assert_eq!(
reduce_weighted_sorted_distribution(&unit, SampleReduction::Median),
10.0,
"unit-weight median is the low value — the contrast that proves weighting",
);
let wmean = reduce_weighted_sorted_distribution(&weighted, SampleReduction::Mean);
assert!((wmean - (10_000.0 + 100_000.0 * 20.0) / 21.0 / 1000.0).abs() < 1e-9);
}
#[test]
fn repool_wake_weights_phases_by_true_population_not_reservoir_length() {
let phase0 = PhaseCgroupStats {
wake_latencies_ns: vec![10_000], wake_sample_total: 1, ..PhaseCgroupStats::default()
};
let phase1 = PhaseCgroupStats {
wake_latencies_ns: vec![100_000], wake_sample_total: 20, ..PhaseCgroupStats::default()
};
let mut b0 = PhaseBucket {
step_index: 0,
..PhaseBucket::default()
};
b0.per_cgroup.insert("a".to_string(), phase0);
let mut b1 = PhaseBucket {
step_index: 1,
..PhaseBucket::default()
};
b1.per_cgroup.insert("a".to_string(), phase1);
let mut stats = ScenarioStats {
phases: vec![b0, b1],
..ScenarioStats::default()
};
populate_run_distribution_metrics(&mut stats);
let median = stats
.ext_metrics
.get("worst_median_wake_latency_us")
.copied();
assert_eq!(
median,
Some(100.0),
"population-weighted cross-phase median follows the 20:1 true population \
(high phase), got {median:?}",
);
assert_ne!(
median,
Some(10.0),
"must NOT be the reservoir-length-weighted (1:1) median — that is the \
cross-phase length skew population-weighting removes",
);
}
#[test]
fn repool_wake_under_cap_is_byte_identical_to_unweighted_union() {
let phase0 = PhaseCgroupStats {
wake_latencies_ns: (1..=50u64).map(|v| v * 1000).collect(),
wake_sample_total: 50, ..PhaseCgroupStats::default()
};
let phase1 = PhaseCgroupStats {
wake_latencies_ns: (51..=100u64).map(|v| v * 1000).collect(),
wake_sample_total: 50, ..PhaseCgroupStats::default()
};
let mut b0 = PhaseBucket {
step_index: 0,
..PhaseBucket::default()
};
b0.per_cgroup.insert("a".to_string(), phase0);
let mut b1 = PhaseBucket {
step_index: 1,
..PhaseBucket::default()
};
b1.per_cgroup.insert("a".to_string(), phase1);
let mut stats = ScenarioStats {
phases: vec![b0, b1],
..ScenarioStats::default()
};
populate_run_distribution_metrics(&mut stats);
let union: Vec<u64> = (1..=100u64).map(|v| v * 1000).collect();
assert_eq!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(percentile(&union, 0.99) as f64 / 1000.0),
"≤cap (unit-weight) p99 must equal the unweighted union percentile",
);
assert_eq!(
stats
.ext_metrics
.get("worst_median_wake_latency_us")
.copied(),
Some(percentile(&union, 0.5) as f64 / 1000.0),
"≤cap (unit-weight) median must equal the unweighted union percentile",
);
}
#[test]
fn repool_wake_cv_is_population_weighted_at_over_cap() {
let phase0 = PhaseCgroupStats {
wake_latencies_ns: vec![10_000],
wake_sample_total: 1,
..PhaseCgroupStats::default()
};
let phase1 = PhaseCgroupStats {
wake_latencies_ns: vec![30_000], wake_sample_total: 3, ..PhaseCgroupStats::default()
};
let mut b0 = PhaseBucket {
step_index: 0,
..PhaseBucket::default()
};
b0.per_cgroup.insert("a".to_string(), phase0);
let mut b1 = PhaseBucket {
step_index: 1,
..PhaseBucket::default()
};
b1.per_cgroup.insert("a".to_string(), phase1);
let mut stats = ScenarioStats {
phases: vec![b0, b1],
..ScenarioStats::default()
};
populate_run_distribution_metrics(&mut stats);
let cv = stats
.ext_metrics
.get("worst_wake_latency_cv")
.copied()
.unwrap();
assert!(
(cv - 0.346_410_161_513_775_46).abs() < 1e-9,
"population-weighted CV = √75e6/25000 = 0.346410, got {cv}",
);
assert!(
(cv - 0.5).abs() > 0.1,
"must NOT be the unweighted (length n=2) CV 0.5 — pins the weighted denominator",
);
}
#[test]
fn weighted_cv_all_equal_values_is_zero() {
assert_eq!(
reduce_weighted_sorted_distribution(&[(5_000, 3.0), (5_000, 7.0)], SampleReduction::Cv),
0.0,
);
}
#[test]
fn repool_wake_merge_and_pool_layers_compose() {
use crate::workload::MAX_WAKE_SAMPLES as CAP;
let phase0 = PhaseCgroupStats {
wake_latencies_ns: vec![10_000; CAP], wake_sample_total: CAP as u64, ..PhaseCgroupStats::default()
};
let sub = || PhaseCgroupStats {
wake_latencies_ns: vec![30_000; 60_000],
wake_sample_total: 60_000,
..PhaseCgroupStats::default()
};
let phase1 = PhaseCgroupStats::merge(sub(), sub());
assert_eq!(
phase1.wake_latencies_ns.len(),
CAP,
"merge re-caps to MAX_WAKE_SAMPLES"
);
assert_eq!(
phase1.wake_sample_total, 120_000,
"merge SUMs true population"
);
let mut b0 = PhaseBucket {
step_index: 0,
..PhaseBucket::default()
};
b0.per_cgroup.insert("a".to_string(), phase0);
let mut b1 = PhaseBucket {
step_index: 1,
..PhaseBucket::default()
};
b1.per_cgroup.insert("a".to_string(), phase1);
let mut stats = ScenarioStats {
phases: vec![b0, b1],
..ScenarioStats::default()
};
populate_run_distribution_metrics(&mut stats);
let median = stats
.ext_metrics
.get("worst_median_wake_latency_us")
.copied();
assert_eq!(
median,
Some(30.0),
"merged phase1's summed population (120k > phase0's 100k) wins the weighted \
median despite EQUAL capped lengths; got {median:?}",
);
assert_ne!(
median,
Some(10.0),
"must NOT be the length-weighted (100k:100k) median — that ignores the \
merge's summed true population",
);
}