#[cfg(test)]
mod tests {
use crate::core::codegen;
use crate::core::types::{Resource, ResourceType};
const SUDO_LINE: &str = "sudo bash \"$forjar_sudo_script\"";
const TRAP_LINE: &str = "trap 'rm -f \"$forjar_sudo_script\"' EXIT INT TERM";
fn file_resource(sudo: bool) -> Resource {
Resource {
resource_type: ResourceType::File,
path: Some("/etc/test.conf".to_string()),
content: Some("hello".to_string()),
sudo,
..Default::default()
}
}
fn assert_sudo_form(script: &str) {
assert!(script.contains("if [ \"$(id -u)\" -eq 0 ]"), "{script}");
assert!(script.contains(SUDO_LINE), "{script}");
assert!(script.contains("mktemp"), "{script}");
assert!(script.contains("<<'FORJAR_SUDO'"), "{script}");
assert!(
script.contains(TRAP_LINE),
"the temp file must be removed on EXIT, INT and TERM:\n{script}"
);
assert!(
!script.contains("/dev/fd/"),
"sudo closes every fd >= 3 (closefrom); a /dev/fd transport runs nothing:\n{script}"
);
}
#[test]
fn test_fj1394_sudo_false_no_wrap() {
let r = file_resource(false);
let script = codegen::apply_script(&r).unwrap();
assert!(!script.contains("sudo bash"));
}
#[test]
fn test_fj1394_sudo_true_wraps_script() {
let r = file_resource(true);
let script = codegen::apply_script(&r).unwrap();
assert_sudo_form(&script);
}
#[test]
fn test_pmat159_sudo_transport_is_a_temp_file_not_fd3() {
let r = file_resource(true);
for (name, script) in [
("apply", codegen::apply_script(&r).unwrap()),
("check", codegen::check_script(&r).unwrap()),
("state_query", codegen::state_query_script(&r).unwrap()),
] {
assert!(!script.contains("/dev/fd/"), "{name}:\n{script}");
assert!(script.contains(SUDO_LINE), "{name}:\n{script}");
assert!(
script.contains("cat >\"$forjar_sudo_script\" <<'FORJAR_SUDO'"),
"{name}: the script must be written into the temp file by a quoted heredoc:\n{script}"
);
assert!(script.contains(TRAP_LINE), "{name}:\n{script}");
}
}
#[test]
fn test_pmat159_sudo_temp_file_cleanup_covers_int_and_term() {
let script = codegen::apply_script(&file_resource(true)).unwrap();
assert!(script.contains(TRAP_LINE), "{script}");
assert!(
!script.contains("trap 'rm -f \"$forjar_sudo_script\"' EXIT\n"),
"the bare-EXIT trap leaves the temp file behind on ^C:\n{script}"
);
}
#[test]
fn test_fj1394_sudo_package_resource() {
let r = Resource {
resource_type: ResourceType::Package,
provider: Some("apt".to_string()),
packages: vec!["nginx".to_string()],
sudo: true,
..Default::default()
};
let script = codegen::apply_script(&r).unwrap();
assert_sudo_form(&script);
}
#[test]
fn test_fj1394_sudo_service_resource() {
let r = Resource {
resource_type: ResourceType::Service,
name: Some("nginx".to_string()),
state: Some("running".to_string()),
sudo: true,
..Default::default()
};
let script = codegen::apply_script(&r).unwrap();
assert_sudo_form(&script);
}
#[test]
fn test_fj1394_sudo_default_is_false() {
let r = Resource::default();
assert!(!r.sudo);
}
#[test]
fn test_fj1394_sudo_true_wraps_check_script() {
let r = file_resource(true);
let script = codegen::check_script(&r).unwrap();
assert_sudo_form(&script);
}
#[test]
fn test_fj1394_sudo_true_wraps_state_query_script() {
let r = file_resource(true);
let script = codegen::state_query_script(&r).unwrap();
assert_sudo_form(&script);
}
#[test]
fn test_fj1394_sudo_false_leaves_check_and_state_query_plain() {
let r = file_resource(false);
assert!(!codegen::check_script(&r).unwrap().contains("sudo bash"));
assert!(!codegen::state_query_script(&r)
.unwrap()
.contains("sudo bash"));
}
#[test]
fn test_fj1394_sudo_preserves_script_when_root() {
let r = file_resource(true);
let script = codegen::apply_script(&r).unwrap();
assert!(script.contains("if [ \"$(id -u)\" -eq 0 ]; then"));
assert!(script.contains("else"));
assert!(script.contains("fi"));
}
}