@@ -193,6 +193,44 @@ class HTTPConnectionPool_HTTP2StateMachineTests: XCTestCase {
193193 // 4. retry connection, but no more queued requests.
194194 XCTAssertEqual ( state. connectionCreationBackoffDone ( newConnectionID) , . none)
195195 }
196+
197+ func testConnectionFailureWhileShuttingDown( ) {
198+ struct SomeError : Error , Equatable { }
199+ let elg = EmbeddedEventLoopGroup ( loops: 4 )
200+ defer { XCTAssertNoThrow ( try elg. syncShutdownGracefully ( ) ) }
201+
202+ var state = HTTPConnectionPool . HTTP2StateMachine (
203+ idGenerator: . init( ) ,
204+ retryConnectionEstablishment: false ,
205+ lifecycleState: . running
206+ )
207+
208+ let mockRequest = MockHTTPRequest ( eventLoop: elg. next ( ) )
209+ let request = HTTPConnectionPool . Request ( mockRequest)
210+
211+ let action = state. executeRequest ( request)
212+ XCTAssertEqual ( . scheduleRequestTimeout( for: request, on: mockRequest. eventLoop) , action. request)
213+
214+ // 1. connection attempt
215+ guard case . createConnection( let connectionID, on: let connectionEL) = action. connection else {
216+ return XCTFail ( " Unexpected connection action: \( action. connection) " )
217+ }
218+ XCTAssert ( connectionEL === mockRequest. eventLoop) // XCTAssertIdentical not available on Linux
219+
220+ // 2. initialise shutdown
221+ let shutdownAction = state. shutdown ( )
222+ XCTAssertEqual ( shutdownAction. connection, . cleanupConnections( . init( ) , isShutdown: . no) )
223+ guard case . failRequestsAndCancelTimeouts( let requestsToFail, let requestError) = shutdownAction. request else {
224+ return XCTFail ( " Unexpected request action: \( action. request) " )
225+ }
226+ XCTAssertEqualTypeAndValue ( requestError, HTTPClientError . cancelled)
227+ XCTAssertEqualTypeAndValue ( requestsToFail, [ request] )
228+
229+ // 3. connection attempt fails
230+ let failedConnectAction = state. failedToCreateNewConnection ( SomeError ( ) , connectionID: connectionID)
231+ XCTAssertEqual ( failedConnectAction. request, . none)
232+ XCTAssertEqual ( failedConnectAction. connection, . cleanupConnections( . init( ) , isShutdown: . yes( unclean: true ) ) )
233+ }
196234
197235 func testConnectionFailureWithoutRetry( ) {
198236 struct SomeError : Error , Equatable { }
0 commit comments