Skip to content

Commit 1c05e2a

Browse files
committed
[Tests] Add some basic IPv6 tests
1 parent 2fe3f42 commit 1c05e2a

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

Tests/AsyncHTTPClientTests/HTTPClientTestUtils.swift

+20
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import NIOSSL
2626
import NIOTLS
2727
import NIOTransportServices
2828
import XCTest
29+
import NIOEmbedded
2930

3031
/// Are we testing NIO Transport services
3132
func isTestingNIOTS() -> Bool {
@@ -46,6 +47,22 @@ func getDefaultEventLoopGroup(numberOfThreads: Int) -> EventLoopGroup {
4647
return MultiThreadedEventLoopGroup(numberOfThreads: numberOfThreads)
4748
}
4849

50+
let canBindIPv6Loopback: Bool = {
51+
#if canImport(Network)
52+
if #available(OSX 10.14, iOS 12.0, tvOS 12.0, watchOS 6.0, *),
53+
isTestingNIOTS() {
54+
return true
55+
}
56+
#endif
57+
let serverChannel = try? ServerBootstrap(group: getDefaultEventLoopGroup(numberOfThreads: 1))
58+
.serverChannelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: 1)
59+
.bind(host: "::1", port: 9999)
60+
.wait()
61+
let didBind = (serverChannel != nil)
62+
try? serverChannel?.close().wait()
63+
return didBind
64+
}()
65+
4966
class TestHTTPDelegate: HTTPClientResponseDelegate {
5067
typealias Response = Void
5168

@@ -266,6 +283,7 @@ internal final class HTTPBin<RequestHandler: ChannelInboundHandler> where
266283
enum BindTarget {
267284
case unixDomainSocket(String)
268285
case localhostIPv4RandomPort
286+
case localhostIPv6RandomPort
269287
}
270288

271289
enum Mode {
@@ -331,6 +349,8 @@ internal final class HTTPBin<RequestHandler: ChannelInboundHandler> where
331349
switch bindTarget {
332350
case .localhostIPv4RandomPort:
333351
socketAddress = try! SocketAddress(ipAddress: "127.0.0.1", port: 0)
352+
case .localhostIPv6RandomPort:
353+
socketAddress = try! SocketAddress(ipAddress: "::1", port: 0)
334354
case .unixDomainSocket(let path):
335355
socketAddress = try! SocketAddress(unixDomainSocketPath: path)
336356
}

Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ extension HTTPClientTests {
3838
("testGetHttps", testGetHttps),
3939
("testGetHttpsWithIP", testGetHttpsWithIP),
4040
("testGetHTTPSWorksOnMTELGWithIP", testGetHTTPSWorksOnMTELGWithIP),
41+
("testGetHttpsWithIPv6", testGetHttpsWithIPv6),
42+
("testGetHTTPSWorksOnMTELGWithIPv6", testGetHTTPSWorksOnMTELGWithIPv6),
4143
("testPostHttps", testPostHttps),
4244
("testHttpRedirect", testHttpRedirect),
4345
("testHttpHostRedirect", testHttpHostRedirect),

Tests/AsyncHTTPClientTests/HTTPClientTests.swift

+34
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,40 @@ class HTTPClientTests: XCTestCase {
333333
XCTAssertEqual(.ok, response.status)
334334
}
335335

336+
func testGetHttpsWithIPv6() throws {
337+
try XCTSkipUnless(canBindIPv6Loopback, "Requires IPv6")
338+
let localHTTPBin = HTTPBin(.http1_1(ssl: true), bindTarget: .localhostIPv6RandomPort)
339+
let localClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup),
340+
configuration: HTTPClient.Configuration(certificateVerification: .none))
341+
defer {
342+
XCTAssertNoThrow(try localClient.syncShutdown())
343+
XCTAssertNoThrow(try localHTTPBin.shutdown())
344+
}
345+
var response: HTTPClient.Response?
346+
XCTAssertNoThrow(response = try localClient.get(url: "https://[::1]:\(localHTTPBin.port)/get").wait())
347+
XCTAssertEqual(.ok, response?.status)
348+
}
349+
350+
func testGetHTTPSWorksOnMTELGWithIPv6() throws {
351+
try XCTSkipUnless(canBindIPv6Loopback, "Requires IPv6")
352+
// Same test as above but this one will use NIO on Sockets even on Apple platforms, just to make sure
353+
// this works.
354+
let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
355+
defer {
356+
XCTAssertNoThrow(try group.syncShutdownGracefully())
357+
}
358+
let localHTTPBin = HTTPBin(.http1_1(ssl: true), bindTarget: .localhostIPv6RandomPort)
359+
let localClient = HTTPClient(eventLoopGroupProvider: .shared(group),
360+
configuration: HTTPClient.Configuration(certificateVerification: .none))
361+
defer {
362+
XCTAssertNoThrow(try localClient.syncShutdown())
363+
XCTAssertNoThrow(try localHTTPBin.shutdown())
364+
}
365+
var response: HTTPClient.Response?
366+
XCTAssertNoThrow(response = try localClient.get(url: "https://[::1]:\(localHTTPBin.port)/get").wait())
367+
XCTAssertEqual(.ok, response?.status)
368+
}
369+
336370
func testPostHttps() throws {
337371
let localHTTPBin = HTTPBin(.http1_1(ssl: true))
338372
let localClient = HTTPClient(eventLoopGroupProvider: .shared(self.clientGroup),

0 commit comments

Comments
 (0)