Author: markt
Date: Mon Jun 11 14:19:19 2012
New Revision: 1348859

URL: http://svn.apache.org/viewvc?rev=1348859&view=rev
Log:
Additional Comet tests to confirm / deny the behaviour claimed in 
https://issues.apache.org/bugzilla/show_bug.cgi?id=53391
The bug report is incorrect

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=1348859&r1=1348858&r2=1348859&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java 
(original)
+++ tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java Mon Jun 
11 14:19:19 2012
@@ -28,6 +28,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import junit.framework.Assert;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -117,6 +119,135 @@ public class TestCometProcessor extends 
     }
 
     @Test
+    public void testSyncClose() throws Exception {
+
+        if (!isCometSupported()) {
+            log.info("This test is skipped, because this connector does not 
support Comet.");
+            return;
+        }
+
+        // Setup Tomcat instance
+        Tomcat tomcat = getTomcatInstance();
+        Context root = tomcat.addContext("", TEMP_DIR);
+        Tomcat.addServlet(root, "comet", new CometCloseServlet());
+        root.addServletMapping("/comet", "comet");
+        Tomcat.addServlet(root, "hello", new HelloWorldServlet());
+        root.addServletMapping("/hello", "hello");
+        tomcat.getConnector().setProperty("connectionTimeout", "5000");
+        tomcat.start();
+
+        // Create connection to Comet servlet
+        final Socket socket =
+            SocketFactory.getDefault().createSocket("localhost", getPort());
+        socket.setSoTimeout(5000);
+
+        final OutputStream os = socket.getOutputStream();
+        String requestLine = "POST http://localhost:"; + getPort() +
+                "/comet HTTP/1.1\r\n";
+        os.write(requestLine.getBytes());
+        os.write("transfer-encoding: chunked\r\n".getBytes());
+        os.write("\r\n".getBytes());
+        // Don't send any data
+        os.write("0\r\n\r\n".getBytes());
+
+        InputStream is = socket.getInputStream();
+        ResponseReaderThread readThread = new ResponseReaderThread(is);
+        readThread.start();
+
+        // Wait for the comet request/response to finish
+        int count = 0;
+        while (count < 10 && !readThread.getResponse().endsWith("0\r\n\r\n")) {
+            Thread.sleep(500);
+            count++;
+        }
+
+        Assert.assertTrue(readThread.getResponse().contains("2\r\nOK"));
+
+        if (count == 10) {
+            fail("Comet request did not complete");
+        }
+
+        // Send a standard HTTP request on the same connection
+        requestLine = "GET http://localhost:"; + getPort() +
+                "/hello HTTP/1.1\r\n";
+        os.write(requestLine.getBytes());
+        os.write("connection: close\r\n".getBytes());
+        os.write("\r\n".getBytes());
+
+        // Check for the expected response
+        count = 0;
+        while (count < 10 && !readThread.getResponse().contains(
+                HelloWorldServlet.RESPONSE_TEXT)) {
+            Thread.sleep(500);
+            count++;
+        }
+
+        if (count == 10) {
+            fail("Non-comet request did not complete");
+        }
+
+        readThread.join();
+        os.close();
+        is.close();
+    }
+
+    @Test
+    public void testConnectionClose() throws Exception {
+
+        if (!isCometSupported()) {
+            log.info("This test is skipped, because this connector does not 
support Comet.");
+            return;
+        }
+
+        // Setup Tomcat instance
+        Tomcat tomcat = getTomcatInstance();
+        Context root = tomcat.addContext("", TEMP_DIR);
+        Tomcat.addServlet(root, "comet", new ConnectionCloseServlet());
+        root.addServletMapping("/comet", "comet");
+        Tomcat.addServlet(root, "hello", new HelloWorldServlet());
+        root.addServletMapping("/hello", "hello");
+        tomcat.getConnector().setProperty("connectionTimeout", "5000");
+        tomcat.start();
+
+        // Create connection to Comet servlet
+        final Socket socket =
+            SocketFactory.getDefault().createSocket("localhost", getPort());
+        socket.setSoTimeout(5000);
+
+        final OutputStream os = socket.getOutputStream();
+        String requestLine = "POST http://localhost:"; + getPort() +
+                "/comet HTTP/1.1\r\n";
+        os.write(requestLine.getBytes());
+        os.write("transfer-encoding: chunked\r\n".getBytes());
+        os.write("\r\n".getBytes());
+        // Don't send any data
+        os.write("0\r\n\r\n".getBytes());
+
+        InputStream is = socket.getInputStream();
+        ResponseReaderThread readThread = new ResponseReaderThread(is);
+        readThread.start();
+
+        // Wait for the comet request/response to finish
+        int count = 0;
+        while (count < 10 && !readThread.getResponse().endsWith("OK")) {
+            Thread.sleep(500);
+            count++;
+        }
+
+        if (count == 10) {
+            fail("Comet request did not complete");
+        }
+
+        // Read thread should have terminated cleanly when the server closed 
the
+        // socket
+        Assert.assertFalse(readThread.isAlive());
+        Assert.assertNull(readThread.getException());
+
+        os.close();
+        is.close();
+    }
+
+    @Test
     public void testSimpleCometClient() throws Exception {
         doSimpleCometTest(null);
     }
@@ -420,6 +551,43 @@ public class TestCometProcessor extends 
         }
     }
 
+    private static class CometCloseServlet extends HttpServlet
+            implements CometProcessor {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public void event(CometEvent event) throws IOException,
+                ServletException {
+            HttpServletResponse response = event.getHttpServletResponse();
+            response.setContentType("text/plain");
+            // Force a chunked response since that is what the test client
+            // expects
+            response.flushBuffer();
+            response.getWriter().print("OK");
+            event.close();
+        }
+
+    }
+
+    private static class ConnectionCloseServlet extends HttpServlet
+            implements CometProcessor {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public void event(CometEvent event) throws IOException,
+                ServletException {
+            HttpServletResponse response = event.getHttpServletResponse();
+            response.setContentType("text/plain");
+            // Disable keep-alive
+            response.setHeader("Connection", "close");
+            response.flushBuffer();
+            response.getWriter().print("OK");
+            event.close();
+        }
+    }
+
     private static class PingWriterThread extends Thread {
 
         private final int pingCount;
@@ -455,7 +623,7 @@ public class TestCometProcessor extends 
     private static class ResponseReaderThread extends Thread {
 
         private final InputStream is;
-        private final StringBuilder response = new StringBuilder();
+        private StringBuilder response = new StringBuilder();
 
         private volatile Exception e = null;
 
@@ -467,6 +635,10 @@ public class TestCometProcessor extends 
             return e;
         }
 
+        public void clearResponse() {
+            response = new StringBuilder();
+        }
+
         public String getResponse() {
             return response.toString();
         }



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

Reply via email to