Skip to content

Commit

Permalink
Adding a nicer description for WebSocketFrame. (#2862)
Browse files Browse the repository at this point in the history
### Motivation:

Resolving the following issue:
#2828

### Modifications:

Making `WebSocketFrame` conform to `CustomStringConvertible`.

### Result:

A nicer description for `WebSocketFrame`.

---------

Co-authored-by: Franz Busch <f.busch@apple.com>
  • Loading branch information
supersonicbyte and FranzBusch authored Sep 4, 2024
1 parent 3615f9c commit 74f7b1e
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 0 deletions.
43 changes: 43 additions & 0 deletions Sources/NIOWebSocket/WebSocketFrame.swift
Original file line number Diff line number Diff line change
Expand Up @@ -363,3 +363,46 @@ extension WebSocketFrame._Storage: Equatable {
lhs.data == rhs.data && lhs.extensionData == rhs.extensionData
}
}

extension WebSocketFrame: CustomStringConvertible {
/// A `String` describing this `WebSocketFrame`. Example:
///
/// WebSocketFrame {
/// maskKey: Optional(NIOWebSocket.WebSocketMaskingKey(_key: (187, 28, 185, 79))),
/// fin: true,
/// rsv1: true,
/// rsv2: true,
/// rsv3: true,
/// opcode: WebSocketOpcode.binary,
/// length: 0,
/// data: ByteBuffer { readerIndex: 0, writerIndex: 0, readableBytes: 0, capacity: 0, storageCapacity: 0, slice: _ByteBufferSlice { 0..<0 }, storage: 0x00006000028246b0 (0 bytes) },
/// extensionData: nil,
/// unmaskedData: ByteBuffer { readerIndex: 0, writerIndex: 0, readableBytes: 0, capacity: 0, storageCapacity: 0, slice: _ByteBufferSlice { 0..<0 }, storage: 0x0000600002824800 (0 bytes) },
/// unmaskedDataExtension: nil
/// }
///
/// The format of the description is not API.
///
/// - returns: A description of this `WebSocketFrame`.
public var description: String {
"""
maskKey: \(String(describing: self.maskKey)), \
fin: \(self.fin), \
rsv1: \(self.rsv1), \
rsv2: \(self.rsv2), \
rsv3: \(self.rsv3), \
opcode: \(self.opcode), \
length: \(self.length), \
data: \(String(describing: self.data)), \
extensionData: \(String(describing: self.extensionData)), \
unmaskedData: \(String(describing: self.unmaskedData)), \
unmaskedDataExtension: \(String(describing: self.unmaskedExtensionData))
"""
}
}

extension WebSocketFrame: CustomDebugStringConvertible {
public var debugDescription: String {
"(\(self.description))"
}
}
62 changes: 62 additions & 0 deletions Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -606,4 +606,66 @@ public final class WebSocketFrameDecoderTest: XCTestCase {
// We expect that an error frame will have been written out.
XCTAssertNoThrow(XCTAssertEqual([0x88, 0x02, 0x03, 0xF1], try self.decoderChannel.readAllOutboundBytes()))
}

func testWebSocketFrameDescription() {
let byteBuffer = ByteBuffer()
let webSocketFrame = WebSocketFrame(
fin: true,
rsv1: true,
rsv2: true,
rsv3: true,
opcode: .binary,
maskKey: nil,
data: byteBuffer,
extensionData: nil
)

let expectedOutput = """
maskKey: nil, \
fin: true, \
rsv1: true, \
rsv2: true, \
rsv3: true, \
opcode: WebSocketOpcode.binary, \
length: 0, \
data: \(String(describing: byteBuffer)), \
extensionData: nil, \
unmaskedData: \(String(describing: byteBuffer)), \
unmaskedDataExtension: nil
"""

XCTAssertEqual(expectedOutput, String(describing: webSocketFrame))
}

func testWebSocketFrameDebugDescription() {
let byteBuffer = ByteBuffer()
let webSocketFrame = WebSocketFrame(
fin: true,
rsv1: true,
rsv2: true,
rsv3: true,
opcode: .binary,
maskKey: nil,
data: byteBuffer,
extensionData: nil
)

let expectedOutput = """
(\
maskKey: nil, \
fin: true, \
rsv1: true, \
rsv2: true, \
rsv3: true, \
opcode: WebSocketOpcode.binary, \
length: 0, \
data: \(String(describing: byteBuffer)), \
extensionData: nil, \
unmaskedData: \(String(describing: byteBuffer)), \
unmaskedDataExtension: nil\
)
"""

XCTAssertEqual(expectedOutput, webSocketFrame.debugDescription)
}
}

0 comments on commit 74f7b1e

Please sign in to comment.