Author: kkolinko Date: Sun Jan 8 19:02:55 2012 New Revision: 1228918 URL: http://svn.apache.org/viewvc?rev=1228918&view=rev Log: Change TestCometProcessor#testCometConnectorStop() to test whether END event was processed by servlet and write other information as a log message. The old test was not 100% reliable and fails for me with APR. It needs more investigation.
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=1228918&r1=1228917&r2=1228918&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java (original) +++ tomcat/trunk/test/org/apache/catalina/comet/TestCometProcessor.java Sun Jan 8 19:02:55 2012 @@ -29,7 +29,6 @@ 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 static org.junit.Assert.fail; @@ -52,6 +51,7 @@ public class TestCometProcessor extends public void testAsyncClose() throws Exception { if (!isCometSupported()) { + log.info("This test is skipped, because this connector does not support Comet."); return; } @@ -138,6 +138,7 @@ public class TestCometProcessor extends private void doSimpleCometTest(String initParam) throws Exception { if (!isCometSupported()) { + log.info("This test is skipped, because this connector does not support Comet."); return; } @@ -233,13 +234,15 @@ public class TestCometProcessor extends public void testCometConnectorStop() throws Exception { if (!isCometSupported()) { + log.info("This test is skipped, because this connector does not support Comet."); return; } // Setup Tomcat instance + SimpleCometServlet servlet = new SimpleCometServlet(); Tomcat tomcat = getTomcatInstance(); Context root = tomcat.addContext("", TEMP_DIR); - Tomcat.addServlet(root, "comet", new SimpleCometServlet()); + Tomcat.addServlet(root, "comet", servlet); root.addServletMapping("/", "comet"); tomcat.start(); @@ -267,15 +270,16 @@ public class TestCometProcessor extends tomcat.getConnector().stop(); - // Wait for the write thread to stop int count = 0; - while (writeThread.isAlive() && count < 50) { + // Wait for the read thread to stop + while (readThread.isAlive() && count < 50) { Thread.sleep(100); count ++; } - // Wait for the read thread to stop - while (readThread.isAlive() && count < 50) { + // Wait for the write thread to stop + count = 0; + while (writeThread.isAlive() && count < 50) { Thread.sleep(100); count ++; } @@ -283,15 +287,43 @@ public class TestCometProcessor extends // Destroy the connector once the executor has sent the end event tomcat.getConnector().destroy(); - // Write should trigger an exception once the connector stops since the - // socket should be closed - assertNotNull("No exception in writing thread", - writeThread.getException()); - - // Termination of Read thread varies by platform and protocol - // In all cases, the END event should be sent. + String[] response = readThread.getResponse().split("\r\n"); + String lastMessage = ""; + String lastResponseLine = ""; + for (int i = response.length; --i >= 0;) { + lastMessage = response[i]; + if (lastMessage.startsWith("Client:")) { + break; + } + } + for (int i = response.length; --i >= 0;) { + lastResponseLine = response[i]; + if (lastResponseLine.length() > 0) { + break; + } + } + StringBuilder status = new StringBuilder(); + // Expected, but is not 100% reliable: + // WriteThread exception: java.net.SocketException + // ReaderThread exception: null + // Last message: [Client: END] + // Last response line: [0] (empty chunk) + // Last comet event: [END] + status.append("Status:"); + status.append("\nWriterThread exception: " + writeThread.getException()); + status.append("\nReaderThread exception: " + readThread.getException()); + status.append("\nLast message: [" + lastMessage + "]"); + status.append("\nLast response line: [" + lastResponseLine + "]"); + status.append("\nLast comet event: [" + servlet.getLastEvent() + "]"); + if (writeThread.getException() == null + || !lastMessage.contains("Client: END") + || !EventType.END.equals(servlet.getLastEvent())) { + log.error(status); + } else { + log.info(status); + } assertTrue("Comet END event not received", - readThread.getResponse().contains("Client: END")); + EventType.END.equals(servlet.getLastEvent())); } private boolean isCometSupported() { @@ -317,6 +349,11 @@ public class TestCometProcessor extends private boolean failOnRead = false; private boolean failOnEnd = false; + private volatile EventType lastEvent; + + public EventType getLastEvent() { + return lastEvent; + } @Override public void init() throws ServletException { @@ -339,6 +376,8 @@ public class TestCometProcessor extends HttpSession session = request.getSession(true); session.setMaxInactiveInterval(30); + lastEvent = event.getEventType(); + if (event.getEventType() == EventType.BEGIN) { if (failOnBegin) { throw new IOException("Fail on begin"); @@ -409,10 +448,16 @@ public class TestCometProcessor extends private final InputStream is; private final StringBuilder response = new StringBuilder(); + private volatile Exception e = null; + public ResponseReaderThread(InputStream is) { this.is = is; } + public Exception getException() { + return e; + } + public String getResponse() { return response.toString(); } @@ -426,7 +471,7 @@ public class TestCometProcessor extends c = is.read(); } } catch (Exception e) { - // Ignore + this.e = e; } } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org