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