@@ -23,6 +23,7 @@ import NIOHTTP1
2323import NIOHTTPTypes
2424import NIOPosix
2525import NIOSSL
26+ import ServiceLifecycle
2627import XCTest
2728
2829final class HummingBirdHTTP2Tests : XCTestCase {
@@ -243,4 +244,54 @@ final class HummingBirdHTTP2Tests: XCTestCase {
243244 }
244245 )
245246 }
247+
248+ func testChildChannelGracefulShutdown( ) async throws {
249+ let eventLoopGroup = MultiThreadedEventLoopGroup ( numberOfThreads: 2 )
250+ defer {
251+ XCTAssertNoThrow ( try eventLoopGroup. syncShutdownGracefully ( ) )
252+ }
253+ var logger = Logger ( label: " Hummingbird " )
254+ logger. logLevel = . trace
255+
256+ var tlsConfiguration = try getClientTLSConfiguration ( )
257+ // no way to override the SSL server name with AsyncHTTPClient so need to set
258+ // hostname verification off
259+ tlsConfiguration. certificateVerification = . noHostnameVerification
260+ try await withHTTPClient ( . init( tlsConfiguration: tlsConfiguration) ) { httpClient in
261+ try await withThrowingTaskGroup ( of: Void . self) { group in
262+ let promise = Promise < Int > ( )
263+ let server = try HTTPServerBuilder . http2Upgrade ( tlsConfiguration: getServerTLSConfiguration ( ) ) . buildServer (
264+ configuration: . init( address: . hostname( port: 0 ) , serverName: testServerName) ,
265+ eventLoopGroup: eventLoopGroup,
266+ logger: logger,
267+ responder: { ( _, responseWriter: consuming ResponseWriter , _) in
268+ try await Task . sleep ( for: . seconds( 2 ) )
269+ try await responseWriter. writeResponse ( . init( status: . ok) )
270+ } ,
271+ onServerRunning: { await promise. complete ( $0. localAddress!. port!) }
272+ )
273+ let serviceGroup = ServiceGroup (
274+ configuration: . init(
275+ services: [ server] ,
276+ gracefulShutdownSignals: [ . sigterm, . sigint] ,
277+ logger: logger
278+ )
279+ )
280+
281+ group. addTask {
282+ try await serviceGroup. run ( )
283+ }
284+
285+ let port = await promise. wait ( )
286+ group. addTask {
287+ let request = HTTPClientRequest ( url: " https://localhost: \( port) / " )
288+ let response = try await httpClient. execute ( request, deadline: . now( ) + . seconds( 30 ) )
289+ XCTAssertEqual ( response. status, . ok)
290+ }
291+ try await Task . sleep ( for: . milliseconds( 500 ) )
292+ await serviceGroup. triggerGracefulShutdown ( )
293+ }
294+ }
295+ }
296+
246297}
0 commit comments