@@ -2849,7 +2849,7 @@ class SimpleClientServerFramePayloadStreamTests: XCTestCase {
28492849 XCTAssertNoThrow ( try self . serverChannel. finish ( ) )
28502850 }
28512851
2852- func testFrameDelegateIsCalledForDATAFrames ( ) throws {
2852+ func testFrameDelegateIsCalled ( ) throws {
28532853 // Cap the frame size to 2^14 = 16_384
28542854 let settings = [ HTTP2Setting ( parameter: . maxFrameSize, value: 1 << 14 ) ]
28552855
@@ -2898,20 +2898,47 @@ class SimpleClientServerFramePayloadStreamTests: XCTestCase {
28982898 self . clientChannel. embeddedEventLoop. run ( )
28992899 try stream. closeFuture. wait ( )
29002900
2901- XCTAssertEqual ( delegate. events. count, 6 )
2902- XCTAssertTrue ( delegate. events [ 0 ] . 0 . isHeaders)
2903- XCTAssertTrue ( delegate. events. allSatisfy { $0. 1 == HTTP2StreamID ( 1 ) } )
2901+ var events = delegate. events
2902+ XCTAssertEqual ( events. count, 8 )
29042903
2904+ // First the server writes its own SETTINGS.
2905+ events. popFirst ( ) ? . assertSettingsFrame ( expectedSettings: settings, ack: false )
2906+ // Then it acks the client SETTINGS.
2907+ events. popFirst ( ) ? . assertSettingsFrame ( expectedSettings: [ ] , ack: true )
2908+
2909+ // Then writes HEADERS on stream 1
2910+ events. popFirst ( ) ? . assertHeadersFrame (
2911+ endStream: false ,
2912+ streamID: 1 ,
2913+ headers: headers. headers
2914+ )
2915+
2916+ // Now 5 DATA frames on stream 1.
2917+ //
29052918 // The max frame size is set to 2^14 and the initial connection window
29062919 // size is (2^16)-1, so the write of size 2^16 is split up over five frames.
29072920 // The first three are the max frame size of 2^14, the fourth is (2^14) - 1
29082921 // as that's all that remains of the connection window. The final byte of the
29092922 // message is sent later, after the server sends a WINDOW_UPDATE frame.
2910- XCTAssertEqual ( delegate. events [ 1 ] . 0 . dataByteCount, 1 << 14 )
2911- XCTAssertEqual ( delegate. events [ 2 ] . 0 . dataByteCount, 1 << 14 )
2912- XCTAssertEqual ( delegate. events [ 3 ] . 0 . dataByteCount, 1 << 14 )
2913- XCTAssertEqual ( delegate. events [ 4 ] . 0 . dataByteCount, ( 1 << 14 ) - 1 )
2914- XCTAssertEqual ( delegate. events [ 5 ] . 0 . dataByteCount, 1 )
2923+ for _ in 1 ... 3 {
2924+ events. popFirst ( ) ? . assertDataFrame (
2925+ endStream: false ,
2926+ streamID: 1 ,
2927+ payload: ByteBuffer ( repeating: 42 , count: 1 << 14 )
2928+ )
2929+ }
2930+ events. popFirst ( ) ? . assertDataFrame (
2931+ endStream: false ,
2932+ streamID: 1 ,
2933+ payload: ByteBuffer ( repeating: 42 , count: ( 1 << 14 ) - 1 )
2934+ )
2935+ events. popFirst ( ) ? . assertDataFrame (
2936+ endStream: true ,
2937+ streamID: 1 ,
2938+ payload: ByteBuffer ( repeating: 42 , count: 1 )
2939+ )
2940+
2941+ XCTAssertNil ( events. popFirst ( ) )
29152942 }
29162943}
29172944
@@ -2975,44 +3002,13 @@ final class OkHandler: ChannelInboundHandler {
29753002}
29763003
29773004final class RecordingFrameDelegate : NIOHTTP2FrameDelegate {
2978- enum Frame {
2979- case data( Int )
2980- case headers
2981-
2982- var isHeaders : Bool {
2983- switch self {
2984- case . headers:
2985- return true
2986- default :
2987- return false
2988- }
2989- }
2990-
2991- var dataByteCount : Int ? {
2992- switch self {
2993- case . data( let byteCount) :
2994- return byteCount
2995- default :
2996- return nil
2997- }
2998- }
2999-
3000- }
3001-
3002- private( set) var events : [ ( Frame , HTTP2StreamID ) ]
3005+ private( set) var events : CircularBuffer < HTTP2Frame >
30033006
30043007 init ( ) {
30053008 self . events = [ ]
30063009 }
30073010
30083011 func wroteFrame( _ frame: HTTP2Frame ) {
3009- switch frame. payload {
3010- case . data( let data) :
3011- self . events. append ( ( . data( data. data. readableBytes) , streamID: frame. streamID) )
3012- case . headers( let headers) :
3013- self . events. append ( ( . headers, streamID: frame. streamID) )
3014- default :
3015- ( )
3016- }
3012+ self . events. append ( frame)
30173013 }
30183014}
0 commit comments