stun_rs/attributes/turn/
additional_address_family.rs

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