xref: /webrtc/rtp/src/packet/packet_test.rs (revision 259fddd2)
1 use super::*;
2 
3 use std::io::{BufReader, BufWriter};
4 
5 use util::Error;
6 
7 //TODO: BenchmarkMarshal
8 //TODO: BenchmarkUnmarshal
9 
10 #[test]
11 fn test_basic() -> Result<(), Error> {
12     let empty_bytes = vec![];
13     let mut reader = BufReader::new(empty_bytes.as_slice());
14     let result = Packet::unmarshal(&mut reader);
15     if result.is_ok() {
16         assert!(false, "Unmarshal did not error on zero length packet");
17     }
18 
19     let raw_pkt = vec![
20         0x90, 0xe0, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0x00, 0x01, 0x00,
21         0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x36, 0xbe, 0x88, 0x9e,
22     ];
23     let parsed_packet = Packet {
24         header: Header {
25             version: 2,
26             padding: false,
27             extension: true,
28             marker: true,
29             payload_type: 96,
30             sequence_number: 27023,
31             timestamp: 3653407706,
32             ssrc: 476325762,
33             csrc: vec![],
34             extension_profile: 1,
35             extensions: vec![Extension {
36                 id: 0,
37                 payload: vec![0xFF, 0xFF, 0xFF, 0xFF],
38             }],
39             payload_offset: 20,
40             ..Default::default()
41         },
42         payload: vec![0x98, 0x36, 0xbe, 0x88, 0x9e],
43     };
44 
45     let mut reader = BufReader::new(raw_pkt.as_slice());
46     let packet = Packet::unmarshal(&mut reader)?;
47     assert_eq!(
48         packet, parsed_packet,
49         "TestBasic unmarshal: got {}, want {}",
50         packet, parsed_packet
51     );
52 
53     assert_eq!(packet.size(), raw_pkt.len(), "wrong computed marshal size");
54 
55     let mut raw: Vec<u8> = vec![];
56     {
57         let mut writer = BufWriter::<&mut Vec<u8>>::new(raw.as_mut());
58         packet.marshal(&mut writer)?;
59     }
60 
61     assert_eq!(
62         raw.len(),
63         raw_pkt.len(),
64         "wrong raw marshal size {} vs {}",
65         raw.len(),
66         raw_pkt.len()
67     );
68     assert_eq!(
69         raw, raw_pkt,
70         "TestBasic marshal: got {:?}, want {:?}",
71         raw, raw_pkt
72     );
73 
74     Ok(())
75 }
76 
77 #[test]
78 fn test_extension() -> Result<(), Error> {
79     let missing_extension_pkt = vec![
80         0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82,
81     ];
82     let mut reader = BufReader::new(missing_extension_pkt.as_slice());
83     let result = Packet::unmarshal(&mut reader);
84     if result.is_ok() {
85         assert!(
86             false,
87             "Unmarshal did not error on packet with missing extension data"
88         );
89     }
90 
91     let invalid_extension_length_pkt = vec![
92         0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0x99, 0x99, 0x99,
93         0x99,
94     ];
95     let mut reader = BufReader::new(invalid_extension_length_pkt.as_slice());
96     let result = Packet::unmarshal(&mut reader);
97     if result.is_ok() {
98         assert!(
99             false,
100             "Unmarshal did not error on packet with invalid extension length"
101         );
102     }
103 
104     let packet = Packet {
105         header: Header {
106             extension: true,
107             extension_profile: 3,
108             extensions: vec![Extension {
109                 id: 0,
110                 payload: vec![0],
111             }],
112             ..Default::default()
113         },
114         payload: vec![],
115     };
116 
117     let mut raw: Vec<u8> = vec![];
118     {
119         let mut writer = BufWriter::<&mut Vec<u8>>::new(raw.as_mut());
120         let result = packet.marshal(&mut writer);
121         if result.is_ok() {
122             assert!(
123                 false,
124                 "Marshal did not error on packet with invalid extension length"
125             );
126         }
127     }
128 
129     Ok(())
130 }
131 
132 #[test]
133 fn test_rfc8285_one_byte_extension() -> Result<(), Error> {
134     let raw_pkt = vec![
135         0x90, 0xe0, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0xBE, 0xDE, 0x00,
136         0x01, 0x50, 0xAA, 0x00, 0x00, 0x98, 0x36, 0xbe, 0x88, 0x9e,
137     ];
138     let mut reader = BufReader::new(raw_pkt.as_slice());
139     Packet::unmarshal(&mut reader)?;
140 
141     let p = Packet {
142         header: Header {
143             marker: true,
144             extension: true,
145             extension_profile: 0xBEDE,
146             extensions: vec![Extension {
147                 id: 5,
148                 payload: vec![0xAA],
149             }],
150             version: 2,
151             payload_offset: 18,
152             payload_type: 96,
153             sequence_number: 27023,
154             timestamp: 3653407706,
155             ssrc: 476325762,
156             csrc: vec![],
157             ..Default::default()
158         },
159         payload: raw_pkt[20..].to_vec(),
160     };
161 
162     let mut dst: Vec<u8> = vec![];
163     {
164         let mut writer = BufWriter::<&mut Vec<u8>>::new(dst.as_mut());
165         p.marshal(&mut writer)?;
166     }
167     assert_eq!(dst, raw_pkt);
168 
169     Ok(())
170 }
171 
172 #[test]
173 fn test_rfc8285one_byte_two_extension_of_two_bytes() -> Result<(), Error> {
174     //  0                   1                   2                   3
175     //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
176     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
177     // |       0xBE    |    0xDE       |           length=1            |
178     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
179     // |  ID   | L=0   |     data      |  ID   |  L=0  |   data...
180     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
181     let raw_pkt = vec![
182         0x90, 0xe0, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0xBE, 0xDE, 0x00,
183         0x01, 0x10, 0xAA, 0x20, 0xBB, // Payload
184         0x98, 0x36, 0xbe, 0x88, 0x9e,
185     ];
186     let mut reader = BufReader::new(raw_pkt.as_slice());
187     let p = Packet::unmarshal(&mut reader)?;
188 
189     let ext1 = p.header.get_extension(1);
190     let ext1_expect = &[0xAA];
191     if let Some(ext1) = ext1 {
192         assert_eq!(ext1, ext1_expect);
193     } else {
194         assert!(false, "ext1 is none");
195     }
196 
197     let ext2 = p.header.get_extension(2);
198     let ext2_expect = [0xBB];
199     if let Some(ext2) = ext2 {
200         assert_eq!(ext2, ext2_expect);
201     } else {
202         assert!(false, "ext2 is none");
203     }
204 
205     // Test Marshal
206     let p = Packet {
207         header: Header {
208             marker: true,
209             extension: true,
210             extension_profile: 0xBEDE,
211             extensions: vec![
212                 Extension {
213                     id: 1,
214                     payload: vec![0xAA],
215                 },
216                 Extension {
217                     id: 2,
218                     payload: vec![0xBB],
219                 },
220             ],
221             version: 2,
222             payload_offset: 26,
223             payload_type: 96,
224             sequence_number: 27023,
225             timestamp: 3653407706,
226             ssrc: 476325762,
227             csrc: vec![],
228             ..Default::default()
229         },
230         payload: raw_pkt[20..].to_vec(),
231     };
232 
233     let mut dst: Vec<u8> = vec![];
234     {
235         let mut writer = BufWriter::<&mut Vec<u8>>::new(dst.as_mut());
236         p.marshal(&mut writer)?;
237     }
238     assert_eq!(dst, raw_pkt);
239 
240     Ok(())
241 }
242 
243 //TODO: TestRFC8285OneByteMultipleExtensionsWithPadding
244 //TODO: ...
245 //TODO: TestRoundtrip
246