use super::tests_common::rpt;
use super::*;
#[test]
fn assert_no_overrides_has_no_checks() {
let v = Assert::NO_OVERRIDES;
assert!(v.not_starved.is_none());
assert!(v.isolation.is_none());
assert!(v.max_gap_ms.is_none());
assert!(v.max_spread_pct.is_none());
assert!(v.max_imbalance_ratio.is_none());
}
#[test]
fn assert_default_checks_is_no_overrides() {
let v = Assert::default_checks();
assert!(v.not_starved.is_none());
assert!(v.isolation.is_none());
assert!(v.max_imbalance_ratio.is_none());
assert!(v.max_local_dsq_depth.is_none());
assert!(v.fail_on_stall.is_none());
assert!(v.sustained_samples.is_none());
assert!(v.max_fallback_rate.is_none());
assert!(v.max_keep_last_rate.is_none());
}
#[test]
fn with_monitor_defaults_propagates_enforce_true_to_thresholds() {
let assert = Assert::NO_OVERRIDES.with_monitor_defaults();
let t = assert.monitor_thresholds();
assert!(
t.enforce,
"with_monitor_defaults() must propagate enforce=true to MonitorThresholds"
);
}
#[test]
fn assert_default_without_monitor_defaults_yields_enforce_false() {
let assert = Assert::NO_OVERRIDES;
let t = assert.monitor_thresholds();
assert!(
!t.enforce,
"default Assert (no .with_monitor_defaults()) must yield enforce=false"
);
}
#[test]
fn no_overrides_enforce_monitor_thresholds_field_is_false() {
let v = Assert::NO_OVERRIDES;
assert!(
!v.enforce_monitor_thresholds,
"NO_OVERRIDES.enforce_monitor_thresholds must be false (post-enforce-default-flip default)"
);
}
#[test]
fn merge_enforce_monitor_thresholds_or_semantics_false_false() {
let merged = Assert::NO_OVERRIDES.merge(&Assert::NO_OVERRIDES);
assert!(
!merged.enforce_monitor_thresholds,
"false || false must yield false"
);
}
#[test]
fn merge_enforce_monitor_thresholds_or_semantics_true_left() {
let left = Assert::NO_OVERRIDES.with_monitor_defaults();
let right = Assert::NO_OVERRIDES;
let merged = left.merge(&right);
assert!(
merged.enforce_monitor_thresholds,
"true (self) || false (other) must yield true (sticky OR)"
);
}
#[test]
fn merge_enforce_monitor_thresholds_or_semantics_false_true() {
let left = Assert::NO_OVERRIDES;
let right = Assert::NO_OVERRIDES.with_monitor_defaults();
let merged = left.merge(&right);
assert!(
merged.enforce_monitor_thresholds,
"false (self) || true (other) must yield true (sticky OR)"
);
}
#[test]
fn with_monitor_defaults_fills_all_unset_threshold_fields() {
use crate::monitor::MonitorThresholds;
let assert = Assert::NO_OVERRIDES.with_monitor_defaults();
let d = MonitorThresholds::DEFAULT;
assert!(
(assert.max_imbalance_ratio.unwrap() - d.max_imbalance_ratio).abs() < f64::EPSILON,
"max_imbalance_ratio must be auto-filled with DEFAULT"
);
assert_eq!(
assert.max_local_dsq_depth,
Some(d.max_local_dsq_depth),
"max_local_dsq_depth must be auto-filled with DEFAULT"
);
assert_eq!(
assert.fail_on_stall,
Some(d.fail_on_stall),
"fail_on_stall must be auto-filled with DEFAULT"
);
assert_eq!(
assert.sustained_samples,
Some(d.sustained_samples),
"sustained_samples must be auto-filled with DEFAULT"
);
assert!(
(assert.max_fallback_rate.unwrap() - d.max_fallback_rate).abs() < f64::EPSILON,
"max_fallback_rate must be auto-filled with DEFAULT"
);
assert!(
(assert.max_keep_last_rate.unwrap() - d.max_keep_last_rate).abs() < f64::EPSILON,
"max_keep_last_rate must be auto-filled with DEFAULT"
);
assert!(
assert.enforce_monitor_thresholds,
"enforce_monitor_thresholds must be set to true"
);
}
#[test]
fn merge_enforce_monitor_thresholds_or_semantics_true_true() {
let left = Assert::NO_OVERRIDES.with_monitor_defaults();
let right = Assert::NO_OVERRIDES.with_monitor_defaults();
let merged = left.merge(&right);
assert!(
merged.enforce_monitor_thresholds,
"true || true must yield true (OR, not XOR)"
);
}
#[test]
fn with_monitor_defaults_preserves_user_set_values() {
use crate::monitor::MonitorThresholds;
let d = MonitorThresholds::DEFAULT;
let custom_imbalance = d.max_imbalance_ratio * 0.5;
let custom_local_dsq = d.max_local_dsq_depth * 2;
let custom_fail_on_stall = !d.fail_on_stall;
let custom_sustained = d.sustained_samples * 2;
let custom_fallback = d.max_fallback_rate * 0.5;
let custom_keep_last = d.max_keep_last_rate * 0.5;
assert!(
(custom_imbalance - d.max_imbalance_ratio).abs() > f64::EPSILON,
"test derivation produced custom_imbalance == DEFAULT — DEFAULT.max_imbalance_ratio may have shifted to 0"
);
assert_ne!(
custom_local_dsq, d.max_local_dsq_depth,
"test derivation produced custom_local_dsq == DEFAULT — DEFAULT.max_local_dsq_depth may have shifted to 0"
);
assert_ne!(
custom_fail_on_stall, d.fail_on_stall,
"bool flip should always differ"
);
assert_ne!(
custom_sustained, d.sustained_samples,
"test derivation produced custom_sustained == DEFAULT — DEFAULT.sustained_samples may have shifted to 0"
);
assert!(
(custom_fallback - d.max_fallback_rate).abs() > f64::EPSILON,
"test derivation produced custom_fallback == DEFAULT — DEFAULT.max_fallback_rate may have shifted to 0"
);
assert!(
(custom_keep_last - d.max_keep_last_rate).abs() > f64::EPSILON,
"test derivation produced custom_keep_last == DEFAULT — DEFAULT.max_keep_last_rate may have shifted to 0"
);
let assert = Assert::NO_OVERRIDES
.max_imbalance_ratio(custom_imbalance)
.max_local_dsq_depth(custom_local_dsq)
.fail_on_stall(custom_fail_on_stall)
.sustained_samples(custom_sustained)
.max_fallback_rate(custom_fallback)
.max_keep_last_rate(custom_keep_last)
.with_monitor_defaults();
assert!(
(assert.max_imbalance_ratio.unwrap() - custom_imbalance).abs() < f64::EPSILON,
"max_imbalance_ratio user-set value must survive with_monitor_defaults"
);
assert_eq!(
assert.max_local_dsq_depth,
Some(custom_local_dsq),
"max_local_dsq_depth user-set value must survive"
);
assert_eq!(
assert.fail_on_stall,
Some(custom_fail_on_stall),
"fail_on_stall user-set value must survive"
);
assert_eq!(
assert.sustained_samples,
Some(custom_sustained),
"sustained_samples user-set value must survive"
);
assert!(
(assert.max_fallback_rate.unwrap() - custom_fallback).abs() < f64::EPSILON,
"max_fallback_rate user-set value must survive"
);
assert!(
(assert.max_keep_last_rate.unwrap() - custom_keep_last).abs() < f64::EPSILON,
"max_keep_last_rate user-set value must survive"
);
assert!(
assert.enforce_monitor_thresholds,
"enforce_monitor_thresholds still set to true (the only field with_monitor_defaults unconditionally writes)"
);
}
#[test]
fn has_monitor_thresholds_false_when_all_none() {
let v = Assert::NO_OVERRIDES;
assert!(
!v.has_monitor_thresholds(),
"NO_OVERRIDES must report has_monitor_thresholds() == false"
);
}
#[test]
fn has_monitor_thresholds_true_when_any_set() {
use crate::monitor::MonitorThresholds;
let _ = MonitorThresholds {
max_imbalance_ratio: 0.0,
max_local_dsq_depth: 0,
fail_on_stall: false,
sustained_samples: 0,
max_fallback_rate: 0.0,
max_keep_last_rate: 0.0,
enforce: false,
};
type FieldSetter = (&'static str, fn() -> Assert);
let setters: &[FieldSetter] = &[
("max_imbalance_ratio", || {
Assert::NO_OVERRIDES.max_imbalance_ratio(3.0)
}),
("max_local_dsq_depth", || {
Assert::NO_OVERRIDES.max_local_dsq_depth(64)
}),
("fail_on_stall", || Assert::NO_OVERRIDES.fail_on_stall(true)),
("sustained_samples", || {
Assert::NO_OVERRIDES.sustained_samples(7)
}),
("max_fallback_rate", || {
Assert::NO_OVERRIDES.max_fallback_rate(150.0)
}),
("max_keep_last_rate", || {
Assert::NO_OVERRIDES.max_keep_last_rate(75.0)
}),
];
for (field, build) in setters {
let v = build();
assert!(
v.has_monitor_thresholds(),
"has_monitor_thresholds() must return true when only `{field}` is set"
);
}
}
#[test]
fn assert_merge_other_overrides_self() {
let base = Assert::NO_OVERRIDES;
let other = Assert::NO_OVERRIDES
.check_not_starved()
.max_gap_ms(5000)
.max_imbalance_ratio(2.0);
let merged = base.merge(&other);
assert_eq!(merged.not_starved, Some(true));
assert_eq!(merged.max_gap_ms, Some(5000));
assert_eq!(merged.max_imbalance_ratio, Some(2.0));
}
#[test]
fn assert_merge_preserves_self_when_other_is_none() {
let base = Assert::NO_OVERRIDES
.check_not_starved()
.max_imbalance_ratio(4.0);
let merged = base.merge(&Assert::NO_OVERRIDES);
assert_eq!(merged.not_starved, Some(true));
assert_eq!(merged.max_imbalance_ratio, Some(4.0));
}
#[test]
fn assert_merge_other_takes_precedence() {
let base = Assert::NO_OVERRIDES.max_imbalance_ratio(4.0);
let other = Assert::NO_OVERRIDES.max_imbalance_ratio(2.0);
let merged = base.merge(&other);
assert_eq!(merged.max_imbalance_ratio, Some(2.0));
}
#[test]
fn assert_merge_last_some_wins() {
let base = Assert::NO_OVERRIDES.check_not_starved();
let other = Assert::NO_OVERRIDES.check_isolation();
let merged = base.merge(&other);
assert_eq!(merged.not_starved, Some(true));
assert_eq!(merged.isolation, Some(true));
}
#[test]
fn assert_merge_child_disables_not_starved() {
let base = Assert::NO_OVERRIDES.check_not_starved();
let other = Assert {
not_starved: Some(false),
..Assert::NO_OVERRIDES
};
let merged = base.merge(&other);
assert_eq!(merged.not_starved, Some(false));
assert!(!merged.worker_plan().not_starved);
}
#[test]
fn assert_merge_child_disables_isolation() {
let base = Assert::NO_OVERRIDES.check_isolation(); let other = Assert {
isolation: Some(false),
..Assert::NO_OVERRIDES
};
let merged = base.merge(&other);
assert_eq!(merged.isolation, Some(false));
assert!(!merged.worker_plan().isolation);
}
#[test]
fn assert_worker_plan_extraction() {
let v = Assert::NO_OVERRIDES
.check_not_starved()
.check_isolation()
.max_gap_ms(3000)
.max_spread_pct(25.0);
assert_eq!(v.not_starved, Some(true));
assert_eq!(v.isolation, Some(true));
let plan = v.worker_plan();
assert!(plan.not_starved);
assert!(plan.isolation);
assert_eq!(plan.max_gap_ms, Some(3000));
assert_eq!(plan.max_spread_pct, Some(25.0));
}
#[test]
fn assert_cgroup_delegates_to_plan() {
let v = Assert::NO_OVERRIDES.check_not_starved();
let reports = [rpt(1, 1000, 5e9 as u64, 5e8 as u64, &[0], 50)];
let r = v.assert_cgroup(&reports, None);
assert!(r.passed);
assert_eq!(r.stats.total_workers, 1);
}
#[test]
fn assert_monitor_thresholds_extraction() {
let v = Assert::NO_OVERRIDES
.max_imbalance_ratio(2.5)
.max_local_dsq_depth(100)
.fail_on_stall(false)
.sustained_samples(10)
.max_fallback_rate(50.0)
.max_keep_last_rate(25.0);
let t = v.monitor_thresholds();
assert!((t.max_imbalance_ratio - 2.5).abs() < f64::EPSILON);
assert_eq!(t.max_local_dsq_depth, 100);
assert!(!t.fail_on_stall);
assert_eq!(t.sustained_samples, 10);
assert!((t.max_fallback_rate - 50.0).abs() < f64::EPSILON);
assert!((t.max_keep_last_rate - 25.0).abs() < f64::EPSILON);
}
#[test]
fn assert_monitor_thresholds_defaults_when_none() {
let v = Assert::NO_OVERRIDES;
let t = v.monitor_thresholds();
let d = crate::monitor::MonitorThresholds::DEFAULT;
assert!((t.max_imbalance_ratio - d.max_imbalance_ratio).abs() < f64::EPSILON);
assert_eq!(t.max_local_dsq_depth, d.max_local_dsq_depth);
}
#[test]
fn assert_chain_all_setters() {
let v = Assert::NO_OVERRIDES
.check_not_starved()
.check_isolation()
.max_gap_ms(1000)
.max_spread_pct(5.0)
.max_imbalance_ratio(3.0)
.max_local_dsq_depth(20)
.fail_on_stall(true)
.sustained_samples(3)
.max_fallback_rate(100.0)
.max_keep_last_rate(50.0);
assert_eq!(v.not_starved, Some(true));
assert_eq!(v.isolation, Some(true));
assert_eq!(v.max_gap_ms, Some(1000));
assert_eq!(v.max_spread_pct, Some(5.0));
assert_eq!(v.max_imbalance_ratio, Some(3.0));
assert_eq!(v.max_local_dsq_depth, Some(20));
assert_eq!(v.fail_on_stall, Some(true));
assert_eq!(v.sustained_samples, Some(3));
assert_eq!(v.max_fallback_rate, Some(100.0));
assert_eq!(v.max_keep_last_rate, Some(50.0));
}
#[test]
fn gap_threshold_default() {
let t = gap_threshold_ms();
if cfg!(debug_assertions) {
assert_eq!(t, 3000);
} else {
assert_eq!(t, 2000);
}
}
#[test]
fn assert_merge_max_spread_pct() {
let base = Assert::NO_OVERRIDES.max_spread_pct(10.0);
let other = Assert::NO_OVERRIDES.max_spread_pct(5.0);
assert_eq!(base.merge(&other).max_spread_pct, Some(5.0));
assert_eq!(base.merge(&Assert::NO_OVERRIDES).max_spread_pct, Some(10.0));
}
#[test]
fn assert_merge_fail_on_stall() {
let base = Assert::NO_OVERRIDES.fail_on_stall(true);
let other = Assert::NO_OVERRIDES.fail_on_stall(false);
assert_eq!(base.merge(&other).fail_on_stall, Some(false));
assert_eq!(base.merge(&Assert::NO_OVERRIDES).fail_on_stall, Some(true));
}
#[test]
fn assert_merge_sustained_samples() {
let base = Assert::NO_OVERRIDES.sustained_samples(5);
let other = Assert::NO_OVERRIDES.sustained_samples(10);
assert_eq!(base.merge(&other).sustained_samples, Some(10));
assert_eq!(base.merge(&Assert::NO_OVERRIDES).sustained_samples, Some(5));
}
#[test]
fn assert_merge_max_fallback_rate() {
let base = Assert::NO_OVERRIDES.max_fallback_rate(200.0);
let other = Assert::NO_OVERRIDES.max_fallback_rate(50.0);
assert_eq!(base.merge(&other).max_fallback_rate, Some(50.0));
assert_eq!(
base.merge(&Assert::NO_OVERRIDES).max_fallback_rate,
Some(200.0)
);
}
#[test]
fn assert_merge_max_keep_last_rate() {
let base = Assert::NO_OVERRIDES.max_keep_last_rate(100.0);
let other = Assert::NO_OVERRIDES.max_keep_last_rate(25.0);
assert_eq!(base.merge(&other).max_keep_last_rate, Some(25.0));
assert_eq!(
base.merge(&Assert::NO_OVERRIDES).max_keep_last_rate,
Some(100.0)
);
}
#[test]
fn assert_merge_max_local_dsq_depth() {
let base = Assert::NO_OVERRIDES.max_local_dsq_depth(50);
let other = Assert::NO_OVERRIDES.max_local_dsq_depth(100);
assert_eq!(base.merge(&other).max_local_dsq_depth, Some(100));
assert_eq!(
base.merge(&Assert::NO_OVERRIDES).max_local_dsq_depth,
Some(50)
);
}
#[test]
fn assert_merge_max_gap_ms() {
let base = Assert::NO_OVERRIDES.max_gap_ms(2000);
let other = Assert::NO_OVERRIDES.max_gap_ms(5000);
assert_eq!(base.merge(&other).max_gap_ms, Some(5000));
assert_eq!(base.merge(&Assert::NO_OVERRIDES).max_gap_ms, Some(2000));
}
#[test]
fn assert_merge_three_layers() {
let defaults = Assert::default_checks();
let sched = Assert::NO_OVERRIDES
.max_imbalance_ratio(2.0)
.max_fallback_rate(50.0);
let test = Assert::NO_OVERRIDES.max_gap_ms(5000);
let merged = defaults.merge(&sched).merge(&test);
assert_eq!(merged.not_starved, None);
assert_eq!(merged.max_imbalance_ratio, Some(2.0));
assert_eq!(merged.max_fallback_rate, Some(50.0));
assert_eq!(merged.max_gap_ms, Some(5000));
assert_eq!(merged.sustained_samples, None);
}
#[test]
fn assert_merge_no_overrides_preserves_base() {
let base = Assert::NO_OVERRIDES
.check_not_starved()
.max_imbalance_ratio(4.0)
.fail_on_stall(true);
let merged = base.merge(&Assert::NO_OVERRIDES);
assert_eq!(merged.not_starved, Some(true));
assert_eq!(merged.max_imbalance_ratio, Some(4.0));
assert_eq!(merged.fail_on_stall, Some(true));
}
#[test]
fn assert_merge_no_overrides_is_left_identity() {
let merged = Assert::NO_OVERRIDES.merge(&Assert::default_checks());
assert!(merged.not_starved.is_none());
assert!(merged.max_imbalance_ratio.is_none());
assert!(merged.max_gap_ms.is_none());
assert!(merged.isolation.is_none());
}
#[test]
fn assert_merge_runtime_chain_with_no_overrides_yields_defaults() {
let scheduler_assert = Assert::NO_OVERRIDES;
let test_assert = Assert::NO_OVERRIDES;
let merged = Assert::default_checks()
.merge(&scheduler_assert)
.merge(&test_assert);
assert!(merged.not_starved.is_none());
assert!(merged.max_imbalance_ratio.is_none());
assert!(merged.max_local_dsq_depth.is_none());
assert!(merged.fail_on_stall.is_none());
}
#[test]
fn assert_merge_overrides_fields() {
let base = Assert::NO_OVERRIDES;
let overrides = Assert::NO_OVERRIDES
.max_imbalance_ratio(5.0)
.max_gap_ms(1000)
.check_not_starved();
let merged = base.merge(&overrides);
assert_eq!(merged.not_starved, Some(true));
assert_eq!(merged.max_imbalance_ratio, Some(5.0));
assert_eq!(merged.max_gap_ms, Some(1000));
}
#[test]
fn assert_merge_later_overrides_earlier() {
let a = Assert::NO_OVERRIDES.max_imbalance_ratio(2.0);
let b = Assert::NO_OVERRIDES.max_imbalance_ratio(10.0);
let merged = a.merge(&b);
assert_eq!(merged.max_imbalance_ratio, Some(10.0));
}
#[test]
fn assert_worker_plan_extracts_fields() {
let v = Assert::NO_OVERRIDES
.check_not_starved()
.check_isolation()
.max_gap_ms(500)
.max_spread_pct(10.0);
assert_eq!(v.not_starved, Some(true));
assert_eq!(v.isolation, Some(true));
let plan = v.worker_plan();
assert!(plan.not_starved);
assert!(plan.isolation);
assert_eq!(plan.max_gap_ms, Some(500));
assert_eq!(plan.max_spread_pct, Some(10.0));
}
#[test]
fn assert_monitor_thresholds_defaults() {
let v = Assert::NO_OVERRIDES;
let t = v.monitor_thresholds();
let d = crate::monitor::MonitorThresholds::DEFAULT;
assert_eq!(t.max_imbalance_ratio, d.max_imbalance_ratio);
assert_eq!(t.max_local_dsq_depth, d.max_local_dsq_depth);
}
#[test]
fn assert_monitor_thresholds_overridden() {
let v = Assert::NO_OVERRIDES
.max_imbalance_ratio(99.0)
.max_local_dsq_depth(42)
.fail_on_stall(false)
.sustained_samples(10)
.max_fallback_rate(0.5)
.max_keep_last_rate(0.3);
let t = v.monitor_thresholds();
assert_eq!(t.max_imbalance_ratio, 99.0);
assert_eq!(t.max_local_dsq_depth, 42);
assert!(!t.fail_on_stall);
assert_eq!(t.sustained_samples, 10);
assert_eq!(t.max_fallback_rate, 0.5);
assert_eq!(t.max_keep_last_rate, 0.3);
}
#[test]
fn assert_max_spread_pct() {
let v = Assert::NO_OVERRIDES.max_spread_pct(25.0);
assert_eq!(v.max_spread_pct, Some(25.0));
}
#[test]
fn gap_threshold_debug_vs_release() {
let t = gap_threshold_ms();
assert!(t >= 2000, "threshold should be at least 2000ms: {t}");
}
#[test]
fn assert_no_overrides_has_no_worker_checks() {
assert!(!Assert::NO_OVERRIDES.has_worker_checks());
}
#[test]
fn assert_default_checks_has_no_worker_checks() {
assert!(!Assert::default_checks().has_worker_checks());
}
#[test]
fn assert_single_field_has_worker_checks() {
assert!(Assert::NO_OVERRIDES.max_gap_ms(5000).has_worker_checks());
assert!(Assert::NO_OVERRIDES.check_isolation().has_worker_checks());
assert!(
Assert::NO_OVERRIDES
.max_spread_pct(10.0)
.has_worker_checks()
);
assert!(
Assert::NO_OVERRIDES
.max_throughput_cv(0.5)
.has_worker_checks()
);
assert!(
Assert::NO_OVERRIDES
.min_work_rate(100.0)
.has_worker_checks()
);
assert!(
Assert::NO_OVERRIDES
.max_p99_wake_latency_ns(1000)
.has_worker_checks()
);
assert!(
Assert::NO_OVERRIDES
.max_wake_latency_cv(0.5)
.has_worker_checks()
);
assert!(
Assert::NO_OVERRIDES
.min_iteration_rate(10.0)
.has_worker_checks()
);
assert!(
Assert::NO_OVERRIDES
.max_migration_ratio(0.5)
.has_worker_checks()
);
}
#[test]
fn assert_monitor_only_no_worker_checks() {
let a = Assert::NO_OVERRIDES
.max_imbalance_ratio(5.0)
.fail_on_stall(true);
assert!(!a.has_worker_checks());
}
#[test]
fn assert_merge_all_field_categories() {
let defaults = Assert::default_checks();
let sched = Assert::NO_OVERRIDES
.max_spread_pct(50.0)
.max_p99_wake_latency_ns(100_000)
.max_migration_ratio(0.5)
.fail_on_stall(true);
let test = Assert::NO_OVERRIDES.check_isolation().max_spread_pct(80.0);
let merged = defaults.merge(&sched).merge(&test);
assert_eq!(merged.max_spread_pct, Some(80.0));
assert_eq!(merged.max_p99_wake_latency_ns, Some(100_000));
assert_eq!(merged.max_migration_ratio, Some(0.5));
assert_eq!(merged.isolation, Some(true));
assert_eq!(merged.fail_on_stall, Some(true));
}