@@ -126,6 +126,28 @@ final class HandlerRemovedHandler: ChannelInboundHandler {
126
126
}
127
127
128
128
129
+ /// A channel handler that succeeds a promise when its channel becomes active.
130
+ final class ActiveHandler : ChannelInboundHandler {
131
+ typealias InboundIn = Any
132
+
133
+ let activatedPromise : EventLoopPromise < Void >
134
+
135
+ init ( activatedPromise: EventLoopPromise < Void > ) {
136
+ self . activatedPromise = activatedPromise
137
+ }
138
+
139
+ func handlerAdded( ctx: ChannelHandlerContext ) {
140
+ if ctx. channel. isActive {
141
+ self . activatedPromise. succeed ( result: ( ) )
142
+ }
143
+ }
144
+
145
+ func channelActive( ctx: ChannelHandlerContext ) {
146
+ self . activatedPromise. succeed ( result: ( ) )
147
+ }
148
+ }
149
+
150
+
129
151
final class HTTP2StreamMultiplexerTests : XCTestCase {
130
152
var channel : EmbeddedChannel !
131
153
@@ -199,6 +221,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
199
221
func testChannelsCloseAfterResetStreamFrameFirstThenEvent( ) throws {
200
222
var closeError : Error ? = nil
201
223
224
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
225
+
202
226
// First, set up the frames we want to send/receive.
203
227
let streamID = HTTP2StreamID ( knownID: Int32 ( 1 ) )
204
228
var frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -233,6 +257,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
233
257
func testChannelsCloseAfterGoawayFrameFirstThenEvent( ) throws {
234
258
var closeError : Error ? = nil
235
259
260
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
261
+
236
262
// First, set up the frames we want to send/receive.
237
263
let streamID = HTTP2StreamID ( knownID: Int32 ( 1 ) )
238
264
var frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -345,6 +371,9 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
345
371
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: frameReceiver) . wait ( ) )
346
372
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
347
373
374
+
375
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
376
+
348
377
// Let's send a headers frame to open the stream.
349
378
let streamID = HTTP2StreamID ( knownID: 1 )
350
379
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -372,6 +401,9 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
372
401
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: frameReceiver) . wait ( ) )
373
402
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
374
403
404
+
405
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
406
+
375
407
// Let's send a headers frame to open the stream.
376
408
let streamID = HTTP2StreamID ( knownID: 1 )
377
409
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -406,6 +438,9 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
406
438
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: frameReceiver) . wait ( ) )
407
439
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
408
440
441
+
442
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
443
+
409
444
// Let's send a headers frame to open the stream.
410
445
let streamID = HTTP2StreamID ( knownID: 1 )
411
446
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -459,6 +494,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
459
494
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: frameReceiver) . wait ( ) )
460
495
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
461
496
497
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
498
+
462
499
// Let's send a headers frame to open the stream.
463
500
let streamID = HTTP2StreamID ( knownID: 1 )
464
501
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -494,6 +531,9 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
494
531
}
495
532
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
496
533
534
+
535
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
536
+
497
537
// Let's send a headers frame to open the stream.
498
538
let streamID = HTTP2StreamID ( knownID: 1 )
499
539
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -608,6 +648,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
608
648
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: writeTracker) . wait ( ) )
609
649
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
610
650
651
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
652
+
611
653
// Let's open two streams.
612
654
let firstStreamID = HTTP2StreamID ( knownID: 1 )
613
655
let secondStreamID = HTTP2StreamID ( knownID: 3 )
@@ -751,6 +793,9 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
751
793
}
752
794
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
753
795
796
+
797
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
798
+
754
799
// Let's open a stream.
755
800
let streamID = HTTP2StreamID ( knownID: 1 )
756
801
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -797,6 +842,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
797
842
}
798
843
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
799
844
845
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
846
+
800
847
// Let's open two streams.
801
848
for streamID in [ firstStreamID, secondStreamID] {
802
849
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -836,6 +883,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
836
883
}
837
884
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
838
885
886
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
887
+
839
888
// Let's open a stream.
840
889
let streamID = HTTP2StreamID ( knownID: 1 )
841
890
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -884,6 +933,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
884
933
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: readCounter) . wait ( ) )
885
934
XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
886
935
936
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
937
+
887
938
// Let's open a stream.
888
939
let streamID = HTTP2StreamID ( knownID: 1 )
889
940
let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
@@ -1039,6 +1090,8 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
1039
1090
var childChannel : Channel ? = nil
1040
1091
var childStreamID : HTTP2StreamID ? = nil
1041
1092
1093
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
1094
+
1042
1095
let multiplexer = HTTP2StreamMultiplexer { ( _, _) in
1043
1096
XCTFail ( " Must not be called " )
1044
1097
return self . channel. eventLoop. newFailedFuture ( error: MyError ( ) )
@@ -1112,4 +1165,91 @@ final class HTTP2StreamMultiplexerTests: XCTestCase {
1112
1165
1113
1166
XCTAssertNoThrow ( try self . channel. finish ( ) )
1114
1167
}
1168
+
1169
+ func testCreatedChildChannelDoesNotActivateEarly( ) throws {
1170
+ var activated = false
1171
+
1172
+ let activePromise : EventLoopPromise < Void > = self . channel. eventLoop. newPromise ( )
1173
+ let activeRecorder = ActiveHandler ( activatedPromise: activePromise)
1174
+ activePromise. futureResult. map {
1175
+ activated = true
1176
+ } . whenFailure { ( _: Error ) in
1177
+ XCTFail ( " Activation promise must not fail " )
1178
+ }
1179
+
1180
+ let multiplexer = HTTP2StreamMultiplexer { ( _, _) in
1181
+ XCTFail ( " Must not be called " )
1182
+ return self . channel. eventLoop. newFailedFuture ( error: MyError ( ) )
1183
+ }
1184
+ XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
1185
+ multiplexer. createStreamChannel ( promise: nil ) { ( channel, streamID) in
1186
+ return channel. pipeline. add ( handler: activeRecorder)
1187
+ }
1188
+ ( self . channel. eventLoop as! EmbeddedEventLoop ) . run ( )
1189
+ XCTAssertFalse ( activated)
1190
+
1191
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
1192
+
1193
+ XCTAssertTrue ( activated)
1194
+
1195
+ XCTAssertNoThrow ( try self . channel. finish ( ) )
1196
+ }
1197
+
1198
+ func testCreatedChildChannelActivatesIfParentIsActive( ) throws {
1199
+ var activated = false
1200
+
1201
+ let activePromise : EventLoopPromise < Void > = self . channel. eventLoop. newPromise ( )
1202
+ let activeRecorder = ActiveHandler ( activatedPromise: activePromise)
1203
+ activePromise. futureResult. map {
1204
+ activated = true
1205
+ } . whenFailure { ( _: Error ) in
1206
+ XCTFail ( " Activation promise must not fail " )
1207
+ }
1208
+
1209
+ let multiplexer = HTTP2StreamMultiplexer { ( _, _) in
1210
+ XCTFail ( " Must not be called " )
1211
+ return self . channel. eventLoop. newFailedFuture ( error: MyError ( ) )
1212
+ }
1213
+ XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
1214
+
1215
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( ipAddress: " 127.0.0.1 " , port: 8765 ) ) . wait ( ) )
1216
+ XCTAssertFalse ( activated)
1217
+
1218
+ multiplexer. createStreamChannel ( promise: nil ) { ( channel, streamID) in
1219
+ return channel. pipeline. add ( handler: activeRecorder)
1220
+ }
1221
+ ( self . channel. eventLoop as! EmbeddedEventLoop ) . run ( )
1222
+ XCTAssertTrue ( activated)
1223
+
1224
+ XCTAssertNoThrow ( try self . channel. finish ( ) )
1225
+ }
1226
+
1227
+ func testInitiatedChildChannelActivates( ) throws {
1228
+ XCTAssertNoThrow ( try self . channel. connect ( to: SocketAddress ( unixDomainSocketPath: " /whatever " ) , promise: nil ) )
1229
+
1230
+ var activated = false
1231
+
1232
+ let activePromise : EventLoopPromise < Void > = self . channel. eventLoop. newPromise ( )
1233
+ let activeRecorder = ActiveHandler ( activatedPromise: activePromise)
1234
+ activePromise. futureResult. map {
1235
+ activated = true
1236
+ } . whenFailure { ( _: Error ) in
1237
+ XCTFail ( " Activation promise must not fail " )
1238
+ }
1239
+
1240
+ let multiplexer = HTTP2StreamMultiplexer { ( channel, _) in
1241
+ return channel. pipeline. add ( handler: activeRecorder)
1242
+ }
1243
+ XCTAssertNoThrow ( try self . channel. pipeline. add ( handler: multiplexer) . wait ( ) )
1244
+ self . channel. pipeline. fireChannelActive ( )
1245
+
1246
+ // Open a new stream.
1247
+ XCTAssertFalse ( activated)
1248
+ let streamID = HTTP2StreamID ( knownID: 1 )
1249
+ let frame = HTTP2Frame ( streamID: streamID, payload: . headers( HTTPHeaders ( ) ) )
1250
+ XCTAssertNoThrow ( try self . channel. writeInbound ( frame) )
1251
+ XCTAssertTrue ( activated)
1252
+
1253
+ XCTAssertNoThrow ( try self . channel. finish ( ) )
1254
+ }
1115
1255
}
0 commit comments