use microsandbox::Sandbox;
use test_utils::msb_test;
const IMAGE: &str = "mirror.gcr.io/library/alpine";
const MARKER_PATH: &str = "/root/test-marker";
const MARKER_VALUE: &str = "hello-705";
async fn cleanup(name: &str) {
if let Ok(mut h) = Sandbox::get(name).await {
let _ = h.kill().await;
let _ = h.remove().await;
}
}
#[msb_test]
async fn graceful_stop_flushes_writes_to_rootfs() {
let name = "stop-flush-705";
cleanup(name).await;
let sb = Sandbox::builder(name)
.image(IMAGE)
.cpus(1)
.memory(256)
.replace()
.create()
.await
.expect("first create");
let write = sb
.exec(
"sh",
["-c", &format!("printf '{MARKER_VALUE}' > {MARKER_PATH}")],
)
.await
.expect("exec: write marker");
assert!(
write.status().success,
"marker write failed: stdout=`{}` stderr=`{}`",
write.stdout().unwrap_or_default(),
write.stderr().unwrap_or_default()
);
sb.detach().await;
let handle = Sandbox::get(name).await.expect("get handle");
handle.stop().await.expect("graceful stop");
let restarted = Sandbox::get(name)
.await
.expect("get for restart")
.start()
.await
.expect("start after stop");
let read = restarted
.exec("cat", [MARKER_PATH])
.await
.expect("exec: read marker");
let stdout = read.stdout().unwrap_or_default();
let _ = restarted.stop_and_wait().await;
cleanup(name).await;
assert!(
read.status().success,
"cat exited non-zero — marker file likely missing: stdout=`{stdout}` stderr=`{}`",
read.stderr().unwrap_or_default()
);
assert_eq!(
stdout.trim(),
MARKER_VALUE,
"marker content did not survive graceful stop"
);
}