vmexec 0.7.1

Run a single command in a speedy virtual machine with zero-setup
Documentation
use assert_cmd::cargo::cargo_bin_cmd;
use color_eyre::Result;
use predicates::{prelude::PredicateBooleanExt, str::contains};

/// Run ps and exit
#[test]
fn ps_command() -> Result<()> {
    cargo_bin_cmd!()
        .arg("ps")
        .assert()
        .success()
        .stdout(contains("VM ID"));

    Ok(())
}

/// Run a detached VM and run a command in it
#[test]
fn exec_command_and_stop() -> Result<()> {
    let detached_run_output = cargo_bin_cmd!()
        .arg("run")
        .arg("archlinux")
        .arg("--detach")
        .arg("--rm")
        .arg("--disable-kvm")
        .args(["--ssh-timeout", "180"])
        .args(["sleep", "180"])
        .assert()
        .success()
        .get_output()
        .stdout
        .clone();
    let detached_run_output_str = String::from_utf8(detached_run_output)?;
    let detached_vm_id = detached_run_output_str.lines().last().unwrap();

    cargo_bin_cmd!()
        .arg("ready")
        .arg("--wait")
        .args(["--timeout", "180"])
        .arg(detached_vm_id)
        .assert()
        .success();

    // The VM should now exist.
    cargo_bin_cmd!()
        .arg("ps")
        .assert()
        .success()
        .stdout(predicates::str::contains(detached_vm_id));

    cargo_bin_cmd!()
        .arg("exec")
        .arg(detached_vm_id)
        .args(["echo", "test in running vm"])
        .assert()
        .success()
        .stdout(contains("test in running vm"));

    cargo_bin_cmd!()
        .arg("stop")
        .arg(detached_vm_id)
        .assert()
        .success();

    // The VM should now be gone.
    cargo_bin_cmd!()
        .arg("ps")
        .arg("-a")
        .assert()
        .success()
        .stdout(predicates::str::contains(detached_vm_id).not());

    Ok(())
}

/// Run a basic command and exit
#[test]
fn run_command() -> Result<()> {
    let vmid = "testcmd";
    cargo_bin_cmd!()
        .arg("run")
        .arg("archlinux")
        .args(["--vmid", vmid])
        .arg("--disable-kvm")
        .arg("--rm")
        .args(["--ssh-timeout", "180"])
        .args(["echo", "hello yes"])
        .assert()
        .success()
        .stdout(contains("hello yes"));

    // The VM should now be gone since it was launched with --rm.
    cargo_bin_cmd!()
        .arg("ps")
        .arg("-a")
        .assert()
        .success()
        .stdout(predicates::str::contains(vmid).not());

    Ok(())
}

/// Run a basic detached command
#[test]
fn run_command_detached() -> Result<()> {
    let vmid = cargo_bin_cmd!()
        .arg("run")
        .arg("archlinux")
        .arg("--detach")
        .arg("--disable-kvm")
        .arg("--rm")
        .args(["--ssh-timeout", "180"])
        .args(["echo", "hello yes"])
        .assert()
        .success()
        .get_output()
        .stdout
        .clone();
    let vmid = String::from_utf8(vmid)?;

    // The VM should now be gone.
    cargo_bin_cmd!()
        .arg("ps")
        .arg("-a")
        .assert()
        .success()
        .stdout(predicates::str::contains(vmid).not());

    Ok(())
}