1 use super::*;
2 
3 use util::Error;
4 
5 #[test]
6 fn test_fragment_buffer() -> Result<(), Error> {
7     let tests = vec![
8         (
9             "Single Fragment",
10             vec![vec![
11                 0x16, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03,
12                 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x00,
13             ]],
14             vec![vec![
15                 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff,
16                 0x00,
17             ]],
18             0,
19         ),
20         (
21             "Single Fragment Epoch 3",
22             vec![vec![
23                 0x16, 0xfe, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03,
24                 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x00,
25             ]],
26             vec![vec![
27                 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff,
28                 0x00,
29             ]],
30             3,
31         ),
32         (
33             "Multiple Fragments",
34             vec![
35                 vec![
36                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
37                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
38                     0x01, 0x02, 0x03, 0x04,
39                 ],
40                 vec![
41                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
42                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x05,
43                     0x06, 0x07, 0x08, 0x09,
44                 ],
45                 vec![
46                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
47                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05, 0x0A,
48                     0x0B, 0x0C, 0x0D, 0x0E,
49                 ],
50             ],
51             vec![vec![
52                 0x0b, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
53                 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
54             ]],
55             0,
56         ),
57         (
58             "Multiple Unordered Fragments",
59             vec![
60                 vec![
61                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
62                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
63                     0x01, 0x02, 0x03, 0x04,
64                 ],
65                 vec![
66                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
67                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05, 0x0A,
68                     0x0B, 0x0C, 0x0D, 0x0E,
69                 ],
70                 vec![
71                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81,
72                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x05,
73                     0x06, 0x07, 0x08, 0x09,
74                 ],
75             ],
76             vec![vec![
77                 0x0b, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
78                 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
79             ]],
80             0,
81         ),
82         (
83             "Multiple Handshakes in Signle Fragment",
84             vec![vec![
85                 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
86                 0x30, /* record header */
87                 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0xff,
88                 0x01, 0x01, /*handshake msg 1*/
89                 0x03, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0xff,
90                 0x01, 0x01, /*handshake msg 2*/
91                 0x03, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0xff,
92                 0x01, 0x01, /*handshake msg 3*/
93             ]],
94             vec![
95                 vec![
96                     0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe,
97                     0xff, 0x01, 0x01,
98                 ],
99                 vec![
100                     0x03, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe,
101                     0xff, 0x01, 0x01,
102                 ],
103                 vec![
104                     0x03, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe,
105                     0xff, 0x01, 0x01,
106                 ],
107             ],
108             0,
109         ),
110     ];
111 
112     for (name, inputs, expects, expected_epoch) in tests {
113         let mut fragment_buffer = FragmentBuffer::new();
114         for frag in inputs {
115             let status = fragment_buffer.push(&frag)?;
116             assert_eq!(
117                 true, status,
118                 "fragment_buffer didn't accept fragments for '{}'",
119                 name
120             );
121         }
122 
123         for expected in expects {
124             let (out, epoch) = fragment_buffer.pop();
125             assert_eq!(
126                 out, expected,
127                 "fragment_buffer '{}' push/pop: got {:?}, want {:?}",
128                 name, out, expected
129             );
130 
131             assert_eq!(
132                 epoch, expected_epoch,
133                 "fragment_buffer returned wrong epoch: got {}, want {}",
134                 epoch, expected_epoch
135             );
136         }
137 
138         let (frag, _) = fragment_buffer.pop();
139         assert_eq!(
140             frag.len(),
141             0,
142             "fragment_buffer popped single buffer multiple times for '{}'",
143             name
144         );
145     }
146 
147     Ok(())
148 }
149