@@ -266,6 +266,48 @@ final class RequestBagTests: XCTestCase {
266266 }
267267 }
268268
269+ func testCancelHasNoEffectAfterDeadlineExceededFailsTask( ) {
270+ struct MyError : Error , Equatable { }
271+ let embeddedEventLoop = EmbeddedEventLoop ( )
272+ defer { XCTAssertNoThrow ( try embeddedEventLoop. syncShutdownGracefully ( ) ) }
273+ let logger = Logger ( label: " test " )
274+
275+ var maybeRequest : HTTPClient . Request ?
276+ XCTAssertNoThrow ( maybeRequest = try HTTPClient . Request ( url: " https://swift.org " ) )
277+ guard let request = maybeRequest else { return XCTFail ( " Expected to have a request " ) }
278+
279+ let delegate = UploadCountingDelegate ( eventLoop: embeddedEventLoop)
280+ var maybeRequestBag : RequestBag < UploadCountingDelegate > ?
281+ XCTAssertNoThrow ( maybeRequestBag = try RequestBag (
282+ request: request,
283+ eventLoopPreference: . delegate( on: embeddedEventLoop) ,
284+ task: . init( eventLoop: embeddedEventLoop, logger: logger) ,
285+ redirectHandler: nil ,
286+ connectionDeadline: . now( ) + . seconds( 30 ) ,
287+ requestOptions: . forTests( ) ,
288+ delegate: delegate
289+ ) )
290+ guard let bag = maybeRequestBag else { return XCTFail ( " Expected to be able to create a request bag. " ) }
291+ XCTAssert ( bag. eventLoop === embeddedEventLoop)
292+
293+ let queuer = MockTaskQueuer ( )
294+ bag. requestWasQueued ( queuer)
295+
296+ XCTAssertEqual ( queuer. hitCancelCount, 0 )
297+ bag. deadlineExceeded ( )
298+ XCTAssertEqual ( queuer. hitCancelCount, 1 )
299+ XCTAssertEqual ( delegate. hitDidReceiveError, 0 )
300+ bag. fail ( MyError ( ) )
301+ XCTAssertEqual ( delegate. hitDidReceiveError, 1 )
302+
303+ bag. cancel ( )
304+ XCTAssertEqual ( delegate. hitDidReceiveError, 1 )
305+
306+ XCTAssertThrowsError ( try bag. task. futureResult. wait ( ) ) {
307+ XCTAssertEqualTypeAndValue ( $0, MyError ( ) )
308+ }
309+ }
310+
269311 func testCancelFailsTaskAfterRequestIsSent( ) {
270312 let embeddedEventLoop = EmbeddedEventLoop ( )
271313 defer { XCTAssertNoThrow ( try embeddedEventLoop. syncShutdownGracefully ( ) ) }
0 commit comments