mirror of
https://github.com/apple/swift-nio.git
synced 2026-05-20 20:30:36 +00:00
* Apply formatting
* Apply no block comments rule
* Apply OmitExplicitReturns
* Apple OnlyOneTrailingClosureArgument
* Apply NoAssignmentInExpressions
* Fix up DontRepeatTypeInStaticProperties lint errors
* Apply `OrderedImports`
* Apply `ReplaceForEachWithForLoop`
* format file
* Enable the formatting pipeline
* Adopt `AmbiguousTrailingClosureOverload`
* Fix license header
* Fix format check
* Fix `EndOfLineComment`
* Fix CI
* Adapt CI script to check if changes when running formatting
* Separate lint and format into to steps
* Fix format
* Adopt `UseEarlyExits`
* Revert "Adopt `UseEarlyExits`"
This reverts commit d1ac5bbe12.
172 lines
7.8 KiB
Swift
172 lines
7.8 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 NIOCore
|
|
import NIOEmbedded
|
|
import NIOWebSocket
|
|
import XCTest
|
|
|
|
final class NIOWebSocketFrameAggregatorTests: XCTestCase {
|
|
var channel: EmbeddedChannel!
|
|
|
|
override func setUp() {
|
|
channel = EmbeddedChannel(
|
|
handler: NIOWebSocketFrameAggregator(
|
|
minNonFinalFragmentSize: 1,
|
|
maxAccumulatedFrameCount: 4,
|
|
maxAccumulatedFrameSize: 32
|
|
)
|
|
)
|
|
}
|
|
|
|
override func tearDown() {
|
|
XCTAssertEqual(try self.channel.finish().isClean, true)
|
|
}
|
|
|
|
func testEmptyButFinalFrameIsForwardedEvenIfMinNonFinalFragmentSizeIsGreaterThanZero() {
|
|
let frame = WebSocketFrame(fin: true, opcode: .binary, data: ByteBuffer())
|
|
XCTAssertNoThrow(try channel.writeInbound(frame))
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), frame)
|
|
}
|
|
|
|
func testTooSmallAndNonFinalFrameThrows() {
|
|
let frame = WebSocketFrame(fin: false, opcode: .binary, data: ByteBuffer())
|
|
XCTAssertThrowsError(try channel.writeInbound(frame))
|
|
}
|
|
|
|
func testTooBigFrameThrows() {
|
|
let frame = WebSocketFrame(fin: false, opcode: .binary, data: ByteBuffer(repeating: 2, count: 33))
|
|
XCTAssertThrowsError(try channel.writeInbound(frame))
|
|
}
|
|
|
|
func testTooBigAccumulatedFrameThrows() {
|
|
let frame1 = WebSocketFrame(fin: false, opcode: .binary, data: ByteBuffer(repeating: 2, count: 32))
|
|
XCTAssertNoThrow(try channel.writeInbound(frame1))
|
|
|
|
let frame2 = WebSocketFrame(fin: false, opcode: .binary, data: ByteBuffer(repeating: 3, count: 1))
|
|
XCTAssertThrowsError(try channel.writeInbound(frame2))
|
|
}
|
|
|
|
func testTooManyFramesThrow() {
|
|
let firstFrame = WebSocketFrame(fin: false, opcode: .binary, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(firstFrame))
|
|
let fragment = WebSocketFrame(fin: false, opcode: .continuation, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
XCTAssertThrowsError(try channel.writeInbound(fragment))
|
|
}
|
|
func testAlmostTooManyFramesDoNotThrow() {
|
|
let firstFrame = WebSocketFrame(fin: false, opcode: .binary, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(firstFrame))
|
|
let fragment = WebSocketFrame(fin: false, opcode: .continuation, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
let lastFrame = WebSocketFrame(fin: true, opcode: .continuation, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(lastFrame))
|
|
|
|
let completeFrame = WebSocketFrame(fin: true, opcode: .binary, data: ByteBuffer(repeating: 2, count: 8))
|
|
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), completeFrame)
|
|
}
|
|
|
|
func testTextFrameIsStillATextFrameAfterAggregation() {
|
|
let firstFrame = WebSocketFrame(fin: false, opcode: .text, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(firstFrame))
|
|
let fragment = WebSocketFrame(fin: false, opcode: .continuation, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
let lastFrame = WebSocketFrame(fin: true, opcode: .continuation, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(lastFrame))
|
|
|
|
let completeFrame = WebSocketFrame(fin: true, opcode: .text, data: ByteBuffer(repeating: 2, count: 8))
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), completeFrame)
|
|
}
|
|
|
|
func testPingFrameIsForwarded() {
|
|
let controlFrame = WebSocketFrame(fin: true, opcode: .ping, data: ByteBuffer())
|
|
XCTAssertNoThrow(try channel.writeInbound(controlFrame))
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), controlFrame)
|
|
|
|
let fragment = WebSocketFrame(fin: false, opcode: .text, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
|
|
XCTAssertNoThrow(try channel.writeInbound(controlFrame))
|
|
XCTAssertEqual(
|
|
try channel.readInbound(as: WebSocketFrame.self),
|
|
controlFrame,
|
|
"should forward control frames during buffering"
|
|
)
|
|
}
|
|
|
|
func testPongFrameIsForwarded() {
|
|
let controlFrame = WebSocketFrame(fin: true, opcode: .pong, data: ByteBuffer())
|
|
XCTAssertNoThrow(try channel.writeInbound(controlFrame))
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), controlFrame)
|
|
|
|
let fragment = WebSocketFrame(fin: false, opcode: .text, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
|
|
XCTAssertNoThrow(try channel.writeInbound(controlFrame))
|
|
XCTAssertEqual(
|
|
try channel.readInbound(as: WebSocketFrame.self),
|
|
controlFrame,
|
|
"should forward control frames during buffering"
|
|
)
|
|
}
|
|
|
|
func testCloseConnectionFrameIsForwarded() {
|
|
let controlFrame = WebSocketFrame(fin: true, opcode: .connectionClose, data: ByteBuffer())
|
|
XCTAssertNoThrow(try channel.writeInbound(controlFrame))
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), controlFrame)
|
|
|
|
let fragment = WebSocketFrame(fin: false, opcode: .text, data: ByteBuffer(repeating: 2, count: 2))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
|
|
XCTAssertNoThrow(try channel.writeInbound(controlFrame))
|
|
XCTAssertEqual(
|
|
try channel.readInbound(as: WebSocketFrame.self),
|
|
controlFrame,
|
|
"should forward control frames during buffering"
|
|
)
|
|
}
|
|
|
|
func testFrameAggregationWithMask() {
|
|
var firstFrameData = ByteBuffer(repeating: 2, count: 2)
|
|
let firsFrameMask: WebSocketMaskingKey = [1, 2, 3, 4]
|
|
firstFrameData.webSocketMask(firsFrameMask)
|
|
let firstFrame = WebSocketFrame(fin: false, opcode: .binary, maskKey: firsFrameMask, data: firstFrameData)
|
|
XCTAssertNoThrow(try channel.writeInbound(firstFrame))
|
|
|
|
var fragmentData = ByteBuffer(repeating: 3, count: 2)
|
|
let fragmentMaskKey: WebSocketMaskingKey = [5, 6, 7, 8]
|
|
fragmentData.webSocketMask(fragmentMaskKey)
|
|
let fragment = WebSocketFrame(fin: false, opcode: .continuation, maskKey: fragmentMaskKey, data: fragmentData)
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
XCTAssertNoThrow(try channel.writeInbound(fragment))
|
|
|
|
var lastFrameData = ByteBuffer(repeating: 4, count: 2)
|
|
let lastFrameMaskKey: WebSocketMaskingKey = [9, 10, 11, 12]
|
|
lastFrameData.webSocketMask(lastFrameMaskKey)
|
|
let lastFrame = WebSocketFrame(fin: true, opcode: .continuation, maskKey: lastFrameMaskKey, data: lastFrameData)
|
|
XCTAssertNoThrow(try channel.writeInbound(lastFrame))
|
|
|
|
let completeFrame = WebSocketFrame(
|
|
fin: true,
|
|
opcode: .binary,
|
|
data: ByteBuffer(bytes: [2, 2, 3, 3, 3, 3, 4, 4])
|
|
)
|
|
XCTAssertEqual(try channel.readInbound(as: WebSocketFrame.self), completeFrame)
|
|
}
|
|
}
|