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