From af9530496bf70de02814ad2cbb3a86f4a512654f Mon Sep 17 00:00:00 2001 From: Ucanbarlic Date: Tue, 3 Sep 2024 11:59:42 +0200 Subject: [PATCH 1/5] Adding a nicer description for `WebSocketFrame`. Motivation: Resolving the following issue: https://github.com/apple/swift-nio/issues/2828 Modifications: Making `WebSocketFrame` conform to `CustomStringConvertible`. Result: A nicer description for `WebSocketFrame`. --- Sources/NIOWebSocket/WebSocketFrame.swift | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Sources/NIOWebSocket/WebSocketFrame.swift b/Sources/NIOWebSocket/WebSocketFrame.swift index 0e3c2cab83..db207227c3 100644 --- a/Sources/NIOWebSocket/WebSocketFrame.swift +++ b/Sources/NIOWebSocket/WebSocketFrame.swift @@ -363,3 +363,42 @@ 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 { + """ + WebSocketFrame { + 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)) + } + """ + } +} From 94113088eb33bc632bde800a3f44a2366f72574f Mon Sep 17 00:00:00 2001 From: Ucanbarlic Date: Tue, 3 Sep 2024 12:27:21 +0200 Subject: [PATCH 2/5] Add unit test for WebSocketFrame description --- .../WebSocketFrameDecoderTest.swift | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift index 8a0a7f1944..adcc882c65 100644 --- a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift +++ b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift @@ -606,4 +606,36 @@ 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 = """ + WebSocketFrame { + 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)) + } } From 64ca1eb68ed43821e1661e373a55e1d6dfb26064 Mon Sep 17 00:00:00 2001 From: Ucanbarlic Date: Tue, 3 Sep 2024 13:56:51 +0200 Subject: [PATCH 3/5] Make WebSocketFrame description one liner --- Sources/NIOWebSocket/WebSocketFrame.swift | 26 +++++++++---------- .../WebSocketFrameDecoderTest.swift | 26 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Sources/NIOWebSocket/WebSocketFrame.swift b/Sources/NIOWebSocket/WebSocketFrame.swift index db207227c3..81cd35ad6e 100644 --- a/Sources/NIOWebSocket/WebSocketFrame.swift +++ b/Sources/NIOWebSocket/WebSocketFrame.swift @@ -386,19 +386,19 @@ extension WebSocketFrame: CustomStringConvertible { /// - returns: A description of this `WebSocketFrame`. public var description: String { """ - WebSocketFrame { - 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)) - } + WebSocketFrame ( \ + 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)) \ + ) """ } } diff --git a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift index adcc882c65..c15d1dc882 100644 --- a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift +++ b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift @@ -621,19 +621,19 @@ public final class WebSocketFrameDecoderTest: XCTestCase { ) let expectedOutput = """ - WebSocketFrame { - 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 - } + WebSocketFrame ( \ + 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)) From 1c958b4b39950610c64e4d254ad7ad2baf0fc3ee Mon Sep 17 00:00:00 2001 From: Ucanbarlic Date: Tue, 3 Sep 2024 15:13:06 +0200 Subject: [PATCH 4/5] Drop type name from description --- Sources/NIOWebSocket/WebSocketFrame.swift | 20 ++++++++++++++++++- .../WebSocketFrameDecoderTest.swift | 4 +--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Sources/NIOWebSocket/WebSocketFrame.swift b/Sources/NIOWebSocket/WebSocketFrame.swift index 81cd35ad6e..2ea6204cd6 100644 --- a/Sources/NIOWebSocket/WebSocketFrame.swift +++ b/Sources/NIOWebSocket/WebSocketFrame.swift @@ -386,7 +386,25 @@ extension WebSocketFrame: CustomStringConvertible { /// - returns: A description of this `WebSocketFrame`. public var description: String { """ - WebSocketFrame ( \ + 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 { + """ + ( \ maskKey: \(String(describing: self.maskKey)), \ fin: \(self.fin), \ rsv1: \(self.rsv1), \ diff --git a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift index c15d1dc882..efbb729f89 100644 --- a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift +++ b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift @@ -621,7 +621,6 @@ public final class WebSocketFrameDecoderTest: XCTestCase { ) let expectedOutput = """ - WebSocketFrame ( \ maskKey: nil, \ fin: true, \ rsv1: true, \ @@ -632,8 +631,7 @@ public final class WebSocketFrameDecoderTest: XCTestCase { data: \(String(describing: byteBuffer)), \ extensionData: nil, \ unmaskedData: \(String(describing: byteBuffer)), \ - unmaskedDataExtension: nil \ - ) + unmaskedDataExtension: nil """ XCTAssertEqual(expectedOutput, String(describing: webSocketFrame)) From 65ff53a14fc4f6f409f202d60a082c988b79388e Mon Sep 17 00:00:00 2001 From: Ucanbarlic Date: Wed, 4 Sep 2024 12:31:55 +0200 Subject: [PATCH 5/5] Reuse description for debugDescription --- Sources/NIOWebSocket/WebSocketFrame.swift | 16 +--------- .../WebSocketFrameDecoderTest.swift | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Sources/NIOWebSocket/WebSocketFrame.swift b/Sources/NIOWebSocket/WebSocketFrame.swift index 2ea6204cd6..5fc4bd0e59 100644 --- a/Sources/NIOWebSocket/WebSocketFrame.swift +++ b/Sources/NIOWebSocket/WebSocketFrame.swift @@ -403,20 +403,6 @@ extension WebSocketFrame: CustomStringConvertible { extension WebSocketFrame: CustomDebugStringConvertible { public var debugDescription: 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)) \ - ) - """ + "(\(self.description))" } } diff --git a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift index efbb729f89..1ae4c0bf9b 100644 --- a/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift +++ b/Tests/NIOWebSocketTests/WebSocketFrameDecoderTest.swift @@ -636,4 +636,36 @@ public final class WebSocketFrameDecoderTest: XCTestCase { 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) + } }