stun_rs/attributes/ice/
ice_controlled.rs

1const ICE_CONTROLLED: u16 = 0x8029;
2
3crate::common::integer_attribute!(
4    /// The controlled agent MUST include the [`IceControlled`]
5    /// attribute in a Binding request. The content of this value
6    /// is used as tiebreaker values when an ICE role
7    /// [conflict](https://datatracker.ietf.org/doc/html/rfc8445#section-7.3.1.1) occurs
8    ///
9    /// # Examples
10    ///```rust
11    /// # use stun_rs::attributes::ice::IceControlled;
12    /// let attr = IceControlled::from(1234);
13    /// assert_eq!(attr, 1234);
14    ///```
15    IceControlled,
16    ICE_CONTROLLED,
17    u64,
18);
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23    use crate::StunAttribute;
24
25    #[test]
26    fn integer_attribute() {
27        let attr = IceControlled::new(1234);
28        assert_eq!(attr, 1234);
29        assert_eq!(1234, attr);
30
31        let attr2 = IceControlled::from(1234);
32        assert_eq!(attr, attr2);
33
34        let attr3 = IceControlled::from(5678);
35        assert_ne!(attr, attr3);
36
37        assert!(attr < 5555);
38        assert!(attr > 1000);
39        assert!(5555 > attr);
40        assert!(1000 < attr);
41
42        assert_eq!(attr.as_ref(), &1234);
43        assert_eq!(attr.partial_cmp(&1234), Some(std::cmp::Ordering::Equal));
44    }
45
46    #[test]
47    fn ice_controlled_stunt_attribute() {
48        let attr = StunAttribute::IceControlled(IceControlled::new(1234));
49        assert!(attr.is_ice_controlled());
50        assert!(attr.as_ice_controlled().is_ok());
51        assert!(attr.as_error_code().is_err());
52
53        assert!(!attr.attribute_type().is_comprehension_required());
54        assert!(attr.attribute_type().is_comprehension_optional());
55
56        let dbg_fmt = format!("{:?}", attr);
57        assert_eq!("IceControlled(IceControlled(1234))", dbg_fmt);
58    }
59}