use nix_user_chroot::mkdtemp;
use std::env;
use std::fs;
use std::path::Path;
use std::process::Command;
const TARGET: &str = env!("TARGET");
fn busybox_in_tmp() -> String {
let src = env::var("NIX_USER_CHROOT_TEST_BUSYBOX")
.expect("NIX_USER_CHROOT_TEST_BUSYBOX must point to a static busybox binary");
let dir = mkdtemp::mkdtemp("/tmp/nix-user-chroot-test.XXXXXX").unwrap();
let dst = dir.join("busybox");
fs::copy(&src, &dst)
.unwrap_or_else(|e| panic!("failed to copy {} -> {}: {}", src, dst.display(), e));
dst.to_str().unwrap().to_string()
}
#[test]
fn run_chroot_smoke() {
let nixdir = mkdtemp::mkdtemp("/tmp/nix.XXXXXX").unwrap();
let busybox = busybox_in_tmp();
let out = Command::new("cargo")
.args([
"run",
"--target",
TARGET,
nixdir.to_str().unwrap(),
&busybox,
"sh",
"-c",
&format!(
"test -x {bb} && test -d /nix && test -z \"$({bb} ls -A /nix)\" && echo ok",
bb = busybox
),
])
.output()
.expect("failed to spawn cargo run");
fs::remove_dir_all(&nixdir).unwrap();
assert!(
out.status.success(),
"stdout: {}\nstderr: {}",
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr)
);
assert_eq!(String::from_utf8_lossy(&out.stdout).trim(), "ok");
}
#[test]
fn run_nix_install() {
if Path::new("/etc/NIXOS").exists() {
eprintln!("skipping run_nix_install on NixOS (installer needs FHS userland)");
return;
}
let nixdir = mkdtemp::mkdtemp("/tmp/nix.XXXXXX").unwrap();
let result = Command::new("cargo")
.args([
"run",
"--target",
TARGET,
nixdir.to_str().unwrap(),
"bash",
"-c",
"curl https://nixos.org/nix/install | bash",
])
.status();
fs::remove_dir_all(nixdir).unwrap();
assert!(result.unwrap().success());
}