@@ -922,6 +922,52 @@ class HTTPClientTests: XCTestCase {
922922 }
923923 }
924924
925+ func testManyConcurrentRequestsWork( ) {
926+ let numberOfWorkers = 20
927+ let numberOfRequestsPerWorkers = 20
928+ let allWorkersReady = DispatchSemaphore ( value: 0 )
929+ let allWorkersGo = DispatchSemaphore ( value: 0 )
930+ let allDone = DispatchGroup ( )
931+
932+ let httpBin = HTTPBin ( )
933+ defer {
934+ XCTAssertNoThrow ( try httpBin. shutdown ( ) )
935+ }
936+ let httpClient = HTTPClient ( eventLoopGroupProvider: . createNew)
937+ defer {
938+ XCTAssertNoThrow ( try httpClient. syncShutdown ( ) )
939+ }
940+
941+ let url = " http://localhost: \( httpBin. port) /get "
942+ XCTAssertNoThrow ( XCTAssertEqual ( . ok, try httpClient. get ( url: url) . wait ( ) . status) )
943+
944+ for w in 0 ..< numberOfWorkers {
945+ let q = DispatchQueue ( label: " worker \( w) " )
946+ q. async ( group: allDone) {
947+ func go( ) {
948+ allWorkersReady. signal ( ) // tell the driver we're ready
949+ allWorkersGo. wait ( ) // wait for the driver to let us go
950+
951+ for _ in 0 ..< numberOfRequestsPerWorkers {
952+ XCTAssertNoThrow ( XCTAssertEqual ( . ok, try httpClient. get ( url: url) . wait ( ) . status) )
953+ }
954+ }
955+ go ( )
956+ }
957+ }
958+
959+ for _ in 0 ..< numberOfWorkers {
960+ allWorkersReady. wait ( )
961+ }
962+ // now all workers should be waiting for the go signal
963+
964+ for _ in 0 ..< numberOfWorkers {
965+ allWorkersGo. signal ( )
966+ }
967+ // all workers should be running, let's wait for them to finish
968+ allDone. wait ( )
969+ }
970+
925971 func testRepeatedRequestsWorkWhenServerAlwaysCloses( ) {
926972 let web = NIOHTTP1TestServer ( group: self . group)
927973 defer {
0 commit comments