@@ -30,19 +30,6 @@ public final class NIOSingleStepByteToMessageDecoderTest: XCTestCase {
30
30
}
31
31
}
32
32
33
- private final class ForeverDecoder : NIOSingleStepByteToMessageDecoder {
34
- typealias InboundOut = Never
35
-
36
- func decode( buffer: inout ByteBuffer ) throws -> InboundOut ? {
37
- return nil
38
- }
39
-
40
- func decodeLast( buffer: inout ByteBuffer , seenEOF: Bool ) throws -> InboundOut ? {
41
- XCTAssertTrue ( seenEOF)
42
- return try self . decode ( buffer: & buffer)
43
- }
44
- }
45
-
46
33
private final class LargeChunkDecoder : NIOSingleStepByteToMessageDecoder {
47
34
typealias InboundOut = ByteBuffer
48
35
@@ -227,14 +214,19 @@ public final class NIOSingleStepByteToMessageDecoderTest: XCTestCase {
227
214
var buffer = allocator. buffer ( capacity: 16 )
228
215
buffer. clear ( )
229
216
buffer. writeStaticString ( " 1 " )
217
+ XCTAssertEqual ( processor. unprocessedBytes, 0 )
230
218
XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
219
+ XCTAssertEqual ( processor. unprocessedBytes, 1 )
231
220
buffer. clear ( )
232
221
buffer. writeStaticString ( " 23 " )
233
222
XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
223
+ XCTAssertEqual ( processor. unprocessedBytes, 1 )
234
224
buffer. clear ( )
235
225
buffer. writeStaticString ( " 4567890x " )
236
226
XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
227
+ XCTAssertEqual ( processor. unprocessedBytes, 1 )
237
228
XCTAssertNoThrow ( try processor. finishProcessing ( seenEOF: false , messageReceiver. receiveMessage) )
229
+ XCTAssertEqual ( processor. unprocessedBytes, 1 )
238
230
239
231
XCTAssertEqual ( " 12 " , messageReceiver. retrieveMessage ( ) . map {
240
232
String ( decoding: $0. readableBytesView, as: Unicode . UTF8. self)
@@ -495,4 +487,38 @@ public final class NIOSingleStepByteToMessageDecoderTest: XCTestCase {
495
487
XCTAssertEqual ( processor. decoder. reclaimHits, 1 )
496
488
XCTAssertEqual ( processor. _buffer!. readableBytes, 1 )
497
489
}
490
+
491
+ func testUnprocessedBytes( ) {
492
+ let allocator = ByteBufferAllocator ( )
493
+ let processor = NIOSingleStepByteToMessageProcessor ( LargeChunkDecoder ( ) ) // reads slices of 512 bytes
494
+ let messageReceiver : MessageReceiver < ByteBuffer > = MessageReceiver ( )
495
+
496
+ // We're going to send in 128 bytes. This will be held.
497
+ var buffer = allocator. buffer ( capacity: 128 )
498
+ buffer. writeBytes ( Array ( repeating: 0x04 , count: 128 ) )
499
+ XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
500
+ XCTAssertEqual ( 0 , messageReceiver. count)
501
+ XCTAssertEqual ( processor. unprocessedBytes, 128 )
502
+
503
+ // Adding 513 bytes, will cause a message to be returned and an extra byte to be saved.
504
+ buffer. clear ( )
505
+ buffer. writeBytes ( Array ( repeating: 0x04 , count: 513 ) )
506
+ XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
507
+ XCTAssertEqual ( 1 , messageReceiver. count)
508
+ XCTAssertEqual ( processor. unprocessedBytes, 129 )
509
+
510
+ // Adding 255 bytes, will cause 255 more bytes to be held.
511
+ buffer. clear ( )
512
+ buffer. writeBytes ( Array ( repeating: 0x04 , count: 255 ) )
513
+ XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
514
+ XCTAssertEqual ( 1 , messageReceiver. count)
515
+ XCTAssertEqual ( processor. unprocessedBytes, 384 )
516
+
517
+ // Adding 128 bytes, will cause another message to be returned and the buffer to be empty.
518
+ buffer. clear ( )
519
+ buffer. writeBytes ( Array ( repeating: 0x04 , count: 128 ) )
520
+ XCTAssertNoThrow ( try processor. process ( buffer: buffer, messageReceiver. receiveMessage) )
521
+ XCTAssertEqual ( 2 , messageReceiver. count)
522
+ XCTAssertEqual ( processor. unprocessedBytes, 0 )
523
+ }
498
524
}
0 commit comments