use std::os::unix::fs::PermissionsExt as _;
use super::super::*;
use tempfile::tempdir;
#[test]
fn ensure_tools_converges_every_roster_shim() {
let dir = tempdir().unwrap();
let tools = dir.path().join("world").join("tools");
ensure_tools(&tools).unwrap();
for (namespace, binary) in ROSTER {
let path = tools.join(namespace);
assert_eq!(
fs::read_to_string(&path).unwrap(),
shim_script(namespace, &Cli::resolve(binary).exec_words()),
"{namespace}"
);
let mode = fs::metadata(&path).unwrap().permissions().mode();
assert_eq!(mode & 0o777, 0o755, "{namespace}");
}
let yog_shim = fs::read_to_string(tools.join(YOG)).unwrap();
assert!(
!yog_shim.contains("' yog \"$@\""),
"no verb word in yog's own shim: {yog_shim}"
);
assert!(
yog_shim.contains("\"$@\""),
"argv passes through: {yog_shim}"
);
let stamp = fs::metadata(tools.join(BL)).unwrap().modified().unwrap();
ensure_tools(&tools).unwrap();
assert_eq!(
fs::metadata(tools.join(BL)).unwrap().modified().unwrap(),
stamp
);
}
#[test]
fn prepend_path_puts_the_tools_dir_first_and_is_idempotent() {
let tools = Path::new("/d/yog/world/tools");
assert_eq!(
prepend_path(tools, Some("/usr/bin:/bin".to_owned())),
"/d/yog/world/tools:/usr/bin:/bin"
);
let once = prepend_path(tools, Some("/usr/bin".to_owned()));
assert_eq!(prepend_path(tools, Some(once.clone())), once);
assert_eq!(prepend_path(tools, None), "/d/yog/world/tools");
assert_eq!(
prepend_path(tools, Some(String::new())),
"/d/yog/world/tools"
);
assert_eq!(
prepend_path(tools, Some("/d/yog/world/tools-old:/bin".to_owned())),
"/d/yog/world/tools:/d/yog/world/tools-old:/bin"
);
}
#[test]
fn the_capability_control_shim_is_seeded_where_the_authored_block_names_it() {
let dir = tempdir().unwrap();
let tools = dir.path().join("tools");
let seeded = ensure_control(&tools).unwrap();
assert_eq!(seeded, control_path(&tools));
assert!(seeded.is_absolute(), "the block must not be PATH-resolved");
assert_eq!(
fs::read_to_string(&seeded).unwrap(),
shim_script(
TOOL_CONTROL,
&Cli::resolve(crate::cli_outbound::Binary::ToolControl).exec_words()
)
);
}
#[test]
fn seed_converges_the_world_tools_dir_and_warns_when_it_cannot() {
let root = tempfile::tempdir().unwrap();
let world_root = root.path().join("ok");
let ambient = crate::test_support::world_under(&world_root);
seed(&ambient);
assert!(
crate::world::layout(&ambient).tools.join("bl").exists(),
"the world's `PATH` names this dir unconditionally, so seeding it is the world's own act"
);
let blocked_root = root.path().join("blocked");
let blocked = crate::test_support::world_under(&blocked_root);
let tools = crate::world::layout(&blocked).tools;
std::fs::create_dir_all(tools.parent().unwrap()).unwrap();
std::fs::write(&tools, b"not a directory").unwrap();
seed(&blocked);
assert!(tools.is_file(), "it said so and left the world alone");
}