1 use super::*;
2 use bytes::Bytes;
3 
4 #[test]
test_full_intra_request_unmarshal()5 fn test_full_intra_request_unmarshal() {
6     let tests = vec![
7         (
8             "valid",
9             Bytes::from_static(&[
10                 0x84, 0xce, 0x00, 0x03, // v=2, p=0, FMT=4, PSFB, len=3
11                 0x00, 0x00, 0x00, 0x00, // ssrc=0x0
12                 0x4b, 0xc4, 0xfc, 0xb4, // ssrc=0x4bc4fcb4
13                 0x12, 0x34, 0x56, 0x78, // ssrc=0x12345678
14                 0x42, 0x00, 0x00, 0x00, // Seqno=0x42
15             ]),
16             FullIntraRequest {
17                 sender_ssrc: 0x0,
18                 media_ssrc: 0x4bc4fcb4,
19                 fir: vec![FirEntry {
20                     ssrc: 0x12345678,
21                     sequence_number: 0x42,
22                 }],
23             },
24             None,
25         ),
26         (
27             "also valid",
28             Bytes::from_static(&[
29                 0x84, 0xce, 0x00, 0x05, // v=2, p=0, FMT=4, PSFB, len=3
30                 0x00, 0x00, 0x00, 0x00, // ssrc=0x0
31                 0x4b, 0xc4, 0xfc, 0xb4, // ssrc=0x4bc4fcb4
32                 0x12, 0x34, 0x56, 0x78, // ssrc=0x12345678
33                 0x42, 0x00, 0x00, 0x00, // Seqno=0x42
34                 0x98, 0x76, 0x54, 0x32, // ssrc=0x98765432
35                 0x57, 0x00, 0x00, 0x00, // Seqno=0x57
36             ]),
37             FullIntraRequest {
38                 sender_ssrc: 0x0,
39                 media_ssrc: 0x4bc4fcb4,
40                 fir: vec![
41                     FirEntry {
42                         ssrc: 0x12345678,
43                         sequence_number: 0x42,
44                     },
45                     FirEntry {
46                         ssrc: 0x98765432,
47                         sequence_number: 0x57,
48                     },
49                 ],
50             },
51             None,
52         ),
53         (
54             "packet too short",
55             Bytes::from_static(&[0x00, 0x00, 0x00, 0x00]),
56             FullIntraRequest::default(),
57             Some(Error::PacketTooShort),
58         ),
59         (
60             "invalid header",
61             Bytes::from_static(&[
62                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64             ]),
65             FullIntraRequest::default(),
66             Some(Error::BadVersion),
67         ),
68         (
69             "wrong type",
70             Bytes::from_static(&[
71                 0x84, 0xc9, 0x00, 0x03, // v=2, p=0, FMT=4, RR, len=3
72                 0x00, 0x00, 0x00, 0x00, // ssrc=0x0
73                 0x4b, 0xc4, 0xfc, 0xb4, // ssrc=0x4bc4fcb4
74                 0x12, 0x34, 0x56, 0x78, // ssrc=0x12345678
75                 0x42, 0x00, 0x00, 0x00, // Seqno=0x42
76             ]),
77             FullIntraRequest::default(),
78             Some(Error::WrongType),
79         ),
80         (
81             "wrong fmt",
82             Bytes::from_static(&[
83                 0x82, 0xce, 0x00, 0x03, // v=2, p=0, FMT=2, PSFB, len=3
84                 0x00, 0x00, 0x00, 0x00, // ssrc=0x0
85                 0x4b, 0xc4, 0xfc, 0xb4, // ssrc=0x4bc4fcb4
86                 0x12, 0x34, 0x56, 0x78, // ssrc=0x12345678
87                 0x42, 0x00, 0x00, 0x00, // Seqno=0x42
88             ]),
89             FullIntraRequest::default(),
90             Some(Error::WrongType),
91         ),
92     ];
93 
94     for (name, mut data, want, want_error) in tests {
95         let got = FullIntraRequest::unmarshal(&mut data);
96 
97         assert_eq!(
98             got.is_err(),
99             want_error.is_some(),
100             "Unmarshal {name} rr: err = {got:?}, want {want_error:?}"
101         );
102 
103         if let Some(err) = want_error {
104             let got_err = got.err().unwrap();
105             assert_eq!(
106                 err, got_err,
107                 "Unmarshal {name} rr: err = {got_err:?}, want {err:?}",
108             );
109         } else {
110             let actual = got.unwrap();
111             assert_eq!(
112                 actual, want,
113                 "Unmarshal {name} rr: got {actual:?}, want {want:?}"
114             );
115         }
116     }
117 }
118 
119 #[test]
test_full_intra_request_round_trip()120 fn test_full_intra_request_round_trip() {
121     let tests: Vec<(&str, FullIntraRequest, Option<Error>)> = vec![
122         (
123             "valid",
124             FullIntraRequest {
125                 sender_ssrc: 1,
126                 media_ssrc: 2,
127                 fir: vec![FirEntry {
128                     ssrc: 3,
129                     sequence_number: 42,
130                 }],
131             },
132             None,
133         ),
134         (
135             "also valid",
136             FullIntraRequest {
137                 sender_ssrc: 5000,
138                 media_ssrc: 6000,
139                 fir: vec![FirEntry {
140                     ssrc: 3,
141                     sequence_number: 57,
142                 }],
143             },
144             None,
145         ),
146     ];
147 
148     for (name, want, want_error) in tests {
149         let got = want.marshal();
150 
151         assert_eq!(
152             got.is_ok(),
153             want_error.is_none(),
154             "Marshal {name}: err = {got:?}, want {want_error:?}"
155         );
156 
157         if let Some(err) = want_error {
158             let got_err = got.err().unwrap();
159             assert_eq!(
160                 err, got_err,
161                 "Unmarshal {name} rr: err = {got_err:?}, want {err:?}",
162             );
163         } else {
164             let mut data = got.ok().unwrap();
165             let actual = FullIntraRequest::unmarshal(&mut data)
166                 .unwrap_or_else(|_| panic!("Unmarshal {name}"));
167 
168             assert_eq!(
169                 actual, want,
170                 "{name} round trip: got {actual:?}, want {want:?}"
171             )
172         }
173     }
174 }
175 
176 #[test]
test_full_intra_request_unmarshal_header()177 fn test_full_intra_request_unmarshal_header() {
178     let tests = vec![(
179         "valid header",
180         Bytes::from_static(&[
181             0x84, 0xce, 0x00, 0x02, // v=2, p=0, FMT=1, PSFB, len=1
182             0x00, 0x00, 0x00, 0x00, // ssrc=0x0
183             0x4b, 0xc4, 0xfc, 0xb4, 0x00, 0x00, 0x00, 0x00, // ssrc=0x4bc4fcb4
184         ]),
185         Header {
186             count: FORMAT_FIR,
187             packet_type: PacketType::PayloadSpecificFeedback,
188             length: 2,
189             ..Default::default()
190         },
191     )];
192 
193     for (name, mut data, want) in tests {
194         let result = FullIntraRequest::unmarshal(&mut data);
195 
196         assert!(
197             result.is_ok(),
198             "Unmarshal header {name} rr: want {result:?}",
199         );
200 
201         match result {
202             Err(_) => continue,
203 
204             Ok(fir) => {
205                 let h = fir.header();
206 
207                 assert_eq!(
208                     h, want,
209                     "Unmarshal header {name} rr: got {h:?}, want {want:?}"
210                 )
211             }
212         }
213     }
214 }
215