core/src/agent/control/execution_tests.rs
60 lines
use crate::agent::AgentControl;use codex_protocol::error::CodexErr;use codex_protocol::protocol::MultiAgentVersion;use codex_protocol::protocol::SessionSource;use codex_protocol::protocol::SubAgentSource;use pretty_assertions::assert_eq;fn control_with_limit(max_threads: usize) -> AgentControl { let control = AgentControl::default(); control.agent_execution_limiter.initialize(max_threads); control}#[test]fn execution_guards_count_active_v2_subagent_turns() { let control = control_with_limit(/*max_threads*/ 1); // Child role configs cannot replace the root-derived session limit. control .agent_execution_limiter .initialize(/*max_threads*/ 2); let source = SessionSource::SubAgent(SubAgentSource::Other("worker".to_string())); control .ensure_execution_capacity(MultiAgentVersion::V2, &source) .expect("first active turn should fit"); let first = control .execution_guard(MultiAgentVersion::V2, &source) .expect("v2 subagent execution should be counted"); let Err(err) = control.ensure_execution_capacity(MultiAgentVersion::V2, &source) else { panic!("second active turn should exceed the derived non-root cap"); }; let CodexErr::AgentLimitReached { max_threads } = err else { panic!("expected AgentLimitReached"); }; assert_eq!(max_threads, 1); drop(first); control .ensure_execution_capacity(MultiAgentVersion::V2, &source) .expect("capacity should be released when the running task drops");}#[test]fn execution_guards_ignore_root_and_v1_turns() { let control = control_with_limit(/*max_threads*/ 0); assert!( control .execution_guard(MultiAgentVersion::V2, &SessionSource::Cli) .is_none() ); assert!( control .execution_guard( MultiAgentVersion::V1, &SessionSource::SubAgent(SubAgentSource::Other("worker".to_string())), ) .is_none() );}