use crate::agent_result::AgentStatus;
use crate::stage::Stage;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Action {
Advance,
AutoResume,
GateInfra,
GateReview,
}
pub fn decide_action(_stage: Stage, outcome: AgentStatus) -> Action {
match outcome {
AgentStatus::Success => Action::Advance,
AgentStatus::RateLimited => Action::AutoResume,
AgentStatus::ResourceKilled => Action::GateInfra,
AgentStatus::AgentUnavailable => Action::GateInfra,
AgentStatus::Failed => Action::GateReview,
AgentStatus::Unknown => Action::GateReview,
AgentStatus::IdleTimeout => Action::GateReview,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn success_advances() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::Success),
Action::Advance
);
}
#[test]
fn rate_limited_auto_resumes() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::RateLimited),
Action::AutoResume
);
}
#[test]
fn resource_killed_gates_infra() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::ResourceKilled),
Action::GateInfra
);
}
#[test]
fn agent_unavailable_gates_infra() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::AgentUnavailable),
Action::GateInfra
);
}
#[test]
fn failed_gates_review() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::Failed),
Action::GateReview
);
}
#[test]
fn unknown_gates_review_never_advances() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::Unknown),
Action::GateReview
);
}
#[test]
fn idle_timeout_gates_review() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::IdleTimeout),
Action::GateReview
);
}
fn every_stage() -> Vec<Stage> {
let mut stages = vec![Stage::Define];
while let Some(next) = stages.last().and_then(|s| s.next()) {
stages.push(next);
}
stages
}
#[test]
fn idle_timeout_is_never_auto_resumed() {
let stages = every_stage();
assert_eq!(stages.len(), 5, "stage chain changed; review this test");
for stage in stages {
let action = decide_action(stage, AgentStatus::IdleTimeout);
assert_ne!(
action,
Action::AutoResume,
"IdleTimeout must never auto-resume at {stage:?}"
);
assert_ne!(
action,
Action::Advance,
"IdleTimeout must never advance at {stage:?}"
);
}
}
#[test]
fn the_never_auto_resume_loop_can_actually_fail() {
for stage in every_stage() {
assert_eq!(
decide_action(stage, AgentStatus::RateLimited),
Action::AutoResume,
"negative control: RateLimited must auto-resume at {stage:?}"
);
}
}
}