use std::process::{Child, Command};
use std::sync::Once;
use std::thread;
use std::time::Duration;
static INIT: Once = Once::new();
static mut SERVER: Option<Child> = None;
#[ctor::ctor]
pub fn global_setup() {
INIT.call_once(|| {
println!("Starting test server...");
let server_path = format!(
"{}/tests/server/build/test_server",
env!("CARGO_MANIFEST_DIR")
);
let server_config = format!(
"{}/tests/server/config/config.json",
env!("CARGO_MANIFEST_DIR")
);
println!("Server path: {}", server_path);
let server_process = Command::new(server_path)
.arg("-c")
.arg(server_config)
.arg("-s") .spawn()
.expect("Failed to start test server");
unsafe {
SERVER = Some(server_process);
}
thread::sleep(Duration::from_secs(5)); println!("Test server started successfully.");
});
}
#[ctor::dtor]
#[allow(static_mut_refs)]
pub fn global_cleanup() {
unsafe {
if let Some(mut server_process) = SERVER.take() {
println!("Stopping the test server...");
if let Err(e) = server_process.kill() {
println!("Failed to kill the test server: {:?}", e);
} else {
println!("Test server successfully killed.");
}
if let Err(e) = server_process.wait() {
println!("Failed to clean up the test server: {:?}", e);
} else {
println!("Test server exited cleanly.");
}
} else {
println!("No server process is running.");
}
}
}