use std::process::Command;
const SENTINEL: &str = "918273";
fn settings_output(args: &[&str]) -> String {
let out = Command::new(env!("CARGO_BIN_EXE_tak"))
.arg("settings")
.args(args)
.env_remove("TAK_ENV_DENY")
.env_remove("TAK_ENV_ALLOW")
.env_remove("TAK_GATE_PCT")
.env_remove("TAK_CREDIT")
.current_dir(std::env::temp_dir())
.output()
.expect("failed to run tak settings");
assert!(
out.status.success(),
"tak settings failed: {}",
String::from_utf8_lossy(&out.stderr)
);
String::from_utf8_lossy(&out.stdout).into_owned()
}
#[test]
fn every_declared_cli_flag_reaches_the_resolver() {
let baseline = settings_output(&[]);
for setting in tak_cli::settings::SETTINGS {
for flag in setting.cli_flags {
if setting.type_ == "bool" {
let output = settings_output(&[flag]);
assert_ne!(
output, baseline,
"`{}` declares {flag} but passing it changed nothing",
setting.name
);
continue;
}
let output = settings_output(&[flag, SENTINEL]);
assert!(
output.contains(SENTINEL),
"`{}` declares {flag} but passing it changed nothing.\n{output}",
setting.name
);
}
}
}
#[test]
fn every_setting_appears_in_the_listing() {
let output = settings_output(&[]);
for setting in tak_cli::settings::SETTINGS {
assert!(
output.contains(setting.name),
"`{}` is missing from `tak settings`.\n{output}",
setting.name
);
}
assert!(
!output.contains("no accessor"),
"a setting fell through to the no-accessor branch.\n{output}"
);
}
fn dir_with_config(tag: &str, contents: &str) -> std::path::PathBuf {
let dir = std::env::temp_dir().join(format!("tak-cfg-{tag}-{}", std::process::id()));
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("tak.toml"), contents).unwrap();
dir
}
fn run_in(dir: &std::path::Path, args: &[&str]) -> std::process::Output {
Command::new(env!("CARGO_BIN_EXE_tak"))
.args(args)
.current_dir(dir)
.output()
.expect("failed to run tak")
}
#[cfg(unix)]
#[test]
fn an_invalid_benchmark_does_not_block_an_ad_hoc_run() {
let dir = dir_with_config("badbench", "[bench.broken]\ncmd = []\n");
let out = run_in(
&dir,
&[
"run",
"--no-counters",
"--runs",
"1",
"--warmup",
"0",
"--",
"/bin/echo",
"hi",
],
);
std::fs::remove_dir_all(&dir).ok();
assert!(
out.status.success(),
"an unrelated broken benchmark blocked an explicit run: {}",
String::from_utf8_lossy(&out.stderr)
);
}
#[test]
fn an_invalid_benchmark_does_not_block_the_listing() {
let dir = dir_with_config("badbench2", "[bench.broken]\ncmd = []\n");
let out = run_in(&dir, &["settings"]);
std::fs::remove_dir_all(&dir).ok();
assert!(
out.status.success(),
"a broken benchmark blocked `tak settings`: {}",
String::from_utf8_lossy(&out.stderr)
);
}
#[test]
fn a_broken_config_does_not_block_commands_that_ignore_it() {
let dir = dir_with_config("syntax", "this is not toml at all\n");
let out = run_in(&dir, &["history"]);
std::fs::remove_dir_all(&dir).ok();
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains("tak.toml"),
"a command that ignores tak.toml complained about it: {stderr}"
);
}
#[test]
fn a_malformed_config_is_an_error_not_a_default() {
let dir = std::env::temp_dir().join(format!("tak-bad-config-{}", std::process::id()));
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("tak.toml"), "[env]\ndeny = \"not a list\"\n").unwrap();
let out = Command::new(env!("CARGO_BIN_EXE_tak"))
.arg("settings")
.current_dir(&dir)
.output()
.expect("failed to run tak settings");
std::fs::remove_dir_all(&dir).ok();
assert!(
!out.status.success(),
"a broken tak.toml should not succeed"
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("tak.toml"),
"the error should name the file: {stderr}"
);
}