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.DataFrame; import com.webpieces.http2parser.api.dto.lib.Http2Frame; public class TestHttp2Data{ private static Http2Parser parser = Http2ParserFactory.createParser(new BufferCreationPool()); private static String unpaddedDataFrame() { String data = "00 00 08" + // Length "00" + // Type "01" + // Flags "00 00 00 01" + // R + streamid "FF FF FF FF FF FF FF FF"; // payload return data.replaceAll("\\s+",""); } private static String endStreamDataFrame() { String data = "00 00 08" + // Length "00" + // Type "01" + // Flags - endStream = true "00 00 00 01" + // R + streamid "FF FF FF FF FF FF FF FF"; // payload return data.replaceAll("\\s+",""); } private static String paddedDataFrame() { String data = "00 00 0B" + // Length "00" + // Type "09" + // Flags (padded = true) "00 00 00 01" + // R + streamid "02" + // padding length "FF FF FF FF FF FF FF FF" + // data "00 00"; // padding return data.replaceAll("\\s+",""); } private static String paddedEndStreamDataFrame() { String data = "00 00 0B" + // Length "00" + // Type "09" + // Flags - endStream = true "00 00 00 01" + // R + streamid "02" + // padding length "FF FF FF FF FF FF FF FF" + // payload "00 00"; // padding return data.replaceAll("\\s+",""); } private Http2Memento memento; @Before public void setUp() { memento = parser.prepareToParse(Long.MAX_VALUE); } @Test public void testParseUnpaddedData() { DataWrapper data = Util.hexToBytes(unpaddedDataFrame()); parser.parse(memento, data); DataFrame frame = (DataFrame) assertGood(); Assert.assertEquals(1, frame.getStreamId()); Assert.assertEquals(8, frame.getData().getReadableSize()); Assert.assertEquals(0, frame.getPadding().getReadableSize()); Assert.assertTrue(frame.isEndOfStream()); } @Test public void testParsePaddedData() { DataWrapper data = Util.hexToBytes(paddedDataFrame()); parser.parse(memento, data); DataFrame frame = (DataFrame) assertGood(); Assert.assertEquals(1, frame.getStreamId()); Assert.assertEquals(8, frame.getData().getReadableSize()); Assert.assertEquals(2, frame.getPadding().getReadableSize()); Assert.assertTrue(frame.isEndOfStream()); } @Test public void testParseEndOfStreamTrue() { DataWrapper data = Util.hexToBytes(endStreamDataFrame()); parser.parse(memento, data); DataFrame frame = (DataFrame) assertGood(); Assert.assertEquals(1, frame.getStreamId()); Assert.assertEquals(8, frame.getData().getReadableSize()); Assert.assertEquals(0, frame.getPadding().getReadableSize()); Assert.assertTrue(frame.isEndOfStream()); } 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 testMarshalDataFrameUnpadded() { DataFrame frame = new DataFrame(); frame.setData(Util.hexToBytes("FF FF FF FF FF FF FF FF")); frame.setStreamId(1); byte[] data = parser.marshal(frame).createByteArray(); String hexFrame = Util.toHexString(data); Assert.assertEquals(unpaddedDataFrame(), hexFrame); } @Test public void testMarshalDataFramePadded() { DataFrame frame = new DataFrame(); frame.setData(Util.hexToBytes("FF FF FF FF FF FF FF FF")); frame.setStreamId(1); frame.setPadding(Util.hexToBytes("00 00")); byte[] data = parser.marshal(frame).createByteArray(); String hexFrame = Util.toHexString(data); Assert.assertEquals(paddedDataFrame(), hexFrame); } @Test public void testMarshalDataFrameEndStream() { DataFrame frame = new DataFrame(); frame.setData(Util.hexToBytes("FF FF FF FF FF FF FF FF")); frame.setStreamId(1); frame.setEndOfStream(true); byte[] data = parser.marshal(frame).createByteArray(); String hexFrame = Util.toHexString(data); Assert.assertEquals(endStreamDataFrame(), hexFrame); } @Test public void testMarshalDataFramePaddedEndStream() { DataFrame frame = new DataFrame(); frame.setData(Util.hexToBytes("FF FF FF FF FF FF FF FF")); frame.setStreamId(1); frame.setEndOfStream(true); frame.setPadding(Util.hexToBytes("00 00")); byte[] data = parser.marshal(frame).createByteArray(); String hexFrame = Util.toHexString(data); Assert.assertEquals(paddedEndStreamDataFrame(), hexFrame); } }