#![cfg(test)]
#![allow(unused_imports)]
use super::super::affinity::*;
use super::super::config::*;
use super::super::types::*;
use super::super::worker::*;
use super::testing::*;
use super::*;
use std::collections::{BTreeMap, BTreeSet};
use std::sync::atomic::{AtomicBool, Ordering};
use std::time::{Duration, Instant};
#[test]
fn pathology_idle_churn_iterates() {
let cfg = WorkloadConfig {
num_workers: 2,
work_type: WorkType::IdleChurn {
burst_duration: Duration::from_millis(1),
sleep_duration: Duration::from_millis(5),
precise_timing: false,
},
..Default::default()
};
let mut h = WorkloadHandle::spawn(&cfg).expect("IdleChurn must spawn");
h.start();
std::thread::sleep(Duration::from_millis(200));
let reports = h.stop_and_collect();
assert_eq!(reports.len(), 2);
for r in &reports {
assert!(r.iterations > 0, "IdleChurn worker must iterate: {r:?}");
}
}
#[test]
fn idle_churn_zero_sleep_rejects() {
let cfg = WorkloadConfig {
num_workers: 1,
work_type: WorkType::IdleChurn {
burst_duration: Duration::from_millis(1),
sleep_duration: Duration::ZERO,
precise_timing: false,
},
..Default::default()
};
let err = WorkloadHandle::spawn(&cfg)
.err()
.expect("IdleChurn with sleep_duration=ZERO must be rejected at spawn");
let msg = format!("{err:#}");
assert!(
msg.contains("sleep_duration must be > 0"),
"diagnostic must name the rejected field; got: {msg}",
);
assert!(
msg.contains("SpinWait"),
"diagnostic must steer the caller to SpinWait; got: {msg}",
);
let typed = err
.downcast_ref::<WorkTypeValidationError>()
.expect("error must downcast to WorkTypeValidationError");
assert!(
matches!(
typed,
WorkTypeValidationError::ZeroSleepDuration { group_idx: 0 }
),
"expected ZeroSleepDuration {{ group_idx: 0 }}, got: {typed:?}",
);
}
#[test]
fn idle_churn_zero_burst_rejects() {
let cfg = WorkloadConfig {
num_workers: 1,
work_type: WorkType::IdleChurn {
burst_duration: Duration::ZERO,
sleep_duration: Duration::from_millis(5),
precise_timing: false,
},
..Default::default()
};
let err = WorkloadHandle::spawn(&cfg)
.err()
.expect("IdleChurn with burst_duration=ZERO must be rejected at spawn");
let msg = format!("{err:#}");
assert!(
msg.contains("burst_duration must be > 0"),
"diagnostic must name the rejected field; got: {msg}",
);
assert!(
msg.contains("pure sleep"),
"diagnostic must explain the pure-sleep degeneracy; got: {msg}",
);
let typed = err
.downcast_ref::<WorkTypeValidationError>()
.expect("error must downcast to WorkTypeValidationError");
assert!(
matches!(
typed,
WorkTypeValidationError::ZeroBurstDuration { group_idx: 0 }
),
"expected ZeroBurstDuration {{ group_idx: 0 }}, got: {typed:?}",
);
}
#[test]
fn idle_churn_both_zero_rejects_burst_first() {
let cfg = WorkloadConfig {
num_workers: 1,
work_type: WorkType::IdleChurn {
burst_duration: Duration::ZERO,
sleep_duration: Duration::ZERO,
precise_timing: false,
},
..Default::default()
};
let err = WorkloadHandle::spawn(&cfg)
.err()
.expect("IdleChurn with both fields ZERO must be rejected at spawn");
let msg = format!("{err:#}");
assert!(
msg.contains("burst_duration must be > 0"),
"burst check fires first; diagnostic must name burst_duration: {msg}",
);
assert!(
!msg.contains("sleep_duration must be > 0"),
"sleep check must NOT fire when burst already failed; got: {msg}",
);
let typed = err
.downcast_ref::<WorkTypeValidationError>()
.expect("error must downcast to WorkTypeValidationError");
assert!(
matches!(
typed,
WorkTypeValidationError::ZeroBurstDuration { group_idx: 0 }
),
"expected ZeroBurstDuration {{ group_idx: 0 }} (burst fires first), got: {typed:?}",
);
}
#[test]
fn idle_churn_min_valid_durations_pass_validation() {
let cfg = WorkloadConfig {
num_workers: 1,
work_type: WorkType::IdleChurn {
burst_duration: Duration::from_nanos(1),
sleep_duration: Duration::from_nanos(1),
precise_timing: false,
},
..Default::default()
};
let mut h = WorkloadHandle::spawn(&cfg)
.expect("IdleChurn with 1ns durations must pass spawn-side validation");
h.start();
let _reports = h.stop_and_collect();
}
#[test]
fn idle_churn_precise_timing_iterates() {
let cfg = WorkloadConfig {
num_workers: 1,
work_type: WorkType::IdleChurn {
burst_duration: Duration::from_millis(1),
sleep_duration: Duration::from_millis(5),
precise_timing: true,
},
..Default::default()
};
let mut h = WorkloadHandle::spawn(&cfg).expect("IdleChurn precise_timing=true must spawn");
h.start();
std::thread::sleep(Duration::from_millis(100));
let reports = h.stop_and_collect();
assert_eq!(reports.len(), 1);
assert!(
reports[0].iterations > 0,
"IdleChurn precise_timing=true worker must iterate: {:?}",
reports[0],
);
}