use ahrightos_process::{ProcessControlBlock, ProcessId, ProcessState, RoundRobinScheduler};
#[test]
fn scheduler_contract_supports_parent_child_wait_flow() {
let parent = ProcessId::from_usize(1);
let mut scheduler = RoundRobinScheduler::new(1);
let mut child = ProcessControlBlock::new(ProcessId::from_usize(2), "child", Some(parent));
child.context_mut().set_sepc(0x1000);
scheduler.add_process(Box::new(child)).unwrap();
scheduler
.add_process(Box::new(ProcessControlBlock::new(
ProcessId::from_usize(3),
"idle",
None,
)))
.unwrap();
let running = scheduler.schedule().expect("child scheduled");
assert_eq!(running.state(), ProcessState::Running);
running.set_exit_code(42);
scheduler.schedule();
assert_eq!(
scheduler.find_zombie_child(parent),
Some((ProcessId::from_usize(2), 42))
);
}
#[test]
fn scheduler_normalizes_zero_time_slice_and_reaps_many_children() {
let parent = ProcessId::from_usize(10);
let mut scheduler = RoundRobinScheduler::new(0);
for pid in 11..19 {
scheduler
.add_process(Box::new(ProcessControlBlock::new(
ProcessId::from_usize(pid),
"child",
Some(parent),
)))
.unwrap();
}
for expected_pid in 11usize..19 {
let running = scheduler.schedule().expect("child scheduled");
assert_eq!(running.state(), ProcessState::Running);
running.set_exit_code(expected_pid as i32);
}
scheduler.schedule();
for expected_pid in 11usize..19 {
let pid = ProcessId::from_usize(expected_pid);
assert_eq!(
scheduler.find_zombie_child(parent),
Some((pid, expected_pid as i32))
);
assert!(scheduler.remove_zombie(pid));
}
assert!(!scheduler.has_living_children(parent));
}