From 7890fffd204aa1d81d16554dac86dc80eac845d0 Mon Sep 17 00:00:00 2001 From: marci4 Date: Sun, 19 Jan 2020 19:03:07 +0100 Subject: [PATCH] Added test for #900 Overwrite channel to always throw IOException --- .../org/java_websocket/WebSocketImpl.java | 2 +- .../java_websocket/issues/Issue900Test.java | 155 ++++++++++++++++++ 2 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/java_websocket/issues/Issue900Test.java diff --git a/src/main/java/org/java_websocket/WebSocketImpl.java b/src/main/java/org/java_websocket/WebSocketImpl.java index a4066975..5c8e1a47 100644 --- a/src/main/java/org/java_websocket/WebSocketImpl.java +++ b/src/main/java/org/java_websocket/WebSocketImpl.java @@ -512,7 +512,7 @@ public synchronized void closeConnection( int code, String message, boolean remo try { channel.close(); } catch ( IOException e ) { - if( e.getMessage().equals( "Broken pipe" ) ) { + if( e.getMessage() != null && e.getMessage().equals( "Broken pipe" ) ) { log.trace( "Caught IOException: Broken pipe during closeConnection()", e ); } else { log.error("Exception during channel.close()", e); diff --git a/src/test/java/org/java_websocket/issues/Issue900Test.java b/src/test/java/org/java_websocket/issues/Issue900Test.java new file mode 100644 index 00000000..5c8c11d1 --- /dev/null +++ b/src/test/java/org/java_websocket/issues/Issue900Test.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2010-2020 Nathan Rajlich + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package org.java_websocket.issues; + +import org.java_websocket.WebSocket; +import org.java_websocket.WebSocketImpl; +import org.java_websocket.WrappedByteChannel; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.server.WebSocketServer; +import org.java_websocket.util.SocketUtil; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.InetSocketAddress; +import java.net.URI; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.concurrent.CountDownLatch; + +public class Issue900Test { + + CountDownLatch countServerDownLatch = new CountDownLatch(1); + CountDownLatch countCloseCallsDownLatch = new CountDownLatch(1); + + @Test(timeout = 2000) + public void testIssue() throws Exception { + int port = SocketUtil.getAvailablePort(); + final WebSocketClient client = new WebSocketClient(new URI("ws://localhost:" + port)) { + @Override + public void onOpen(ServerHandshake handshakedata) { + + } + + @Override + public void onMessage(String message) { + } + + @Override + public void onClose(int code, String reason, boolean remote) { + } + + @Override + public void onError(Exception ex) { + + } + }; + WebSocketServer server = new WebSocketServer(new InetSocketAddress(port)) { + @Override + public void onOpen(WebSocket conn, ClientHandshake handshake) { + } + + @Override + public void onClose(WebSocket conn, int code, String reason, boolean remote) { + countCloseCallsDownLatch.countDown(); + } + + @Override + public void onMessage(WebSocket conn, String message) { + + } + + @Override + public void onError(WebSocket conn, Exception ex) { + + } + + @Override + public void onStart() { + countServerDownLatch.countDown(); + } + }; + new Thread(server).start(); + countServerDownLatch.await(); + client.connectBlocking(); + WebSocketImpl websocketImpl = (WebSocketImpl)new ArrayList(server.getConnections()).get(0); + websocketImpl.setChannel(new ExceptionThrowingByteChannel()); + server.broadcast("test"); + countCloseCallsDownLatch.await(); + } + class ExceptionThrowingByteChannel implements WrappedByteChannel { + + @Override + public boolean isNeedWrite() { + return false; + } + + @Override + public void writeMore() throws IOException { + throw new IOException(); + } + + @Override + public boolean isNeedRead() { + return false; + } + + @Override + public int readMore(ByteBuffer dst) throws IOException { + throw new IOException(); + } + + @Override + public boolean isBlocking() { + return false; + } + + @Override + public int read(ByteBuffer dst) throws IOException { + throw new IOException(); + } + + @Override + public int write(ByteBuffer src) throws IOException { + throw new IOException(); + } + + @Override + public boolean isOpen() { + return false; + } + + @Override + public void close() throws IOException { + throw new IOException(); + } + } +}