use super::*; use crate::description::common::*; use crate::description::media::*; use crate::description::session::*; fn get_test_session_description() -> SessionDescription { SessionDescription{ media_descriptions: vec![ MediaDescription { media_name: MediaName { media: "video".to_string(), port: RangedPort { value: 51372, range: None, }, protos: vec!["RTP".to_string(), "AVP".to_string()], formats: vec!["120".to_string(), "121".to_string(), "126".to_string(), "97".to_string()], }, attributes: vec![ Attribute::new("fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1".to_string(), None), Attribute::new("fmtp:97 profile-level-id=42e01f;level-asymmetry-allowed=1".to_string(), None), Attribute::new("fmtp:120 max-fs=12288;max-fr=60".to_string(), None), Attribute::new("fmtp:121 max-fs=12288;max-fr=60".to_string(), None), Attribute::new("rtpmap:120 VP8/90000".to_string(), None), Attribute::new("rtpmap:121 VP9/90000".to_string(), None), Attribute::new("rtpmap:126 H264/90000".to_string(), None), Attribute::new("rtpmap:97 H264/90000".to_string(), None), Attribute::new("rtcp-fb:97 ccm fir".to_string(), None), Attribute::new("rtcp-fb:97 nack".to_string(), None), Attribute::new("rtcp-fb:97 nack pli".to_string(), None), ], ..Default::default() }, ], ..Default::default() } } #[test] fn test_get_payload_type_for_vp8() -> Result<()> { let tests = vec![ ( Codec { name: "VP8".to_string(), ..Default::default() }, 120, ), ( Codec { name: "VP9".to_string(), ..Default::default() }, 121, ), ( Codec { name: "H264".to_string(), fmtp: "profile-level-id=42e01f;level-asymmetry-allowed=1".to_string(), ..Default::default() }, 97, ), ( Codec { name: "H264".to_string(), fmtp: "level-asymmetry-allowed=1;profile-level-id=42e01f".to_string(), ..Default::default() }, 97, ), ( Codec { name: "H264".to_string(), fmtp: "profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1" .to_string(), ..Default::default() }, 126, ), ]; for (codec, expected) in tests { let sdp = get_test_session_description(); let actual = sdp.get_payload_type_for_codec(&codec)?; assert_eq!(actual, expected); } Ok(()) } #[test] fn test_get_codec_for_payload_type() -> Result<()> { let tests: Vec<(u8, Codec)> = vec![ ( 120, Codec { payload_type: 120, name: "VP8".to_string(), clock_rate: 90000, fmtp: "max-fs=12288;max-fr=60".to_string(), ..Default::default() }, ), ( 121, Codec { payload_type: 121, name: "VP9".to_string(), clock_rate: 90000, fmtp: "max-fs=12288;max-fr=60".to_string(), ..Default::default() }, ), ( 126, Codec { payload_type: 126, name: "H264".to_string(), clock_rate: 90000, fmtp: "profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1" .to_string(), ..Default::default() }, ), ( 97, Codec { payload_type: 97, name: "H264".to_string(), clock_rate: 90000, fmtp: "profile-level-id=42e01f;level-asymmetry-allowed=1".to_string(), rtcp_feedback: vec![ "ccm fir".to_string(), "nack".to_string(), "nack pli".to_string(), ], ..Default::default() }, ), ]; for (payload_type, expected) in &tests { let sdp = get_test_session_description(); let actual = sdp.get_codec_for_payload_type(*payload_type)?; assert_eq!(actual, *expected); } Ok(()) } #[test] fn test_new_session_id() -> Result<()> { let mut min = 0x7FFFFFFFFFFFFFFFu64; let mut max = 0u64; for _ in 0..10000 { let r = new_session_id(); if r > (1 << 63) - 1 { panic!("Session ID must be less than 2**64-1, got {r}") } if r < min { min = r } if r > max { max = r } } if min > 0x1000000000000000 { panic!("Value around lower boundary was not generated") } if max < 0x7000000000000000 { panic!("Value around upper boundary was not generated") } Ok(()) }