1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 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 NIO
import NIOWebSocket
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)
}
}
|