Author: kkolinko
Date: Sat Oct 25 23:23:51 2014
New Revision: 1634259
URL: http://svn.apache.org/r1634259
Log:
Backport test case for BZ 54928.
https://issues.apache.org/bugzilla/show_bug.cgi?id=54928
Merged revisions r1485862 r1486062 r1580030 r1580849 r1580869
r1590377 r1590402 r1590635 r1590638 r1633936 r1633974 r1634257 and r1634258.
Modified:
tomcat/tc7.0.x/trunk/ (props changed)
tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestCoyoteAdapter.java
tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
Merged
/tomcat/trunk:r1485862,1486062,1580030,1580849,1580869,1590377,1590402,1590635,1590638,1633936,1633974,1634257-1634258
Modified:
tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestCoyoteAdapter.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestCoyoteAdapter.java?rev=1634259&r1=1634258&r2=1634259&view=diff
==============================================================================
---
tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestCoyoteAdapter.java
(original)
+++
tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestCoyoteAdapter.java
Sat Oct 25 23:23:51 2014
@@ -18,8 +18,10 @@ package org.apache.catalina.connector;
import java.io.File;
import java.io.IOException;
+import java.io.OutputStream;
import java.io.PrintWriter;
+import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -29,12 +31,26 @@ import org.junit.Assert;
import org.junit.Test;
import org.apache.catalina.Context;
+import org.apache.catalina.Wrapper;
+import org.apache.catalina.startup.SimpleHttpClient;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.tomcat.util.buf.B2CConverter;
import org.apache.tomcat.util.buf.ByteChunk;
public class TestCoyoteAdapter extends TomcatBaseTest {
+ public static final String TEXT_8K;
+ public static final byte[] BYTES_8K;
+
+ static {
+ StringBuilder sb = new StringBuilder(8192);
+ for (int i = 0; i < 512; i++) {
+ sb.append("0123456789ABCDEF");
+ }
+ TEXT_8K = sb.toString();
+ BYTES_8K = TEXT_8K.getBytes(B2CConverter.UTF_8);
+ }
@Test
public void testPathParmsRootNone() throws Exception {
pathParamTest("/", "none");
@@ -255,4 +271,124 @@ public class TestCoyoteAdapter extends T
pathInfo = req.getPathInfo();
}
}
+
+
+ @Test
+ public void testBug54928() throws Exception {
+ // Setup Tomcat instance
+ Tomcat tomcat = getTomcatInstance();
+
+ // Must have a real docBase - just use temp
+ Context ctx =
+ tomcat.addContext("/", System.getProperty("java.io.tmpdir"));
+
+ AsyncServlet servlet = new AsyncServlet();
+ Wrapper w = Tomcat.addServlet(ctx, "async", servlet);
+ w.setAsyncSupported(true);
+ ctx.addServletMapping("/async", "async");
+
+ tomcat.start();
+
+ SimpleHttpClient client = new SimpleHttpClient() {
+ @Override
+ public boolean isResponseBodyOK() {
+ return true;
+ }
+ };
+
+ String request = "GET /async HTTP/1.1" + SimpleHttpClient.CRLF +
+ "Host: a" + SimpleHttpClient.CRLF + SimpleHttpClient.CRLF;
+
+ client.setPort(getPort());
+ client.setRequest(new String[] {request});
+
+ client.connect();
+ client.sendRequest();
+
+ for (int i = 0; i < 10; i++) {
+ String line = client.readLine();
+ if (line != null && line.length() > 20) {
+ log.info(line.subSequence(0, 20) + "...");
+ }
+ }
+
+ client.disconnect();
+
+ // Wait for server thread to stop
+ int count = 0;
+ while (servlet.getThread().isAlive() && count < 20) {
+ Thread.sleep(250);
+ count ++;
+ }
+ log.info("Waited for servlet thread to stop for " + (count * 250)
+ + " ms");
+
+ Assert.assertTrue(servlet.isCompleted());
+ }
+
+ private class AsyncServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ // This is a hack that won't work generally as servlets are expected to
+ // handle more than one request.
+ private Thread t;
+ private volatile boolean completed = false;
+
+ public Thread getThread() {
+ return t;
+ }
+
+ public boolean isCompleted() {
+ return completed;
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ resp.setContentType("text/plain");
+ resp.setCharacterEncoding("UTF-8");
+
+ final OutputStream os = resp.getOutputStream();
+
+ final AsyncContext asyncCtxt = req.startAsync();
+ asyncCtxt.setTimeout(3000);
+
+ t = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 20; i++) {
+ try {
+ // Some tests depend on this write failing (e.g.
+ // because the client has gone away). In some cases
+ // there may be a large (ish) buffer to fill before
+ // the write fails.
+ for (int j = 0 ; j < 8; j++) {
+ os.write(BYTES_8K);
+ }
+ os.flush();
+ Thread.sleep(1000);
+ } catch (Exception e) {
+ log.info("Exception caught " + e);
+ try {
+ // Note if request times out before this
+ // exception is thrown and the complete call
+ // below is made, the complete call below will
+ // fail since the timeout will have completed
+ // the request.
+ asyncCtxt.complete();
+ break;
+ } finally {
+ completed = true;
+ }
+ }
+ }
+ }
+ });
+ t.setName("testBug54928");
+ t.start();
+ }
+ }
}
Modified:
tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java?rev=1634259&r1=1634258&r2=1634259&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
(original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
Sat Oct 25 23:23:51 2014
@@ -99,7 +99,7 @@ public abstract class SimpleHttpClient {
private String responseBody;
private List<String> bodyUriElements = null;
- protected void setPort(int thePort) {
+ public void setPort(int thePort) {
port = thePort;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]