use crate::TNS_VERSION_DESIRED;
#[must_use]
pub fn build_sni(service_name: &str, server_type: Option<&str>) -> String {
let server_type_part = match server_type {
Some(st) if !st.is_empty() => {
let first = st.chars().next().unwrap_or_default();
format!(".T1.{first}")
}
_ => String::new(),
};
format!(
"S{}.{}{}.V3.{}",
service_name.len(),
service_name,
server_type_part,
TNS_VERSION_DESIRED
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sni_basic_service_only() {
assert_eq!(build_sni("FREEPDB1", None), "S8.FREEPDB1.V3.319");
}
#[test]
fn sni_with_server_type_uses_first_char() {
assert_eq!(build_sni("svc", Some("dedicated")), "S3.svc.T1.d.V3.319");
}
#[test]
fn sni_with_emon_server_type() {
assert_eq!(build_sni("svc", Some("emon")), "S3.svc.T1.e.V3.319");
}
#[test]
fn sni_empty_server_type_is_omitted() {
assert_eq!(build_sni("svc", Some("")), "S3.svc.V3.319");
}
#[test]
fn sni_length_is_byte_count_not_padded() {
let svc = "a".repeat(12);
assert_eq!(build_sni(&svc, None), format!("S12.{svc}.V3.319"));
}
#[test]
fn sni_version_matches_protocol_constant() {
let sni = build_sni("x", None);
assert!(sni.ends_with(&format!(".V3.{TNS_VERSION_DESIRED}")));
}
}