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, _client: &crate::registry::Client, _request: Value) -> Vec<Value> {
vec![json!({"ok": true})]
}
}
#[test]
fn an_unprovisioned_box_founds_its_own_loopback_wire() {
let _guard = crate::test_support::spawn_guard();
let tmp = TempDir::new().expect("tmp");
let world = crate::test_support::world_under(tmp.path());
crate::test_support::wire::ephemeral(&world);
let listener = listen(&world, Arc::new(Silent), Presence::default()).expect("listening");
assert!(
listener.address().starts_with("127.0.0.1:"),
"loopback only"
);
for role in material::LEAVES {
assert!(
material::read(&world, role).expect("readable").is_some(),
"{role:?} is provisioned"
);
}
}
#[test]
fn a_box_the_mint_cannot_provision_keeps_its_engine() {
let _guard = crate::test_support::spawn_guard();
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");
assert!(listen(&world, Arc::new(Silent), Presence::default()).is_none());
}
#[test]
fn a_leaf_the_mint_can_replace_is_replaced() {
let _guard = crate::test_support::spawn_guard();
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_some());
}
#[test]
fn a_provisioned_box_listens() {
let _guard = crate::test_support::spawn_guard();
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 _guard = crate::test_support::spawn_guard();
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");
assert!(listen(&world, Arc::new(Silent), Presence::default()).is_none());
}
#[test]
fn the_window_dials_loopback_at_the_bound_port() {
assert_eq!(loopback("0.0.0.0:7737"), "127.0.0.1:7737");
assert_eq!(loopback("engine.example.com:9"), "127.0.0.1:9");
assert_eq!(loopback("nonsense"), "127.0.0.1:");
}
#[test]
fn an_unbindable_address_leaves_the_engine_running() {
let _guard = crate::test_support::spawn_guard();
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_none());
}