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]
test_generator_interceptor() -> Result<()>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!(r.header.sequence_number, seq_num);
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!(p.nacks[0].packet_id, 13);
58         assert_eq!(p.nacks[0].lost_packets, 0b10); // we want packets: 13, 15 (not packet 17, because skipLastN is setReceived to 2)
59     } else {
60         panic!("single packet RTCP Compound Packet expected");
61     }
62 
63     stream.close().await?;
64 
65     Ok(())
66 }
67