1 use rtp::{header::Header, packet::Packet, packetizer::Depacketizer};
2 
3 use super::*;
4 
5 // Turns u8 integers into Bytes Array
6 macro_rules! bytes {
7     ($($item:expr),*) => ({
8         static STATIC_SLICE: &'static [u8] = &[$($item), *];
9         Bytes::from_static(STATIC_SLICE)
10     });
11 }
12 #[derive(Default)]
13 pub struct SampleBuilderTest {
14     message: String,
15     packets: Vec<Packet>,
16     with_head_checker: bool,
17     head_bytes: Vec<bytes::Bytes>,
18     samples: Vec<Sample>,
19     max_late: u16,
20     max_late_timestamp: Duration,
21     extra_pop_attempts: usize,
22 }
23 
24 pub struct FakeDepacketizer {
25     head_checker: bool,
26     head_bytes: Vec<bytes::Bytes>,
27 }
28 
29 impl FakeDepacketizer {
new() -> Self30     fn new() -> Self {
31         Self {
32             head_checker: false,
33             head_bytes: vec![],
34         }
35     }
36 }
37 
38 impl Depacketizer for FakeDepacketizer {
depacketize(&mut self, b: &Bytes) -> std::result::Result<bytes::Bytes, rtp::Error>39     fn depacketize(&mut self, b: &Bytes) -> std::result::Result<bytes::Bytes, rtp::Error> {
40         Ok(b.clone())
41     }
42 
43     /// Checks if the packet is at the beginning of a partition.  This
44     /// should return false if the result could not be determined, in
45     /// which case the caller will detect timestamp discontinuities.
is_partition_head(&self, payload: &Bytes) -> bool46     fn is_partition_head(&self, payload: &Bytes) -> bool {
47         if !self.head_checker {
48             // from .go: simulates a bug in 3.0 version, the tests should not assume the bug
49             return true;
50         }
51 
52         for b in &self.head_bytes {
53             if *payload == b {
54                 return true;
55             }
56         }
57         false
58     }
59 
60     /// Checks if the packet is at the end of a partition.  This should
61     /// return false if the result could not be determined.
is_partition_tail(&self, marker: bool, _payload: &Bytes) -> bool62     fn is_partition_tail(&self, marker: bool, _payload: &Bytes) -> bool {
63         marker
64     }
65 }
66 
67 #[test]
test_sample_builder()68 pub fn test_sample_builder() {
69     #![allow(clippy::needless_update)]
70     let test_data: Vec<SampleBuilderTest> = vec![
71         SampleBuilderTest {
72             #[rustfmt::skip]
73             message: "Sample builder shouldn't emit anything if only one RTP packet has been pushed".into(),
74             packets: vec![Packet {
75                 header: Header {
76                     sequence_number: 5000,
77                     timestamp: 5,
78                     ..Default::default()
79                 },
80                 payload: bytes!(1),
81                 ..Default::default()
82             }],
83             samples: vec![],
84             max_late: 50,
85             max_late_timestamp: Duration::from_secs(0),
86             ..Default::default()
87         },
88         SampleBuilderTest {
89             #[rustfmt::skip]
90             message: "Sample builder shouldn't emit anything if only one RTP packet has been pushed even if the marker bit is set".into(),
91             packets: vec![Packet {
92                 header: Header {
93                     sequence_number: 5000,
94                     timestamp: 5,
95                     marker: true,
96                     ..Default::default()
97                 },
98                 payload: bytes!(1),
99                 ..Default::default()
100             }],
101             samples: vec![],
102             max_late: 50,
103             max_late_timestamp: Duration::from_secs(0),
104             ..Default::default()
105         },
106         SampleBuilderTest {
107             #[rustfmt::skip]
108             message: "Sample builder should emit two packets, we had three packets with unique timestamps".into(),
109             packets: vec![
110                 Packet {
111                     // First packet
112                     header: Header {
113                         sequence_number: 5000,
114                         timestamp: 5,
115                         ..Default::default()
116                     },
117                     payload: bytes!(1),
118                     ..Default::default()
119                 },
120                 Packet {
121                     // Second packet
122                     header: Header {
123                         sequence_number: 5001,
124                         timestamp: 6,
125                         ..Default::default()
126                     },
127                     payload: bytes!(2),
128                     ..Default::default()
129                 },
130                 Packet {
131                     // Third packet
132                     header: Header {
133                         sequence_number: 5002,
134                         timestamp: 7,
135                         ..Default::default()
136                     },
137                     payload: bytes!(3),
138                     ..Default::default()
139                 },
140             ],
141             samples: vec![
142                 Sample {
143                     // First sample
144                     data: bytes!(1),
145                     duration: Duration::from_secs(1), // technically this is the default value, but since it was in .go source....
146                     packet_timestamp: 5,
147                     ..Default::default()
148                 },
149                 Sample {
150                     // Second sample
151                     data: bytes!(2),
152                     duration: Duration::from_secs(1),
153                     packet_timestamp: 6,
154                     ..Default::default()
155                 },
156             ],
157             max_late: 50,
158             max_late_timestamp: Duration::from_secs(0),
159             ..Default::default()
160         },
161         SampleBuilderTest {
162             #[rustfmt::skip]
163             message: "Sample builder should emit one packet, we had a packet end of sequence marker and run out of space".into(),
164             packets: vec![
165                 Packet {
166                     // First packet
167                     header: Header {
168                         sequence_number: 5000,
169                         timestamp: 5,
170                         marker: true,
171                         ..Default::default()
172                     },
173                     payload: bytes!(1),
174                     ..Default::default()
175                 },
176                 Packet {
177                     // Second packet
178                     header: Header {
179                         sequence_number: 5002,
180                         timestamp: 7,
181                         ..Default::default()
182                     },
183                     payload: bytes!(2),
184                     ..Default::default()
185                 },
186                 Packet {
187                     // Third packet
188                     header: Header {
189                         sequence_number: 5004,
190                         timestamp: 9,
191                         ..Default::default()
192                     },
193                     payload: bytes!(3),
194                     ..Default::default()
195                 },
196                 Packet {
197                     // Fourth packet
198                     header: Header {
199                         sequence_number: 5006,
200                         timestamp: 11,
201                         ..Default::default()
202                     },
203                     payload: bytes!(4),
204                     ..Default::default()
205                 },
206                 Packet {
207                     // Fifth packet
208                     header: Header {
209                         sequence_number: 5008,
210                         timestamp: 13,
211                         ..Default::default()
212                     },
213                     payload: bytes!(5),
214                     ..Default::default()
215                 },
216                 Packet {
217                     // Sixth packet
218                     header: Header {
219                         sequence_number: 5010,
220                         timestamp: 15,
221                         ..Default::default()
222                     },
223                     payload: bytes!(6),
224                     ..Default::default()
225                 },
226                 Packet {
227                     // Seventh packet
228                     header: Header {
229                         sequence_number: 5012,
230                         timestamp: 17,
231                         ..Default::default()
232                     },
233                     payload: bytes!(7),
234                     ..Default::default()
235                 },
236             ],
237             samples: vec![Sample {
238                 // First sample
239                 data: bytes!(1),
240                 duration: Duration::from_secs(2),
241                 packet_timestamp: 5,
242                 ..Default::default()
243             }],
244             max_late: 5,
245             max_late_timestamp: Duration::from_secs(0),
246             ..Default::default()
247         },
248         SampleBuilderTest {
249             #[rustfmt::skip]
250             message: "Sample builder shouldn't emit any packet, we do not have a valid end of sequence and run out of space".into(),
251             packets: vec![
252                 Packet {
253                     // First packet
254                     header: Header {
255                         sequence_number: 5000,
256                         timestamp: 5,
257                         ..Default::default()
258                     },
259                     payload: bytes!(1),
260                     ..Default::default()
261                 },
262                 Packet {
263                     // Second packet
264                     header: Header {
265                         sequence_number: 5002,
266                         timestamp: 7,
267                         ..Default::default()
268                     },
269                     payload: bytes!(2),
270                     ..Default::default()
271                 },
272                 Packet {
273                     // Third packet
274                     header: Header {
275                         sequence_number: 5004,
276                         timestamp: 9,
277                         ..Default::default()
278                     },
279                     payload: bytes!(3),
280                     ..Default::default()
281                 },
282                 Packet {
283                     // Fourth packet
284                     header: Header {
285                         sequence_number: 5006,
286                         timestamp: 11,
287                         ..Default::default()
288                     },
289                     payload: bytes!(4),
290                     ..Default::default()
291                 },
292                 Packet {
293                     // Fifth packet
294                     header: Header {
295                         sequence_number: 5008,
296                         timestamp: 13,
297                         ..Default::default()
298                     },
299                     payload: bytes!(5),
300                     ..Default::default()
301                 },
302                 Packet {
303                     // Sixth packet
304                     header: Header {
305                         sequence_number: 5010,
306                         timestamp: 15,
307                         ..Default::default()
308                     },
309                     payload: bytes!(6),
310                     ..Default::default()
311                 },
312                 Packet {
313                     // Seventh packet
314                     header: Header {
315                         sequence_number: 5012,
316                         timestamp: 17,
317                         ..Default::default()
318                     },
319                     payload: bytes!(7),
320                     ..Default::default()
321                 },
322             ],
323             samples: vec![],
324             max_late: 5,
325             max_late_timestamp: Duration::from_secs(0),
326             ..Default::default()
327         },
328         SampleBuilderTest {
329             #[rustfmt::skip]
330             message: "Sample builder should emit one packet, we had a packet end of sequence marker and run out of space".into(),
331             packets: vec![
332                 Packet {
333                     // First packet
334                     header: Header {
335                         sequence_number: 5000,
336                         timestamp: 5,
337                         marker: true,
338                         ..Default::default()
339                     },
340                     payload: bytes!(1),
341                     ..Default::default()
342                 },
343                 Packet {
344                     // Second packet
345                     header: Header {
346                         sequence_number: 5002,
347                         timestamp: 7,
348                         marker: true,
349                         ..Default::default()
350                     },
351                     payload: bytes!(2),
352                     ..Default::default()
353                 },
354                 Packet {
355                     // Third packet
356                     header: Header {
357                         sequence_number: 5004,
358                         timestamp: 9,
359                         ..Default::default()
360                     },
361                     payload: bytes!(3),
362                     ..Default::default()
363                 },
364                 Packet {
365                     // Fourth packet
366                     header: Header {
367                         sequence_number: 5006,
368                         timestamp: 11,
369                         ..Default::default()
370                     },
371                     payload: bytes!(4),
372                     ..Default::default()
373                 },
374                 Packet {
375                     // Fifth packet
376                     header: Header {
377                         sequence_number: 5008,
378                         timestamp: 13,
379                         ..Default::default()
380                     },
381                     payload: bytes!(5),
382                     ..Default::default()
383                 },
384                 Packet {
385                     // Sixth packet
386                     header: Header {
387                         sequence_number: 5010,
388                         timestamp: 15,
389                         ..Default::default()
390                     },
391                     payload: bytes!(6),
392                     ..Default::default()
393                 },
394                 Packet {
395                     // Seventh packet
396                     header: Header {
397                         sequence_number: 5012,
398                         timestamp: 17,
399                         ..Default::default()
400                     },
401                     payload: bytes!(7),
402                     ..Default::default()
403                 },
404             ],
405             samples: vec![
406                 Sample {
407                     // First (dropped) sample
408                     data: bytes!(1),
409                     duration: Duration::from_secs(2),
410                     packet_timestamp: 5,
411                     ..Default::default()
412                 },
413                 Sample {
414                     // First correct sample
415                     data: bytes!(2),
416                     duration: Duration::from_secs(2),
417                     packet_timestamp: 7,
418                     prev_dropped_packets: 1,
419                     ..Default::default()
420                 },
421             ],
422             max_late: 5,
423             max_late_timestamp: Duration::from_secs(0),
424             ..Default::default()
425         },
426         SampleBuilderTest {
427             #[rustfmt::skip]
428             message: "Sample builder should emit one packet, we had two packets but with duplicate timestamps".into(),
429             packets: vec![
430                 Packet {
431                     // First packet
432                     header: Header {
433                         sequence_number: 5000,
434                         timestamp: 5,
435                         ..Default::default()
436                     },
437                     payload: bytes!(1),
438                     ..Default::default()
439                 },
440                 Packet {
441                     // Second packet
442                     header: Header {
443                         sequence_number: 5001,
444                         timestamp: 6,
445                         ..Default::default()
446                     },
447                     payload: bytes!(2),
448                     ..Default::default()
449                 },
450                 Packet {
451                     // Third packet
452                     header: Header {
453                         sequence_number: 5002,
454                         timestamp: 6,
455                         ..Default::default()
456                     },
457                     payload: bytes!(3),
458                     ..Default::default()
459                 },
460                 Packet {
461                     // Fourth packet
462                     header: Header {
463                         sequence_number: 5003,
464                         timestamp: 7,
465                         ..Default::default()
466                     },
467                     payload: bytes!(4),
468                     ..Default::default()
469                 },
470             ],
471             samples: vec![
472                 Sample {
473                     // First sample
474                     data: bytes!(1),
475                     duration: Duration::from_secs(1),
476                     packet_timestamp: 5,
477                     ..Default::default()
478                 },
479                 Sample {
480                     // Second (duplicate) correct sample
481                     data: bytes!(2, 3),
482                     duration: Duration::from_secs(1),
483                     packet_timestamp: 6,
484                     ..Default::default()
485                 },
486             ],
487             max_late: 50,
488             max_late_timestamp: Duration::from_secs(0),
489             ..Default::default()
490         },
491         SampleBuilderTest {
492             #[rustfmt::skip]
493             message: "Sample builder shouldn't emit a packet because we have a gap before a valid one".into(),
494             packets: vec![
495                 Packet {
496                     // First packet
497                     header: Header {
498                         sequence_number: 5000,
499                         timestamp: 5,
500                         marker: true,
501                         ..Default::default()
502                     },
503                     payload: bytes!(1),
504                     ..Default::default()
505                 },
506                 Packet {
507                     // Second packet
508                     header: Header {
509                         sequence_number: 5007,
510                         timestamp: 6,
511                         marker: true,
512                         ..Default::default()
513                     },
514                     payload: bytes!(2),
515                     ..Default::default()
516                 },
517                 Packet {
518                     // Third packet
519                     header: Header {
520                         sequence_number: 5008,
521                         timestamp: 7,
522                         ..Default::default()
523                     },
524                     payload: bytes!(3),
525                     ..Default::default()
526                 },
527             ],
528             samples: vec![],
529             max_late: 50,
530             max_late_timestamp: Duration::from_secs(0),
531             ..Default::default()
532         },
533         SampleBuilderTest {
534             #[rustfmt::skip]
535             message: "Sample builder shouldn't emit a packet after a gap as there are gaps and have not reached maxLate yet".into(),
536             packets: vec![
537                 Packet {
538                     // First packet
539                     header: Header {
540                         sequence_number: 5000,
541                         timestamp: 5,
542                         marker: true,
543                         ..Default::default()
544                     },
545                     payload: bytes!(1),
546                     ..Default::default()
547                 },
548                 Packet {
549                     // Second packet
550                     header: Header {
551                         sequence_number: 5007,
552                         timestamp: 6,
553                         marker: true,
554                         ..Default::default()
555                     },
556                     payload: bytes!(2),
557                     ..Default::default()
558                 },
559                 Packet {
560                     // Third packet
561                     header: Header {
562                         sequence_number: 5008,
563                         timestamp: 7,
564                         ..Default::default()
565                     },
566                     payload: bytes!(3),
567                     ..Default::default()
568                 },
569             ],
570             with_head_checker: true,
571             head_bytes: vec![bytes!(2)],
572             samples: vec![],
573             max_late: 50,
574             max_late_timestamp: Duration::from_secs(0),
575             ..Default::default()
576         },
577         SampleBuilderTest {
578             #[rustfmt::skip]
579             message: "Sample builder shouldn't emit a packet after a gap if PartitionHeadChecker doesn't assume it head".into(),
580             packets: vec![
581                 Packet {
582                     // First packet
583                     header: Header {
584                         sequence_number: 5000,
585                         timestamp: 5,
586                         marker: true,
587                         ..Default::default()
588                     },
589                     payload: bytes!(1),
590                     ..Default::default()
591                 },
592                 Packet {
593                     // Second packet
594                     header: Header {
595                         sequence_number: 5007,
596                         timestamp: 6,
597                         marker: true,
598                         ..Default::default()
599                     },
600                     payload: bytes!(2),
601                     ..Default::default()
602                 },
603                 Packet {
604                     // Third packet
605                     header: Header {
606                         sequence_number: 5008,
607                         timestamp: 7,
608                         ..Default::default()
609                     },
610                     payload: bytes!(3),
611                     ..Default::default()
612                 },
613             ],
614             with_head_checker: true,
615             head_bytes: vec![],
616             samples: vec![],
617             max_late: 50,
618             max_late_timestamp: Duration::from_secs(0),
619             ..Default::default()
620         },
621         SampleBuilderTest {
622             #[rustfmt::skip]
623             message: "Sample builder should emit multiple valid packets".into(),
624             packets: vec![
625                 Packet {
626                     // First packet
627                     header: Header {
628                         sequence_number: 5000,
629                         timestamp: 1,
630                         ..Default::default()
631                     },
632                     payload: bytes!(1),
633                     ..Default::default()
634                 },
635                 Packet {
636                     // Second packet
637                     header: Header {
638                         sequence_number: 5001,
639                         timestamp: 2,
640                         ..Default::default()
641                     },
642                     payload: bytes!(2),
643                     ..Default::default()
644                 },
645                 Packet {
646                     // Third packet
647                     header: Header {
648                         sequence_number: 5002,
649                         timestamp: 3,
650                         ..Default::default()
651                     },
652                     payload: bytes!(3),
653                     ..Default::default()
654                 },
655                 Packet {
656                     // Fourth packet
657                     header: Header {
658                         sequence_number: 5003,
659                         timestamp: 4,
660                         ..Default::default()
661                     },
662                     payload: bytes!(4),
663                     ..Default::default()
664                 },
665                 Packet {
666                     // Fifth packet
667                     header: Header {
668                         sequence_number: 5004,
669                         timestamp: 5,
670                         ..Default::default()
671                     },
672                     payload: bytes!(5),
673                     ..Default::default()
674                 },
675                 Packet {
676                     // Sixth packet
677                     header: Header {
678                         sequence_number: 5005,
679                         timestamp: 6,
680                         ..Default::default()
681                     },
682                     payload: bytes!(6),
683                     ..Default::default()
684                 },
685             ],
686             samples: vec![
687                 Sample {
688                     // First sample
689                     data: bytes!(1),
690                     duration: Duration::from_secs(1),
691                     packet_timestamp: 1,
692                     ..Default::default()
693                 },
694                 Sample {
695                     // Second sample
696                     data: bytes!(2),
697                     duration: Duration::from_secs(1),
698                     packet_timestamp: 2,
699                     ..Default::default()
700                 },
701                 Sample {
702                     // Third sample
703                     data: bytes!(3),
704                     duration: Duration::from_secs(1),
705                     packet_timestamp: 3,
706                     ..Default::default()
707                 },
708                 Sample {
709                     // Fourth sample
710                     data: bytes!(4),
711                     duration: Duration::from_secs(1),
712                     packet_timestamp: 4,
713                     ..Default::default()
714                 },
715                 Sample {
716                     // Fifth sample
717                     data: bytes!(5),
718                     duration: Duration::from_secs(1),
719                     packet_timestamp: 5,
720                     ..Default::default()
721                 },
722             ],
723             max_late: 50,
724             max_late_timestamp: Duration::from_secs(0),
725             ..Default::default()
726         },
727         SampleBuilderTest {
728             #[rustfmt::skip]
729             message: "Sample builder should skip timestamps too old".into(),
730             packets: vec![
731                 Packet {
732                     // First packet
733                     header: Header {
734                         sequence_number: 5000,
735                         timestamp: 1,
736                         ..Default::default()
737                     },
738                     payload: bytes!(1),
739                     ..Default::default()
740                 },
741                 Packet {
742                     // Second packet
743                     header: Header {
744                         sequence_number: 5001,
745                         timestamp: 2,
746                         ..Default::default()
747                     },
748                     payload: bytes!(2),
749                     ..Default::default()
750                 },
751                 Packet {
752                     // Third packet
753                     header: Header {
754                         sequence_number: 5002,
755                         timestamp: 3,
756                         ..Default::default()
757                     },
758                     payload: bytes!(3),
759                     ..Default::default()
760                 },
761                 Packet {
762                     // Fourth packet
763                     header: Header {
764                         sequence_number: 5013,
765                         timestamp: 4000,
766                         ..Default::default()
767                     },
768                     payload: bytes!(4),
769                     ..Default::default()
770                 },
771                 Packet {
772                     // Fifth packet
773                     header: Header {
774                         sequence_number: 5014,
775                         timestamp: 4000,
776                         ..Default::default()
777                     },
778                     payload: bytes!(5),
779                     ..Default::default()
780                 },
781                 Packet {
782                     // Sixth packet
783                     header: Header {
784                         sequence_number: 5015,
785                         timestamp: 4002,
786                         ..Default::default()
787                     },
788                     payload: bytes!(6),
789                     ..Default::default()
790                 },
791                 Packet {
792                     // Seventh packet
793                     header: Header {
794                         sequence_number: 5016,
795                         timestamp: 7000,
796                         ..Default::default()
797                     },
798                     payload: bytes!(4),
799                     ..Default::default()
800                 },
801                 Packet {
802                     // Eigth packet
803                     header: Header {
804                         sequence_number: 5017,
805                         timestamp: 7001,
806                         ..Default::default()
807                     },
808                     payload: bytes!(5),
809                     ..Default::default()
810                 },
811             ],
812             samples: vec![Sample {
813                 // First sample
814                 data: bytes!(4, 5),
815                 duration: Duration::from_secs(2),
816                 packet_timestamp: 4000,
817                 prev_dropped_packets: 12,
818                 ..Default::default()
819             }],
820             with_head_checker: true,
821             head_bytes: vec![bytes!(4)],
822             max_late: 50,
823             max_late_timestamp: Duration::from_secs(2000),
824             ..Default::default()
825         },
826         // This test is based on observed RTP packet streams from Chrome. libWebRTC inserts padding
827         // packets to keep send rates steady, these are not important for sample building but we
828         // should identify them as padding packets to differentiate them from lost packets.
829         SampleBuilderTest {
830             #[rustfmt::skip]
831             message: "Sample builder should recognise padding packets".into(),
832             packets: vec![
833                 Packet {
834                     // First packet
835                     header: Header {
836                         sequence_number: 5000,
837                         timestamp: 1,
838                         ..Default::default()
839                     },
840                     payload: bytes!(1),
841                     ..Default::default()
842                 },
843                 Packet {
844                     // Second packet
845                     header: Header {
846                         sequence_number: 5001,
847                         timestamp: 1,
848                         ..Default::default()
849                     },
850                     payload: bytes!(2),
851                     ..Default::default()
852                 },
853                 Packet {
854                     // Third packet
855                     header: Header {
856                         sequence_number: 5002,
857                         timestamp: 1,
858                         marker: true,
859                         ..Default::default()
860                     },
861                     payload: bytes!(3),
862                     ..Default::default()
863                 },
864                 Packet {
865                     // Padding packet 1
866                     header: Header {
867                         sequence_number: 5003,
868                         timestamp: 1,
869                         ..Default::default()
870                     },
871                     payload: Bytes::from_static(&[]),
872                     ..Default::default()
873                 },
874                 Packet {
875                     // Padding packet 2
876                     header: Header {
877                         sequence_number: 5004,
878                         timestamp: 1,
879                         ..Default::default()
880                     },
881                     payload: Bytes::from_static(&[]),
882                     ..Default::default()
883                 },
884                 Packet {
885                     // Sixth packet
886                     header: Header {
887                         sequence_number: 5005,
888                         timestamp: 2,
889                         ..Default::default()
890                     },
891                     payload: bytes!(1),
892                     ..Default::default()
893                 },
894                 Packet {
895                     // Seventh packet
896                     header: Header {
897                         sequence_number: 5006,
898                         timestamp: 2,
899                         marker: true,
900                         ..Default::default()
901                     },
902                     payload: bytes!(7),
903                     ..Default::default()
904                 },
905                 Packet {
906                     // Seventh packet
907                     header: Header {
908                         sequence_number: 5007,
909                         timestamp: 3,
910                         ..Default::default()
911                     },
912                     payload: bytes!(1),
913                     ..Default::default()
914                 },
915             ],
916             samples: vec![
917                 Sample {
918                     // First sample
919                     data: bytes!(1, 2, 3),
920                     duration: Duration::from_secs(0),
921                     packet_timestamp: 1,
922                     prev_dropped_packets: 0,
923                     ..Default::default()
924                 },
925                 Sample {
926                     // Second sample
927                     data: bytes!(1, 7),
928                     duration: Duration::from_secs(1),
929                     packet_timestamp: 2,
930                     prev_dropped_packets: 2,
931                     prev_padding_packets: 2,
932                     ..Default::default()
933                 },
934             ],
935             with_head_checker: true,
936             head_bytes: vec![bytes!(1)],
937             max_late: 50,
938             max_late_timestamp: Duration::from_secs(2000),
939             extra_pop_attempts: 1,
940             ..Default::default()
941         },
942         // This test is based on observed RTP packet streams when screen sharing in Chrome.
943         SampleBuilderTest {
944             #[rustfmt::skip]
945             message: "Sample builder should recognise padding packets when combined with max_late_timestamp".into(),
946             packets: vec![
947                 Packet {
948                     // First packet
949                     header: Header {
950                         sequence_number: 5000,
951                         timestamp: 1,
952                         ..Default::default()
953                     },
954                     payload: bytes!(1),
955                     ..Default::default()
956                 },
957                 Packet {
958                     // Second packet
959                     header: Header {
960                         sequence_number: 5001,
961                         timestamp: 1,
962                         ..Default::default()
963                     },
964                     payload: bytes!(2),
965                     ..Default::default()
966                 },
967                 Packet {
968                     // Third packet
969                     header: Header {
970                         sequence_number: 5002,
971                         timestamp: 1,
972                         marker: true,
973                         ..Default::default()
974                     },
975                     payload: bytes!(3),
976                     ..Default::default()
977                 },
978                 Packet {
979                     // Padding packet 1
980                     header: Header {
981                         sequence_number: 5003,
982                         timestamp: 1,
983                         ..Default::default()
984                     },
985                     payload: Bytes::from_static(&[]),
986                     ..Default::default()
987                 },
988                 Packet {
989                     // Padding packet 2
990                     header: Header {
991                         sequence_number: 5004,
992                         timestamp: 1,
993                         ..Default::default()
994                     },
995                     payload: Bytes::from_static(&[]),
996                     ..Default::default()
997                 },
998                 Packet {
999                     // Sixth packet
1000                     header: Header {
1001                         sequence_number: 5005,
1002                         timestamp: 3,
1003                         ..Default::default()
1004                     },
1005                     payload: bytes!(1),
1006                     ..Default::default()
1007                 },
1008                 Packet {
1009                     // Seventh packet
1010                     header: Header {
1011                         sequence_number: 5006,
1012                         timestamp: 3,
1013                         marker: true,
1014                         ..Default::default()
1015                     },
1016                     payload: bytes!(7),
1017                     ..Default::default()
1018                 },
1019                 Packet {
1020                     // Seventh packet
1021                     header: Header {
1022                         sequence_number: 5007,
1023                         timestamp: 4,
1024                         ..Default::default()
1025                     },
1026                     payload: bytes!(1),
1027                     ..Default::default()
1028                 },
1029             ],
1030             samples: vec![
1031                 Sample {
1032                     // First sample
1033                     data: bytes!(1, 2, 3),
1034                     duration: Duration::from_secs(0),
1035                     packet_timestamp: 1,
1036                     prev_dropped_packets: 0,
1037                     ..Default::default()
1038                 },
1039                 Sample {
1040                     // Second sample
1041                     data: bytes!(1, 7),
1042                     duration: Duration::from_secs(1),
1043                     packet_timestamp: 3,
1044                     prev_dropped_packets: 2,
1045                     prev_padding_packets: 2,
1046                     ..Default::default()
1047                 },
1048             ],
1049             with_head_checker: true,
1050             head_bytes: vec![bytes!(1)],
1051             max_late: 50,
1052             max_late_timestamp: Duration::from_millis(1050),
1053             extra_pop_attempts: 1,
1054             ..Default::default()
1055         },
1056         // This test is based on observed RTP packet streams when screen sharing in Chrome.
1057         SampleBuilderTest {
1058             #[rustfmt::skip]
1059             message: "Sample builder should build a sample out of a packet that's both start and end".into(),
1060             packets: vec![
1061                 Packet {
1062                     header: Header {
1063                         sequence_number: 5000,
1064                         timestamp: 1,
1065                         marker: true,
1066                         ..Default::default()
1067                     },
1068                     payload: bytes!(1),
1069                     ..Default::default()
1070                 },
1071                 Packet {
1072                     header: Header {
1073                         sequence_number: 5001,
1074                         timestamp: 2,
1075                         ..Default::default()
1076                     },
1077                     payload: bytes!(1),
1078                     ..Default::default()
1079                 },
1080             ],
1081             samples: vec![Sample {
1082                 // First sample
1083                 data: bytes!(1),
1084                 duration: Duration::from_secs(1),
1085                 packet_timestamp: 1,
1086                 prev_dropped_packets: 0,
1087                 ..Default::default()
1088             }],
1089             with_head_checker: true,
1090             head_bytes: vec![bytes!(1)],
1091             max_late: 50,
1092             max_late_timestamp: Duration::from_millis(1050),
1093             ..Default::default()
1094         },
1095         // This test is based on observed RTP packet streams when screen sharing in Chrome. In
1096         // particular the scenario used involved no movement on screen which causes Chrome to
1097         // generate padding packets.
1098         SampleBuilderTest {
1099             #[rustfmt::skip]
1100             message: "Sample builder should build a sample out of a packet that's both start and end following a run of padding packets".into(),
1101             packets: vec![
1102                 // First valid packet
1103                 Packet {
1104                     header: Header {
1105                         sequence_number: 5000,
1106                         timestamp: 1,
1107                         ..Default::default()
1108                     },
1109                     payload: bytes!(1),
1110                     ..Default::default()
1111                 },
1112                 // Second valid packet
1113                 Packet {
1114                     header: Header {
1115                         sequence_number: 5001,
1116                         timestamp: 1,
1117                         marker: true,
1118                         ..Default::default()
1119                     },
1120                     payload: bytes!(2),
1121                     ..Default::default()
1122                 },
1123                 // Padding packet 1
1124                 Packet {
1125                     header: Header {
1126                         sequence_number: 5002,
1127                         timestamp: 1,
1128                         ..Default::default()
1129                     },
1130                     payload: Bytes::default(),
1131                     ..Default::default()
1132                 },
1133                 // Padding packet 2
1134                 Packet {
1135                     header: Header {
1136                         sequence_number: 5003,
1137                         timestamp: 1,
1138                         ..Default::default()
1139                     },
1140                     payload: Bytes::default(),
1141                     ..Default::default()
1142                 },
1143                 // Third valid packet
1144                 Packet {
1145                     header: Header {
1146                         sequence_number: 5004,
1147                         timestamp: 2,
1148                         marker: true,
1149                         ..Default::default()
1150                     },
1151                     payload: bytes!(1),
1152                     ..Default::default()
1153                 },
1154                 // Fourth valid packet, start of next sample
1155                 Packet {
1156                     header: Header {
1157                         sequence_number: 5005,
1158                         timestamp: 3,
1159                         ..Default::default()
1160                     },
1161                     payload: bytes!(1),
1162                     ..Default::default()
1163                 },
1164             ],
1165             samples: vec![
1166                 Sample {
1167                     // First sample
1168                     data: bytes!(1, 2),
1169                     duration: Duration::from_secs(0),
1170                     packet_timestamp: 1,
1171                     prev_dropped_packets: 0,
1172                     ..Default::default()
1173                 },
1174                 Sample {
1175                     // Second sample
1176                     data: bytes!(1),
1177                     duration: Duration::from_secs(1),
1178                     packet_timestamp: 2,
1179                     prev_dropped_packets: 2,
1180                     prev_padding_packets: 2,
1181                     ..Default::default()
1182                 },
1183             ],
1184             with_head_checker: true,
1185             head_bytes: vec![bytes!(1)],
1186             extra_pop_attempts: 1,
1187             max_late: 50,
1188             ..Default::default()
1189         },
1190     ];
1191 
1192     for t in test_data {
1193         let d = FakeDepacketizer {
1194             head_checker: t.with_head_checker,
1195             head_bytes: t.head_bytes,
1196         };
1197 
1198         let mut s = {
1199             let sample_builder = SampleBuilder::new(t.max_late, d, 1);
1200             if t.max_late_timestamp != Duration::from_secs(0) {
1201                 sample_builder.with_max_time_delay(t.max_late_timestamp)
1202             } else {
1203                 sample_builder
1204             }
1205         };
1206 
1207         let mut samples = Vec::<Sample>::new();
1208         for p in t.packets {
1209             s.push(p)
1210         }
1211 
1212         while let Some(sample) = s.pop() {
1213             samples.push(sample)
1214         }
1215 
1216         for _ in 0..t.extra_pop_attempts {
1217             // Pop some more
1218             while let Some(sample) = s.pop() {
1219                 samples.push(sample)
1220             }
1221         }
1222 
1223         // Current problem: Sample does not implement Eq. Either implement myself or find another way of comparison. (Derive does not work)
1224         assert_eq!(t.samples, samples, "{}", t.message);
1225     }
1226 }
1227 
1228 // SampleBuilder should respect maxLate if we popped successfully but then have a gap larger then maxLate
1229 #[test]
test_sample_builder_max_late()1230 fn test_sample_builder_max_late() {
1231     let mut s = SampleBuilder::new(50, FakeDepacketizer::new(), 1);
1232 
1233     s.push(Packet {
1234         header: Header {
1235             sequence_number: 0,
1236             timestamp: 1,
1237             ..Default::default()
1238         },
1239         payload: bytes!(0x01),
1240     });
1241     s.push(Packet {
1242         header: Header {
1243             sequence_number: 1,
1244             timestamp: 2,
1245             ..Default::default()
1246         },
1247         payload: bytes!(0x01),
1248     });
1249     s.push(Packet {
1250         header: Header {
1251             sequence_number: 2,
1252             timestamp: 3,
1253             ..Default::default()
1254         },
1255         payload: bytes!(0x01),
1256     });
1257     assert_eq!(
1258         s.pop(),
1259         Some(Sample {
1260             data: bytes!(0x01),
1261             duration: Duration::from_secs(1),
1262             packet_timestamp: 1,
1263             ..Default::default()
1264         }),
1265         "Failed to build samples before gap"
1266     );
1267 
1268     s.push(Packet {
1269         header: Header {
1270             sequence_number: 5000,
1271             timestamp: 500,
1272             ..Default::default()
1273         },
1274         payload: bytes!(0x02),
1275     });
1276     s.push(Packet {
1277         header: Header {
1278             sequence_number: 5001,
1279             timestamp: 501,
1280             ..Default::default()
1281         },
1282         payload: bytes!(0x02),
1283     });
1284     s.push(Packet {
1285         header: Header {
1286             sequence_number: 5002,
1287             timestamp: 502,
1288             ..Default::default()
1289         },
1290         payload: bytes!(0x02),
1291     });
1292 
1293     assert_eq!(
1294         s.pop(),
1295         Some(Sample {
1296             data: bytes!(0x01),
1297             duration: Duration::from_secs(1),
1298             packet_timestamp: 2,
1299             ..Default::default()
1300         }),
1301         "Failed to build samples after large gap"
1302     );
1303     assert_eq!(None, s.pop(), "Failed to build samples after large gap");
1304 
1305     s.push(Packet {
1306         header: Header {
1307             sequence_number: 6000,
1308             timestamp: 600,
1309             ..Default::default()
1310         },
1311         payload: bytes!(0x03),
1312     });
1313     assert_eq!(
1314         s.pop(),
1315         Some(Sample {
1316             data: bytes!(0x02),
1317             duration: Duration::from_secs(1),
1318             packet_timestamp: 500,
1319             prev_dropped_packets: 4998,
1320             ..Default::default()
1321         }),
1322         "Failed to build samples after large gap"
1323     );
1324     assert_eq!(
1325         s.pop(),
1326         Some(Sample {
1327             data: bytes!(0x02),
1328             duration: Duration::from_secs(1),
1329             packet_timestamp: 501,
1330             ..Default::default()
1331         }),
1332         "Failed to build samples after large gap"
1333     );
1334 }
1335 
1336 #[test]
test_seqnum_distance()1337 fn test_seqnum_distance() {
1338     struct TestData {
1339         x: u16,
1340         y: u16,
1341         d: u16,
1342     }
1343     let test_data = vec![
1344         TestData {
1345             x: 0x0001,
1346             y: 0x0003,
1347             d: 0x0002,
1348         },
1349         TestData {
1350             x: 0x0003,
1351             y: 0x0001,
1352             d: 0x0002,
1353         },
1354         TestData {
1355             x: 0xFFF3,
1356             y: 0xFFF1,
1357             d: 0x0002,
1358         },
1359         TestData {
1360             x: 0xFFF1,
1361             y: 0xFFF3,
1362             d: 0x0002,
1363         },
1364         TestData {
1365             x: 0xFFFF,
1366             y: 0x0001,
1367             d: 0x0002,
1368         },
1369         TestData {
1370             x: 0x0001,
1371             y: 0xFFFF,
1372             d: 0x0002,
1373         },
1374     ];
1375 
1376     for data in test_data {
1377         assert_eq!(
1378             seqnum_distance(data.x, data.y),
1379             data.d,
1380             "seqnum_distance({}, {}) returned {} which must be {}",
1381             data.x,
1382             data.y,
1383             seqnum_distance(data.x, data.y),
1384             data.d
1385         );
1386     }
1387 }
1388 
1389 #[test]
test_sample_builder_clean_reference()1390 fn test_sample_builder_clean_reference() {
1391     for seq_start in [0_u16, 0xfff8, 0xfffe] {
1392         let mut s = SampleBuilder::new(10, FakeDepacketizer::new(), 1);
1393         s.push(Packet {
1394             header: Header {
1395                 sequence_number: seq_start,
1396                 timestamp: 0,
1397                 ..Default::default()
1398             },
1399             payload: bytes!(0x01),
1400         });
1401         s.push(Packet {
1402             header: Header {
1403                 sequence_number: seq_start.wrapping_add(1),
1404                 timestamp: 0,
1405                 ..Default::default()
1406             },
1407             payload: bytes!(0x02),
1408         });
1409         s.push(Packet {
1410             header: Header {
1411                 sequence_number: seq_start.wrapping_add(2),
1412                 timestamp: 0,
1413                 ..Default::default()
1414             },
1415             payload: bytes!(0x03),
1416         });
1417         let pkt4 = Packet {
1418             header: Header {
1419                 sequence_number: seq_start.wrapping_add(14),
1420                 timestamp: 120,
1421                 ..Default::default()
1422             },
1423             payload: bytes!(0x04),
1424         };
1425         s.push(pkt4.clone());
1426         let pkt5 = Packet {
1427             header: Header {
1428                 sequence_number: seq_start.wrapping_add(12),
1429                 timestamp: 120,
1430                 ..Default::default()
1431             },
1432             payload: bytes!(0x05),
1433         };
1434         s.push(pkt5.clone());
1435 
1436         for i in 0..3 {
1437             assert_eq!(
1438                 s.buffer[seq_start.wrapping_add(i) as usize],
1439                 None,
1440                 "Old packet ({i}) is not unreferenced (seq_start: {seq_start}, max_late: 10, pushed: 12)"
1441             );
1442         }
1443         assert_eq!(s.buffer[seq_start.wrapping_add(14) as usize], Some(pkt4));
1444         assert_eq!(s.buffer[seq_start.wrapping_add(12) as usize], Some(pkt5));
1445     }
1446 }
1447 
1448 #[test]
test_sample_builder_push_max_zero()1449 fn test_sample_builder_push_max_zero() {
1450     let pkts = vec![Packet {
1451         header: Header {
1452             sequence_number: 0,
1453             timestamp: 0,
1454             marker: true,
1455             ..Default::default()
1456         },
1457         payload: bytes!(0x01),
1458     }];
1459     let d = FakeDepacketizer {
1460         head_checker: true,
1461         head_bytes: vec![bytes!(0x01)],
1462     };
1463     let mut s = SampleBuilder::new(0, d, 1);
1464     s.push(pkts[0].clone());
1465     assert!(s.pop().is_some(), "Should expect a popped sample.")
1466 }
1467 
1468 #[test]
test_pop_with_timestamp()1469 fn test_pop_with_timestamp() {
1470     let mut s = SampleBuilder::new(0, FakeDepacketizer::new(), 1);
1471     assert_eq!(s.pop_with_timestamp(), None);
1472 }
1473 
1474 #[test]
test_sample_builder_data()1475 fn test_sample_builder_data() {
1476     let mut s = SampleBuilder::new(10, FakeDepacketizer::new(), 1);
1477     let mut j: usize = 0;
1478     for i in 0..0x20000_usize {
1479         let p = Packet {
1480             header: Header {
1481                 sequence_number: i as u16,
1482                 timestamp: (i + 42) as u32,
1483                 ..Default::default()
1484             },
1485             payload: Bytes::copy_from_slice(&[i as u8]),
1486         };
1487         s.push(p);
1488         while let Some((sample, ts)) = s.pop_with_timestamp() {
1489             assert_eq!(ts, (j + 42) as u32, "timestamp");
1490             assert_eq!(sample.data.len(), 1, "data length");
1491             assert_eq!(sample.data[0], j as u8, "timestamp");
1492             j += 1;
1493         }
1494     }
1495     // only the last packet should be dropped
1496     assert_eq!(j, 0x1FFFF);
1497 }
1498