Skip to content

Commit 008d436

Browse files
committed
Merge branch 'master' into pooling
2 parents a937ab7 + 8031c46 commit 008d436

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ extension HTTPClientTests {
7676
("testResponseDelayGet", testResponseDelayGet),
7777
("testIdleTimeoutNoReuse", testIdleTimeoutNoReuse),
7878
("testStressGetClose", testStressGetClose),
79+
("testManyConcurrentRequestsWork", testManyConcurrentRequestsWork),
7980
("testRepeatedRequestsWorkWhenServerAlwaysCloses", testRepeatedRequestsWorkWhenServerAlwaysCloses),
8081
("testShutdownBeforeTasksCompletion", testShutdownBeforeTasksCompletion),
8182
("testUncleanShutdownActuallyShutsDown", testUncleanShutdownActuallyShutsDown),

Tests/AsyncHTTPClientTests/HTTPClientTests.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,52 @@ class HTTPClientTests: XCTestCase {
10791079
XCTAssertNoThrow(try EventLoopFuture<HTTPClient.Response>.andAllComplete(futureResults, on: eventLoop).timeout(after: .seconds(10)).wait())
10801080
}
10811081

1082+
func testManyConcurrentRequestsWork() {
1083+
let numberOfWorkers = 20
1084+
let numberOfRequestsPerWorkers = 20
1085+
let allWorkersReady = DispatchSemaphore(value: 0)
1086+
let allWorkersGo = DispatchSemaphore(value: 0)
1087+
let allDone = DispatchGroup()
1088+
1089+
let httpBin = HTTPBin()
1090+
defer {
1091+
XCTAssertNoThrow(try httpBin.shutdown())
1092+
}
1093+
let httpClient = HTTPClient(eventLoopGroupProvider: .createNew)
1094+
defer {
1095+
XCTAssertNoThrow(try httpClient.syncShutdown())
1096+
}
1097+
1098+
let url = "http://localhost:\(httpBin.port)/get"
1099+
XCTAssertNoThrow(XCTAssertEqual(.ok, try httpClient.get(url: url).wait().status))
1100+
1101+
for w in 0..<numberOfWorkers {
1102+
let q = DispatchQueue(label: "worker \(w)")
1103+
q.async(group: allDone) {
1104+
func go() {
1105+
allWorkersReady.signal() // tell the driver we're ready
1106+
allWorkersGo.wait() // wait for the driver to let us go
1107+
1108+
for _ in 0..<numberOfRequestsPerWorkers {
1109+
XCTAssertNoThrow(XCTAssertEqual(.ok, try httpClient.get(url: url).wait().status))
1110+
}
1111+
}
1112+
go()
1113+
}
1114+
}
1115+
1116+
for _ in 0..<numberOfWorkers {
1117+
allWorkersReady.wait()
1118+
}
1119+
// now all workers should be waiting for the go signal
1120+
1121+
for _ in 0..<numberOfWorkers {
1122+
allWorkersGo.signal()
1123+
}
1124+
// all workers should be running, let's wait for them to finish
1125+
allDone.wait()
1126+
}
1127+
10821128
func testRepeatedRequestsWorkWhenServerAlwaysCloses() {
10831129
let web = NIOHTTP1TestServer(group: self.group)
10841130
defer {

0 commit comments

Comments
 (0)