use super::*;
const V1: &str = "pipeadlvvgabqkyqvn6vjp7nhslea45a5yls6pnkmizfv4bbu2hxa5iruaaauhlp2na";
const V2: &str = "pipeadlvvgabqkyqvn6vjp7nhslea45a5yls6pnkmizfv4bbu2hxa5iruaqaaangq5duobztulzpojswyylzfzsxqylnobwgkltdn5ws6aiaa3akqaihcfiqbrp5xr4q";
const V3: &str = "pipeadlvvgabqkyqvn6vjp7nhslea45a5yls6pnkmizfv4bbu2hxa5iruaicaajcaainxaaaaaaaaaaaaaaaaaaach4qaabstehw";
const V5: &str = "pipeadlvvgabqkyqvn6vjp7nhslea45a5yls6pnkmizfv4bbu2hxa5iruaiaaaswq5duobztulzpkjswyylzfzcxqylnobwgklsdj5gs4orugqzs6jjxivtg63ya25wypry";
const V5_URL: &str = "https://Relay.Example.COM.:443/%7Efoo";
fn ticket(s: &str) -> Ticket {
s.parse().expect("a normative vector must parse")
}
#[test]
fn a_ticket_with_no_relay_says_so_rather_than_leaving_it_to_be_guessed() {
assert!(
ticket(V1).relay_urls().is_empty(),
"the minimal ticket names nowhere at all"
);
assert!(
ticket(V3).relay_urls().is_empty(),
"a direct-only ticket is reachable on a LAN and nowhere else"
);
assert_eq!(
ticket(V2).relay_urls(),
["https://relay.example.com/"],
"and a ticket that has one hands it back"
);
}
#[test]
fn a_relay_url_is_handed_back_exactly_as_the_serve_side_wrote_it() {
assert_eq!(ticket(V5).relay_urls(), [V5_URL]);
}
#[test]
fn the_direct_addresses_come_back_as_socket_addresses() {
assert_eq!(
ticket(V2).direct_addrs(),
["192.168.1.7:4433".parse::<SocketAddr>().unwrap()],
"the LAN address the fast path exists for"
);
assert_eq!(
ticket(V3).direct_addrs(),
["[2001:db8::1]:8080".parse::<SocketAddr>().unwrap()]
);
assert!(
ticket(V1).direct_addrs().is_empty(),
"an id-only ticket is resolved through address lookup, not an address"
);
}
#[test]
fn each_accessor_reports_its_own_kind_of_address_and_no_other() {
let both = ticket(V2);
assert_eq!(both.relay_urls().len(), 1);
assert_eq!(both.direct_addrs().len(), 1);
assert!(
both.relay_urls()[0].starts_with("https://"),
"a relay body is a URL, not an address"
);
}
#[test]
fn the_order_survives_a_round_trip_through_the_string_form() {
for vector in [V1, V2, V3, V5] {
let once = ticket(vector);
let twice = ticket(&once.to_string());
assert_eq!(once.relay_urls(), twice.relay_urls(), "{vector}");
assert_eq!(once.direct_addrs(), twice.direct_addrs(), "{vector}");
}
}