use super::common::{
create_register_request, create_test_request, create_test_server,
create_test_server_with_config, create_transaction,
};
use crate::call::TransactionCookie;
use crate::config::ProxyConfig;
use crate::proxy::registrar::RegistrarModule;
use crate::proxy::{ProxyAction, ProxyModule};
use tokio_util::sync::CancellationToken;
#[tokio::test]
async fn test_registrar_register_success() {
let (server_inner, config) = create_test_server().await;
let request = create_register_request("alice", "rustpbx.com", Some(60));
let module = RegistrarModule::new(server_inner.clone(), config);
let (mut tx, _) = create_transaction(request).await;
let result = module
.on_transaction_begin(
CancellationToken::new(),
&mut tx,
TransactionCookie::default(),
)
.await
.unwrap();
assert!(matches!(result, ProxyAction::Abort));
let locations = server_inner
.locator
.lookup(&"sip:alice@rustpbx.com".try_into().expect("invalid uri"))
.await;
assert!(locations.is_ok());
let locations = locations.unwrap();
assert_eq!(locations.len(), 1);
let location = &locations[0];
let registered_aor = location.registered_aor.as_ref().unwrap();
assert_eq!(registered_aor.user().unwrap_or(""), "alice");
assert_eq!(registered_aor.host().to_string(), "rustpbx.com");
assert!(
location
.contact_raw
.as_ref()
.unwrap()
.contains("expires=60")
);
assert!(
location.home_proxy.is_some(),
"registrar should stamp home_proxy for clustered routing"
);
}
#[tokio::test]
async fn test_registrar_unregister() {
let (server_inner, config) = create_test_server().await;
let register_request = create_register_request("alice", "rustpbx.com", Some(60));
let module = RegistrarModule::new(server_inner.clone(), config.clone());
let (mut tx, _) = create_transaction(register_request).await;
let result = module
.on_transaction_begin(
CancellationToken::new(),
&mut tx,
TransactionCookie::default(),
)
.await
.unwrap();
assert!(matches!(result, ProxyAction::Abort));
let unregister_request = create_register_request("alice", "rustpbx.com", Some(0));
let (mut tx, _) = create_transaction(unregister_request).await;
let result = module
.on_transaction_begin(
CancellationToken::new(),
&mut tx,
TransactionCookie::default(),
)
.await
.unwrap();
assert!(matches!(result, ProxyAction::Abort));
let locations = server_inner
.locator
.lookup(&"sip:alice@rustpbx.com".try_into().expect("invalid uri"))
.await;
if let Ok(v) = locations {
assert!(v.is_empty(), "Expected no locations after unregister")
}
}
#[tokio::test]
async fn test_registrar_with_custom_expires() {
let config = ProxyConfig {
registrar_expires: Some(120),
..Default::default()
};
let (server_inner, config) = create_test_server_with_config(config).await;
let request = create_register_request("alice", "rustpbx.com", None);
let module = RegistrarModule::new(server_inner.clone(), config);
let (mut tx, _) = create_transaction(request).await;
let result = module
.on_transaction_begin(
CancellationToken::new(),
&mut tx,
TransactionCookie::default(),
)
.await
.unwrap();
assert!(matches!(result, ProxyAction::Abort));
let locations = server_inner
.locator
.lookup(&"sip:alice@rustpbx.com".try_into().expect("invalid uri"))
.await
.unwrap();
assert_eq!(locations[0].expires, 120);
}
#[tokio::test]
async fn test_registrar_non_register_method() {
let (server_inner, config) = create_test_server().await;
let request = create_test_request(
rsipstack::sip::Method::Invite,
"alice",
None,
"rustpbx.com",
None,
);
let module = RegistrarModule::new(server_inner, config);
let (mut tx, _) = create_transaction(request).await;
let result = module
.on_transaction_begin(
CancellationToken::new(),
&mut tx,
TransactionCookie::default(),
)
.await
.unwrap();
assert!(matches!(result, ProxyAction::Continue));
}