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