niom-turn/tests/channel/integration_udp.rs

56 lines
1.8 KiB
Rust

//! UDP channel bind integration coverage.
#[path = "../support/mod.rs"]
mod support;
mod helpers;
use crate::support::stun_builders::{
build_allocate_request, build_channel_bind_request, extract_error_code, parse,
};
use helpers::*;
use niom_turn::alloc::AllocationManager;
use niom_turn::auth;
use support::{default_test_credentials, init_tracing, test_auth_manager};
use tokio::net::UdpSocket;
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn channel_bind_without_allocation_returns_mismatch() {
init_tracing();
let (username, password) = default_test_credentials();
let auth_manager = test_auth_manager(username, password);
let allocs = AllocationManager::new();
let server_addr = spawn_udp_server(auth_manager.clone(), allocs.clone()).await;
let client = UdpSocket::bind("127.0.0.1:0").await.expect("client bind");
let mut buf = [0u8; 1500];
// Challenge to obtain nonce (no allocation performed yet)
let challenge = build_allocate_request(None, None, None, None, None);
client
.send_to(&challenge, server_addr)
.await
.expect("send challenge");
let (len, _) = client.recv_from(&mut buf).await.expect("recv nonce");
let resp = parse(&buf[..len]);
let nonce = extract_nonce(&resp).expect("nonce attr");
let key = auth::compute_a1_md5(username, auth_manager.realm(), password);
let channel_req = build_channel_bind_request(
username,
auth_manager.realm(),
&nonce,
&key,
sample_channel_number(),
&sample_peer(),
);
client
.send_to(&channel_req, server_addr)
.await
.expect("send channel bind");
let (len, _) = client.recv_from(&mut buf).await.expect("recv error");
let resp = parse(&buf[..len]);
let code = extract_error_code(&resp).expect("error attr");
assert_eq!(code, 437);
}