package org.webpieces.httpfrontend2.api.http2; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.webpieces.data.api.DataWrapper; import com.webpieces.http2parser.api.dto.GoAwayFrame; import com.webpieces.http2parser.api.dto.SettingsFrame; import com.webpieces.http2parser.api.dto.lib.Http2ErrorCode; /** * Test this section of rfc.. * http://httpwg.org/specs/rfc7540.html#SETTINGS */ public class TestS6_5SettingsFrameErrors extends AbstractHttp2Test { @Override protected void simulateClientSendingPrefaceAndSettings() { //null out the settings stuff mockChannel.sendPreface(); SettingsFrame settings = (SettingsFrame) mockChannel.getFrameAndClear(); Assert.assertEquals(0, settings.getStreamId()); } @Ignore @Test public void testSection6_5_3SettingsAckNotReceivedInReasonableTime() { } @Test public void testSection6_5AckNonEmptyPayload() { String badAckFrame = "00 00 01" + // length "04" + // type "01" + // flags (ack) "00 00 00 00" + // R + streamid "00"; //payload mockChannel.writeHexBack(badAckFrame); //ack client frame //remote receives goAway GoAwayFrame goAway = (GoAwayFrame) mockChannel.getFrameAndClear(); DataWrapper debugData = goAway.getDebugData(); String msg = debugData.createStringFromUtf8(0, debugData.getReadableSize()); Assert.assertEquals("size of payload of a settings frame ack must be 0 but was=1 reason=FRAME_SIZE_INCORRECT stream=0", msg); Assert.assertTrue(mockChannel.isClosed()); } @Test public void testSection6_5SettingsStreamIdNonZeroValue() { //server's settings frame is finally coming in as well with maxConcurrent=1 String badStreamIdSettings = "00 00 0C" + // length "04" + // type "00" + //flags "00 00 00 01" + //R + streamid "00 02 00 00 00 01" + //setting 1 (enable push) "00 03 00 00 01 00"; //setting 2 (max streams) mockChannel.writeHexBack(badStreamIdSettings); //remote receives goAway GoAwayFrame goAway = (GoAwayFrame) mockChannel.getFrameAndClear(); Assert.assertEquals(Http2ErrorCode.PROTOCOL_ERROR, goAway.getKnownErrorCode()); Assert.assertTrue(mockChannel.isClosed()); } @Test public void testSection6_5SettingsFrameLengthMultipleNotSixOctects() { //server's settings frame is finally coming in as well with maxConcurrent=1 String badStreamIdSettings = "00 00 0B" + // length "04" + // type "00" + //flags "00 00 00 00" + //R + streamid "00 02 00 00 00 01" + //setting 1 (enable push) "00 03 00 00 01"; //setting 2 (max streams) mockChannel.writeHexBack(badStreamIdSettings); //remote receives goAway GoAwayFrame goAway = (GoAwayFrame) mockChannel.getFrameAndClear(); Assert.assertEquals(Http2ErrorCode.FRAME_SIZE_ERROR, goAway.getKnownErrorCode()); Assert.assertTrue(mockChannel.isClosed()); } @Test public void testSection6_5_2InitialWindowSizeTooLarge() { //server's settings frame is finally coming in as well with maxConcurrent=1 String badStreamIdSettings = "00 00 0C" + // length "04" + // type "00" + //flags "00 00 00 00" + //R + streamid "00 02 00 00 00 01" + //setting 1 (enable push) "00 04 FF FF FF FF"; //setting 2 (initial window size) mockChannel.writeHexBack(badStreamIdSettings); //remote receives goAway GoAwayFrame goAway = (GoAwayFrame) mockChannel.getFrameAndClear(); Assert.assertEquals(Http2ErrorCode.FLOW_CONTROL_ERROR, goAway.getKnownErrorCode()); Assert.assertTrue(mockChannel.isClosed()); } @Test public void testSection6_5_2MaxFrameSizeOutsideAllowedRange() { //server's settings frame is finally coming in as well with maxConcurrent=1 String badStreamIdSettings = "00 00 0C" + // length "04" + // type "00" + //flags "00 00 00 00" + //R + streamid "00 02 00 00 00 01" + //setting 1 (enable push) "00 05 00 00 00 00"; //setting 2 (initial window size) mockChannel.writeHexBack(badStreamIdSettings); //remote receives goAway GoAwayFrame goAway = (GoAwayFrame) mockChannel.getFrameAndClear(); Assert.assertEquals(Http2ErrorCode.PROTOCOL_ERROR, goAway.getKnownErrorCode()); Assert.assertTrue(mockChannel.isClosed()); } }