Author: markt
Date: Tue Nov 26 11:29:54 2013
New Revision: 1545619

URL: http://svn.apache.org/r1545619
Log:
Fix regression in fix for 
https://issues.apache.org/bugzilla/show_bug.cgi?id=55799 that broke stream 
messages.
Add a test case for stream messages.

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java?rev=1545619&r1=1545618&r2=1545619&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 
Tue Nov 26 11:29:54 2013
@@ -835,7 +835,7 @@ public abstract class WsRemoteEndpointIm
 
         private void doWrite(boolean last) throws IOException {
             buffer.flip();
-            endpoint.sendPartialBytes(buffer, last);
+            endpoint.startMessageBlock(Constants.OPCODE_BINARY, buffer, last);
             buffer.clear();
         }
     }

Modified: 
tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java?rev=1545619&r1=1545618&r2=1545619&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java 
(original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestWsRemoteEndpoint.java Tue 
Nov 26 11:29:54 2013
@@ -16,8 +16,12 @@
  */
 package org.apache.tomcat.websocket;
 
+import java.io.OutputStream;
 import java.io.Writer;
 import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -36,6 +40,7 @@ import org.apache.catalina.servlets.Defa
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.descriptor.web.ApplicationListener;
+import org.apache.tomcat.websocket.TesterMessageCountClient.AsyncBinary;
 import org.apache.tomcat.websocket.TesterMessageCountClient.AsyncHandler;
 import org.apache.tomcat.websocket.TesterMessageCountClient.AsyncText;
 import 
org.apache.tomcat.websocket.TesterMessageCountClient.TesterAnnotatedEndpoint;
@@ -58,15 +63,25 @@ public class TestWsRemoteEndpoint extend
 
     @Test
     public void testWriterAnnotation() throws Exception {
-        doTestWriter(TesterAnnotatedEndpoint.class);
+        doTestWriter(TesterAnnotatedEndpoint.class, true);
     }
 
     @Test
     public void testWriterProgrammatic() throws Exception {
-        doTestWriter(TesterProgrammaticEndpoint.class);
+        doTestWriter(TesterProgrammaticEndpoint.class, true);
     }
 
-    private void doTestWriter(Class<?> clazz) throws Exception {
+    @Test
+    public void testStreamAnnotation() throws Exception {
+        doTestWriter(TesterAnnotatedEndpoint.class, false);
+    }
+
+    @Test
+    public void testStreamProgrammatic() throws Exception {
+        doTestWriter(TesterProgrammaticEndpoint.class, false);
+    }
+
+    private void doTestWriter(Class<?> clazz, boolean useWriter) throws 
Exception {
         Tomcat tomcat = getTomcatInstance();
         // Must have a real docBase - just use temp
         Context ctx =
@@ -98,40 +113,70 @@ public class TestWsRemoteEndpoint extend
         TesterEndpoint tep =
                 (TesterEndpoint) wsSession.getUserProperties().get("endpoint");
         tep.setLatch(latch);
-        AsyncHandler<?> handler = new AsyncText(latch);
+        AsyncHandler<?> handler;
+        if (useWriter) {
+            handler = new AsyncText(latch);
+        } else {
+            handler = new AsyncBinary(latch);
+        }
 
         wsSession.addMessageHandler(handler);
 
-        Writer w = wsSession.getBasicRemote().getSendWriter();
+        if (useWriter) {
+            Writer w = wsSession.getBasicRemote().getSendWriter();
 
-        for (int i = 0; i < 8; i++) {
-            w.write(TEST_MESSAGE_5K);
-        }
+            for (int i = 0; i < 8; i++) {
+                w.write(TEST_MESSAGE_5K);
+            }
 
-        w.close();
+            w.close();
+        } else {
+            OutputStream s = wsSession.getBasicRemote().getSendStream();
+
+            for (int i = 0; i < 8; i++) {
+                s.write(TEST_MESSAGE_5K.getBytes(StandardCharsets.UTF_8));
+            }
+
+            s.close();
+        }
 
         boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS);
 
         Assert.assertTrue(latchResult);
 
-        @SuppressWarnings("unchecked")
-        List<String> messages = (List<String>) handler.getMessages();
+        List<String> results = new ArrayList<>();
+        if (useWriter) {
+            @SuppressWarnings("unchecked")
+            List<String> messages = (List<String>) handler.getMessages();
+            results.addAll(messages);
+        } else {
+            // Take advantage of the fact that the message uses characters that
+            // are represented as a single UTF-8 byte so won't be split across
+            // binary messages
+            @SuppressWarnings("unchecked")
+            List<ByteBuffer> messages = (List<ByteBuffer>) 
handler.getMessages();
+            for (ByteBuffer message : messages) {
+                byte[] bytes = new byte[message.limit()];
+                message.get(bytes);
+                results.add(new String(bytes, StandardCharsets.UTF_8));
+            }
+        }
 
         int offset = 0;
         int i = 0;
-        for (String message : messages) {
+        for (String result : results) {
             // First may be a fragment
             Assert.assertEquals(SEQUENCE.substring(offset, S_LEN),
-                    message.substring(0, S_LEN - offset));
+                    result.substring(0, S_LEN - offset));
             i = S_LEN - offset;
-            while (i + S_LEN < message.length()) {
-                if (!SEQUENCE.equals(message.substring(i, i + S_LEN))) {
+            while (i + S_LEN < result.length()) {
+                if (!SEQUENCE.equals(result.substring(i, i + S_LEN))) {
                     Assert.fail();
                 }
                 i += S_LEN;
             }
-            offset = message.length() - i;
-            if (!SEQUENCE.substring(0, offset).equals(message.substring(i))) {
+            offset = result.length() - i;
+            if (!SEQUENCE.substring(0, offset).equals(result.substring(i))) {
                 Assert.fail();
             }
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to