1ffe74184SMartin Algesten use super::*;
2ffe74184SMartin Algesten use crate::relay::relay_none::*;
3ffe74184SMartin Algesten
4c4e6ecf8Slogist322 use std::{net::IpAddr, str::FromStr};
5c4e6ecf8Slogist322 use tokio::{
6c4e6ecf8Slogist322 net::UdpSocket,
7c4e6ecf8Slogist322 time::{Duration, Instant},
8c4e6ecf8Slogist322 };
9ffe74184SMartin Algesten use util::vnet::net::*;
10ffe74184SMartin Algesten
11ffe74184SMartin Algesten const STATIC_KEY: &str = "ABC";
12ffe74184SMartin Algesten
13ffe74184SMartin Algesten #[tokio::test]
test_allocation_lifetime_parsing() -> Result<()>14ffe74184SMartin Algesten async fn test_allocation_lifetime_parsing() -> Result<()> {
15ffe74184SMartin Algesten let lifetime = Lifetime(Duration::from_secs(5));
16ffe74184SMartin Algesten
17ffe74184SMartin Algesten let mut m = Message::new();
18ffe74184SMartin Algesten let lifetime_duration = allocation_lifetime(&m);
19ffe74184SMartin Algesten
20ffe74184SMartin Algesten assert_eq!(
21ffe74184SMartin Algesten lifetime_duration, DEFAULT_LIFETIME,
22ffe74184SMartin Algesten "Allocation lifetime should be default time duration"
23ffe74184SMartin Algesten );
24ffe74184SMartin Algesten
25ffe74184SMartin Algesten lifetime.add_to(&mut m)?;
26ffe74184SMartin Algesten
27ffe74184SMartin Algesten let lifetime_duration = allocation_lifetime(&m);
28ffe74184SMartin Algesten assert_eq!(
29ffe74184SMartin Algesten lifetime_duration, lifetime.0,
305d8fe953SJoão Oliveira "Expect lifetime_duration is {lifetime}, but {lifetime_duration:?}"
31ffe74184SMartin Algesten );
32ffe74184SMartin Algesten
33ffe74184SMartin Algesten Ok(())
34ffe74184SMartin Algesten }
35ffe74184SMartin Algesten
36ffe74184SMartin Algesten #[tokio::test]
test_allocation_lifetime_overflow() -> Result<()>37ffe74184SMartin Algesten async fn test_allocation_lifetime_overflow() -> Result<()> {
38ffe74184SMartin Algesten let lifetime = Lifetime(MAXIMUM_ALLOCATION_LIFETIME * 2);
39ffe74184SMartin Algesten
40ffe74184SMartin Algesten let mut m2 = Message::new();
41ffe74184SMartin Algesten lifetime.add_to(&mut m2)?;
42ffe74184SMartin Algesten
43ffe74184SMartin Algesten let lifetime_duration = allocation_lifetime(&m2);
44ffe74184SMartin Algesten assert_eq!(
45ffe74184SMartin Algesten lifetime_duration, DEFAULT_LIFETIME,
465d8fe953SJoão Oliveira "Expect lifetime_duration is {DEFAULT_LIFETIME:?}, but {lifetime_duration:?}"
47ffe74184SMartin Algesten );
48ffe74184SMartin Algesten
49ffe74184SMartin Algesten Ok(())
50ffe74184SMartin Algesten }
51ffe74184SMartin Algesten
52ffe74184SMartin Algesten struct TestAuthHandler;
53ffe74184SMartin Algesten impl AuthHandler for TestAuthHandler {
auth_handle(&self, _username: &str, _realm: &str, _src_addr: SocketAddr) -> Result<Vec<u8>>54ffe74184SMartin Algesten fn auth_handle(&self, _username: &str, _realm: &str, _src_addr: SocketAddr) -> Result<Vec<u8>> {
55ffe74184SMartin Algesten Ok(STATIC_KEY.as_bytes().to_vec())
56ffe74184SMartin Algesten }
57ffe74184SMartin Algesten }
58ffe74184SMartin Algesten
59ffe74184SMartin Algesten #[tokio::test]
test_allocation_lifetime_deletion_zero_lifetime() -> Result<()>60ffe74184SMartin Algesten async fn test_allocation_lifetime_deletion_zero_lifetime() -> Result<()> {
61ffe74184SMartin Algesten //env_logger::init();
62ffe74184SMartin Algesten
63ffe74184SMartin Algesten let l = Arc::new(UdpSocket::bind("0.0.0.0:0").await?);
64ffe74184SMartin Algesten
65ffe74184SMartin Algesten let allocation_manager = Arc::new(Manager::new(ManagerConfig {
66ffe74184SMartin Algesten relay_addr_generator: Box::new(RelayAddressGeneratorNone {
67ffe74184SMartin Algesten address: "0.0.0.0".to_owned(),
68ffe74184SMartin Algesten net: Arc::new(Net::new(None)),
69ffe74184SMartin Algesten }),
70*9ea7b2acSclia alloc_close_notify: None,
71ffe74184SMartin Algesten }));
72ffe74184SMartin Algesten
73ffe74184SMartin Algesten let socket = SocketAddr::new(IpAddr::from_str("127.0.0.1")?, 5000);
74ffe74184SMartin Algesten
75ffe74184SMartin Algesten let mut r = Request::new(l, socket, allocation_manager, Arc::new(TestAuthHandler {}));
76ffe74184SMartin Algesten
77ffe74184SMartin Algesten {
78ffe74184SMartin Algesten let mut nonces = r.nonces.lock().await;
79ffe74184SMartin Algesten nonces.insert(STATIC_KEY.to_owned(), Instant::now());
80ffe74184SMartin Algesten }
81ffe74184SMartin Algesten
82ffe74184SMartin Algesten let five_tuple = FiveTuple {
83ffe74184SMartin Algesten src_addr: r.src_addr,
845b79f08aSalexlapa dst_addr: r.conn.local_addr()?,
85ffe74184SMartin Algesten protocol: PROTO_UDP,
86ffe74184SMartin Algesten };
87ffe74184SMartin Algesten
88ffe74184SMartin Algesten r.allocation_manager
89ffe74184SMartin Algesten .create_allocation(
90630c46feSHugo Tunius five_tuple,
91ffe74184SMartin Algesten Arc::clone(&r.conn),
92ffe74184SMartin Algesten 0,
93ffe74184SMartin Algesten Duration::from_secs(3600),
94c4e6ecf8Slogist322 TextAttribute::new(ATTR_USERNAME, "user".into()),
95ffe74184SMartin Algesten )
96ffe74184SMartin Algesten .await?;
97ffe74184SMartin Algesten assert!(r
98ffe74184SMartin Algesten .allocation_manager
99ffe74184SMartin Algesten .get_allocation(&five_tuple)
100ffe74184SMartin Algesten .await
101ffe74184SMartin Algesten .is_some());
102ffe74184SMartin Algesten
103ffe74184SMartin Algesten let mut m = Message::new();
104ffe74184SMartin Algesten Lifetime::default().add_to(&mut m)?;
105ffe74184SMartin Algesten MessageIntegrity(STATIC_KEY.as_bytes().to_vec()).add_to(&mut m)?;
106ffe74184SMartin Algesten Nonce::new(ATTR_NONCE, STATIC_KEY.to_owned()).add_to(&mut m)?;
107ffe74184SMartin Algesten Realm::new(ATTR_REALM, STATIC_KEY.to_owned()).add_to(&mut m)?;
108ffe74184SMartin Algesten Username::new(ATTR_USERNAME, STATIC_KEY.to_owned()).add_to(&mut m)?;
109ffe74184SMartin Algesten
110ffe74184SMartin Algesten r.handle_refresh_request(&m).await?;
111ffe74184SMartin Algesten assert!(r
112ffe74184SMartin Algesten .allocation_manager
113ffe74184SMartin Algesten .get_allocation(&five_tuple)
114ffe74184SMartin Algesten .await
115ffe74184SMartin Algesten .is_none());
116ffe74184SMartin Algesten
117ffe74184SMartin Algesten Ok(())
118ffe74184SMartin Algesten }
119