From 42c627e7acdb2262e58eb0e671268ae2aed52eb7 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Sun, 2 Feb 2020 21:52:41 +0100 Subject: [PATCH] NetSocket data handler should report runtime failures to context exception handler - see #3272 --- .../io/vertx/core/net/impl/NetSocketImpl.java | 1 + src/test/java/io/vertx/core/net/NetTest.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/java/io/vertx/core/net/impl/NetSocketImpl.java b/src/main/java/io/vertx/core/net/impl/NetSocketImpl.java index 76722a8a2..d8bb1a311 100644 --- a/src/main/java/io/vertx/core/net/impl/NetSocketImpl.java +++ b/src/main/java/io/vertx/core/net/impl/NetSocketImpl.java @@ -89,6 +89,7 @@ public class NetSocketImpl extends ConnectionBase implements NetSocketInternal { this.messageHandler = NULL_MSG_HANDLER; pending = new InboundBuffer<>(context); pending.drainHandler(v -> doResume()); + pending.exceptionHandler(context::reportException); pending.handler(obj -> { if (obj == InboundBuffer.END_SENTINEL) { Handler handler = endHandler(); diff --git a/src/test/java/io/vertx/core/net/NetTest.java b/src/test/java/io/vertx/core/net/NetTest.java index adcf086eb..7aa5eba34 100755 --- a/src/test/java/io/vertx/core/net/NetTest.java +++ b/src/test/java/io/vertx/core/net/NetTest.java @@ -18,6 +18,7 @@ import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.http.*; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpVersion; +import io.vertx.codegen.annotations.Nullable; import io.vertx.core.*; import io.vertx.core.buffer.Buffer; import io.vertx.core.eventbus.Message; @@ -3646,4 +3647,36 @@ public class NetTest extends VertxTestBase { assertEquals(8080, converted.port()); assertEquals("localhost", converted.host()); } + + @Test + public void testNetSocketHandlerFailureReportedToContextExceptionHandler() throws Exception { + server.connectHandler(so -> { + Context ctx = Vertx.currentContext(); + List reported = new ArrayList<>(); + ctx.exceptionHandler(reported::add); + NullPointerException err1 = new NullPointerException(); + so.handler(buff -> { + throw err1; + }); + NullPointerException err2 = new NullPointerException(); + so.endHandler(v ->{ + throw err2; + }); + NullPointerException err3 = new NullPointerException(); + so.closeHandler(v1 -> { + ctx.runOnContext(v2 -> { + assertEquals(Arrays.asList(err1, err2, err3), reported); + testComplete(); + }); + throw err3; + }); + }); + startServer(testAddress); + client.connect(testAddress, onSuccess(so -> { + so.write("ping"); + so.close(); + })); + await(); + } + }