use super::*;
#[test]
fn assert_format_human_field_order_is_stable() {
let a = Assert::default_checks();
let out = a.format_human();
let pairs = [
("not_starved", "isolation"),
("isolation", "max_gap_ms"),
("max_gap_ms", "max_spread_pct"),
("max_spread_pct", "max_throughput_cv"),
("min_work_rate", "max_p99_wake_latency_ns"),
("max_keep_last_rate", "min_page_locality"),
];
for (earlier, later) in pairs {
let ei = out
.find(earlier)
.unwrap_or_else(|| panic!("field {earlier} missing from format_human output:\n{out}"));
let li = out
.find(later)
.unwrap_or_else(|| panic!("field {later} missing from format_human output:\n{out}"));
assert!(
ei < li,
"field order unstable: {earlier} (at {ei}) must precede {later} (at {li})",
);
}
}
#[test]
fn assert_format_human_no_overrides_renders_all_none() {
let out = Assert::NO_OVERRIDES.format_human();
let none_count = out.matches(": none").count();
assert_eq!(
none_count, 19,
"NO_OVERRIDES must render every field as `none`, got {none_count} `none` rows:\n{out}",
);
assert!(
out.starts_with(" not_starved"),
"format_human must open with the first threshold row \
(header ownership belongs to the caller); got: {out}",
);
assert!(
out.ends_with('\n'),
"format_human output must end with newline"
);
}
#[test]
fn assert_format_human_default_checks_shows_populated_values() {
let a = Assert::default_checks();
let out = a.format_human();
assert!(
out.contains("not_starved") && out.contains(": true"),
"default_checks must populate not_starved = true: {out}",
);
}
#[test]
fn is_skipped_true_for_skip_result() {
let r = AssertResult::skip("no LLC available");
assert!(r.passed, "skip keeps passed=true for simple gate");
assert!(r.is_skipped(), "skip must report is_skipped");
}
#[test]
fn is_skipped_false_for_pass_result() {
let r = AssertResult::pass();
assert!(r.passed);
assert!(!r.is_skipped(), "pass is not a skip");
}
#[test]
fn is_skipped_false_for_fail_result() {
let mut r = AssertResult::pass();
r.passed = false;
r.details
.push(AssertDetail::new(DetailKind::Starved, "worker starved"));
assert!(
!r.is_skipped(),
"fail is not a skip even with non-skip details"
);
}
#[test]
fn assert_result_pass_defaults() {
let r = AssertResult::pass();
assert!(r.passed);
assert!(r.details.is_empty());
assert_eq!(r.stats.total_workers, 0);
}
#[test]
fn assert_result_skip_is_pass_with_reason() {
let r = AssertResult::skip("topology too small");
assert!(r.passed);
assert_eq!(r.details.len(), 1);
assert_eq!(r.details[0], "topology too small");
}
#[test]
fn assert_result_skip_default_stats() {
let r = AssertResult::skip("skipped");
assert_eq!(r.stats.total_workers, 0);
assert!(r.stats.cgroups.is_empty());
}
#[test]
fn derived_ratio_methods_compute_tail_and_throughput() {
use crate::assert::CgroupStats;
let cg = CgroupStats {
num_workers: 4,
total_iterations: 800,
p99_wake_latency_us: 50.0,
median_wake_latency_us: 10.0,
..CgroupStats::default()
};
assert_eq!(
cg.wake_latency_tail_ratio(),
5.0,
"p99 / median = 50 / 10; got {}",
cg.wake_latency_tail_ratio(),
);
assert_eq!(
cg.iterations_per_worker(),
200.0,
"total_iterations / num_workers = 800 / 4; got {}",
cg.iterations_per_worker(),
);
let cg = CgroupStats {
num_workers: 2,
total_iterations: 100,
p99_wake_latency_us: 50.0,
median_wake_latency_us: 0.0,
..CgroupStats::default()
};
assert_eq!(
cg.wake_latency_tail_ratio(),
0.0,
"divide-by-zero guard on median must yield 0.0, not NaN; got {}",
cg.wake_latency_tail_ratio(),
);
assert!(
cg.wake_latency_tail_ratio().is_finite(),
"tail_ratio must be finite; got {}",
cg.wake_latency_tail_ratio(),
);
assert_eq!(
cg.iterations_per_worker(),
50.0,
"cross-check: median-guard branch must not zero out the \
independent iterations_per_worker (100 / 2 = 50); got {}",
cg.iterations_per_worker(),
);
let cg = CgroupStats {
num_workers: 0,
total_iterations: 100,
p99_wake_latency_us: 50.0,
median_wake_latency_us: 10.0,
..CgroupStats::default()
};
assert_eq!(
cg.iterations_per_worker(),
0.0,
"divide-by-zero guard on num_workers must yield 0.0, \
not NaN; got {}",
cg.iterations_per_worker(),
);
assert!(
cg.iterations_per_worker().is_finite(),
"iterations_per_worker must be finite; got {}",
cg.iterations_per_worker(),
);
assert_eq!(
cg.wake_latency_tail_ratio(),
5.0,
"cross-check: num_workers-guard branch must not zero out \
the independent tail_ratio (50 / 10 = 5); got {}",
cg.wake_latency_tail_ratio(),
);
}
#[test]
fn wire_format_omits_derived_ratio_keys() {
use crate::assert::CgroupStats;
let cg = CgroupStats {
num_workers: 2,
total_iterations: 1000,
p99_wake_latency_us: 50.0,
median_wake_latency_us: 10.0,
..CgroupStats::default()
};
let json = serde_json::to_value(&cg).unwrap();
let map = match json {
serde_json::Value::Object(m) => m,
other => panic!("expected object, got {other:?}"),
};
assert!(
!map.contains_key("wake_latency_tail_ratio"),
"derived methods must NOT appear as wire-format fields; \
got: {map:#?}",
);
assert!(
!map.contains_key("iterations_per_worker"),
"derived methods must NOT appear as wire-format fields; \
got: {map:#?}",
);
assert_eq!(cg.wake_latency_tail_ratio(), 5.0);
assert_eq!(cg.iterations_per_worker(), 500.0);
}
#[test]
fn computed_accessors_handle_nan_infinity_and_negative_median() {
use crate::assert::CgroupStats;
fn assert_finite_eq(got: f64, expected: f64, label: &str) {
assert!(
got.is_finite(),
"[{label}] accessor returned non-finite value {got}; \
the guard branch must catch every degenerate input",
);
assert_eq!(
got, expected,
"[{label}] accessor returned {got}, expected {expected}",
);
}
let cg = CgroupStats {
p99_wake_latency_us: 50.0,
median_wake_latency_us: f64::NAN,
..CgroupStats::default()
};
assert_finite_eq(cg.wake_latency_tail_ratio(), 0.0, "nan-median");
let cg = CgroupStats {
p99_wake_latency_us: f64::NAN,
median_wake_latency_us: 10.0,
..CgroupStats::default()
};
let got = cg.wake_latency_tail_ratio();
assert!(
got.is_nan() || got == 0.0,
"[nan-p99] current accessor allows NaN through the \
numerator; either NaN or 0.0 is acceptable documented \
behavior today (downstream `finite_or_zero` handles \
it) — got {got}. A future hardening that adds numerator \
sanitization should tighten this to `== 0.0` and drop \
the allow_nan arm.",
);
let cg = CgroupStats {
p99_wake_latency_us: 50.0,
median_wake_latency_us: f64::INFINITY,
..CgroupStats::default()
};
assert_finite_eq(cg.wake_latency_tail_ratio(), 0.0, "inf-median");
let cg = CgroupStats {
p99_wake_latency_us: f64::INFINITY,
median_wake_latency_us: 10.0,
..CgroupStats::default()
};
let got = cg.wake_latency_tail_ratio();
assert!(
got.is_infinite() || got == 0.0,
"[inf-p99] current accessor allows Infinity through the \
numerator; either Infinity or 0.0 is acceptable — got {got}",
);
let cg = CgroupStats {
p99_wake_latency_us: 0.0,
median_wake_latency_us: 0.0,
..CgroupStats::default()
};
assert_finite_eq(cg.wake_latency_tail_ratio(), 0.0, "both-zero");
let cg = CgroupStats {
p99_wake_latency_us: 50.0,
median_wake_latency_us: -10.0,
..CgroupStats::default()
};
assert_finite_eq(cg.wake_latency_tail_ratio(), 0.0, "negative-median");
let cg = CgroupStats {
num_workers: 1,
total_iterations: u64::MAX,
..CgroupStats::default()
};
let got = cg.iterations_per_worker();
assert!(
got.is_finite(),
"[u64-max-iters] iterations_per_worker must stay finite \
even with total_iterations = u64::MAX; got {got}",
);
assert!(
got > 0.0,
"[u64-max-iters] result must be positive; got {got}",
);
}