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