Files
codex/codex-rs/windows-sandbox-rs/tests/support/src/lib.rs
T
jgershen-oai 9212b3eca8 Serialize tests that share Windows sandbox accounts (#49389)
## Why

Elevated sandbox tests share machine-local Windows accounts. Concurrent setup can rotate account passwords between another test's setup and logon.

## What changed

- Add a shared file-lock guard for elevated sandbox tests in `codex-core`, `codex-exec-server`, and `codex-windows-sandbox`, held through sandbox commands and cleanup.
- Queue these tests in a single-threaded Nextest group before their timeouts start, while retaining the file lock to coordinate other test processes.
- Limit account locking to tests that use elevated accounts and remove the sandbox crate's blanket Bazel `exclusive-if-local` tag.

GitOrigin-RevId: 26d4606cb1fdcac65926d29835bed4eac04c19c0
2026-09-29 22:50:07 +00:00

50 lines
1.8 KiB
Rust

//! Coordinates tests that share the runner's Windows sandbox accounts across processes.
#![cfg(windows)]
use std::fs::File;
use std::fs::OpenOptions;
use std::io;
/// Serializes tests that provision or use the runner's shared Windows sandbox accounts.
/// Hold this from before setup until all sandbox commands and cleanup have finished.
#[must_use = "the account lock is released when the guard is dropped"]
pub struct WindowsSandboxAccountTestGuard {
_file: File,
}
impl WindowsSandboxAccountTestGuard {
/// Acquires the same file lock across all test processes run by this Windows user.
pub fn acquire() -> io::Result<Self> {
let directory = dirs::data_local_dir().ok_or_else(|| {
io::Error::new(
io::ErrorKind::NotFound,
"Windows local application data directory is unavailable",
)
})?;
// Bazel uses per-test temporary directories, so the lock lives in the runner user's
// Windows known folder instead. It is separate from the production setup lock.
let path = directory.join("codex-windows-sandbox-integration-test.lock");
// Leave the file in place: deleting it would let processes lock different files at this path.
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.truncate(false)
.open(path)
.map_err(|error| {
io::Error::new(
error.kind(),
format!("open Windows sandbox test lock: {error}"),
)
})?;
file.lock().map_err(|error| {
io::Error::new(
error.kind(),
format!("lock Windows sandbox test accounts: {error}"),
)
})?;
Ok(Self { _file: file })
}
}