@@ -455,6 +455,73 @@ final class RequestBagTests: XCTestCase {
455455 }
456456 }
457457
458+ func testDidReceiveBodyPartFailedPromise( ) {
459+ let embeddedEventLoop = EmbeddedEventLoop ( )
460+ defer { XCTAssertNoThrow ( try embeddedEventLoop. syncShutdownGracefully ( ) ) }
461+ let logger = Logger ( label: " test " )
462+
463+ var maybeRequest : HTTPClient . Request ?
464+
465+ XCTAssertNoThrow ( maybeRequest = try HTTPClient . Request (
466+ url: " https://swift.org " ,
467+ method: . POST,
468+ body: . byteBuffer( . init( bytes: [ 1 ] ) )
469+ ) )
470+ guard let request = maybeRequest else { return XCTFail ( " Expected to have a request " ) }
471+
472+ struct MyError : Error , Equatable { }
473+ final class Delegate : HTTPClientResponseDelegate {
474+ typealias Response = Void
475+ let didFinishPromise : EventLoopPromise < Void >
476+ init ( didFinishPromise: EventLoopPromise < Void > ) {
477+ self . didFinishPromise = didFinishPromise
478+ }
479+
480+ func didReceiveBodyPart( task: HTTPClient . Task < Void > , _ buffer: ByteBuffer ) -> EventLoopFuture < Void > {
481+ task. eventLoop. makeFailedFuture ( MyError ( ) )
482+ }
483+
484+ func didReceiveError( task: HTTPClient . Task < Void > , _ error: Error ) {
485+ self . didFinishPromise. fail ( error)
486+ }
487+
488+ func didFinishRequest( task: AsyncHTTPClient . HTTPClient . Task < Void > ) throws {
489+ XCTFail ( " \( #function) should not be called " )
490+ self . didFinishPromise. succeed ( ( ) )
491+ }
492+ }
493+ let delegate = Delegate ( didFinishPromise: embeddedEventLoop. makePromise ( ) )
494+ var maybeRequestBag : RequestBag < Delegate > ?
495+ XCTAssertNoThrow ( maybeRequestBag = try RequestBag (
496+ request: request,
497+ eventLoopPreference: . delegate( on: embeddedEventLoop) ,
498+ task: . init( eventLoop: embeddedEventLoop, logger: logger) ,
499+ redirectHandler: nil ,
500+ connectionDeadline: . now( ) + . seconds( 30 ) ,
501+ requestOptions: . forTests( ) ,
502+ delegate: delegate
503+ ) )
504+ guard let bag = maybeRequestBag else { return XCTFail ( " Expected to be able to create a request bag. " ) }
505+
506+ let executor = MockRequestExecutor ( eventLoop: embeddedEventLoop)
507+
508+ executor. runRequest ( bag)
509+
510+ bag. resumeRequestBodyStream ( )
511+ XCTAssertNoThrow ( try executor. receiveRequestBody { XCTAssertEqual ( $0, ByteBuffer ( bytes: [ 1 ] ) ) } )
512+
513+ bag. receiveResponseHead ( . init( version: . http1_1, status: . ok) )
514+
515+ bag. succeedRequest ( [ ByteBuffer ( [ 1 ] ) ] )
516+
517+ XCTAssertThrowsError ( try delegate. didFinishPromise. futureResult. wait ( ) ) { error in
518+ XCTAssertEqualTypeAndValue ( error, MyError ( ) )
519+ }
520+ XCTAssertThrowsError ( try bag. task. futureResult. wait ( ) ) { error in
521+ XCTAssertEqualTypeAndValue ( error, MyError ( ) )
522+ }
523+ }
524+
458525 func testHTTPUploadIsCancelledEvenThoughRequestSucceeds( ) {
459526 let embeddedEventLoop = EmbeddedEventLoop ( )
460527 defer { XCTAssertNoThrow ( try embeddedEventLoop. syncShutdownGracefully ( ) ) }
0 commit comments