@@ -371,7 +371,7 @@ class HTTPConnectionPool_HTTP2ConnectionsTests: XCTestCase {
371
371
XCTAssertEqual ( leasedConn1, conn1)
372
372
XCTAssertEqual ( leasdConnContext1. wasIdle, true )
373
373
374
- XCTAssertTrue ( connections. goAwayReceived ( conn1ID) . eventLoop === el1)
374
+ XCTAssertTrue ( connections. goAwayReceived ( conn1ID) ? . eventLoop === el1)
375
375
376
376
XCTAssertEqual (
377
377
connections. stats,
@@ -389,7 +389,7 @@ class HTTPConnectionPool_HTTP2ConnectionsTests: XCTestCase {
389
389
XCTAssertNil ( connections. leaseStream ( onRequired: el1) , " we should not be able to lease a stream because the connection is draining " )
390
390
391
391
// a server can potentially send more than one connection go away and we should not crash
392
- XCTAssertTrue ( connections. goAwayReceived ( conn1ID) . eventLoop === el1)
392
+ XCTAssertTrue ( connections. goAwayReceived ( conn1ID) ? . eventLoop === el1)
393
393
XCTAssertEqual (
394
394
connections. stats,
395
395
. init(
@@ -454,7 +454,9 @@ class HTTPConnectionPool_HTTP2ConnectionsTests: XCTestCase {
454
454
455
455
XCTAssertNil ( connections. leaseStream ( onRequired: el1) , " all streams are in use " )
456
456
457
- let ( _, newSettingsContext1) = connections. newHTTP2MaxConcurrentStreamsReceived ( conn1ID, newMaxStreams: 2 )
457
+ guard let ( _, newSettingsContext1) = connections. newHTTP2MaxConcurrentStreamsReceived ( conn1ID, newMaxStreams: 2 ) else {
458
+ return XCTFail ( " Expected to get a new settings context " )
459
+ }
458
460
XCTAssertEqual ( newSettingsContext1. availableStreams, 1 )
459
461
XCTAssertTrue ( newSettingsContext1. eventLoop === el1)
460
462
XCTAssertFalse ( newSettingsContext1. isIdle)
@@ -465,7 +467,9 @@ class HTTPConnectionPool_HTTP2ConnectionsTests: XCTestCase {
465
467
XCTAssertEqual ( leasedConn2, conn1)
466
468
XCTAssertEqual ( leaseContext2. wasIdle, false )
467
469
468
- let ( _, newSettingsContext2) = connections. newHTTP2MaxConcurrentStreamsReceived ( conn1ID, newMaxStreams: 1 )
470
+ guard let ( _, newSettingsContext2) = connections. newHTTP2MaxConcurrentStreamsReceived ( conn1ID, newMaxStreams: 1 ) else {
471
+ return XCTFail ( " Expected to get a new settings context " )
472
+ }
469
473
XCTAssertEqual ( newSettingsContext2. availableStreams, 0 )
470
474
XCTAssertTrue ( newSettingsContext2. eventLoop === el1)
471
475
XCTAssertFalse ( newSettingsContext2. isIdle)
@@ -489,6 +493,41 @@ class HTTPConnectionPool_HTTP2ConnectionsTests: XCTestCase {
489
493
XCTAssertEqual ( leaseContext3. wasIdle, true )
490
494
}
491
495
496
+ func testEventsAfterConnectionIsClosed( ) {
497
+ let elg = EmbeddedEventLoopGroup ( loops: 2 )
498
+ var connections = HTTPConnectionPool . HTTP2Connections ( generator: . init( ) )
499
+ let el1 = elg. next ( )
500
+
501
+ let conn1ID = connections. createNewConnection ( on: el1)
502
+ let conn1 : HTTPConnectionPool . Connection = . __testOnly_connection( id: conn1ID, eventLoop: el1)
503
+ let ( conn1Index, conn1CreatedContext) = connections. newHTTP2ConnectionEstablished ( conn1, maxConcurrentStreams: 1 )
504
+ XCTAssertEqual ( conn1CreatedContext. availableStreams, 1 )
505
+
506
+ let ( leasedConn1, leasdConnContext1) = connections. leaseStreams ( at: conn1Index, count: 1 )
507
+ XCTAssertEqual ( leasedConn1, conn1)
508
+ XCTAssertEqual ( leasdConnContext1. wasIdle, true )
509
+
510
+ XCTAssertNil ( connections. leaseStream ( onRequired: el1) , " all streams are in use " )
511
+
512
+ let ( _, releaseContext) = connections. releaseStream ( conn1ID)
513
+ XCTAssertTrue ( releaseContext. eventLoop === el1)
514
+ XCTAssertEqual ( releaseContext. availableStreams, 1 )
515
+ XCTAssertEqual ( releaseContext. connectionID, conn1ID)
516
+ XCTAssertEqual ( releaseContext. isIdle, true )
517
+
518
+ // schedule timeout... this should remove the connection from http2Connections
519
+
520
+ XCTAssertEqual ( connections. closeConnectionIfIdle ( conn1ID) , conn1)
521
+
522
+ // events race with the complete shutdown
523
+
524
+ XCTAssertNil ( connections. newHTTP2MaxConcurrentStreamsReceived ( conn1ID, newMaxStreams: 2 ) )
525
+ XCTAssertNil ( connections. goAwayReceived ( conn1ID) )
526
+
527
+ // finally close event
528
+ XCTAssertNil ( connections. failConnection ( conn1ID) )
529
+ }
530
+
492
531
func testLeaseOnPreferredEventLoopWithoutAnyAvailable( ) {
493
532
let elg = EmbeddedEventLoopGroup ( loops: 4 )
494
533
var connections = HTTPConnectionPool . HTTP2Connections ( generator: . init( ) )
0 commit comments