@Test public void testConnectionClose() throws Exception { Assume.assumeTrue( "This test is skipped, because this connector does not support Comet.", isCometSupported()); // Setup Tomcat instance Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context root = tomcat.addContext("", null); 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(); }
/** Tests if the Comet connection is closed if the Tomcat connector is stopped. */ @Test public void testCometConnectorStop() throws Exception { Assume.assumeTrue( "This test is skipped, because this connector does not support Comet.", isCometSupported()); // Setup Tomcat instance SimpleCometServlet servlet = new SimpleCometServlet(); Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context root = tomcat.addContext("", null); Tomcat.addServlet(root, "comet", servlet); root.addServletMapping("/", "comet"); tomcat.start(); // Create connection to Comet servlet final Socket socket = SocketFactory.getDefault().createSocket("localhost", getPort()); socket.setSoTimeout(10000); 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(); 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(); // Wait for the read and write threads to stop readThread.join(5000); writeThread.join(5000); // Destroy the connector once the executor has sent the end event tomcat.getConnector().destroy(); 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] // END event occurred: [true] 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() + "]"); status.append("\nEND event occurred: [" + servlet.getEndEventOccurred() + "]"); 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", servlet.getEndEventOccurred()); assertTrue( "Comet END event not last event received", EventType.END.equals(servlet.getLastEvent())); }