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