@@ -454,6 +454,71 @@ final class RequestBagTests: XCTestCase {
454
454
XCTAssertEqual ( $0 as? HTTPClientError , . cancelled)
455
455
}
456
456
}
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
+ func didReceiveBodyPart( task: HTTPClient . Task < Void > , _ buffer: ByteBuffer ) -> EventLoopFuture < Void > {
480
+ task. eventLoop. makeFailedFuture ( MyError ( ) )
481
+ }
482
+ func didReceiveError( task: HTTPClient . Task < Void > , _ error: Error ) {
483
+ self . didFinishPromise. fail ( error)
484
+ }
485
+ func didFinishRequest( task: AsyncHTTPClient . HTTPClient . Task < Void > ) throws -> Void {
486
+ XCTFail ( " \( #function) should not be called " )
487
+ self . didFinishPromise. succeed ( ( ) )
488
+ }
489
+ }
490
+ let delegate = Delegate ( didFinishPromise: embeddedEventLoop. makePromise ( ) )
491
+ var maybeRequestBag : RequestBag < Delegate > ?
492
+ XCTAssertNoThrow ( maybeRequestBag = try RequestBag (
493
+ request: request,
494
+ eventLoopPreference: . delegate( on: embeddedEventLoop) ,
495
+ task: . init( eventLoop: embeddedEventLoop, logger: logger) ,
496
+ redirectHandler: nil ,
497
+ connectionDeadline: . now( ) + . seconds( 30 ) ,
498
+ requestOptions: . forTests( ) ,
499
+ delegate: delegate
500
+ ) )
501
+ guard let bag = maybeRequestBag else { return XCTFail ( " Expected to be able to create a request bag. " ) }
502
+
503
+ let executor = MockRequestExecutor ( eventLoop: embeddedEventLoop)
504
+
505
+ executor. runRequest ( bag)
506
+
507
+ bag. resumeRequestBodyStream ( )
508
+ XCTAssertNoThrow ( try executor. receiveRequestBody { XCTAssertEqual ( $0, ByteBuffer ( bytes: [ 1 ] ) ) } )
509
+
510
+ bag. receiveResponseHead ( . init( version: . http1_1, status: . ok) )
511
+
512
+ bag. succeedRequest ( [ ByteBuffer ( [ 1 ] ) ] )
513
+
514
+
515
+ XCTAssertThrowsError ( try delegate. didFinishPromise. futureResult. wait ( ) ) { error in
516
+ XCTAssertEqualTypeAndValue ( error, MyError ( ) )
517
+ }
518
+ XCTAssertThrowsError ( try bag. task. futureResult. wait ( ) ) { error in
519
+ XCTAssertEqualTypeAndValue ( error, MyError ( ) )
520
+ }
521
+ }
457
522
458
523
func testDidReceiveBodyPartFailedPromise( ) {
459
524
let embeddedEventLoop = EmbeddedEventLoop ( )
0 commit comments