Author: markt
Date: Wed Jun 10 21:56:27 2015
New Revision: 1684771

URL: http://svn.apache.org/r1684771
Log:
Add a test for maxConcurrentStreams
Also expands capabilities of Http2TestBase to include
- large requests
- setting maxConcurrentStreams

Modified:
    tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java
    tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java

Modified: tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java?rev=1684771&r1=1684770&r2=1684771&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Wed Jun 10 
21:56:27 2015
@@ -114,10 +114,30 @@ public abstract class Http2TestBase exte
     }
 
 
+    protected void sendLargeRequest(int streamId) throws IOException {
+        byte[] frameHeader = new byte[9];
+        ByteBuffer headersPayload = ByteBuffer.allocate(128);
+
+        buildLargeRequest(frameHeader, headersPayload, streamId);
+        writeFrame(frameHeader, headersPayload);
+    }
+
+
     protected void buildSimpleRequest(byte[] frameHeader, ByteBuffer 
headersPayload, int streamId) {
+        buildRequest(frameHeader, headersPayload, streamId, "/simple");
+    }
+
+
+    protected void buildLargeRequest(byte[] frameHeader, ByteBuffer 
headersPayload, int streamId) {
+        buildRequest(frameHeader, headersPayload, streamId, "/large");
+    }
+
+
+    protected void buildRequest(byte[] frameHeader, ByteBuffer headersPayload, 
int streamId,
+            String url) {
         MimeHeaders headers = new MimeHeaders();
         headers.addValue(":method").setString("GET");
-        headers.addValue(":path").setString("/any");
+        headers.addValue(":path").setString(url);
         headers.addValue(":authority").setString("localhost:" + getPort());
         hpackEncoder.encode(headers, headersPayload);
 
@@ -137,7 +157,7 @@ public abstract class Http2TestBase exte
             int streamId) {
         MimeHeaders headers = new MimeHeaders();
         headers.addValue(":method").setString("GET");
-        headers.addValue(":path").setString("/any");
+        headers.addValue(":path").setString("/simple");
         hpackEncoder.encode(headers, headersPayload);
 
         headersPayload.flip();
@@ -204,12 +224,17 @@ public abstract class Http2TestBase exte
 
 
     protected void enableHttp2() {
+        enableHttp2(200);
+    }
+
+    protected void enableHttp2(long maxConcurrentStreams) {
         Connector connector = getTomcatInstance().getConnector();
         Http2Protocol http2Protocol = new Http2Protocol();
         // Short timeouts for now. May need to increase these for CI systems.
         http2Protocol.setReadTimeout(2000);
         http2Protocol.setKeepAliveTimeout(5000);
         http2Protocol.setWriteTimeout(2000);
+        http2Protocol.setMaxConcurrentStreams(maxConcurrentStreams);
         connector.addUpgradeProtocol(http2Protocol);
     }
 
@@ -219,7 +244,9 @@ public abstract class Http2TestBase exte
 
         Context ctxt = tomcat.addContext("", null);
         Tomcat.addServlet(ctxt, "simple", new SimpleServlet());
-        ctxt.addServletMapping("/*", "simple");
+        ctxt.addServletMapping("/simple", "simple");
+        Tomcat.addServlet(ctxt, "large", new LargeServlet());
+        ctxt.addServletMapping("/large", "large");
 
         tomcat.start();
     }
@@ -245,7 +272,7 @@ public abstract class Http2TestBase exte
 
     protected void doHttpUpgrade(String connection, String upgrade, String 
settings,
             boolean validate) throws IOException {
-        byte[] upgradeRequest = ("GET / HTTP/1.1\r\n" +
+        byte[] upgradeRequest = ("GET /simple HTTP/1.1\r\n" +
                 "Host: localhost:" + getPort() + "\r\n" +
                 "Connection: "+ connection + "\r\n" +
                 "Upgrade: " + upgrade + "\r\n" +
@@ -606,6 +633,32 @@ public abstract class Http2TestBase exte
             // Two bytes per entry
             resp.setContentLengthLong(count * 2);
 
+            OutputStream os = resp.getOutputStream();
+            byte[] data = new byte[2];
+            for (int i = 0; i < count; i++) {
+                data[0] = (byte) (i & 0xFF);
+                data[1] = (byte) ((i >> 8) & 0xFF);
+                os.write(data);
+            }
+        }
+    }
+
+
+    private static class LargeServlet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            // Generate content with a simple known format that will exceed the
+            // default flow control window for a stream.
+            resp.setContentType("application/octet-stream");
+
+            int count = 128 * 1024;
+            // Two bytes per entry
+            resp.setContentLengthLong(count * 2);
+
             OutputStream os = resp.getOutputStream();
             byte[] data = new byte[2];
             for (int i = 0; i < count; i++) {

Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java?rev=1684771&r1=1684770&r2=1684771&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java 
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java Wed Jun 
10 21:56:27 2015
@@ -204,5 +204,44 @@ public class TestHttp2Section_5_1 extend
                 output.getTrace().startsWith("0-Goaway-[2147483647]-[" +
                         Http2Error.PROTOCOL_ERROR.getCode() + "]-["));
     }
-    // TODO 5.1.2 tests
+
+
+    @Test
+    public void testExceedMaxActiveStreams() throws Exception {
+        hpackEncoder = new 
HpackEncoder(ConnectionSettings.DEFAULT_HEADER_TABLE_SIZE);
+
+        // http2Connect() - modified
+        enableHttp2(1);
+        configureAndStartWebApplication();
+        openClientConnection();
+        doHttpUpgrade();
+        sendClientPreface();
+        validateHttp2InitialResponse();
+
+        sendLargeRequest(3);
+
+        sendSimpleRequest(5);
+
+        // 1 * headers
+        // 64k of body (8 * 8k)
+        // 1 * error (could be in any order)
+        for (int i = 0; i < 9; i++) {
+            parser.readFrame(true);
+        }
+        parser.readFrame(true);
+
+        // Release the remaining body
+        sendWindowUpdate(0, (1 << 31) - 1);
+        sendWindowUpdate(3, (1 << 31) - 1);
+
+        // 192k of body (24 * 8k)
+        // 1 * error (could be in any order)
+        for (int i = 0; i < 24; i++) {
+            parser.readFrame(true);
+        }
+
+        Assert.assertTrue(output.getTrace(),
+                output.getTrace().contains("5-RST-[" +
+                        Http2Error.REFUSED_STREAM.getCode() + "]"));
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to