From bfd9b398bbb6e9380d2f3a97dc4a76a7092d4b7f Mon Sep 17 00:00:00 2001 From: Tobias Haeberle Date: Wed, 26 Jun 2019 23:37:56 +0200 Subject: [PATCH] Make sure that event loop of task is the same as event loop of channel --- Sources/AsyncHTTPClient/HTTPClient.swift | 2 +- Sources/AsyncHTTPClient/HTTPHandler.swift | 1 + .../HTTPClientTests+XCTest.swift | 1 + .../HTTPClientTests.swift | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index 4b3bab7ca..df7b4ea4c 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -123,7 +123,7 @@ public class HTTPClient { let task = Task(eventLoop: eventLoop) - var bootstrap = ClientBootstrap(group: self.eventLoopGroup) + var bootstrap = ClientBootstrap(group: eventLoop) .channelOption(ChannelOptions.socket(SocketOptionLevel(IPPROTO_TCP), TCP_NODELAY), value: 1) .channelInitializer { channel in let encoder = HTTPRequestEncoder() diff --git a/Sources/AsyncHTTPClient/HTTPHandler.swift b/Sources/AsyncHTTPClient/HTTPHandler.swift index 9cfb7c970..862c7a371 100644 --- a/Sources/AsyncHTTPClient/HTTPHandler.swift +++ b/Sources/AsyncHTTPClient/HTTPHandler.swift @@ -271,6 +271,7 @@ extension HTTPClient { } func setChannel(_ channel: Channel) -> Channel { + precondition(self.eventLoop === channel.eventLoop, "Channel must use same event loop as this task.") return self.lock.withLock { self.channel = channel return channel diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift b/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift index 644a9b50c..5b46c82c8 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift @@ -27,6 +27,7 @@ extension HTTPClientTests { return [ ("testRequestURI", testRequestURI), ("testGet", testGet), + ("testGetWithSharedEventLoopGroup", testGetWithSharedEventLoopGroup), ("testPost", testPost), ("testGetHttps", testGetHttps), ("testPostHttps", testPostHttps), diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTests.swift b/Tests/AsyncHTTPClientTests/HTTPClientTests.swift index 506968528..d6a6640de 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTests.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTests.swift @@ -44,6 +44,25 @@ class HTTPClientTests: XCTestCase { let response = try httpClient.get(url: "http://localhost:\(httpBin.port)/get").wait() XCTAssertEqual(.ok, response.status) } + + func testGetWithSharedEventLoopGroup() throws { + let httpBin = HttpBin() + let elg = MultiThreadedEventLoopGroup(numberOfThreads: 8) + let httpClient = HTTPClient(eventLoopGroupProvider: .shared(elg)) + defer { + try! elg.syncShutdownGracefully() + httpBin.shutdown() + } + + let delegate = TestHTTPDelegate() + let request = try HTTPClient.Request(url: "http://localhost:\(httpBin.port)/events/10/1") + let task = httpClient.execute(request: request, delegate: delegate) + let expectedEventLoop = task.eventLoop + task.futureResult.whenComplete { (_) in + XCTAssertTrue(expectedEventLoop.inEventLoop) + } + try task.wait() + } func testPost() throws { let httpBin = HttpBin()