Skip to content

Commit 6986d18

Browse files
committed
Fixes the DelayOnHeadDelegate test utility
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 6986d18

File tree

2 files changed

+30
-28
lines changed

2 files changed

+30
-28
lines changed

Diff for: Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift

+20-12
Original file line numberDiff line numberDiff line change
@@ -104,36 +104,44 @@ class CountingDelegate: HTTPClientResponseDelegate {
104104
class DelayOnHeadDelegate: HTTPClientResponseDelegate {
105105
typealias Response = ByteBuffer
106106

107-
let promise: EventLoopPromise<Void>
107+
let eventLoop: EventLoop
108+
let didReceiveHead: (HTTPResponseHead, EventLoopPromise<Void>) -> ()
108109

109110
private var data: ByteBuffer
110111

111112
private var mayReceiveData = false
112113

113114
private var expectError = false
114115

115-
init(promise: EventLoopPromise<Void>) {
116-
self.promise = promise
116+
init(eventLoop: EventLoop, didReceiveHead: @escaping (HTTPResponseHead, EventLoopPromise<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-
return self.promise.futureResult.hop(to: task.eventLoop)
125+
126+
let promise = 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-
return self.promise.futureResult.hop(to: task.eventLoop)
144+
return eventLoop.makeSucceededFuture(())
137145
}
138146

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

Diff for: Tests/AsyncHTTPClientTests/HTTPClientTests.swift

+10-16
Original file line numberDiff line numberDiff line change
@@ -2895,15 +2895,13 @@ class HTTPClientTests: XCTestCase {
28952895

28962896
func testCloseWhileBackpressureIsExertedIsFine() throws {
28972897
let request = try Request(url: self.defaultHTTPBinURLPrefix + "close-on-response")
2898-
let backpressurePromise = self.defaultClient.eventLoopGroup.next().makePromise(of: Void.self)
2899-
2900-
let resultFuture = 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+
let delegate = DelayOnHeadDelegate(eventLoop: self.clientGroup.next()) { head, promise in
2899+
promise.futureResult.eventLoop.scheduleTask(in: .milliseconds(50)) {
2900+
promise.succeed(())
2901+
}
29062902
}
2903+
2904+
let resultFuture = self.defaultClient.execute(request: request, delegate: delegate)
29072905

29082906
// The full response must be correctly delivered.
29092907
var data = try resultFuture.wait()
@@ -2920,16 +2918,12 @@ class HTTPClientTests: XCTestCase {
29202918
}
29212919

29222920
let request = try Request(url: self.defaultHTTPBinURLPrefix + "close-on-response")
2923-
let backpressurePromise = self.defaultClient.eventLoopGroup.next().makePromise(of: Void.self)
2924-
2925-
let resultFuture = self.defaultClient.execute(
2926-
request: request, delegate: DelayOnHeadDelegate(promise: backpressurePromise)
2927-
)
2928-
2929-
self.defaultClient.eventLoopGroup.next().scheduleTask(in: .milliseconds(50)) {
2921+
let delegate = DelayOnHeadDelegate(eventLoop: self.clientGroup.next()) { _, backpressurePromise in
29302922
backpressurePromise.fail(ExpectedError.expected)
29312923
}
2932-
2924+
2925+
let resultFuture = 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)