use std::path::Path;
use zone::{Adm, Config, CreationOptions, Zlogin};
const PFEXEC: &str = "/usr/bin/pfexec";
#[test]
#[ignore]
fn test_zlogin() {
zfs_zonetest_create();
let _unwind_zonetest_create = Defer::new(|| zfs_zonetest_destroy());
let name = "zexec";
let path = Path::new("/zonetest/zexec");
let mut cfg = Config::create(name, true, CreationOptions::Default);
cfg.get_global()
.set_path(path)
.set_autoboot(true)
.set_brand("sparse");
cfg.run_blocking()
.map_err(|e| format!("{}: try `pkg install brand/sparse`", e))
.unwrap();
let _unwind_config_create = Defer::new(|| {
cfg.delete(true).run_blocking().unwrap();
});
let mut adm = Adm::new(name);
adm.install_blocking(&[]).unwrap();
let _unwind_adm_install = Defer::new(|| {
Adm::new(name).uninstall_blocking(true).unwrap();
});
adm.boot_blocking().unwrap();
let _unwind_adm_boot = Defer::new(|| {
Adm::new(name).halt_blocking().unwrap();
});
let zlogin = Zlogin::new(name);
let out = zlogin.exec_blocking("hostname").unwrap();
let bad_result = zlogin.exec_blocking("/usr/bin/notathing");
assert_eq!(out, "zexec");
match bad_result {
Ok(_) => panic!("expected error for bad command"),
Err(e) => println!("got error: {:?}", e),
}
}
fn zfs_zonetest_create() {
std::process::Command::new(PFEXEC)
.env_clear()
.arg("zfs")
.arg("create")
.arg("-p")
.arg("-o")
.arg("mountpoint=/zonetest")
.arg("rpool/zonetest")
.output()
.unwrap();
}
fn zfs_zonetest_destroy() {
std::process::Command::new(PFEXEC)
.env_clear()
.arg("zfs")
.arg("destroy")
.arg("-rf")
.arg("rpool/zonetest")
.output()
.unwrap();
}
struct Defer<F: FnOnce() -> ()> {
func: Option<F>,
}
impl<F: FnOnce() -> ()> Drop for Defer<F> {
fn drop(&mut self) {
(self.func.take().unwrap())()
}
}
impl<F: FnOnce() -> ()> Defer<F> {
fn new(func: F) -> Self {
Defer { func: Some(func) }
}
}