use super::{anchors, client_config, identity};
use crate::channel::material::{ANCHORS, CHAIN, KEY};
use crate::test_support::{Scratch, mint};
fn armoured(body: &str) -> String {
format!("-----BEGIN CERTIFICATE-----\n{body}\n-----END CERTIFICATE-----\n")
}
#[test]
fn provisioned_material_builds_a_client_configuration() {
let scratch = Scratch::new();
let held = mint::provisioned(scratch.path(), "engine.example:9000");
assert!(client_config(&held).is_ok());
}
#[test]
fn anchors_that_are_not_there_refuse_by_name() {
let scratch = Scratch::new();
let refusal = anchors(&scratch.join("nowhere.pem")).expect_err("refused");
assert!(refusal.contains("nowhere.pem"), "{refusal}");
}
#[test]
fn an_anchor_file_with_no_certificate_in_it_refuses() {
let scratch = Scratch::new();
let empty = scratch.join("empty.pem");
std::fs::write(&empty, b"# nothing here\n").expect("write");
let refusal = anchors(&empty).expect_err("refused");
assert!(refusal.contains("no certificate in it"), "{refusal}");
}
#[test]
fn anchor_bytes_that_are_not_a_certificate_refuse() {
let scratch = Scratch::new();
let unreadable = scratch.join("unreadable.pem");
std::fs::write(&unreadable, armoured("not base64 !!!")).expect("write");
assert!(
anchors(&unreadable)
.expect_err("refused")
.contains("unreadable.pem")
);
let undecodable = scratch.join("undecodable.pem");
std::fs::write(&undecodable, armoured("bm90IGEgY2VydGlmaWNhdGU=")).expect("write");
assert!(
anchors(&undecodable)
.expect_err("refused")
.contains("undecodable.pem")
);
}
#[test]
fn an_identity_that_cannot_be_read_refuses_by_file() {
let scratch = Scratch::new();
mint::material(scratch.path());
let chain = scratch.join(CHAIN);
let key = scratch.join(KEY);
let missing = scratch.join("nowhere.pem");
assert!(
identity(&missing, &key)
.expect_err("refused")
.contains("nowhere.pem")
);
let empty = scratch.join("empty.pem");
std::fs::write(&empty, b"# nothing here\n").expect("write");
assert!(
identity(&empty, &key)
.expect_err("refused")
.contains("no certificate in it")
);
let unreadable = scratch.join("unreadable.pem");
std::fs::write(&unreadable, armoured("not base64 !!!")).expect("write");
assert!(
identity(&unreadable, &key)
.expect_err("refused")
.contains("unreadable.pem")
);
let keyless = scratch.join("nowhere.key");
assert!(
identity(&chain, &keyless)
.expect_err("refused")
.contains("nowhere.key")
);
}
#[test]
fn a_chain_and_a_key_that_do_not_match_refuse_before_anything_is_dialled() {
let scratch = Scratch::new();
let mut held = mint::provisioned(scratch.path(), "engine.example:9000");
held.key = scratch.join(&format!("{}.key", mint::ENGINE));
let refusal = client_config(&held).expect_err("refused");
assert!(refusal.contains("client identity"), "{refusal}");
}
#[test]
fn a_configuration_with_unreadable_anchors_refuses() {
let scratch = Scratch::new();
let mut held = mint::provisioned(scratch.path(), "engine.example:9000");
held.anchors = scratch.join("nowhere.pem");
let refusal = client_config(&held).expect_err("refused");
assert!(refusal.contains("nowhere.pem"), "{refusal}");
assert!(
scratch.join(ANCHORS).is_file(),
"the operator's real anchors are untouched"
);
}
#[test]
fn a_foot_grade_leaf_refuses_here_rather_than_at_the_far_end() {
let scratch = Scratch::new();
let held = mint::provisioned(scratch.path(), "engine.example:9000");
mint::foot(scratch.path(), true);
let refusal = client_config(&held).expect_err("refused");
assert!(refusal.contains("foot grade"), "{refusal}");
assert!(
refusal.contains(&scratch.join(CHAIN).display().to_string()),
"{refusal}"
);
}