@@ -922,6 +922,52 @@ class HTTPClientTests: XCTestCase {
922
922
}
923
923
}
924
924
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
+
925
971
func testRepeatedRequestsWorkWhenServerAlwaysCloses( ) {
926
972
let web = NIOHTTP1TestServer ( group: self . group)
927
973
defer {
0 commit comments