Skip to content

Commit 210b54f

Browse files
authored
Fixes the DelayOnHeadDelegate test utility (#374)
Currently the DelayOnHeadDelegate test utility depends on correct timings. Right now, if a request is slower than 50ms in `testErrorAfterCloseWhileBackpressureExerted` the test will fail, since the backpressure promise is failed, before a head was received. This pr fixes this, by giving the user a callback, when the head was received.
1 parent 4ca666d commit 210b54f

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

‎Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift‎

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,36 +104,44 @@ class CountingDelegate: HTTPClientResponseDelegate{
104104
classDelayOnHeadDelegate:HTTPClientResponseDelegate{
105105
typealiasResponse=ByteBuffer
106106

107-
letpromise:EventLoopPromise<Void>
107+
leteventLoop:EventLoop
108+
letdidReceiveHead:(HTTPResponseHead,EventLoopPromise<Void>)->Void
108109

109110
privatevardata:ByteBuffer
110111

111112
privatevarmayReceiveData=false
112113

113114
privatevarexpectError=false
114115

115-
init(promise:EventLoopPromise<Void>){
116-
self.promise = promise
116+
init(eventLoop:EventLoop, didReceiveHead:@escaping(HTTPResponseHead,EventLoopPromise<Void>)->Void){
117+
self.eventLoop = eventLoop
118+
self.didReceiveHead = didReceiveHead
117119
self.data =ByteBuffer()
118-
119-
self.promise.futureResult.whenSuccess{
120-
self.mayReceiveData =true
121-
}
122-
self.promise.futureResult.whenFailure{(_:Error)in
123-
self.expectError =true
124-
}
125120
}
126121

127122
func didReceiveHead(task:HTTPClient.Task<Response>, _ head:HTTPResponseHead)->EventLoopFuture<Void>{
123+
XCTAssertFalse(self.mayReceiveData)
128124
XCTAssertFalse(self.expectError)
129-
returnself.promise.futureResult.hop(to: task.eventLoop)
125+
126+
letpromise=self.eventLoop.makePromise(of:Void.self)
127+
promise.futureResult.whenComplete{
128+
switch $0 {
129+
case.success:
130+
self.mayReceiveData =true
131+
case.failure:
132+
self.expectError =true
133+
}
134+
}
135+
136+
self.didReceiveHead(head, promise)
137+
return promise.futureResult
130138
}
131139

132140
func didReceiveBodyPart(task:HTTPClient.Task<Response>, _ buffer:ByteBuffer)->EventLoopFuture<Void>{
133141
XCTAssertTrue(self.mayReceiveData)
134142
XCTAssertFalse(self.expectError)
135143
self.data.writeImmutableBuffer(buffer)
136-
returnself.promise.futureResult.hop(to: task.eventLoop)
144+
returnself.eventLoop.makeSucceededFuture(())
137145
}
138146

139147
func didFinishRequest(task:HTTPClient.Task<Response>)throws->Response{

‎Tests/AsyncHTTPClientTests/HTTPClientTests.swift‎

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2895,16 +2895,14 @@ class HTTPClientTests: XCTestCase{
28952895

28962896
func testCloseWhileBackpressureIsExertedIsFine()throws{
28972897
letrequest=tryRequest(url:self.defaultHTTPBinURLPrefix +"close-on-response")
2898-
letbackpressurePromise=self.defaultClient.eventLoopGroup.next().makePromise(of:Void.self)
2899-
2900-
letresultFuture=self.defaultClient.execute(
2901-
request: request, delegate:DelayOnHeadDelegate(promise: backpressurePromise)
2902-
)
2903-
2904-
self.defaultClient.eventLoopGroup.next().scheduleTask(in:.milliseconds(50)){
2905-
backpressurePromise.succeed(())
2898+
letdelegate=DelayOnHeadDelegate(eventLoop:self.clientGroup.next()){ _, promise in
2899+
promise.futureResult.eventLoop.scheduleTask(in:.milliseconds(50)){
2900+
promise.succeed(())
2901+
}
29062902
}
29072903

2904+
letresultFuture=self.defaultClient.execute(request: request, delegate: delegate)
2905+
29082906
// The full response must be correctly delivered.
29092907
vardata=try resultFuture.wait()
29102908
guardlet info =try data.readJSONDecodable(RequestInfo.self, length: data.readableBytes)else{
@@ -2920,16 +2918,12 @@ class HTTPClientTests: XCTestCase{
29202918
}
29212919

29222920
letrequest=tryRequest(url:self.defaultHTTPBinURLPrefix +"close-on-response")
2923-
letbackpressurePromise=self.defaultClient.eventLoopGroup.next().makePromise(of:Void.self)
2924-
2925-
letresultFuture=self.defaultClient.execute(
2926-
request: request, delegate:DelayOnHeadDelegate(promise: backpressurePromise)
2927-
)
2928-
2929-
self.defaultClient.eventLoopGroup.next().scheduleTask(in:.milliseconds(50)){
2921+
letdelegate=DelayOnHeadDelegate(eventLoop:self.clientGroup.next()){ _, backpressurePromise in
29302922
backpressurePromise.fail(ExpectedError.expected)
29312923
}
29322924

2925+
letresultFuture=self.defaultClient.execute(request: request, delegate: delegate)
2926+
29332927
// The task must be failed.
29342928
XCTAssertThrowsError(try resultFuture.wait()){ error in
29352929
XCTAssertEqual(error as?ExpectedError,.expected)

0 commit comments

Comments
(0)