From 3ef09c71d32733aea3aa5811cb42a4d79cda781f Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Tue, 28 Apr 2026 17:11:43 -0700 Subject: [PATCH 1/2] core tests: migrate tools tests to permission profiles (#20027) ## Summary This continues the test-side migration away from `SandboxPolicy` by removing the remaining legacy policy setup in `core/tests/suite/tools.rs`. The affected test was already modeling a profile-backed filesystem policy with a deny-read glob, so configuring the test through `Permissions::set_permission_profile()` is a better match for the behavior being exercised. ## Changes - Drops the `SandboxPolicy` import from `core/tests/suite/tools.rs`. - Configures the glob deny-read shell test directly with a `PermissionProfile` instead of creating a legacy read-only policy first. - Submits the test turn with the session permission profile so the deny-read glob remains active for the command under test. ## Verification - `cargo check -p codex-core --tests` --- codex-rs/core/tests/suite/tools.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/codex-rs/core/tests/suite/tools.rs b/codex-rs/core/tests/suite/tools.rs index 46195e4dd0..b856074540 100644 --- a/codex-rs/core/tests/suite/tools.rs +++ b/codex-rs/core/tests/suite/tools.rs @@ -9,7 +9,6 @@ use std::time::Instant; use anyhow::Context; use anyhow::Result; -use codex_config::Constrained; use codex_config::types::McpServerConfig; use codex_config::types::McpServerTransportConfig; use codex_core::sandboxing::SandboxPermissions; @@ -21,7 +20,6 @@ use codex_protocol::permissions::FileSystemSandboxEntry; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::TurnEnvironmentSelection; use core_test_support::assert_regex_match; use core_test_support::responses::ev_assistant_message; @@ -547,14 +545,9 @@ async fn shell_enforces_glob_deny_read_policy() -> Result<()> { skip_if_sandbox!(Ok(())); let server = start_mock_server().await; - let read_only_policy = SandboxPolicy::new_read_only_policy(); - let read_only_policy_for_config = read_only_policy.clone(); let mut builder = test_codex() .with_model("gpt-5.4") .with_config(move |config| { - config - .set_legacy_sandbox_policy(read_only_policy_for_config) - .expect("set sandbox policy"); let mut file_system_sandbox_policy = FileSystemSandboxPolicy::default(); file_system_sandbox_policy .entries @@ -564,11 +557,13 @@ async fn shell_enforces_glob_deny_read_policy() -> Result<()> { }, access: FileSystemAccessMode::None, }); - config.permissions.permission_profile = - Constrained::allow_any(PermissionProfile::from_runtime_permissions( + config + .permissions + .set_permission_profile(PermissionProfile::from_runtime_permissions( &file_system_sandbox_policy, NetworkSandboxPolicy::Restricted, - )); + )) + .expect("set permission profile"); }); let fixture = builder.build(&server).await?; @@ -608,8 +603,9 @@ async fn shell_enforces_glob_deny_read_policy() -> Result<()> { ]; let mock = mount_sse_sequence(&server, responses).await; + let permission_profile = fixture.session_configured.permission_profile.clone(); fixture - .submit_turn_with_policy("read the fixture files", read_only_policy) + .submit_turn_with_permission_profile("read the fixture files", permission_profile) .await?; let output_text = mock From d5aa14e0cf2c78b0eea116a49bd0944bc93e0d28 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Tue, 28 Apr 2026 17:11:48 -0700 Subject: [PATCH 2/2] core tests: migrate permissions message tests to profiles --- .../core/tests/suite/permissions_messages.rs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/codex-rs/core/tests/suite/permissions_messages.rs b/codex-rs/core/tests/suite/permissions_messages.rs index 1380f6162f..8ec48e4b14 100644 --- a/codex-rs/core/tests/suite/permissions_messages.rs +++ b/codex-rs/core/tests/suite/permissions_messages.rs @@ -5,10 +5,11 @@ use codex_core::config::Constrained; use codex_core::context::ContextualUserFragment; use codex_core::context::PermissionsInstructions; use codex_core::load_exec_policy; +use codex_protocol::models::PermissionProfile; +use codex_protocol::permissions::NetworkSandboxPolicy; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; -use codex_protocol::protocol::SandboxPolicy; use codex_protocol::user_input::UserInput; use codex_utils_absolute_path::AbsolutePathBuf; use core_test_support::responses::ResponsesRequest; @@ -540,20 +541,19 @@ async fn permissions_message_includes_writable_roots() -> Result<()> { .await; let writable = TempDir::new()?; let writable_root = AbsolutePathBuf::try_from(writable.path())?; - let sandbox_policy = SandboxPolicy::WorkspaceWrite { - writable_roots: vec![writable_root], - network_access: false, - exclude_tmpdir_env_var: false, - exclude_slash_tmp: false, - }; - let sandbox_policy_for_config = sandbox_policy.clone(); + let permission_profile = PermissionProfile::workspace_write_with( + &[writable_root], + NetworkSandboxPolicy::Restricted, + /*exclude_tmpdir_env_var*/ false, + /*exclude_slash_tmp*/ false, + ); let mut builder = test_codex().with_config(move |config| { config.permissions.approval_policy = Constrained::allow_any(AskForApproval::OnRequest); config .permissions - .set_legacy_sandbox_policy(sandbox_policy_for_config, config.cwd.as_path()) - .expect("test sandbox policy should be allowed"); + .set_permission_profile(permission_profile) + .expect("test permission profile should be allowed"); config.config_layer_stack = ConfigLayerStack::default(); }); let test = builder.build(&server).await?; @@ -574,6 +574,7 @@ async fn permissions_message_includes_writable_roots() -> Result<()> { let permissions = permissions_texts(&req.single_request()); let normalize_line_endings = |s: &str| s.replace("\r\n", "\n"); let exec_policy = load_exec_policy(&test.config.config_layer_stack).await?; + let sandbox_policy = test.config.legacy_sandbox_policy(); let expected = PermissionsInstructions::from_policy( &sandbox_policy, AskForApproval::OnRequest,