diff --git a/clients/java/signalr/src/main/java/com/microsoft/signalr/WebSocketTransport.java b/clients/java/signalr/src/main/java/com/microsoft/signalr/WebSocketTransport.java index a1a13e2ea9..bbdf97d95f 100644 --- a/clients/java/signalr/src/main/java/com/microsoft/signalr/WebSocketTransport.java +++ b/clients/java/signalr/src/main/java/com/microsoft/signalr/WebSocketTransport.java @@ -89,7 +89,7 @@ class WebSocketTransport implements Transport { void onClose(Integer code, String reason) { logger.info("WebSocket connection stopping with " + "code {} and reason '{}'.", code, reason); - if (code != 1000) { + if (code == null || code != 1000) { onClose.invoke(reason); } else { diff --git a/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java b/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java index 9761412692..8b9266e203 100644 --- a/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java +++ b/clients/java/signalr/src/test/java/com/microsoft/signalr/WebSocketTransportTest.java @@ -6,10 +6,15 @@ package com.microsoft.signalr; import static org.junit.jupiter.api.Assertions.*; import java.util.HashMap; +import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import org.junit.jupiter.api.Test; +import io.reactivex.Completable; +import io.reactivex.Single; + class WebSocketTransportTest { @Test public void WebsocketThrowsIfItCantConnect() { @@ -17,4 +22,59 @@ class WebSocketTransportTest { RuntimeException exception = assertThrows(RuntimeException.class, () -> transport.start("http://www.example.com").blockingAwait(1, TimeUnit.SECONDS)); assertEquals("There was an error starting the Websockets transport.", exception.getMessage()); } + + @Test + public void CanPassNullExitCodeToOnClosed() { + WebSocketTransport transport = new WebSocketTransport(new HashMap<>(), new WebSocketTestHttpClient()); + AtomicBoolean closed = new AtomicBoolean(); + transport.setOnClose(reason -> { + closed.set(true); + }); + transport.start(""); + transport.stop(); + assertTrue(closed.get()); + } + + class WebSocketTestHttpClient extends HttpClient { + @Override + public Single send(HttpRequest request) { + return null; + } + + @Override + public WebSocketWrapper createWebSocket(String url, Map headers) { + return new TestWrapper(); + } + } + + class TestWrapper extends WebSocketWrapper { + private WebSocketOnClosedCallback onClose; + + @Override + public Completable start() { + return Completable.complete(); + } + + @Override + public Completable stop() { + if (onClose != null) { + onClose.invoke(null, ""); + } + return Completable.complete(); + } + + @Override + public Completable send(String message) { + return null; + } + + @Override + public void setOnReceive(OnReceiveCallBack onReceive) { + } + + @Override + public void setOnClose(WebSocketOnClosedCallback onClose) { + this.onClose = onClose; + } + } }