@@ -587,4 +587,43 @@ class HTTPConnectionPool_HTTP1StateMachineTests: XCTestCase {
587
587
// triggered by timer
588
588
XCTAssertEqual ( state. connectionIdleTimeout ( connection. id) , . none)
589
589
}
590
+
591
+ func testConnectionBackoffVsShutdownRace( ) {
592
+ let elg = EmbeddedEventLoopGroup ( loops: 2 )
593
+ defer { XCTAssertNoThrow ( try elg. syncShutdownGracefully ( ) ) }
594
+
595
+ var state = HTTPConnectionPool . StateMachine (
596
+ eventLoopGroup: elg,
597
+ idGenerator: . init( ) ,
598
+ maximumConcurrentHTTP1Connections: 6
599
+ )
600
+
601
+ let mockRequest = MockHTTPRequest ( eventLoop: elg. next ( ) , requiresEventLoopForChannel: false )
602
+ let request = HTTPConnectionPool . Request ( mockRequest)
603
+
604
+ let executeAction = state. executeRequest ( request)
605
+ guard case . createConnection( let connectionID, on: let connEL) = executeAction. connection else {
606
+ return XCTFail ( " Expected to create a connection " )
607
+ }
608
+
609
+ XCTAssertEqual ( executeAction. request, . scheduleRequestTimeout( for: request, on: mockRequest. eventLoop) )
610
+
611
+ let failAction = state. failedToCreateNewConnection ( HTTPClientError . cancelled, connectionID: connectionID)
612
+ guard case . scheduleBackoffTimer( connectionID, backoff: _, on: let timerEL) = failAction. connection else {
613
+ return XCTFail ( " Expected to create a backoff timer " )
614
+ }
615
+ XCTAssert ( timerEL === connEL)
616
+ XCTAssertEqual ( failAction. request, . none)
617
+
618
+ let shutdownAction = state. shutdown ( )
619
+ guard case . cleanupConnections( let context, isShutdown: . yes( unclean: true ) ) = shutdownAction. connection else {
620
+ return XCTFail ( " Expected to cleanup " )
621
+ }
622
+ XCTAssertEqual ( context. close. count, 0 )
623
+ XCTAssertEqual ( context. cancel. count, 0 )
624
+ XCTAssertEqual ( context. connectBackoff, [ connectionID] )
625
+ XCTAssertEqual ( shutdownAction. request, . failRequestsAndCancelTimeouts( [ request] , HTTPClientError . cancelled) )
626
+
627
+ XCTAssertEqual ( state. connectionCreationBackoffDone ( connectionID) , . none)
628
+ }
590
629
}
0 commit comments