@@ -455,6 +455,73 @@ final class RequestBagTests: XCTestCase {
455
455
}
456
456
}
457
457
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
+
458
525
func testHTTPUploadIsCancelledEvenThoughRequestSucceeds( ) {
459
526
let embeddedEventLoop = EmbeddedEventLoop ( )
460
527
defer { XCTAssertNoThrow ( try embeddedEventLoop. syncShutdownGracefully ( ) ) }
0 commit comments