You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2011/07/29 20:28:43 UTC

svn commit: r1152333 - /tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java

Author: markt
Date: Fri Jul 29 18:28:42 2011
New Revision: 1152333

URL: http://svn.apache.org/viewvc?rev=1152333&view=rev
Log:
Add a unit test that confirms that comet sockets are closed when the connector is stopped.

Modified:
    tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java

Modified: tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java?rev=1152333&r1=1152332&r2=1152333&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java (original)
+++ tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java Fri Jul 29 18:28:42 2011
@@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRes
 import javax.servlet.http.HttpSession;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
@@ -66,39 +67,19 @@ public class TestCometProcessor extends 
         os.write("transfer-encoding: chunked\r\n".getBytes());
         os.write("\r\n".getBytes());
         
-        Thread writeThread = new Thread(new Runnable() {
-            
-            @Override
-            public void run() {
-                try {
-                    for (int i = 0; i < 4; i++) {
-                        os.write("4\r\n".getBytes());
-                        os.write("PING\r\n".getBytes());
-                        os.flush();
-                        Thread.sleep(1000);
-                    }
-                    os.write("0\r\n".getBytes());
-                    os.write("\r\n".getBytes());
-                } catch (Throwable e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-
+        PingWriterThread writeThread = new PingWriterThread(4, os);
         writeThread.start();
         
-        StringBuffer buffer = new StringBuffer();
         socket.setSoTimeout(25000);
         InputStream is = socket.getInputStream();
-        int c = is.read();
-        while (c > -1) {
-            buffer.append((char) c);
-            c = is.read();
-        }
+        ResponseReaderThread readThread = new ResponseReaderThread(is);
+        readThread.start();
+        readThread.join();
         os.close();
+        is.close();
         
         // Validate response
-        String[] response = buffer.toString().split("\r\n");
+        String[] response = readThread.getResponse().split("\r\n");
         assertEquals("HTTP/1.1 200 OK", response[0]);
         assertEquals("Server: Apache-Coyote/1.1", response[1]);
         assertTrue(response[2].startsWith("Set-Cookie: JSESSIONID="));
@@ -129,6 +110,59 @@ public class TestCometProcessor extends 
         assertEquals(26, response.length);
     }
     
+    /**
+     * Tests if the Comet connection is closed if the Tomcat connector is
+     * stopped.
+     */
+    @Test
+    public void testCometConnectorStop() throws Exception {
+        
+        if (!isCometSupported()) {
+            return;
+        }
+
+        // Setup Tomcat instance
+        Tomcat tomcat = getTomcatInstance();
+        Context root = tomcat.addContext("", TEMP_DIR);
+        Tomcat.addServlet(root, "comet", new SimpleCometServlet());
+        root.addServletMapping("/", "comet");
+        tomcat.start();
+
+        // Create connection to Comet servlet
+        final Socket socket =
+            SocketFactory.getDefault().createSocket("localhost", getPort());
+        socket.setSoTimeout(60000);
+        
+        final OutputStream os = socket.getOutputStream();
+        String requestLine = "POST http://localhost:" + getPort() +
+                "/ HTTP/1.1\r\n";
+        os.write(requestLine.getBytes());
+        os.write("transfer-encoding: chunked\r\n".getBytes());
+        os.write("\r\n".getBytes());
+        
+        PingWriterThread writeThread = new PingWriterThread(100, os);
+        writeThread.start();
+
+        socket.setSoTimeout(60000);
+        InputStream is = socket.getInputStream();
+        ResponseReaderThread readThread = new ResponseReaderThread(is);
+        readThread.start();
+        
+        // Allow the first couple of PING messages to be written
+        Thread.sleep(3000);
+        
+        tomcat.getConnector().stop();
+        tomcat.getConnector().destroy();
+
+        // Sleep for a couple of seconds to give enough time for the connector
+        // stop message to be processed
+        Thread.sleep(2000);
+
+        // Write should trigger an exception once the connector stops since the
+        // socket should be closed
+        assertNotNull(writeThread.getException());
+    }
+
     private boolean isCometSupported() {
         String protocol =
             getTomcatInstance().getConnector().getProtocolHandlerClassName();
@@ -177,4 +211,68 @@ public class TestCometProcessor extends 
             response.getWriter().flush();
         }
     }
+
+    private static class PingWriterThread extends Thread {
+        
+        private int pingCount;
+        private OutputStream os;
+        private Exception e = null;
+
+        public PingWriterThread(int pingCount, OutputStream os) {
+            this.pingCount = pingCount;
+            this.os = os;
+        }
+
+        public Exception getException() {
+            return e;
+        }
+
+        @Override
+        public void run() {
+            try {
+                for (int i = 0; i < pingCount; i++) {
+                    os.write("4\r\n".getBytes());
+                    os.write("PING\r\n".getBytes());
+                    os.flush();
+                    Thread.sleep(1000);
+                }
+                os.write("0\r\n".getBytes());
+                os.write("\r\n".getBytes());
+            } catch (Exception e) {
+                this.e = e;
+            }
+        }
+    }
+
+    private static class ResponseReaderThread extends Thread {
+
+        private InputStream is;
+        private StringBuilder response = new StringBuilder();
+        private Exception e = null;
+
+        public ResponseReaderThread(InputStream is) {
+            this.is = is;
+        }
+
+        public String getResponse() {
+            return response.toString();
+        }
+
+        public Exception getException() {
+            return e;
+        }
+
+        @Override
+        public void run() {
+            try {
+                int c = is.read();
+                while (c > -1) {
+                    response.append((char) c);
+                    c = is.read();
+                }
+            } catch (Exception e) {
+                this.e = e;
+            }
+        }
+    }
 }



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