Skip to content

Commit 8031c46

Browse files
authored
add a test that does many equal concurrent requests (#160)
1 parent b8fb78f commit 8031c46

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

Diff for: Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ extension HTTPClientTests {
6868
("testWorksWhenServerClosesConnectionAfterReceivingRequest", testWorksWhenServerClosesConnectionAfterReceivingRequest),
6969
("testSubsequentRequestsWorkWithServerSendingConnectionClose", testSubsequentRequestsWorkWithServerSendingConnectionClose),
7070
("testSubsequentRequestsWorkWithServerAlternatingBetweenKeepAliveAndClose", testSubsequentRequestsWorkWithServerAlternatingBetweenKeepAliveAndClose),
71+
("testManyConcurrentRequestsWork", testManyConcurrentRequestsWork),
7172
("testRepeatedRequestsWorkWhenServerAlwaysCloses", testRepeatedRequestsWorkWhenServerAlwaysCloses),
7273
]
7374
}

Diff for: Tests/AsyncHTTPClientTests/HTTPClientTests.swift

+46
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)