diff --git a/Tests/AsyncHTTPClientTests/RequestBagTests.swift b/Tests/AsyncHTTPClientTests/RequestBagTests.swift index 75d57ba26..e2a959589 100644 --- a/Tests/AsyncHTTPClientTests/RequestBagTests.swift +++ b/Tests/AsyncHTTPClientTests/RequestBagTests.swift @@ -961,13 +961,18 @@ class UploadCountingDelegate: HTTPClientResponseDelegate { } } -class MockTaskQueuer: HTTPRequestScheduler { +final class MockTaskQueuer: HTTPRequestScheduler { private(set) var hitCancelCount = 0 - init() {} + let onCancelRequest: (@Sendable (HTTPSchedulableRequest) -> Void)? - func cancelRequest(_: HTTPSchedulableRequest) { + init(onCancelRequest: (@Sendable (HTTPSchedulableRequest) -> Void)? = nil) { + self.onCancelRequest = onCancelRequest + } + + func cancelRequest(_ request: HTTPSchedulableRequest) { self.hitCancelCount += 1 + self.onCancelRequest?(request) } } diff --git a/Tests/AsyncHTTPClientTests/TransactionTests.swift b/Tests/AsyncHTTPClientTests/TransactionTests.swift index 19454681c..13cb87eb5 100644 --- a/Tests/AsyncHTTPClientTests/TransactionTests.swift +++ b/Tests/AsyncHTTPClientTests/TransactionTests.swift @@ -27,6 +27,9 @@ typealias PreparedRequest = HTTPClientRequest.Prepared final class TransactionTests: XCTestCase { func testCancelAsyncRequest() { guard #available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) else { return } + // creating the `XCTestExpectation` off the main thread crashes on Linux with Swift 5.6 + // therefore we create it here as a workaround which works fine + let scheduledRequestCanceled = self.expectation(description: "scheduled request canceled") XCTAsyncTest { let embeddedEventLoop = EmbeddedEventLoop() defer { XCTAssertNoThrow(try embeddedEventLoop.syncShutdownGracefully()) } @@ -43,19 +46,25 @@ final class TransactionTests: XCTestCase { preferredEventLoop: embeddedEventLoop ) - let queuer = MockTaskQueuer() + let queuer = MockTaskQueuer { _ in + scheduledRequestCanceled.fulfill() + } transaction.requestWasQueued(queuer) + XCTAssertEqual(queuer.hitCancelCount, 0) Task.detached { try await Task.sleep(nanoseconds: 5 * 1000 * 1000) transaction.cancel() } - XCTAssertEqual(queuer.hitCancelCount, 0) await XCTAssertThrowsError(try await responseTask.value) { error in XCTAssertTrue(error is CancellationError, "unexpected error \(error)") } - XCTAssertEqual(queuer.hitCancelCount, 1) + + // self.fulfillment(of:) is not available on Linux + _ = { + self.wait(for: [scheduledRequestCanceled], timeout: 1) + }() } }