@@ -182,85 +182,145 @@ mod tests {
182
182
} ;
183
183
184
184
#[ test]
185
- fn split_test ( ) {
185
+ fn undersized_storage_test ( ) {
186
186
let mut duplex = Reassembler :: default ( ) ;
187
- let mut reader = Data :: new ( 10_000 ) ;
187
+ let mut reader = Data :: new ( 10 ) ;
188
188
let mut checker = reader;
189
189
190
+ let mut storage: Vec < u8 > = vec ! [ ] ;
190
191
{
191
- let mut storage: Vec < u8 > = vec ! [ ] ;
192
+ // limit the storage capacity so we force writing into the duplex
193
+ let mut storage = storage. with_write_limit ( 1 ) ;
192
194
193
195
let mut split = Split :: new ( & mut storage, & mut duplex) ;
194
196
195
- let mut reader = reader. with_read_limit ( 5 ) ;
196
197
split. read_from ( & mut reader) . unwrap ( ) ;
198
+ }
197
199
198
- assert_eq ! ( storage. len( ) , 5 ) ;
199
- assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 5 ) ;
200
+ // the storage was too small so we delegated to duplex
201
+ assert ! ( storage. is_empty( ) ) ;
202
+ assert_eq ! ( duplex. buffered_len( ) , 10 ) ;
200
203
201
- checker. receive ( & [ & storage[ ..] ] ) ;
202
- }
204
+ // move the reassembled bytes into the checker
205
+ checker. read_from ( & mut duplex) . unwrap ( ) ;
206
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 10 ) ;
207
+ assert ! ( duplex. is_consumed( ) ) ;
208
+ }
209
+
210
+ #[ test]
211
+ fn out_of_order_test ( ) {
212
+ let mut duplex = Reassembler :: default ( ) ;
203
213
214
+ // first write 5 bytes at offset 5
204
215
{
205
- let mut storage = writer:: storage:: Empty ;
216
+ let mut reader = Data :: new ( 10 ) ;
217
+
218
+ // advance the reader by 5 bytes
219
+ let _ = reader. send_one ( 5 ) ;
220
+
221
+ let mut storage: Vec < u8 > = vec ! [ ] ;
206
222
207
223
let mut split = Split :: new ( & mut storage, & mut duplex) ;
208
224
209
- let mut reader = reader. with_read_limit ( 5 ) ;
210
225
split. read_from ( & mut reader) . unwrap ( ) ;
211
226
212
- assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 5 ) ;
213
- assert_eq ! ( duplex. len( ) , 5 ) ;
227
+ // make sure we consumed the reader
228
+ assert_eq ! ( reader. current_offset( ) . as_u64( ) , 10 ) ;
229
+
230
+ assert_eq ! ( split. current_offset( ) . as_u64( ) , 0 ) ;
231
+ assert_eq ! ( split. buffered_len( ) , 0 ) ;
232
+
233
+ // make sure we didn't write to the storage, even if we had capacity, since the
234
+ // current_offset doesn't match
235
+ assert ! ( storage. is_empty( ) ) ;
214
236
}
215
237
238
+ // then write 10 bytes at offset 0
216
239
{
240
+ let mut reader = Data :: new ( 10 ) ;
241
+
217
242
let mut storage: Vec < u8 > = vec ! [ ] ;
218
243
219
244
let mut split = Split :: new ( & mut storage, & mut duplex) ;
220
245
221
- let mut reader = reader. with_read_limit ( 5 ) ;
222
246
split. read_from ( & mut reader) . unwrap ( ) ;
223
247
224
- // make sure we didn't write to the storage, even if we had capacity, since the
225
- // current_offset doesn't match
226
- assert ! ( storage. is_empty( ) ) ;
227
- assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 5 ) ;
248
+ // make sure we consumed the reader
249
+ assert_eq ! ( reader. current_offset( ) . as_u64( ) , 10 ) ;
228
250
229
- // move the reassembled bytes into the checker
230
- checker. read_from ( & mut duplex) . unwrap ( ) ;
231
- assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 15 ) ;
251
+ assert_eq ! ( split. current_offset( ) . as_u64( ) , 10 ) ;
252
+ assert_eq ! ( split. buffered_len( ) , 0 ) ;
253
+
254
+ // make sure we copied the entire reader
255
+ assert_eq ! ( storage. len( ) , 10 ) ;
256
+ assert ! ( duplex. is_consumed( ) ) ;
232
257
}
258
+ }
233
259
234
- {
235
- let mut storage: Vec < u8 > = vec ! [ ] ;
236
- {
237
- let mut storage = storage. with_write_limit ( 1 ) ;
260
+ #[ test]
261
+ fn skip_test ( ) {
262
+ let mut duplex = Reassembler :: default ( ) ;
263
+ let mut reader = Data :: new ( 10 ) ;
264
+ let mut checker = reader;
238
265
239
- let mut split = Split :: new ( & mut storage , & mut duplex ) ;
266
+ let mut storage : Vec < u8 > = vec ! [ ] ;
240
267
241
- let mut reader = reader. with_read_limit ( 10 ) ;
242
- split. read_from ( & mut reader) . unwrap ( ) ;
243
- }
268
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
244
269
245
- // the storage was too small so we delegated to duplex
246
- assert ! ( storage. is_empty( ) ) ;
247
- assert_eq ! ( duplex. len( ) , 10 ) ;
270
+ split. read_from ( & mut reader) . unwrap ( ) ;
248
271
249
- // move the reassembled bytes into the checker
250
- checker. read_from ( & mut duplex) . unwrap ( ) ;
251
- assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 25 ) ;
252
- }
272
+ assert_eq ! ( storage. len( ) , 10 ) ;
273
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 10 ) ;
274
+
275
+ checker. receive ( & [ & storage[ ..] ] ) ;
276
+ }
277
+
278
+ #[ test]
279
+ fn empty_storage_test ( ) {
280
+ let mut duplex = Reassembler :: default ( ) ;
281
+ let mut reader = Data :: new ( 10 ) ;
282
+ let mut checker = reader;
283
+
284
+ let mut storage = writer:: storage:: Empty ;
285
+
286
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
253
287
288
+ split. read_from ( & mut reader) . unwrap ( ) ;
289
+
290
+ assert_eq ! ( split. current_offset( ) . as_u64( ) , 0 ) ;
291
+ assert_eq ! ( split. buffered_len( ) , 10 ) ;
292
+
293
+ checker. read_from ( & mut split) . unwrap ( ) ;
294
+
295
+ assert_eq ! ( split. current_offset( ) . as_u64( ) , 10 ) ;
296
+ assert ! ( split. buffer_is_empty( ) ) ;
297
+ assert_eq ! ( split. buffered_len( ) , 0 ) ;
298
+ assert ! ( split. is_consumed( ) ) ;
299
+ }
300
+
301
+ #[ test]
302
+ fn partial_test ( ) {
303
+ let mut duplex = Reassembler :: default ( ) ;
304
+ let mut reader = Data :: new ( 10 ) ;
305
+ let mut checker = reader;
306
+
307
+ let mut storage: Vec < u8 > = vec ! [ ] ;
254
308
{
255
- let mut storage = writer :: storage:: Empty ;
309
+ let mut storage = storage. with_write_limit ( 9 ) ;
256
310
257
311
let mut split = Split :: new ( & mut storage, & mut duplex) ;
258
312
259
- let mut reader = reader. with_read_limit ( 1 ) ;
260
313
split. read_from ( & mut reader) . unwrap ( ) ;
261
-
262
- assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 25 ) ;
263
- assert_eq ! ( duplex. len( ) , 1 ) ;
264
314
}
315
+
316
+ // the storage was at least half the reader
317
+ assert_eq ! ( storage. len( ) , 9 ) ;
318
+ assert_eq ! ( duplex. buffered_len( ) , 1 ) ;
319
+
320
+ // move the reassembled bytes into the checker
321
+ checker. receive ( & [ & storage] ) ;
322
+ checker. read_from ( & mut duplex) . unwrap ( ) ;
323
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 10 ) ;
324
+ assert ! ( duplex. is_consumed( ) ) ;
265
325
}
266
326
}
0 commit comments