use std::net::SocketAddr;
use dig_stun::scope::{is_globally_routable, is_usable_reflexive_addr, scope_of, Scope};
fn addr(s: &str) -> SocketAddr {
s.parse().expect("valid SocketAddr literal")
}
fn assert_scope(addr_str: &str, expected: Scope) {
let a = addr(addr_str);
assert_eq!(scope_of(a), expected, "scope_of({addr_str})");
assert_eq!(
is_usable_reflexive_addr(&a),
expected != Scope::NeverDialable,
"is_usable_reflexive_addr({addr_str})"
);
assert_eq!(
is_globally_routable(&a),
expected == Scope::GlobalUnicast,
"is_globally_routable({addr_str})"
);
}
#[test]
fn accepts_genuinely_global_addresses() {
assert!(is_usable_reflexive_addr(&addr("1.1.1.1:443")));
assert!(is_usable_reflexive_addr(&addr("8.8.8.8:53")));
assert!(is_usable_reflexive_addr(&addr(
"[2606:4700:4700::1111]:443"
)));
}
#[test]
fn accepts_private_cgnat_and_ula() {
assert!(is_usable_reflexive_addr(&addr("192.168.1.5:9000")));
assert!(is_usable_reflexive_addr(&addr("10.0.0.7:9000")));
assert!(is_usable_reflexive_addr(&addr("172.16.5.5:9000")));
assert!(is_usable_reflexive_addr(&addr("100.64.0.1:9000")));
assert!(is_usable_reflexive_addr(&addr("[fd00::1]:9000")));
}
#[test]
fn rejects_port_zero() {
assert!(!is_usable_reflexive_addr(&addr("1.1.1.1:0")));
assert!(!is_usable_reflexive_addr(&addr("[2606:4700:4700::1111]:0")));
}
#[test]
fn rejects_reserved_ipv4() {
assert!(!is_usable_reflexive_addr(&addr("0.0.0.0:1234")));
assert!(!is_usable_reflexive_addr(&addr("127.0.0.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("169.254.1.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("224.0.0.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("255.255.255.255:1234")));
assert!(!is_usable_reflexive_addr(&addr("192.0.2.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("198.51.100.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("203.0.113.1:1234")));
}
#[test]
fn rejects_reserved_ipv6() {
assert!(!is_usable_reflexive_addr(&addr("[::]:1234")));
assert!(!is_usable_reflexive_addr(&addr("[::1]:1234")));
assert!(!is_usable_reflexive_addr(&addr("[fe80::1]:1234")));
assert!(!is_usable_reflexive_addr(&addr("[febf::1]:1234")));
assert!(!is_usable_reflexive_addr(&addr("[ff02::1]:1234")));
assert!(!is_usable_reflexive_addr(&addr("[2001:db8::1]:1234")));
}
#[test]
fn rejects_never_dialable_ipv4_ranges() {
assert!(!is_usable_reflexive_addr(&addr("198.18.0.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("198.19.0.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("240.0.0.1:1234")));
assert!(!is_usable_reflexive_addr(&addr("0.1.2.3:1234")));
assert!(!is_usable_reflexive_addr(&addr("192.88.99.1:1234")));
}
#[test]
fn ipv4_never_dialable_rows() {
assert_scope("0.0.0.0:1234", Scope::NeverDialable); assert_scope("0.1.2.3:1234", Scope::NeverDialable); assert_scope("127.0.0.1:1234", Scope::NeverDialable); assert_scope("169.254.1.1:1234", Scope::NeverDialable); assert_scope("192.0.0.1:1234", Scope::NeverDialable); assert_scope("192.0.2.1:1234", Scope::NeverDialable); assert_scope("198.51.100.1:1234", Scope::NeverDialable); assert_scope("203.0.113.1:1234", Scope::NeverDialable); assert_scope("192.88.99.1:1234", Scope::NeverDialable); assert_scope("198.18.0.1:1234", Scope::NeverDialable); assert_scope("198.19.255.255:1234", Scope::NeverDialable); assert_scope("224.0.0.1:1234", Scope::NeverDialable); assert_scope("240.0.0.1:1234", Scope::NeverDialable); assert_scope("255.255.255.255:1234", Scope::NeverDialable); }
#[test]
fn ipv4_private_scope_rows() {
assert_scope("10.0.0.7:9000", Scope::PrivateScope);
assert_scope("172.16.5.5:9000", Scope::PrivateScope);
assert_scope("172.31.255.255:9000", Scope::PrivateScope); assert_scope("192.168.1.5:9000", Scope::PrivateScope);
assert_scope("100.64.0.1:9000", Scope::PrivateScope); assert_scope("100.127.255.255:9000", Scope::PrivateScope); }
#[test]
fn ipv4_global_unicast_control_addresses() {
assert_scope("1.1.1.1:443", Scope::GlobalUnicast);
assert_scope("8.8.8.8:53", Scope::GlobalUnicast);
assert_scope("100.63.255.255:1", Scope::GlobalUnicast);
assert_scope("100.128.0.0:1", Scope::GlobalUnicast);
assert_scope("198.17.255.255:1", Scope::GlobalUnicast);
assert_scope("198.20.0.0:1", Scope::GlobalUnicast);
}
#[test]
fn ipv6_never_dialable_rows() {
assert_scope("[::]:1234", Scope::NeverDialable); assert_scope("[::1]:1234", Scope::NeverDialable); assert_scope("[fe80::1]:1234", Scope::NeverDialable); assert_scope("[febf::ffff]:1234", Scope::NeverDialable); assert_scope("[ff02::1]:1234", Scope::NeverDialable); assert_scope("[2001:db8::1]:1234", Scope::NeverDialable); assert_scope("[2001:2::1]:1234", Scope::NeverDialable); assert_scope("[100::1]:1234", Scope::NeverDialable); }
#[test]
fn ipv6_private_scope_row() {
assert_scope("[fc00::1]:9000", Scope::PrivateScope); assert_scope("[fd00::1]:9000", Scope::PrivateScope); assert_scope("[fdff:ffff:ffff:ffff::1]:9000", Scope::PrivateScope); }
#[test]
fn ipv6_global_unicast_control_addresses() {
assert_scope("[2606:4700:4700::1111]:443", Scope::GlobalUnicast);
assert_scope("[fec0::1]:1", Scope::GlobalUnicast);
assert_scope("[fe00::1]:1", Scope::GlobalUnicast);
}
#[test]
fn reconciled_6to4_relay_anycast_is_never_dialable() {
assert_scope("192.88.99.1:1234", Scope::NeverDialable);
}
#[test]
fn reconciled_ietf_protocol_assignment_is_never_dialable() {
assert_scope("192.0.0.1:1234", Scope::NeverDialable);
}
#[test]
fn reconciled_ipv6_benchmarking_is_never_dialable() {
assert_scope("[2001:2::1]:1234", Scope::NeverDialable);
}
#[test]
fn reconciled_ipv6_discard_only_is_never_dialable() {
assert_scope("[100::1]:1234", Scope::NeverDialable);
}
#[test]
fn mapped_ipv4_in_ipv6_folds_before_classifying() {
assert_scope("[::ffff:127.0.0.1]:1234", Scope::NeverDialable); assert_scope("[::ffff:0.0.0.0]:1234", Scope::NeverDialable); assert_scope("[::ffff:224.0.0.1]:1234", Scope::NeverDialable); assert_scope("[::ffff:192.0.2.1]:1234", Scope::NeverDialable); assert_scope("[::ffff:255.255.255.255]:1234", Scope::NeverDialable); assert_scope("[::ffff:169.254.169.254]:1234", Scope::NeverDialable);
assert_scope("[::ffff:10.0.0.1]:9000", Scope::PrivateScope);
}
#[test]
fn deprecated_compatible_ipv4_in_ipv6_folds_before_classifying() {
assert_scope("[::7f00:1]:1234", Scope::NeverDialable); assert_scope("[::a9fe:a9fe]:1234", Scope::NeverDialable);
}
#[test]
fn ipv6_loopback_and_unspecified_fold_into_the_v4_this_network_row() {
assert_scope("[::1]:1234", Scope::NeverDialable);
assert_scope("[::]:1234", Scope::NeverDialable);
}
#[test]
fn port_zero_is_never_dialable_regardless_of_ip() {
assert_scope("1.1.1.1:0", Scope::NeverDialable);
assert_scope("[2606:4700:4700::1111]:0", Scope::NeverDialable);
assert_scope("10.0.0.1:0", Scope::NeverDialable);
}