use super::*;
use crate::registry::presence::Presence;
use crate::test_support::wire::mint;
use serde_json::{Value, json};
use tempfile::TempDir;
struct Silent;
impl server::Answerer for Silent {
fn answer(
&self,
_peer: &crate::registry::Peer,
_request: Value,
) -> Box<dyn Iterator<Item = Value>> {
Box::new(std::iter::once(json!({"ok": true})))
}
}
#[test]
fn an_unprovisioned_box_founds_its_own_loopback_wire() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let listener = listen(&world, Arc::new(Silent), Presence::default()).expect("listening");
assert!(
listener.address().starts_with("127.0.0.1:"),
"loopback only"
);
assert!(
!listener.address().ends_with(":0"),
"the bound answer to the `:0` request, never the request itself"
);
for role in material::LEAVES {
assert!(
material::read(&world, role).expect("readable").is_some(),
"{role:?} is provisioned"
);
}
}
#[test]
fn two_engines_on_one_box_each_get_their_own_wire() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let first = listen(&world, Arc::new(Silent), Presence::default()).expect("the first wire");
let second = listen(&world, Arc::new(Silent), Presence::default()).expect("the second wire");
assert_ne!(
first.address(),
second.address(),
"each instance owns a distinct endpoint"
);
}
#[test]
fn a_stated_port_another_process_holds_is_a_refusal_that_names_it() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
mint(&dir);
let holder = std::net::TcpListener::bind("127.0.0.1:0").expect("a port of our own");
let held = holder.local_addr().expect("bound").to_string();
std::fs::write(dir.join(material::ADDRESS), format!("{held}\n")).expect("write");
let refusal = listen(&world, Arc::new(Silent), Presence::default())
.err()
.expect("the held port refuses");
assert!(refusal.contains(&format!("bind {held}")), "{refusal}");
}
#[test]
fn a_box_the_mint_cannot_provision_keeps_its_engine() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
std::fs::create_dir_all(dir.parent().expect("root")).expect("root");
std::fs::write(&dir, b"a file where the directory goes").expect("block it");
let refusal = listen(&world, Arc::new(Silent), Presence::default())
.err()
.expect("a box the mint cannot provision refuses");
assert!(refusal.contains("wire"), "{refusal}");
}
#[test]
fn a_leaf_the_mint_can_replace_is_replaced() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
mint(&dir);
std::fs::remove_file(dir.join("server.key")).expect("rm");
assert!(listen(&world, Arc::new(Silent), Presence::default()).is_ok());
}
#[test]
fn a_provisioned_box_listens() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
mint(&material::dir(&world));
let listener = listen(&world, Arc::new(Silent), Presence::default()).expect("listening");
assert!(listener.address().starts_with("127.0.0.1:"));
}
#[test]
fn a_half_provisioned_box_the_mint_cannot_heal_does_not_listen() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
mint(&dir);
std::fs::remove_file(dir.join(crate::wire::provision::CA_KEY)).expect("rm");
std::fs::remove_file(dir.join("server.key")).expect("rm");
let refusal = listen(&world, Arc::new(Silent), Presence::default())
.err()
.expect("half-provisioned refuses");
assert!(refusal.contains("half-provisioned"), "{refusal}");
}
#[test]
fn an_unbindable_address_leaves_the_engine_running() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
mint(&dir);
std::fs::write(dir.join(material::ADDRESS), "256.256.256.256:1").expect("write");
assert!(listen(&world, Arc::new(Silent), Presence::default()).is_err());
}
#[test]
fn a_mint_failure_with_readable_material_keeps_the_wire() {
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
let dir = material::dir(&world);
mint(&dir);
std::fs::remove_file(dir.join("client.pem")).expect("rm");
std::fs::remove_file(dir.join("client.key")).expect("rm");
std::fs::create_dir(dir.join("client.key")).expect("a directory where the key goes");
let listener = listen(&world, Arc::new(Silent), Presence::default()).expect("the wire is kept");
assert!(listener.address().starts_with("127.0.0.1:"));
}