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