@@ -170,4 +170,41 @@ class HTTPConnectionPool_HTTP2StateMachineTests: XCTestCase {
170
170
// 4. retry connection, but no more queued requests.
171
171
XCTAssertEqual ( state. connectionCreationBackoffDone ( newConnectionID) , . none)
172
172
}
173
+
174
+ func testCancelRequestWorks( ) {
175
+ let elg = EmbeddedEventLoopGroup ( loops: 4 )
176
+ defer { XCTAssertNoThrow ( try elg. syncShutdownGracefully ( ) ) }
177
+
178
+ var state = HTTPConnectionPool . HTTP2StateMaschine (
179
+ idGenerator: . init( )
180
+ )
181
+
182
+ let mockRequest = MockHTTPRequest ( eventLoop: elg. next ( ) )
183
+ let request = HTTPConnectionPool . Request ( mockRequest)
184
+
185
+ let executeAction = state. executeRequest ( request)
186
+ XCTAssertEqual ( . scheduleRequestTimeout( for: request, on: mockRequest. eventLoop) , executeAction. request)
187
+
188
+ // 1. connection attempt
189
+ guard case . createConnection( let connectionID, on: let connectionEL) = executeAction. connection else {
190
+ return XCTFail ( " Unexpected connection action: \( executeAction. connection) " )
191
+ }
192
+ XCTAssert ( connectionEL === mockRequest. eventLoop) // XCTAssertIdentical not available on Linux
193
+
194
+ // 2. cancel request
195
+ let cancelAction = state. cancelRequest ( request. id)
196
+ XCTAssertEqual ( cancelAction. request, . cancelRequestTimeout( request. id) )
197
+ XCTAssertEqual ( cancelAction. connection, . none)
198
+
199
+ // 3. request timeout triggers to late
200
+ XCTAssertEqual ( state. timeoutRequest ( request. id) , . none, " To late timeout is ignored " )
201
+
202
+ // 4. succeed connection attempt
203
+ let connectedAction = state. newHTTP2ConnectionEstablished (
204
+ . __testOnly_connection( id: connectionID, eventLoop: connectionEL) ,
205
+ maxConcurrentStreams: 100
206
+ )
207
+ XCTAssertEqual ( connectedAction. request, . none, " Request must not be executed " )
208
+ XCTAssertEqual ( connectedAction. connection, . scheduleTimeoutTimer( connectionID, on: connectionEL) )
209
+ }
173
210
}
0 commit comments