@@ -194,6 +194,44 @@ class HTTPConnectionPool_HTTP2StateMachineTests: XCTestCase {
194
194
XCTAssertEqual ( state. connectionCreationBackoffDone ( newConnectionID) , . none)
195
195
}
196
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
+ }
234
+
197
235
func testConnectionFailureWithoutRetry( ) {
198
236
struct SomeError : Error , Equatable { }
199
237
let elg = EmbeddedEventLoopGroup ( loops: 4 )
0 commit comments