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