1 use super::*; 2 3 use crate::{allocation::*, error::Result}; 4 5 use tokio::net::UdpSocket; 6 7 use std::net::Ipv4Addr; 8 use stun::{attributes::ATTR_USERNAME, textattrs::TextAttribute}; 9 10 async fn create_channel_bind(lifetime: Duration) -> Result<Allocation> { 11 let turn_socket = Arc::new(UdpSocket::bind("0.0.0.0:0").await?); 12 let relay_socket = Arc::clone(&turn_socket); 13 let relay_addr = relay_socket.local_addr()?; 14 let a = Allocation::new( 15 turn_socket, 16 relay_socket, 17 relay_addr, 18 FiveTuple::default(), 19 TextAttribute::new(ATTR_USERNAME, "user".into()), 20 ); 21 22 let addr = SocketAddr::new(Ipv4Addr::new(0, 0, 0, 0).into(), 0); 23 let c = ChannelBind::new(ChannelNumber(MIN_CHANNEL_NUMBER), addr); 24 25 a.add_channel_bind(c, lifetime).await?; 26 27 Ok(a) 28 } 29 30 #[tokio::test] 31 async fn test_channel_bind() -> Result<()> { 32 let a = create_channel_bind(Duration::from_millis(20)).await?; 33 34 let result = a.get_channel_addr(&ChannelNumber(MIN_CHANNEL_NUMBER)).await; 35 if let Some(addr) = result { 36 assert_eq!(addr.ip().to_string(), "0.0.0.0"); 37 } else { 38 panic!("expected some, but got none"); 39 } 40 41 Ok(()) 42 } 43 44 async fn test_channel_bind_start() -> Result<()> { 45 let a = create_channel_bind(Duration::from_millis(20)).await?; 46 tokio::time::sleep(Duration::from_millis(30)).await; 47 48 assert!(a 49 .get_channel_addr(&ChannelNumber(MIN_CHANNEL_NUMBER)) 50 .await 51 .is_none()); 52 53 Ok(()) 54 } 55 56 async fn test_channel_bind_reset() -> Result<()> { 57 let a = create_channel_bind(Duration::from_millis(30)).await?; 58 59 tokio::time::sleep(Duration::from_millis(20)).await; 60 { 61 let channel_bindings = a.channel_bindings.lock().await; 62 if let Some(c) = channel_bindings.get(&ChannelNumber(MIN_CHANNEL_NUMBER)) { 63 c.refresh(Duration::from_millis(30)).await; 64 } 65 } 66 tokio::time::sleep(Duration::from_millis(20)).await; 67 68 assert!(a 69 .get_channel_addr(&ChannelNumber(MIN_CHANNEL_NUMBER)) 70 .await 71 .is_some()); 72 73 Ok(()) 74 } 75