Files
async-http-client/Tests/AsyncHTTPClientTests/SOCKSEventsHandlerTests.swift
T
Fabian Fett eab2a84b1c Use explicit NIO imports (#407)
* Use explicit NIO imports for `NIOCore`, `NIOPosix` and `NIOEmbedded`
* Updated dependencies
2021-08-19 21:11:49 +02:00

91 lines
4.1 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the AsyncHTTPClient open source project
//
// Copyright (c) 2021 Apple Inc. and the AsyncHTTPClient project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of AsyncHTTPClient project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
@testable import AsyncHTTPClient
import NIOCore
import NIOEmbedded
import NIOSOCKS
import XCTest
class SOCKSEventsHandlerTests: XCTestCase {
func testHandlerHappyPath() {
let socksEventsHandler = SOCKSEventsHandler(deadline: .now() + .seconds(10))
XCTAssertNil(socksEventsHandler.socksEstablishedFuture)
let embedded = EmbeddedChannel(handlers: [socksEventsHandler])
XCTAssertNotNil(socksEventsHandler.socksEstablishedFuture)
XCTAssertNoThrow(try embedded.connect(to: .makeAddressResolvingHost("localhost", port: 0)).wait())
embedded.pipeline.fireUserInboundEventTriggered(SOCKSProxyEstablishedEvent())
XCTAssertNoThrow(try XCTUnwrap(socksEventsHandler.socksEstablishedFuture).wait())
}
func testHandlerFailsFutureWhenRemovedWithoutEvent() {
let socksEventsHandler = SOCKSEventsHandler(deadline: .now() + .seconds(10))
XCTAssertNil(socksEventsHandler.socksEstablishedFuture)
let embedded = EmbeddedChannel(handlers: [socksEventsHandler])
XCTAssertNotNil(socksEventsHandler.socksEstablishedFuture)
XCTAssertNoThrow(try embedded.pipeline.removeHandler(socksEventsHandler).wait())
XCTAssertThrowsError(try XCTUnwrap(socksEventsHandler.socksEstablishedFuture).wait())
}
func testHandlerFailsFutureWhenHandshakeFails() {
let socksEventsHandler = SOCKSEventsHandler(deadline: .now() + .seconds(10))
XCTAssertNil(socksEventsHandler.socksEstablishedFuture)
let embedded = EmbeddedChannel(handlers: [socksEventsHandler])
XCTAssertNotNil(socksEventsHandler.socksEstablishedFuture)
let error = SOCKSError.InvalidReservedByte(actual: 19)
embedded.pipeline.fireErrorCaught(error)
XCTAssertThrowsError(try XCTUnwrap(socksEventsHandler.socksEstablishedFuture).wait()) {
XCTAssertEqual($0 as? SOCKSError.InvalidReservedByte, error)
}
}
func testHandlerClosesConnectionIfHandshakeTimesout() {
// .uptimeNanoseconds(0) => .now() for EmbeddedEventLoops
let socksEventsHandler = SOCKSEventsHandler(deadline: .uptimeNanoseconds(0) + .milliseconds(10))
XCTAssertNil(socksEventsHandler.socksEstablishedFuture)
let embedded = EmbeddedChannel(handlers: [socksEventsHandler])
XCTAssertNotNil(socksEventsHandler.socksEstablishedFuture)
XCTAssertNoThrow(try embedded.connect(to: .makeAddressResolvingHost("localhost", port: 0)).wait())
embedded.embeddedEventLoop.advanceTime(by: .milliseconds(20))
XCTAssertThrowsError(try XCTUnwrap(socksEventsHandler.socksEstablishedFuture).wait()) {
XCTAssertEqual($0 as? HTTPClientError, .socksHandshakeTimeout)
}
XCTAssertFalse(embedded.isActive, "The timeout shall close the connection")
}
func testHandlerWorksIfDeadlineIsInPast() {
// .uptimeNanoseconds(0) => .now() for EmbeddedEventLoops
let socksEventsHandler = SOCKSEventsHandler(deadline: .uptimeNanoseconds(0))
XCTAssertNil(socksEventsHandler.socksEstablishedFuture)
let embedded = EmbeddedChannel(handlers: [socksEventsHandler])
embedded.embeddedEventLoop.advanceTime(by: .milliseconds(10))
XCTAssertNoThrow(try embedded.connect(to: .makeAddressResolvingHost("localhost", port: 0)).wait())
// schedules execute only on the next tick
embedded.embeddedEventLoop.run()
XCTAssertThrowsError(try XCTUnwrap(socksEventsHandler.socksEstablishedFuture).wait()) {
XCTAssertEqual($0 as? HTTPClientError, .socksHandshakeTimeout)
}
XCTAssertFalse(embedded.isActive, "The timeout shall close the connection")
}
}