//! Test support for running the Windows exec-server under Wine. use std::future::Future; use std::path::PathBuf; use anyhow::Context; use anyhow::Result; use tokio::io::AsyncBufReadExt; use tokio::io::BufReader; use wine_test_support::WineTestCommand; /// Runs the Windows exec-server under Wine for the duration of a scoped operation. pub struct WineExecServer; impl WineExecServer { /// Starts the server, passes its WebSocket URL and Wine prefix to `operation`, and tears it /// down afterward. pub async fn scope(self, operation: F) -> Result where F: FnOnce(String, PathBuf) -> Fut, Fut: Future>, { let executable = codex_utils_cargo_bin::cargo_bin("wine-windows-exec-server")?; let mut exec_server = WineTestCommand::new(executable) .env("CODEX_HOME", r"C:\codex-home") .spawn()?; let wine_prefix = exec_server.prefix_path().to_path_buf(); let stdout = exec_server.take_stdout(); exec_server .scope(async move { let mut lines = BufReader::new(stdout).lines(); let exec_server_url = loop { let line = lines .next_line() .await? .context("Wine exec-server exited before reporting its URL")?; if line.starts_with("ws://") { break line; } }; operation(exec_server_url, wine_prefix).await }) .await } }