1 use super::*; 2 use crate::mock::mock_stream::MockStream; 3 use crate::stream_info::RTCPFeedback; 4 use crate::test::timeout_or_fail; 5 6 use rtcp::transport_feedbacks::transport_layer_nack::TransportLayerNack; 7 8 #[tokio::test] 9 async fn test_generator_interceptor() -> Result<()> { 10 const INTERVAL: Duration = Duration::from_millis(10); 11 let icpr: Arc<dyn Interceptor + Send + Sync> = Generator::builder() 12 .with_log2_size_minus_6(0) 13 .with_skip_last_n(2) 14 .with_interval(INTERVAL) 15 .build("")?; 16 17 let stream = MockStream::new( 18 &StreamInfo { 19 ssrc: 1, 20 rtcp_feedback: vec![RTCPFeedback { 21 typ: "nack".to_owned(), 22 ..Default::default() 23 }], 24 ..Default::default() 25 }, 26 icpr, 27 ) 28 .await; 29 30 for seq_num in [10, 11, 12, 14, 16, 18] { 31 stream 32 .receive_rtp(rtp::packet::Packet { 33 header: rtp::header::Header { 34 sequence_number: seq_num, 35 ..Default::default() 36 }, 37 ..Default::default() 38 }) 39 .await; 40 41 let r = timeout_or_fail(Duration::from_millis(10), stream.read_rtp()) 42 .await 43 .expect("A read packet") 44 .expect("Not an error"); 45 assert_eq!(seq_num, r.header.sequence_number); 46 } 47 48 tokio::time::sleep(INTERVAL * 2).await; // wait for at least 2 nack packets 49 50 // ignore the first nack, it might only contain the sequence id 13 as missing 51 let _ = stream.written_rtcp().await; 52 53 let r = timeout_or_fail(Duration::from_millis(10), stream.written_rtcp()) 54 .await 55 .expect("Write rtcp"); 56 if let Some(p) = r[0].as_any().downcast_ref::<TransportLayerNack>() { 57 assert_eq!(13, p.nacks[0].packet_id); 58 assert_eq!(0b10, p.nacks[0].lost_packets); // we want packets: 13, 15 (not packet 17, because skipLastN is setReceived to 2) 59 } else { 60 assert!(false, "single packet RTCP Compound Packet expected"); 61 } 62 63 stream.close().await?; 64 65 Ok(()) 66 } 67