use super::*;
use crate::test_support::wire::{material, mint};
use crate::wire::material::Role;
use serde_json::json;
use tempfile::TempDir;
#[test]
fn the_server_name_comes_off_the_address() {
assert_eq!(
server_name("127.0.0.1:7737").expect("ip"),
ServerName::IpAddress("127.0.0.1".parse::<IpAddr>().expect("ip").into())
);
assert_eq!(
server_name("[::1]:7737").expect("ip"),
ServerName::IpAddress("::1".parse::<IpAddr>().expect("ip").into())
);
assert_eq!(
server_name("engine.example.com:7737").expect("dns"),
ServerName::try_from("engine.example.com").expect("dns")
);
assert_eq!(
server_name("engine.example.com").expect("dns"),
ServerName::try_from("engine.example.com").expect("dns")
);
}
#[test]
fn an_unverifiable_address_refuses() {
let err = server_name("not a host:1").expect_err("refused");
assert!(err.contains("not a host:1"), "{err}");
}
#[test]
fn opening_a_seat_dials_nothing() {
let tmp = TempDir::new().expect("tmp");
mint(tmp.path());
let seat = Seat::open(&material(tmp.path(), Role::Client, "127.0.0.1:7737")).expect("seat");
assert_eq!(seat.address(), "127.0.0.1:7737");
}
#[test]
fn unusable_material_refuses_at_open() {
let tmp = TempDir::new().expect("tmp");
mint(tmp.path());
std::fs::write(tmp.path().join("ca.pem"), "").expect("write");
assert!(Seat::open(&material(tmp.path(), Role::Client, "127.0.0.1:7737")).is_err());
}
#[test]
fn an_unverifiable_address_refuses_at_open() {
let tmp = TempDir::new().expect("tmp");
mint(tmp.path());
assert!(Seat::open(&material(tmp.path(), Role::Client, "not a host:1")).is_err());
}
#[test]
fn a_dead_address_refuses_naming_itself() {
let tmp = TempDir::new().expect("tmp");
mint(tmp.path());
let address = "127.0.0.1:0";
let seat = Seat::open(&material(tmp.path(), Role::Client, address)).expect("seat");
let err = seat.ask(&json!({"op": "workspaces"})).expect_err("refused");
assert!(err.contains(address), "{err}");
}
#[test]
fn a_peer_that_is_not_an_engine_fails_to_answer() {
let tmp = TempDir::new().expect("tmp");
mint(tmp.path());
let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("bind");
let address = listener.local_addr().expect("addr").to_string();
let peer = std::thread::spawn(move || {
let _ = listener.accept();
});
let seat = Seat::open(&material(tmp.path(), Role::Client, &address)).expect("seat");
seat.ask(&json!({"op": "workspaces"}))
.expect_err("no answer");
peer.join().expect("peer");
}
#[test]
fn a_local_seat_dials_loopback_at_the_bound_port() {
use super::loopback;
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:");
}