Skip to content

Commit 2658683

Browse files
wlisacLukasa
authored andcommitted
Fail promise in MessageToByteHandler write error cases (#1096)
* Fail promise in MessageToByteHandler write error cases * Add test case for MessageToByteHandler failing write promises
1 parent b564a72 commit 2658683

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed

Sources/NIO/Codec.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,7 @@ extension MessageToByteHandler {
767767
case .notInChannelYet:
768768
preconditionFailure("MessageToByteHandler.write called before it was added to a Channel")
769769
case .error(let error):
770+
promise?.fail(error)
770771
context.fireErrorCaught(error)
771772
return
772773
case .done:
@@ -784,6 +785,7 @@ extension MessageToByteHandler {
784785
context.write(self.wrapOutboundOut(self.buffer!), promise: promise)
785786
} catch {
786787
self.state = .error(error)
788+
promise?.fail(error)
787789
context.fireErrorCaught(error)
788790
}
789791
}

Tests/LinuxMain.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import XCTest
7575
testCase(IntegerTypesTest.allTests),
7676
testCase(MarkedCircularBufferTests.allTests),
7777
testCase(MessageToByteEncoderTest.allTests),
78+
testCase(MessageToByteHandlerTest.allTests),
7879
testCase(MulticastTest.allTests),
7980
testCase(NIOAnyDebugTest.allTests),
8081
testCase(NIOCloseOnErrorHandlerTest.allTests),

Tests/NIOTests/CodecTest+XCTest.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,12 @@ extension MessageToByteEncoderTest {
7474
}
7575
}
7676

77+
extension MessageToByteHandlerTest {
78+
79+
static var allTests : [(String, (MessageToByteHandlerTest) -> () throws -> Void)] {
80+
return [
81+
("testThrowingEncoderFailsPromises", testThrowingEncoderFailsPromises),
82+
]
83+
}
84+
}
85+

Tests/NIOTests/CodecTest.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,3 +1587,31 @@ private class PairOfBytesDecoder: ByteToMessageDecoder {
15871587
return .needMoreData
15881588
}
15891589
}
1590+
1591+
public final class MessageToByteHandlerTest: XCTestCase {
1592+
private struct ThrowingMessageToByteEncoder: MessageToByteEncoder {
1593+
private struct HandlerError: Error { }
1594+
1595+
typealias OutboundIn = Int
1596+
1597+
public func encode(data value: Int, out: inout ByteBuffer) throws {
1598+
if value == 0 {
1599+
out.writeInteger(value)
1600+
} else {
1601+
throw HandlerError()
1602+
}
1603+
}
1604+
}
1605+
1606+
func testThrowingEncoderFailsPromises() {
1607+
let channel = EmbeddedChannel()
1608+
1609+
XCTAssertNoThrow(try channel.pipeline.addHandler(MessageToByteHandler(ThrowingMessageToByteEncoder())).wait())
1610+
1611+
XCTAssertNoThrow(try channel.writeAndFlush(0).wait())
1612+
1613+
XCTAssertThrowsError(try channel.writeAndFlush(1).wait())
1614+
1615+
XCTAssertThrowsError(try channel.writeAndFlush(0).wait())
1616+
}
1617+
}

0 commit comments

Comments
 (0)