diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift b/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift index 378d206e0..de11d548a 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift @@ -68,6 +68,7 @@ extension HTTPClientTests { ("testWorksWhenServerClosesConnectionAfterReceivingRequest", testWorksWhenServerClosesConnectionAfterReceivingRequest), ("testSubsequentRequestsWorkWithServerSendingConnectionClose", testSubsequentRequestsWorkWithServerSendingConnectionClose), ("testSubsequentRequestsWorkWithServerAlternatingBetweenKeepAliveAndClose", testSubsequentRequestsWorkWithServerAlternatingBetweenKeepAliveAndClose), + ("testManyConcurrentRequestsWork", testManyConcurrentRequestsWork), ("testRepeatedRequestsWorkWhenServerAlwaysCloses", testRepeatedRequestsWorkWhenServerAlwaysCloses), ] } diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTests.swift b/Tests/AsyncHTTPClientTests/HTTPClientTests.swift index 0f91d3995..4bf6daa93 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTests.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTests.swift @@ -922,6 +922,52 @@ class HTTPClientTests: XCTestCase { } } + func testManyConcurrentRequestsWork() { + let numberOfWorkers = 20 + let numberOfRequestsPerWorkers = 20 + let allWorkersReady = DispatchSemaphore(value: 0) + let allWorkersGo = DispatchSemaphore(value: 0) + let allDone = DispatchGroup() + + let httpBin = HTTPBin() + defer { + XCTAssertNoThrow(try httpBin.shutdown()) + } + let httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + defer { + XCTAssertNoThrow(try httpClient.syncShutdown()) + } + + let url = "http://localhost:\(httpBin.port)/get" + XCTAssertNoThrow(XCTAssertEqual(.ok, try httpClient.get(url: url).wait().status)) + + for w in 0..