use microsandbox::{Sandbox, sandbox::SandboxBuilder};
use test_utils::msb_test;
const IMAGE: &str = "mirror.gcr.io/library/alpine";
async fn cleanup(name: &str) {
if let Ok(h) = Sandbox::get(name).await {
let _ = h.kill().await;
let _ = h.remove().await;
}
}
async fn assert_shell_ok(sandbox: &Sandbox, command: &str, expected: &str) {
let output = sandbox.shell(command).await.expect("shell command");
let stdout = output.stdout().unwrap_or_default();
let stderr = output.stderr().unwrap_or_default();
assert!(
output.status().success,
"shell `{command}` failed: stdout=`{stdout}` stderr=`{stderr}`"
);
assert_eq!(stdout.trim(), expected);
}
fn spec_json(name: &str) -> String {
format!(
r#"{{
"name": "{name}",
"image": {{ "oci": {{ "reference": "{IMAGE}" }} }},
"resources": {{ "vcpus": 1, "memory_mib": 256 }},
"runtime": {{ "hostname": "spec-host" }},
"env": [{{ "key": "FROM_SPEC", "value": "applied" }}]
}}"#
)
}
#[msb_test]
async fn from_spec_json_boots_and_applies_spec_fields() {
let name = "from-spec-json-fields";
cleanup(name).await;
let sandbox = SandboxBuilder::from_spec_json(&spec_json(name))
.expect("from_spec_json")
.replace()
.create()
.await
.expect("create from spec");
assert_shell_ok(&sandbox, r#"printf %s "$FROM_SPEC""#, "applied").await;
assert_shell_ok(&sandbox, "hostname", "spec-host").await;
let _ = sandbox.stop().await;
cleanup(name).await;
}
#[msb_test]
async fn from_spec_json_options_override_spec() {
let name = "from-spec-json-override";
cleanup(name).await;
let sandbox = SandboxBuilder::from_spec_json(&spec_json(name))
.expect("from_spec_json")
.hostname("override-host")
.replace()
.create()
.await
.expect("create from spec with override");
assert_shell_ok(&sandbox, "hostname", "override-host").await;
assert_shell_ok(&sandbox, r#"printf %s "$FROM_SPEC""#, "applied").await;
let _ = sandbox.stop().await;
cleanup(name).await;
}