use std::time::Duration;
use aok::{OK, Void};
use cpu_load::CpuLoad;
use log::info;
#[static_init::constructor(0)]
extern "C" fn _log_init() {
log_init::init();
}
#[compio::test]
async fn test_iterator() -> Void {
let cpu_monitor = CpuLoad::init(Duration::from_millis(100));
compio::time::sleep(Duration::from_millis(1000)).await;
let core_count = cpu_monitor.len();
info!("检测到 {} 个 CPU 核心", core_count);
let loads: Vec<u8> = cpu_monitor.into_iter().collect();
assert_eq!(loads.len(), core_count, "迭代器应返回与核心数量相同的元素");
for (i, load) in cpu_monitor.into_iter().enumerate() {
info!("核心 {} 负载: {}%", i, load);
assert!(load <= 100, "负载值应在 0-100 范围内");
assert!(i < core_count, "索引应在有效范围内");
}
let iter = cpu_monitor.into_iter();
let (lower, upper) = iter.size_hint();
assert_eq!(lower, core_count, "大小提示下限应等于核心数量");
assert_eq!(upper, Some(core_count), "大小提示上限应等于核心数量");
assert_eq!(iter.len(), core_count, "迭代器长度应等于核心数量");
let avg_load = cpu_monitor.into_iter().map(|x| x as u16).sum::<u16>() as f32 / core_count as f32;
info!("平均负载: {:.2}%", avg_load);
assert!(
(0.0..=100.0).contains(&avg_load),
"平均负载应在 0-100 范围内"
);
let high_load_cores: Vec<usize> = cpu_monitor
.into_iter()
.enumerate()
.filter(|(_, load)| *load > 50)
.map(|(i, _)| i)
.collect();
if !high_load_cores.is_empty() {
info!("高负载核心 (>50%): {:?}", high_load_cores);
}
if let Some(max_load) = cpu_monitor.into_iter().max() {
info!("最高负载: {}%", max_load);
assert!(max_load <= 100, "最大负载应在 0-100 范围内");
}
if let Some(min_load) = cpu_monitor.into_iter().min() {
info!("最低负载: {}%", min_load);
assert!(min_load <= 100, "最小负载应在 0-100 范围内");
}
info!("迭代器测试完成");
let loads_vec: Vec<u8> = cpu_monitor.into_iter().collect();
let loads_array = loads_vec.clone().into_iter().collect::<Vec<u8>>();
info!("收集到的负载数组: {:?}", &loads_array);
info!("实际收集的负载向量: {:?}", loads_vec);
OK
}