stun_rs/attributes/turn/
requested_address_family.rs

1use crate::attributes::turn::address_family::family_address_attribute;
2
3const REQUESTED_ADDRESS_FAMILY: u16 = 0x0017;
4
5family_address_attribute!(
6    /// This attribute is used in Allocate and Refresh requests to specify
7    /// the address type requested by the client
8    /// # Examples
9    ///```rust
10    /// # use stun_rs::attributes::turn::RequestedAddressFamily;
11    /// # use stun_rs::AddressFamily;
12    /// let attr = RequestedAddressFamily::new(AddressFamily::IPv4);
13    /// assert_eq!(attr.family(), AddressFamily::IPv4);
14    ///```
15    RequestedAddressFamily,
16    REQUESTED_ADDRESS_FAMILY,
17);
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use crate::attributes::{DecodeAttributeValue, EncodeAttributeValue};
23    use crate::context::{AttributeDecoderContext, AttributeEncoderContext};
24    use crate::error::StunErrorType;
25    use crate::AddressFamily;
26    use crate::StunAttribute;
27
28    #[test]
29    fn decode_requested_address_family_constructor() {
30        let attr = RequestedAddressFamily::new(AddressFamily::IPv4);
31        assert_eq!(attr.family(), AddressFamily::IPv4);
32
33        let attr = RequestedAddressFamily::from(AddressFamily::IPv6);
34        assert_eq!(attr.family(), AddressFamily::IPv6);
35    }
36
37    #[test]
38    fn decode_requested_address_family_value() {
39        let dummy_msg = [];
40        let buffer = [];
41        let ctx = AttributeDecoderContext::new(None, &dummy_msg, &buffer);
42        let result = RequestedAddressFamily::decode(ctx);
43        assert_eq!(
44            result.expect_err("Error expected"),
45            StunErrorType::SmallBuffer
46        );
47
48        let buffer = [0x01, 0x00, 0x00];
49        let ctx = AttributeDecoderContext::new(None, &dummy_msg, &buffer);
50        let result = RequestedAddressFamily::decode(ctx);
51        assert_eq!(
52            result.expect_err("Error expected"),
53            StunErrorType::SmallBuffer
54        );
55
56        let buffer = [0x01, 0x00, 0x00, 0x00];
57        let ctx = AttributeDecoderContext::new(None, &dummy_msg, &buffer);
58        let (attr, size) =
59            RequestedAddressFamily::decode(ctx).expect("Can not decode RequestedAddressFamily");
60        assert_eq!(size, 4);
61        assert_eq!(attr.family(), AddressFamily::IPv4);
62
63        let buffer = [0x02, 0x01, 0x02, 0x03];
64        let ctx = AttributeDecoderContext::new(None, &dummy_msg, &buffer);
65        let (attr, size) =
66            RequestedAddressFamily::decode(ctx).expect("Can not decode RequestedAddressFamily");
67        assert_eq!(size, 4);
68        assert_eq!(attr.family(), AddressFamily::IPv6);
69    }
70
71    #[test]
72    fn encode_requested_address_family_value() {
73        let attr = RequestedAddressFamily::new(AddressFamily::IPv4);
74        let dummy_msg = [];
75
76        let mut buffer = [];
77        let ctx = AttributeEncoderContext::new(None, &dummy_msg, &mut buffer);
78        let result = attr.encode(ctx);
79        assert_eq!(
80            result.expect_err("Error expected"),
81            StunErrorType::SmallBuffer
82        );
83
84        let mut buffer: [u8; 3] = [0xFF; 3];
85        let ctx = AttributeEncoderContext::new(None, &dummy_msg, &mut buffer);
86        let result = attr.encode(ctx);
87        assert_eq!(
88            result.expect_err("Error expected"),
89            StunErrorType::SmallBuffer
90        );
91
92        let mut buffer: [u8; 4] = [0xFF; 4];
93        let ctx = AttributeEncoderContext::new(None, &dummy_msg, &mut buffer);
94        let result = attr.encode(ctx);
95        assert_eq!(result, Ok(4));
96        let expected_buffer = [0x01, 0x00, 0x00, 0x00];
97        assert_eq!(&buffer[..], &expected_buffer[..]);
98
99        let attr = RequestedAddressFamily::new(AddressFamily::IPv6);
100        let mut buffer: [u8; 4] = [0xFF; 4];
101        let ctx = AttributeEncoderContext::new(None, &dummy_msg, &mut buffer);
102        let result = attr.encode(ctx);
103        assert_eq!(result, Ok(4));
104        let expected_buffer = [0x02, 0x00, 0x00, 0x00];
105        assert_eq!(&buffer[..], &expected_buffer[..]);
106    }
107
108    #[test]
109    fn requested_address_family_stunt_attribute() {
110        let attr =
111            StunAttribute::RequestedAddressFamily(RequestedAddressFamily::new(AddressFamily::IPv6));
112        assert!(attr.is_requested_address_family());
113        assert!(attr.as_requested_address_family().is_ok());
114        assert!(attr.as_unknown().is_err());
115
116        assert!(attr.attribute_type().is_comprehension_required());
117        assert!(!attr.attribute_type().is_comprehension_optional());
118
119        let dbg_fmt = format!("{:?}", attr);
120        assert_eq!(
121            "RequestedAddressFamily(RequestedAddressFamily(IPv6))",
122            dbg_fmt
123        );
124    }
125}