Files
swift-nio/Tests/NIOWebSocketTests/WebSocketMaskingKeyTests.swift
Adam Fowler d8363850ce Add WebSocketFrame.reservedBits OptionSet (#2971)
Add support for treating WebSocketFrame reserved bits as an option set

### Motivation:

I would like to do mask operations on the reserved bits of the
WebSocketFrame eg check none are set, check only bits in a mask are set.
With the current public interface it is only possible to check the state
of one bit at a time.

### Modifications:

Add `WebSocketFrame.ReservedBits` OptionSet
Add computed member `WebSocketFrame.reservedBits`  

### Result:

I can now check the status of multiple bits in one operation eg
`frame.reservedBits.isEmpty`
`frame.reservedBits.itersection([.rsv1, .rsv2]).isEmpty`
2024-11-15 17:45:38 +00:00

84 lines
3.4 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 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 NIOWebSocket
import XCTest
final class WebSocketMaskingKeyTests: XCTestCase {
var generator = SystemRandomNumberGenerator()
func testRandomMaskingKey() {
let key = WebSocketMaskingKey.random(using: &generator)
var buffer = ByteBuffer(bytes: [1, 2, 3, 4, 5, 6, 7, 8])
buffer.webSocketMask(key)
buffer.webSocketUnmask(key)
XCTAssertEqual(buffer, ByteBuffer(bytes: [1, 2, 3, 4, 5, 6, 7, 8]))
}
func testRandomMaskingKeyIsNotAlwaysZero() {
XCTAssertTrue(
(0..<1000).contains { _ in
WebSocketMaskingKey.random(using: &generator) != [0, 0, 0, 0]
},
"at least 1 of 1000 random masking keys should not be all zeros"
)
}
func testRandomMaskingKeyIsNotAlwaysZeroWithDefaultGenerator() {
XCTAssertTrue(
(0..<1000).contains { _ in
WebSocketMaskingKey.random() != [0, 0, 0, 0]
},
"at least 1 of 1000 random masking keys with default generator should not be all zeros"
)
}
func testGetReservedBits() {
let frame = WebSocketFrame(rsv1: true, opcode: .binary, data: .init())
XCTAssertEqual(frame.reservedBits.contains(.rsv1), true)
XCTAssertEqual(frame.reservedBits.contains(.rsv2), false)
XCTAssertEqual(frame.reservedBits.contains(.rsv3), false)
let frame2 = WebSocketFrame(rsv2: true, opcode: .binary, data: .init())
XCTAssertEqual(frame2.reservedBits.contains(.rsv1), false)
XCTAssertEqual(frame2.reservedBits.contains(.rsv2), true)
XCTAssertEqual(frame2.reservedBits.contains(.rsv3), false)
let frame3 = WebSocketFrame(rsv3: true, opcode: .binary, data: .init())
XCTAssertEqual(frame3.reservedBits.contains(.rsv1), false)
XCTAssertEqual(frame3.reservedBits.contains(.rsv2), false)
XCTAssertEqual(frame3.reservedBits.contains(.rsv3), true)
}
func testSetReservedBits() {
var frame = WebSocketFrame(opcode: .binary, data: .init())
frame.reservedBits = .rsv1
XCTAssertEqual(frame.reservedBits.contains(.rsv1), true)
XCTAssertEqual(frame.reservedBits.contains(.rsv2), false)
XCTAssertEqual(frame.reservedBits.contains(.rsv3), false)
XCTAssertEqual(frame.fin, false)
XCTAssertEqual(frame.opcode, .binary)
frame.reservedBits = .rsv2
XCTAssertEqual(frame.reservedBits.contains(.rsv1), false)
XCTAssertEqual(frame.reservedBits.contains(.rsv2), true)
XCTAssertEqual(frame.reservedBits.contains(.rsv3), false)
XCTAssertEqual(frame.fin, false)
XCTAssertEqual(frame.opcode, .binary)
frame.reservedBits = .rsv3
XCTAssertEqual(frame.reservedBits.contains(.rsv1), false)
XCTAssertEqual(frame.reservedBits.contains(.rsv2), false)
XCTAssertEqual(frame.reservedBits.contains(.rsv3), true)
XCTAssertEqual(frame.fin, false)
XCTAssertEqual(frame.opcode, .binary)
}
}