use super::*;
#[test]
fn phase_cgroup_off_cpu_summary_boundaries() {
assert_eq!(PhaseCgroupStats::default().off_cpu_summary(), None);
let one = PhaseCgroupStats {
off_cpu_pcts: vec![42.0],
..Default::default()
};
assert_eq!(one.off_cpu_summary(), Some((42.0, 42.0, 42.0, 0.0)));
let zeros = PhaseCgroupStats {
off_cpu_pcts: vec![0.0, 0.0],
..Default::default()
};
assert_eq!(
zeros.off_cpu_summary(),
Some((0.0, 0.0, 0.0, 0.0)),
"measured zeros are Some((0,..)), distinct from None (not-measured)",
);
let multi = PhaseCgroupStats {
off_cpu_pcts: vec![10.0, 20.0, 30.0],
..Default::default()
};
assert_eq!(multi.off_cpu_summary(), Some((20.0, 10.0, 30.0, 20.0)));
}
#[test]
fn phase_cgroup_wake_summary_boundaries() {
assert_eq!(PhaseCgroupStats::default().wake_summary(), None);
let one = PhaseCgroupStats {
wake_latencies_ns: vec![5000],
..Default::default()
};
assert_eq!(one.wake_summary(), Some((5.0, 5.0)));
let ten = PhaseCgroupStats {
wake_latencies_ns: (1..=10u64).map(|v| v * 1000).collect(),
..Default::default()
};
assert_eq!(ten.wake_summary(), Some((10.0, 5.0)));
}
#[test]
fn phase_cgroup_run_delay_summary_boundaries() {
assert_eq!(PhaseCgroupStats::default().run_delay_summary(), None);
let two = PhaseCgroupStats {
run_delays_ns: vec![100_000, 300_000],
..Default::default()
};
assert_eq!(two.run_delay_summary(), Some((200.0, 300.0)));
}
#[test]
fn phase_cgroup_summaries_match_cgroup_stats() {
let reports = vec![
WorkerReport {
wake_latencies_ns: vec![1000, 2000, 3000, 4000, 5000],
schedstat_run_delay_ns: 7000,
iterations: 100,
..rpt(1, 1000, 10_000_000, 4_000_000, &[0], 0)
},
WorkerReport {
wake_latencies_ns: vec![6000, 7000, 8000, 9000, 10000],
schedstat_run_delay_ns: 3000,
iterations: 100,
..rpt(2, 1000, 10_000_000, 1_000_000, &[1], 0)
},
];
let cg = cgroup_stats(&reports);
let carrier = phase_cgroup_stats(&reports, None);
let (avg, min, max, spread) = carrier.off_cpu_summary().expect("off-cpu measured");
assert!((avg - cg.avg_off_cpu_pct.unwrap()).abs() < 1e-9);
assert!((min - cg.min_off_cpu_pct.unwrap()).abs() < 1e-9);
assert!((max - cg.max_off_cpu_pct.unwrap()).abs() < 1e-9);
assert!((spread - cg.spread.unwrap()).abs() < 1e-9);
let (p99, median) = carrier.wake_summary().expect("wake measured");
assert!((p99 - cg.p99_wake_latency_us).abs() < 1e-9);
assert!((median - cg.median_wake_latency_us).abs() < 1e-9);
let (mean, worst) = carrier.run_delay_summary().expect("run-delay measured");
assert!((mean - cg.mean_run_delay_us).abs() < 1e-9);
assert!((worst - cg.worst_run_delay_us).abs() < 1e-9);
}
#[test]
fn phase_cgroup_run_delay_mean_within_ulp_of_cgroup_stats() {
let reports: Vec<WorkerReport> = [8_865_093u64, 9_991_834, 9_627_760]
.iter()
.enumerate()
.map(|(i, &rd)| WorkerReport {
schedstat_run_delay_ns: rd,
..rpt(i as i32 + 1, 1000, 1_000_000, 0, &[i], 0)
})
.collect();
let cg = cgroup_stats(&reports);
let carrier = phase_cgroup_stats(&reports, None);
let (mean, _worst) = carrier.run_delay_summary().expect("run-delay measured");
let delta = (mean - cg.mean_run_delay_us).abs();
assert!(
delta < 1e-9,
"mean within 1e-9 of cgroup_stats; delta={delta:e}"
);
assert!(
delta > 0.0,
"inputs must actually DIVERGE so the 1e-9 tolerance is load-bearing, not dead; delta={delta:e}",
);
}
#[test]
fn repool_distribution_carrier_name_dedup_skips_same_name_cgroups_across_steps() {
let step0 = PhaseCgroupStats {
wake_latencies_ns: vec![1000, 2000],
wake_sample_total: 2,
..PhaseCgroupStats::default()
};
let step1 = PhaseCgroupStats {
wake_latencies_ns: vec![3000, 4000],
wake_sample_total: 2,
..PhaseCgroupStats::default()
};
let mut b0 = PhaseBucket {
step_index: 1,
..PhaseBucket::default()
};
b0.per_cgroup.insert("a".to_string(), step0);
let mut b1 = PhaseBucket {
step_index: 2,
..PhaseBucket::default()
};
b1.per_cgroup.insert("a".to_string(), step1);
let cgroups = vec![
CgroupStats {
cgroup_name: "a".to_string(),
p99_wake_latency_us: 9999.0,
..CgroupStats::default()
},
CgroupStats {
cgroup_name: "a".to_string(),
p99_wake_latency_us: 8888.0,
..CgroupStats::default()
},
];
let mut stats = ScenarioStats {
phases: vec![b0, b1],
cgroups,
..ScenarioStats::default()
};
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(4.0),
);
}
#[test]
#[should_panic(expected = "no CgroupStats wake reduction")]
fn repool_distribution_cross_source_arm_debug_asserts_in_test_build() {
let mut target = BTreeMap::new();
let empty_carriers = std::collections::BTreeSet::new();
populate_run_distribution_metrics_from(
&mut target,
std::iter::once((
"worst_p99_wake_latency_us",
MetricKind::Distribution {
source: SampleSource::WakeLatencyNs,
reduction: SampleReduction::Worst,
},
)),
&[],
&empty_carriers,
&[],
&empty_carriers,
&[CgroupStats {
cgroup_name: "a".to_string(),
..CgroupStats::default()
}],
0,
);
}
#[test]
fn repool_distribution_all_zero_reductions_is_measured_zero_not_absent() {
let cg = CgroupStats {
cgroup_name: "x".to_string(),
p99_wake_latency_us: 0.0,
worst_run_delay_us: 0.0,
..CgroupStats::default()
};
let mut stats = repool_stats(vec![("x", PhaseCgroupStats::default())], vec![cg]);
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(0.0),
"all-zero-reduction cohort -> measured Some(0.0), not absent",
);
assert_eq!(
stats.ext_metrics.get("worst_run_delay_us").copied(),
Some(0.0),
);
assert!(
!stats
.ext_metrics
.contains_key("worst_iterations_per_worker"),
"all-None WorstLowest cohort stays absent, distinct from Distribution's 0.0",
);
}
#[test]
fn repool_distribution_name_in_carriers_skips_cgroup_even_with_empty_sibling_phase() {
let with_samples = PhaseCgroupStats {
wake_latencies_ns: vec![1000, 2000],
wake_sample_total: 2,
..PhaseCgroupStats::default()
};
let mut b0 = PhaseBucket {
step_index: 1,
..PhaseBucket::default()
};
b0.per_cgroup.insert("a".to_string(), with_samples);
let mut b1 = PhaseBucket {
step_index: 2,
..PhaseBucket::default()
};
b1.per_cgroup
.insert("a".to_string(), PhaseCgroupStats::default());
let cgroups = vec![CgroupStats {
cgroup_name: "a".to_string(),
p99_wake_latency_us: 9999.0,
..CgroupStats::default()
}];
let mut stats = ScenarioStats {
phases: vec![b0, b1],
cgroups,
..ScenarioStats::default()
};
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(2.0),
);
}
#[test]
fn repool_distribution_falls_back_to_cgroup_reductions_when_stripped() {
let cg0 = CgroupStats {
cgroup_name: "a".to_string(),
p99_wake_latency_us: 30.0,
worst_run_delay_us: 80.0,
..CgroupStats::default()
};
let cg1 = CgroupStats {
cgroup_name: "b".to_string(),
p99_wake_latency_us: 70.0,
worst_run_delay_us: 50.0,
..CgroupStats::default()
};
let mut stats = repool_stats(vec![("a", PhaseCgroupStats::default())], vec![cg0, cg1]);
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(70.0),
"stripped → fallback max over cgroup p99 reductions",
);
assert_eq!(
stats.ext_metrics.get("worst_run_delay_us").copied(),
Some(80.0),
"stripped → fallback max over cgroup worst_run_delay reductions",
);
}
#[test]
fn repool_run_delay_divides_ns_by_1000_once() {
let cg = PhaseCgroupStats {
run_delays_ns: vec![100_000, 300_000],
..PhaseCgroupStats::default()
};
let mut stats = repool_stats(vec![("a", cg)], vec![]);
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_mean_run_delay_us").copied(),
Some(200.0),
);
assert_eq!(
stats.ext_metrics.get("worst_run_delay_us").copied(),
Some(300.0),
);
}
#[test]
fn repool_distribution_pools_wake_across_phases() {
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();
let expected = percentile(&union, 0.99) as f64 / 1000.0;
assert_eq!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(expected),
"pooled p99 must be over the cross-PHASE union (99 µs), not phase[0] alone",
);
let p0: Vec<u64> = (1..=50u64).map(|v| v * 1000).collect();
let phase0_only = percentile(&p0, 0.99) as f64 / 1000.0;
assert_ne!(
stats.ext_metrics.get("worst_p99_wake_latency_us").copied(),
Some(phase0_only),
"must NOT pool only phase[0]",
);
}
#[test]
fn repool_mean_run_delay_pools_across_cgroups_not_max_of_per_cgroup() {
let cg_a = PhaseCgroupStats {
run_delays_ns: vec![10_000, 10_000, 10_000, 10_000],
..PhaseCgroupStats::default()
};
let cg_b = PhaseCgroupStats {
run_delays_ns: vec![200_000],
..PhaseCgroupStats::default()
};
let mut stats = repool_stats(vec![("a", cg_a), ("b", cg_b)], vec![]);
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_mean_run_delay_us").copied(),
Some(48.0),
"pooled cross-cgroup mean run-delay over the union, not max-of-per-cgroup",
);
assert_ne!(
stats.ext_metrics.get("worst_mean_run_delay_us").copied(),
Some(200.0),
"must NOT be max of per-cgroup means (the pre-Item-7 fold)",
);
}
#[test]
fn repool_distribution_folds_carrierless_backdrop_not_dropped() {
let carrier_a = PhaseCgroupStats {
wake_latencies_ns: (1..=50u64).map(|v| v * 1000).collect(), wake_sample_total: 50,
..PhaseCgroupStats::default()
};
let cg_a = CgroupStats {
cgroup_name: "a".to_string(),
p99_wake_latency_us: 9999.0,
..CgroupStats::default()
};
let cg_bd = CgroupStats {
cgroup_name: "bd".to_string(),
p99_wake_latency_us: 500.0,
..CgroupStats::default()
};
let mut stats = repool_stats(vec![("a", carrier_a)], vec![cg_a, cg_bd]);
populate_run_distribution_metrics(&mut stats);
let p99 = stats.ext_metrics.get("worst_p99_wake_latency_us").copied();
assert_eq!(
p99,
Some(500.0),
"backdrop p99 (500) folds worst-wins with the pooled carrier p99 (~50); \
got {p99:?}",
);
assert_ne!(
p99,
Some(9999.0),
"carrier-bearing cgroup must be pooled, not reduction-folded"
);
}
#[test]
fn repool_run_delay_folds_carrierless_backdrop_independently_of_wake() {
let carrier_a = PhaseCgroupStats {
run_delays_ns: vec![10_000, 10_000], ..PhaseCgroupStats::default()
};
let cg_a = CgroupStats {
cgroup_name: "a".to_string(),
mean_run_delay_us: 9999.0, worst_run_delay_us: 9999.0,
..CgroupStats::default()
};
let cg_bd = CgroupStats {
cgroup_name: "bd".to_string(),
mean_run_delay_us: 500.0, worst_run_delay_us: 700.0,
..CgroupStats::default()
};
let mut stats = repool_stats(vec![("a", carrier_a)], vec![cg_a, cg_bd]);
populate_run_distribution_metrics(&mut stats);
assert_eq!(
stats.ext_metrics.get("worst_mean_run_delay_us").copied(),
Some(500.0),
);
assert_eq!(
stats.ext_metrics.get("worst_run_delay_us").copied(),
Some(700.0),
);
}