Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 39 additions & 28 deletions codex-rs/core/tests/suite/request_permissions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ use serde_json::Value;
use serde_json::json;
use std::fs;
use std::path::Path;
use test_case::test_case;

fn absolute_path(path: &Path) -> AbsolutePathBuf {
AbsolutePathBuf::try_from(path).expect("absolute path")
Expand Down Expand Up @@ -164,23 +165,6 @@ fn exec_command_event_with_missing_additional_permissions(
Ok(ev_function_call(call_id, "exec_command", &args_str))
}

fn shell_event_with_raw_request_permissions(
call_id: &str,
command: &str,
workdir: Option<&str>,
additional_permissions: Value,
) -> Result<Value> {
let args = json!({
"command": command,
"workdir": workdir,
"timeout_ms": 1_000_u64,
"sandbox_permissions": SandboxPermissions::WithAdditionalPermissions,
"additional_permissions": additional_permissions,
});
let args_str = serde_json::to_string(&args)?;
Ok(ev_function_call(call_id, "shell_command", &args_str))
}

async fn submit_turn(
test: &TestCodex,
prompt: &str,
Expand Down Expand Up @@ -507,8 +491,18 @@ async fn request_permissions_tool_is_auto_denied_when_granular_request_permissio
Ok(())
}

#[derive(Clone, Copy, Debug)]
enum AdditionalPermissionsCommandTool {
ShellCommand,
ExecCommand,
}

#[test_case(AdditionalPermissionsCommandTool::ShellCommand ; "shell_command")]
#[test_case(AdditionalPermissionsCommandTool::ExecCommand ; "exec_command")]
#[tokio::test(flavor = "current_thread")]
async fn relative_additional_permissions_resolve_against_tool_workdir() -> Result<()> {
async fn relative_additional_permissions_resolve_against_tool_workdir(
command_tool: AdditionalPermissionsCommandTool,
) -> Result<()> {
skip_if_no_network!(Ok(()));
skip_if_sandbox!(Ok(()));

Expand Down Expand Up @@ -542,23 +536,40 @@ async fn relative_additional_permissions_resolve_against_tool_workdir() -> Resul

let call_id = "request_permissions_relative_workdir";
let command = "touch relative-write.txt";
let workdir = "nested";
let additional_permissions = json!({
"file_system": {
"write": ["."],
},
});
let expected_permissions = PermissionProfile {
file_system: Some(FileSystemPermissions::from_read_write_roots(
/*read*/ None,
Some(vec![absolute_path(&nested_dir_canonical)]),
)),
..Default::default()
};
let event = shell_event_with_raw_request_permissions(
call_id,
command,
Some("nested"),
json!({
"file_system": {
"write": ["."],
},
}),
)?;
let (tool_name, arguments) = match command_tool {
AdditionalPermissionsCommandTool::ShellCommand => (
"shell_command",
json!({
"command": command,
"workdir": workdir,
"sandbox_permissions": SandboxPermissions::WithAdditionalPermissions,
"additional_permissions": additional_permissions,
}),
),
AdditionalPermissionsCommandTool::ExecCommand => (
"exec_command",
json!({
"cmd": command,
"workdir": workdir,
"sandbox_permissions": SandboxPermissions::WithAdditionalPermissions,
"additional_permissions": additional_permissions,
}),
),
};
let event = ev_function_call(call_id, tool_name, &serde_json::to_string(&arguments)?);

let _ = mount_sse_once(
&server,
Expand Down
Loading