#![allow(dead_code, reason = "shared harness included by multiple test crates")]
use std::path::{Path, PathBuf};
use std::process::Command;
pub struct CommandOutput {
pub stdout: String,
pub stderr: String,
pub code: i32,
}
pub fn fallow_bin() -> PathBuf {
std::env::var_os("CARGO_BIN_EXE_fallow").map_or_else(
|| {
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
path.pop(); path.pop(); path.push("target/debug/fallow");
if cfg!(windows) {
path.set_extension("exe");
}
path
},
PathBuf::from,
)
}
pub fn fixture_path(name: &str) -> PathBuf {
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
path.pop(); path.pop(); path.push("tests/fixtures");
path.push(name);
path
}
pub fn run_fallow(subcommand: &str, fixture: &str, args: &[&str]) -> CommandOutput {
let root = fixture_path(fixture);
run_fallow_in_root(subcommand, &root, args)
}
pub fn run_fallow_in_root(subcommand: &str, root: &Path, args: &[&str]) -> CommandOutput {
let bin = fallow_bin();
let mut cmd = Command::new(&bin);
cmd.arg(subcommand)
.arg("--root")
.arg(root)
.env("RUST_LOG", "")
.env("NO_COLOR", "1");
for arg in args {
cmd.arg(arg);
}
let output = cmd.output().expect("failed to run fallow binary");
CommandOutput {
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
stderr: String::from_utf8_lossy(&output.stderr).to_string(),
code: output.status.code().unwrap_or(-1),
}
}
pub fn run_fallow_combined(fixture: &str, args: &[&str]) -> CommandOutput {
let bin = fallow_bin();
let root = fixture_path(fixture);
let mut cmd = Command::new(&bin);
cmd.arg("--root")
.arg(&root)
.env("RUST_LOG", "")
.env("NO_COLOR", "1");
for arg in args {
cmd.arg(arg);
}
let output = cmd.output().expect("failed to run fallow binary");
CommandOutput {
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
stderr: String::from_utf8_lossy(&output.stderr).to_string(),
code: output.status.code().unwrap_or(-1),
}
}
pub fn run_fallow_raw(args: &[&str]) -> CommandOutput {
let bin = fallow_bin();
let mut cmd = Command::new(&bin);
cmd.env("RUST_LOG", "").env("NO_COLOR", "1");
for arg in args {
cmd.arg(arg);
}
let output = cmd.output().expect("failed to run fallow binary");
CommandOutput {
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
stderr: String::from_utf8_lossy(&output.stderr).to_string(),
code: output.status.code().unwrap_or(-1),
}
}
pub fn parse_json(output: &CommandOutput) -> serde_json::Value {
serde_json::from_str(&output.stdout).unwrap_or_else(|e| {
panic!(
"failed to parse JSON: {e}\nstdout was:\n{}\nstderr was:\n{}",
output.stdout, output.stderr
)
})
}
pub fn redact_paths(s: &str, root: &Path) -> String {
let root_str = root.to_string_lossy();
s.replace(root_str.as_ref(), "[ROOT]").replace('\\', "/")
}
pub fn redact_version(s: &str) -> String {
s.replace(env!("CARGO_PKG_VERSION"), "[VERSION]")
}
pub fn redact_all(s: &str, root: &Path) -> String {
let s = redact_paths(s, root);
redact_version(&s)
}