Previous to this PR, `codex-rs/core/tests/sandbox.rs` contained integration tests that were specific to Seatbelt. This PR moves those tests to `codex-rs/core/src/seatbelt.rs` and designates `codex-rs/core/tests/sandbox.rs` to be used as the home for cross-platform (well, Mac and Linux...) sandbox tests. To start, this migrates `python_multiprocessing_lock_works_under_seatbelt()` from #1823 to the new `sandbox.rs` because this is the type of thing that should work on both Mac _and_ Linux, though I still need to do some work to clean up the test so it works on both platforms.
50 lines
1.4 KiB
Rust
50 lines
1.4 KiB
Rust
// TODO(mbolin): Update this test to run on Linux, as well.
|
|
// (Should rename the test as part of that work.)
|
|
#[cfg(target_os = "macos")]
|
|
#[tokio::test]
|
|
async fn python_multiprocessing_lock_works_under_seatbelt() {
|
|
#![expect(clippy::expect_used)]
|
|
use codex_core::protocol::SandboxPolicy;
|
|
use codex_core::seatbelt::spawn_command_under_seatbelt;
|
|
use codex_core::spawn::StdioPolicy;
|
|
use std::collections::HashMap;
|
|
|
|
let policy = SandboxPolicy::WorkspaceWrite {
|
|
writable_roots: vec![],
|
|
network_access: false,
|
|
exclude_tmpdir_env_var: false,
|
|
exclude_slash_tmp: false,
|
|
};
|
|
|
|
let python_code = r#"import multiprocessing
|
|
from multiprocessing import Lock, Process
|
|
|
|
def f(lock):
|
|
with lock:
|
|
print("Lock acquired in child process")
|
|
|
|
if __name__ == '__main__':
|
|
lock = Lock()
|
|
p = Process(target=f, args=(lock,))
|
|
p.start()
|
|
p.join()
|
|
"#;
|
|
|
|
let mut child = spawn_command_under_seatbelt(
|
|
vec![
|
|
"python3".to_string(),
|
|
"-c".to_string(),
|
|
python_code.to_string(),
|
|
],
|
|
&policy,
|
|
std::env::current_dir().expect("should be able to get current dir"),
|
|
StdioPolicy::RedirectForShellTool,
|
|
HashMap::new(),
|
|
)
|
|
.await
|
|
.expect("should be able to spawn python under seatbelt");
|
|
|
|
let status = child.wait().await.expect("should wait for child process");
|
|
assert!(status.success(), "python exited with {status:?}");
|
|
}
|