1 use super::*;
2 use crate::codecs::*;
3 use crate::error::Result;
4 
5 use chrono::prelude::*;
6 use std::time::{Duration, UNIX_EPOCH};
7 
8 #[test]
test_packetizer() -> Result<()>9 fn test_packetizer() -> Result<()> {
10     let multiple_payload = Bytes::from_static(&[0; 128]);
11     let g722 = Box::new(g7xx::G722Payloader {});
12     let seq = Box::new(new_random_sequencer());
13 
14     //use the G722 payloader here, because it's very simple and all 0s is valid G722 data.
15     let mut packetizer = new_packetizer(100, 98, 0x1234ABCD, g722, seq, 90000);
16     let packets = packetizer.packetize(&multiple_payload, 2000)?;
17 
18     if packets.len() != 2 {
19         let mut packet_lengths = String::new();
20         #[allow(clippy::needless_range_loop)]
21         for i in 0..packets.len() {
22             packet_lengths +=
23                 format!("Packet {} length {}\n", i, packets[i].payload.len()).as_str();
24         }
25         panic!(
26             "Generated {} packets instead of 2\n{}",
27             packets.len(),
28             packet_lengths,
29         );
30     }
31     Ok(())
32 }
33 
34 #[test]
test_packetizer_abs_send_time() -> Result<()>35 fn test_packetizer_abs_send_time() -> Result<()> {
36     let g722 = Box::new(g7xx::G722Payloader {});
37     let sequencer = Box::new(new_fixed_sequencer(1234));
38 
39     let time_gen: Option<FnTimeGen> = Some(Arc::new(|| -> SystemTime {
40         let loc = FixedOffset::west_opt(5 * 60 * 60).unwrap(); // UTC-5
41         let t = loc.with_ymd_and_hms(1985, 6, 23, 4, 0, 0).unwrap();
42         UNIX_EPOCH
43             .checked_add(Duration::from_nanos(t.timestamp_nanos() as u64))
44             .unwrap_or(UNIX_EPOCH)
45     }));
46 
47     //use the G722 payloader here, because it's very simple and all 0s is valid G722 data.
48     let mut pktizer = PacketizerImpl {
49         mtu: 100,
50         payload_type: 98,
51         ssrc: 0x1234ABCD,
52         payloader: g722,
53         sequencer,
54         timestamp: 45678,
55         clock_rate: 90000,
56         abs_send_time: 0,
57         time_gen,
58     };
59     pktizer.enable_abs_send_time(1);
60 
61     let payload = Bytes::from_static(&[0x11, 0x12, 0x13, 0x14]);
62     let packets = pktizer.packetize(&payload, 2000)?;
63 
64     let expected = Packet {
65         header: Header {
66             version: 2,
67             padding: false,
68             extension: true,
69             marker: true,
70             payload_type: 98,
71             sequence_number: 1234,
72             timestamp: 45678,
73             ssrc: 0x1234ABCD,
74             csrc: vec![],
75             extension_profile: 0xBEDE,
76             extensions: vec![Extension {
77                 id: 1,
78                 payload: Bytes::from_static(&[0x40, 0, 0]),
79             }],
80         },
81         payload: Bytes::from_static(&[0x11, 0x12, 0x13, 0x14]),
82     };
83 
84     if packets.len() != 1 {
85         panic!("Generated {} packets instead of 1", packets.len())
86     }
87 
88     assert_eq!(packets[0], expected);
89 
90     Ok(())
91 }
92 
93 #[test]
test_packetizer_timestamp_rollover_does_not_panic() -> Result<()>94 fn test_packetizer_timestamp_rollover_does_not_panic() -> Result<()> {
95     let g722 = Box::new(g7xx::G722Payloader {});
96     let seq = Box::new(new_random_sequencer());
97 
98     let payload = Bytes::from_static(&[0; 128]);
99     let mut packetizer = new_packetizer(100, 98, 0x1234ABCD, g722, seq, 90000);
100 
101     packetizer.packetize(&payload, 10)?;
102 
103     packetizer.packetize(&payload, u32::MAX)?;
104 
105     packetizer.skip_samples(u32::MAX);
106 
107     Ok(())
108 }
109