Author: markt
Date: Fri Aug 17 20:45:42 2018
New Revision: 1838286
URL: http://svn.apache.org/viewvc?rev=1838286&view=rev
Log:
Expand Async + HTTP/2 tests to cover larger window sizes. Confirm previous fix
fixes BZ 62628.
Modified:
tomcat/trunk/test/org/apache/coyote/http2/TestAsync.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestAsync.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestAsync.java?rev=1838286&r1=1838285&r2=1838286&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestAsync.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestAsync.java Fri Aug 17
20:45:42 2018
@@ -46,6 +46,7 @@ import org.apache.catalina.startup.Tomca
* Based on
* https://bz.apache.org/bugzilla/show_bug.cgi?id=62614
* https://bz.apache.org/bugzilla/show_bug.cgi?id=62620
+ * https://bz.apache.org/bugzilla/show_bug.cgi?id=62628
*/
@RunWith(Parameterized.class)
public class TestAsync extends Http2TestBase {
@@ -53,7 +54,8 @@ public class TestAsync extends Http2Test
private static final int BLOCK_SIZE = 0x8000;
@Parameterized.Parameters(name = "{index}: expandConnectionFirst[{0}], " +
- "connectionUnlimited[{1}], streamUnlimited[{2}],
useNonContainerThreadForWrite[{3}]")
+ "connectionUnlimited[{1}], streamUnlimited[{2}],
useNonContainerThreadForWrite[{3}]," +
+ "largeInitialWindow[{4}]")
public static Collection<Object[]> parameters() {
Boolean[] booleans = new Boolean[] { Boolean.FALSE, Boolean.TRUE };
List<Object[]> parameterSets = new ArrayList<>();
@@ -62,10 +64,12 @@ public class TestAsync extends Http2Test
for (Boolean connectionUnlimited : booleans) {
for (Boolean streamUnlimited : booleans) {
for (Boolean useNonContainerThreadForWrite : booleans) {
- parameterSets.add(new Object[] {
- expandConnectionFirst, connectionUnlimited,
streamUnlimited,
- useNonContainerThreadForWrite
- });
+ for (Boolean largeInitialWindow : booleans) {
+ parameterSets.add(new Object[] {
+ expandConnectionFirst,
connectionUnlimited, streamUnlimited,
+ useNonContainerThreadForWrite,
largeInitialWindow
+ });
+ }
}
}
}
@@ -78,20 +82,23 @@ public class TestAsync extends Http2Test
private final boolean connectionUnlimited;
private final boolean streamUnlimited;
private final boolean useNonContainerThreadForWrite;
+ private final boolean largeInitialWindow;
public TestAsync(boolean expandConnectionFirst, boolean
connectionUnlimited,
- boolean streamUnlimited, boolean useNonContainerThreadForWrite) {
+ boolean streamUnlimited, boolean useNonContainerThreadForWrite,
+ boolean largeInitialWindow) {
this.expandConnectionFirst = expandConnectionFirst;
this.connectionUnlimited = connectionUnlimited;
this.streamUnlimited = streamUnlimited;
this.useNonContainerThreadForWrite = useNonContainerThreadForWrite;
+ this.largeInitialWindow = largeInitialWindow;
}
@Test
public void testEmptyWindow() throws Exception {
- int blockCount = 4;
+ int blockCount = 8;
enableHttp2();
@@ -106,19 +113,32 @@ public class TestAsync extends Http2Test
ctxt.addServletMappingDecoded("/async", "async");
tomcat.start();
+ int startingWindowSize;
+
openClientConnection();
doHttpUpgrade();
sendClientPreface();
validateHttp2InitialResponse();
+ // Reset connection window size after intial response
+ sendWindowUpdate(0, SimpleServlet.CONTENT_LENGTH);
+
+ if (largeInitialWindow) {
+ startingWindowSize = ((1 << 17) - 1);
+ SettingValue sv =
+ new SettingValue(Setting.INITIAL_WINDOW_SIZE.getId(),
startingWindowSize);
+ sendSettings(0, false, sv);
+ // Test code assumes connection window and stream window size are
the same at the start
+ sendWindowUpdate(0, startingWindowSize -
ConnectionSettingsBase.DEFAULT_INITIAL_WINDOW_SIZE);
+ } else {
+ startingWindowSize =
ConnectionSettingsBase.DEFAULT_INITIAL_WINDOW_SIZE;
+ }
+
byte[] frameHeader = new byte[9];
ByteBuffer headersPayload = ByteBuffer.allocate(128);
buildGetRequest(frameHeader, headersPayload, null, 3, "/async");
writeFrame(frameHeader, headersPayload);
- // Reset connection window size after intial response
- sendWindowUpdate(0, SimpleServlet.CONTENT_LENGTH);
-
if (connectionUnlimited) {
// Effectively unlimited for this test
sendWindowUpdate(0, blockCount * BLOCK_SIZE * 2);
@@ -133,7 +153,6 @@ public class TestAsync extends Http2Test
// Body
if (!connectionUnlimited || !streamUnlimited) {
- int startingWindowSize =
ConnectionSettingsBase.DEFAULT_INITIAL_WINDOW_SIZE;
while (output.getBytesRead() < startingWindowSize) {
parser.readFrame(true);
@@ -224,7 +243,7 @@ public class TestAsync extends Http2Test
throw new IllegalStateException(e);
}
}
- }, 2, TimeUnit.SECONDS);
+ }, 200, TimeUnit.MILLISECONDS);
} else {
write();
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1838286&r1=1838285&r2=1838286&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Aug 17 20:45:42 2018
@@ -56,8 +56,9 @@
bodies using asynchronous processing over HTTP/2. (markt)
</fix>
<fix>
- Additional fixes for output corruption of response bodies when writing
- large bodies using asynchronous processing over HTTP/2. (markt)
+ <bug>62628</bug>: Additional fixes for output corruption of response
+ bodies when writing large bodies using asynchronous processing over
+ HTTP/2. (markt)
</fix>
</changelog>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]