use super::super::*;
use super::{deps, provisioned, request};
use crate::registry::Grade;
use tempfile::tempdir;
#[test]
fn a_kernel_chosen_port_refuses_before_anything_is_minted() {
let tmp = tempdir().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
provision::ensure(&dir).expect("the boot's own mint");
let deps = deps(&world, &tmp.path().join("state-root"));
let refusal = enroll(&deps, "7", &request("phone-1", Grade::Operator)).expect_err("refused");
assert!(
refusal.contains("names no port a device can dial"),
"{refusal}"
);
assert!(refusal.contains("WIRE_HOST"), "{refusal}");
assert!(refusal.contains("FORCE=1"), "{refusal}");
assert!(refusal.contains("restart the engine"), "{refusal}");
assert!(!dir.join("phone-1.pem").exists(), "nothing was minted");
}
#[test]
fn a_box_with_no_material_refuses_naming_the_remedy() {
let tmp = tempdir().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let refusal = enroll(
&deps(&world, &tmp.path().join("state-root")),
"7",
&request("phone-1", Grade::Operator),
)
.expect_err("refused");
assert!(refusal.contains("holds no wire material"), "{refusal}");
assert!(refusal.contains(material::REMEDY), "{refusal}");
}
#[test]
fn a_half_provisioned_box_refuses_in_materials_words() {
let tmp = tempdir().expect("tmp");
let (deps, dir) = provisioned(&tmp);
std::fs::remove_file(dir.join("server.key")).expect("remove");
let refusal = enroll(&deps, "7", &request("phone-1", Grade::Operator)).expect_err("refused");
assert!(refusal.contains("half-provisioned"), "{refusal}");
}
#[test]
fn an_unusable_identity_refuses_before_the_mint() {
let tmp = tempdir().expect("tmp");
let (deps, dir) = provisioned(&tmp);
let refusal =
enroll(&deps, "7", &request("../elsewhere", Grade::Operator)).expect_err("refused");
assert!(refusal.contains("unusable client identity"), "{refusal}");
assert!(!dir.join("../elsewhere.pem").exists());
}
#[test]
fn an_unwritable_registry_refuses_with_no_key_left_behind() {
let tmp = tempdir().expect("tmp");
let (deps, dir) = provisioned(&tmp);
std::fs::create_dir_all(&deps.state_root).expect("state root");
std::fs::write(deps.state_root.join(crate::registry::CLIENTS), b"file").expect("write");
assert!(enroll(&deps, "7", &request("phone-1", Grade::Operator)).is_err());
assert!(!dir.join("phone-1.key").exists(), "shredded regardless");
}
#[test]
fn an_unwritable_trail_refuses() {
let tmp = tempdir().expect("tmp");
let (deps, _) = provisioned(&tmp);
std::fs::create_dir_all(deps.state_root.join("ops.jsonl")).expect("a directory in its place");
assert!(enroll(&deps, "7", &request("phone-1", Grade::Operator)).is_err());
}
#[test]
fn a_key_that_cannot_be_shredded_refuses_naming_it() {
let tmp = tempdir().expect("tmp");
let refusal = carry(tmp.path(), "absent").expect_err("nothing to shred");
assert!(refusal.contains("could not be shredded"), "{refusal}");
}
#[test]
fn each_unreadable_pem_refuses_naming_itself() {
for (missing, marker) in [
("phone-1.key", "phone-1.key"),
(material::ANCHORS, material::ANCHORS),
("phone-1.pem", "phone-1.pem"),
] {
let tmp = tempdir().expect("tmp");
for name in [material::ANCHORS, "phone-1.pem"] {
std::fs::write(tmp.path().join(name), b"pem").expect("write");
}
std::fs::write(tmp.path().join("phone-1.key"), [0xff, 0xfe]).expect("write");
if missing != "phone-1.key" {
std::fs::remove_file(tmp.path().join(missing)).expect("remove");
std::fs::write(tmp.path().join("phone-1.key"), b"pem").expect("write");
}
let refusal = carry(tmp.path(), "phone-1").expect_err("refused");
assert!(refusal.contains(marker), "{refusal}");
assert!(!tmp.path().join("phone-1.key").exists(), "shredded first");
}
}