package com.webpieces.http2parser; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.webpieces.data.api.BufferCreationPool; import org.webpieces.data.api.DataWrapper; import com.webpieces.http2parser.api.Http2Memento; import com.webpieces.http2parser.api.Http2Parser; import com.webpieces.http2parser.api.Http2ParserFactory; import com.webpieces.http2parser.api.dto.SettingsFrame; import com.webpieces.http2parser.api.dto.lib.Http2Frame; import com.webpieces.http2parser.api.dto.lib.Http2Setting; import com.webpieces.http2parser.api.dto.lib.SettingsParameter; public class TestHttp2Settings { private static Http2Parser parser = Http2ParserFactory.createParser(new BufferCreationPool()); static private String basicSettings() { String data = "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 03 00 00 01 00"; //setting 2 (max streams) return data.replaceAll("\\s+",""); } static private String ackFrame() { String data = "00 00 00" + // length "04" + // type "01" + // flags (ack) "00 00 00 00"; // R + streamid return data.replaceAll("\\s+",""); } private Http2Memento memento; @Before public void setUp() { memento = parser.prepareToParse(Long.MAX_VALUE); } @Test public void testParseSettings() { DataWrapper data = Util.hexToBytes(basicSettings()); parser.parse(memento, data); SettingsFrame frame = (SettingsFrame) assertGood(); Assert.assertEquals(0, frame.getStreamId()); Assert.assertFalse(frame.isAck()); Assert.assertEquals(frame.getSettings().size(), 2); Http2Setting setting = frame.getSettings().get(0); //first setting must be push from order in the bytes Assert.assertEquals(SettingsParameter.SETTINGS_ENABLE_PUSH, setting.getKnownName()); Assert.assertEquals(1, setting.getValue()); } @Test public void testParseAck() { DataWrapper data = Util.hexToBytes(ackFrame()); parser.parse(memento, data); SettingsFrame frame = (SettingsFrame) assertGood(); Assert.assertEquals(0, frame.getStreamId()); Assert.assertTrue(frame.isAck()); Assert.assertEquals(frame.getSettings().size(), 0); } private Http2Frame assertGood() { Assert.assertEquals(0, memento.getLeftOverData().getReadableSize()); List<Http2Frame> frames = memento.getParsedFrames(); Assert.assertEquals(1, frames.size()); return frames.get(0); } @Test public void testMarshalSettings() { SettingsFrame frame = new SettingsFrame(); frame.addSetting(new Http2Setting(SettingsParameter.SETTINGS_ENABLE_PUSH, 1L)); frame.addSetting(new Http2Setting(SettingsParameter.SETTINGS_MAX_CONCURRENT_STREAMS, 256L)); byte[] data = parser.marshal(frame).createByteArray(); String hexFrame = Util.toHexString(data); Assert.assertEquals(basicSettings(), hexFrame); } @Test public void testMarshalAck() { SettingsFrame frame = new SettingsFrame(); frame.setAck(true); byte[] data = parser.marshal(frame).createByteArray(); String hexFrame = Util.toHexString(data); Assert.assertEquals(ackFrame(), hexFrame); } }