Fail promise in MessageToByteHandler write error cases (#1096)
* Fail promise in MessageToByteHandler write error cases * Add test case for MessageToByteHandler failing write promises
This commit is contained in:
parent
b564a726a9
commit
26586835fd
|
@ -767,6 +767,7 @@ extension MessageToByteHandler {
|
|||
case .notInChannelYet:
|
||||
preconditionFailure("MessageToByteHandler.write called before it was added to a Channel")
|
||||
case .error(let error):
|
||||
promise?.fail(error)
|
||||
context.fireErrorCaught(error)
|
||||
return
|
||||
case .done:
|
||||
|
@ -784,6 +785,7 @@ extension MessageToByteHandler {
|
|||
context.write(self.wrapOutboundOut(self.buffer!), promise: promise)
|
||||
} catch {
|
||||
self.state = .error(error)
|
||||
promise?.fail(error)
|
||||
context.fireErrorCaught(error)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -75,6 +75,7 @@ import XCTest
|
|||
testCase(IntegerTypesTest.allTests),
|
||||
testCase(MarkedCircularBufferTests.allTests),
|
||||
testCase(MessageToByteEncoderTest.allTests),
|
||||
testCase(MessageToByteHandlerTest.allTests),
|
||||
testCase(MulticastTest.allTests),
|
||||
testCase(NIOAnyDebugTest.allTests),
|
||||
testCase(NIOCloseOnErrorHandlerTest.allTests),
|
||||
|
|
|
@ -74,3 +74,12 @@ extension MessageToByteEncoderTest {
|
|||
}
|
||||
}
|
||||
|
||||
extension MessageToByteHandlerTest {
|
||||
|
||||
static var allTests : [(String, (MessageToByteHandlerTest) -> () throws -> Void)] {
|
||||
return [
|
||||
("testThrowingEncoderFailsPromises", testThrowingEncoderFailsPromises),
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1587,3 +1587,31 @@ private class PairOfBytesDecoder: ByteToMessageDecoder {
|
|||
return .needMoreData
|
||||
}
|
||||
}
|
||||
|
||||
public final class MessageToByteHandlerTest: XCTestCase {
|
||||
private struct ThrowingMessageToByteEncoder: MessageToByteEncoder {
|
||||
private struct HandlerError: Error { }
|
||||
|
||||
typealias OutboundIn = Int
|
||||
|
||||
public func encode(data value: Int, out: inout ByteBuffer) throws {
|
||||
if value == 0 {
|
||||
out.writeInteger(value)
|
||||
} else {
|
||||
throw HandlerError()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func testThrowingEncoderFailsPromises() {
|
||||
let channel = EmbeddedChannel()
|
||||
|
||||
XCTAssertNoThrow(try channel.pipeline.addHandler(MessageToByteHandler(ThrowingMessageToByteEncoder())).wait())
|
||||
|
||||
XCTAssertNoThrow(try channel.writeAndFlush(0).wait())
|
||||
|
||||
XCTAssertThrowsError(try channel.writeAndFlush(1).wait())
|
||||
|
||||
XCTAssertThrowsError(try channel.writeAndFlush(0).wait())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue