1 use super::*;
2 
3 #[test]
test_fragment_buffer() -> Result<()>4 fn test_fragment_buffer() -> Result<()> {
5     let tests = vec![
6         (
7             "Single Fragment",
8             vec![vec![
9                 0x16, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03,
10                 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x00,
11             ]],
12             vec![vec![
13                 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff,
14                 0x00,
15             ]],
16             0,
17         ),
18         (
19             "Single Fragment Epoch 3",
20             vec![vec![
21                 0x16, 0xfe, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03,
22                 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x00,
23             ]],
24             vec![vec![
25                 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff,
26                 0x00,
27             ]],
28             3,
29         ),
30         (
31             "Multiple Fragments",
32             vec![
33                 vec![
34                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
35                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
36                     0x01, 0x02, 0x03, 0x04,
37                 ],
38                 vec![
39                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
40                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x05,
41                     0x06, 0x07, 0x08, 0x09,
42                 ],
43                 vec![
44                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
45                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05, 0x0A,
46                     0x0B, 0x0C, 0x0D, 0x0E,
47                 ],
48             ],
49             vec![vec![
50                 0x0b, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
51                 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
52             ]],
53             0,
54         ),
55         (
56             "Multiple Unordered Fragments",
57             vec![
58                 vec![
59                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
60                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
61                     0x01, 0x02, 0x03, 0x04,
62                 ],
63                 vec![
64                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
65                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05, 0x0A,
66                     0x0B, 0x0C, 0x0D, 0x0E,
67                 ],
68                 vec![
69                     0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81,
70                     0x0b, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x05,
71                     0x06, 0x07, 0x08, 0x09,
72                 ],
73             ],
74             vec![vec![
75                 0x0b, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
76                 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
77             ]],
78             0,
79         ),
80         (
81             "Multiple Handshakes in Signle Fragment",
82             vec![vec![
83                 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
84                 0x30, /* record header */
85                 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0xff,
86                 0x01, 0x01, /*handshake msg 1*/
87                 0x03, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0xff,
88                 0x01, 0x01, /*handshake msg 2*/
89                 0x03, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0xff,
90                 0x01, 0x01, /*handshake msg 3*/
91             ]],
92             vec![
93                 vec![
94                     0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe,
95                     0xff, 0x01, 0x01,
96                 ],
97                 vec![
98                     0x03, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe,
99                     0xff, 0x01, 0x01,
100                 ],
101                 vec![
102                     0x03, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe,
103                     0xff, 0x01, 0x01,
104                 ],
105             ],
106             0,
107         ),
108         // Ensure zero length fragments don't cause an infinite recursive loop which in turn causes
109         // a stack overflow.
110         (
111             "Zero length fragment",
112             vec![vec![
113                 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00,
114                 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115             ]],
116             vec![vec![
117                 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
118             ]],
119             0,
120         ),
121     ];
122 
123     for (name, inputs, expects, expected_epoch) in tests {
124         let mut fragment_buffer = FragmentBuffer::new();
125         for frag in inputs {
126             let status = fragment_buffer.push(&frag)?;
127             assert!(
128                 status,
129                 "fragment_buffer didn't accept fragments for '{name}'"
130             );
131         }
132 
133         for expected in expects {
134             let (out, epoch) = fragment_buffer.pop()?;
135             assert_eq!(
136                 out, expected,
137                 "fragment_buffer '{name}' push/pop: got {out:?}, want {expected:?}"
138             );
139 
140             assert_eq!(
141                 epoch, expected_epoch,
142                 "fragment_buffer returned wrong epoch: got {epoch}, want {expected_epoch}"
143             );
144         }
145 
146         let result = fragment_buffer.pop();
147         assert!(
148             result.is_err(),
149             "fragment_buffer popped single buffer multiple times for '{name}'"
150         );
151     }
152 
153     Ok(())
154 }
155 
156 #[test]
test_fragment_buffer_overflow() -> Result<()>157 fn test_fragment_buffer_overflow() -> Result<()> {
158     let mut fragment_buffer = FragmentBuffer::new();
159 
160     fragment_buffer.push(&[
161         0x16, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00,
162         0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x00,
163     ])?;
164 
165     let big_buffer = vec![0; 2_000_000];
166     let result = fragment_buffer.push(&big_buffer);
167 
168     assert!(
169         result.is_err(),
170         "Pushing a buffer of size 2MB should have caused FragmentBuffer::push to return an error"
171     );
172 
173     Ok(())
174 }
175