swift-nio/Tests/NIOPosixTests/ChannelOptionStorageTest.swift

108 lines
4.1 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2021 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import XCTest
import NIOCore
import NIOEmbedded
class ChannelOptionStorageTest: XCTestCase {
func testWeStartWithNoOptions() throws {
let cos = ChannelOptions.Storage()
let optionsCollector = OptionsCollectingChannel()
XCTAssertNoThrow(try cos.applyAllChannelOptions(to: optionsCollector).wait())
XCTAssertEqual(0, optionsCollector.allOptions.count)
}
func testSetTwoOptionsOfDifferentType() throws {
var cos = ChannelOptions.Storage()
let optionsCollector = OptionsCollectingChannel()
cos.append(key: ChannelOptions.socketOption(.so_reuseaddr), value: 1)
cos.append(key: ChannelOptions.backlog, value: 2)
XCTAssertNoThrow(try cos.applyAllChannelOptions(to: optionsCollector).wait())
XCTAssertEqual(2, optionsCollector.allOptions.count)
}
func testSetTwoOptionsOfSameType() throws {
let options: [(ChannelOptions.Types.SocketOption, SocketOptionValue)] = [(ChannelOptions.socketOption(.so_reuseaddr), 1),
(ChannelOptions.socketOption(.so_rcvtimeo), 2)]
var cos = ChannelOptions.Storage()
let optionsCollector = OptionsCollectingChannel()
for kv in options {
cos.append(key: kv.0, value: kv.1)
}
XCTAssertNoThrow(try cos.applyAllChannelOptions(to: optionsCollector).wait())
XCTAssertEqual(2, optionsCollector.allOptions.count)
XCTAssertEqual(options.map { $0.0 },
optionsCollector.allOptions.map { option in
return option.0 as! ChannelOptions.Types.SocketOption
})
XCTAssertEqual(options.map { $0.1 },
optionsCollector.allOptions.map { option in
return option.1 as! SocketOptionValue
})
}
func testSetOneOptionTwice() throws {
var cos = ChannelOptions.Storage()
let optionsCollector = OptionsCollectingChannel()
cos.append(key: ChannelOptions.socketOption(.so_reuseaddr), value: 1)
cos.append(key: ChannelOptions.socketOption(.so_reuseaddr), value: 2)
XCTAssertNoThrow(try cos.applyAllChannelOptions(to: optionsCollector).wait())
XCTAssertEqual(1, optionsCollector.allOptions.count)
XCTAssertEqual([ChannelOptions.socketOption(.so_reuseaddr)],
optionsCollector.allOptions.map { option in
return option.0 as! ChannelOptions.Types.SocketOption
})
XCTAssertEqual([SocketOptionValue(2)],
optionsCollector.allOptions.map { option in
return option.1 as! SocketOptionValue
})
}
}
class OptionsCollectingChannel: Channel {
var allOptions: [(Any, Any)] = []
var allocator: ByteBufferAllocator { fatalError() }
var closeFuture: EventLoopFuture<Void> { fatalError() }
var pipeline: ChannelPipeline { fatalError() }
var localAddress: SocketAddress? { fatalError() }
var remoteAddress: SocketAddress? { fatalError() }
var parent: Channel? { fatalError() }
func setOption<Option: ChannelOption>(_ option: Option, value: Option.Value) -> EventLoopFuture<Void> {
self.allOptions.append((option, value))
return self.eventLoop.makeSucceededFuture(())
}
func getOption<Option: ChannelOption>(_ option: Option) -> EventLoopFuture<Option.Value> {
fatalError()
}
var isWritable: Bool { fatalError() }
var isActive: Bool { fatalError() }
var _channelCore: ChannelCore { fatalError() }
var eventLoop: EventLoop {
return EmbeddedEventLoop()
}
}