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