1 use super::*;
2 
3 #[test]
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_eq!(
128                 true, status,
129                 "fragment_buffer didn't accept fragments for '{}'",
130                 name
131             );
132         }
133 
134         for expected in expects {
135             let (out, epoch) = fragment_buffer.pop()?;
136             assert_eq!(
137                 out, expected,
138                 "fragment_buffer '{}' push/pop: got {:?}, want {:?}",
139                 name, out, expected
140             );
141 
142             assert_eq!(
143                 epoch, expected_epoch,
144                 "fragment_buffer returned wrong epoch: got {}, want {}",
145                 epoch, expected_epoch
146             );
147         }
148 
149         let result = fragment_buffer.pop();
150         assert!(
151             result.is_err(),
152             "fragment_buffer popped single buffer multiple times for '{}'",
153             name
154         );
155     }
156 
157     Ok(())
158 }
159 
160 #[test]
161 fn test_fragment_buffer_overflow() -> Result<()> {
162     let mut fragment_buffer = FragmentBuffer::new();
163 
164     fragment_buffer.push(&[
165         0x16, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00,
166         0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x00,
167     ])?;
168 
169     let big_buffer = vec![0; 2_000_000];
170     let result = fragment_buffer.push(&big_buffer);
171 
172     assert!(
173         result.is_err(),
174         "Pushing a buffer of size 2MB should have caused FragmentBuffer::push to return an error"
175     );
176 
177     Ok(())
178 }
179