Adding test of windows generator with masking

This commit is contained in:
Joakim Erdfelt 2012-07-18 11:51:22 -07:00
parent 58e181f463
commit 0060a32bc5
1 changed files with 69 additions and 0 deletions

View File

@ -5,6 +5,8 @@ import static org.hamcrest.Matchers.*;
import java.nio.ByteBuffer;
import java.util.Arrays;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
import org.junit.Assert;
import org.junit.Test;
@ -43,4 +45,71 @@ public class GeneratorTest
Assert.assertThat("Created Parts",totalParts,is(expectedParts));
Assert.assertThat("Created Bytes",totalBytes,is(payload.length + expectedHeaderSize));
}
@Test
public void testWindowedGenerateWithMasking()
{
byte payload[] = new byte[10240];
Arrays.fill(payload,(byte)0x55);
byte mask[] = new byte[]
{ 0x2A, (byte)0xF0, 0x0F, 0x00 };
WebSocketFrame frame = WebSocketFrame.binary(payload);
frame.setMask(mask);
int totalParts = 0;
int totalBytes = 0;
int windowSize = 2929; // important, use an odd # window size to test masking across window barriers
int expectedHeaderSize = 8;
int expectedParts = (int)Math.ceil((double)(payload.length + expectedHeaderSize) / windowSize);
// Buffer to capture generated bytes
ByteBuffer completeBuf = ByteBuffer.allocate(payload.length + expectedHeaderSize);
BufferUtil.clearToFill(completeBuf);
// Generate and capture generator output
Generator generator = new UnitGenerator();
boolean done = false;
while (!done)
{
Assert.assertThat("Too many parts",totalParts,lessThan(20));
ByteBuffer buf = generator.generate(windowSize,frame);
// System.out.printf("Generated buf.limit() = %,d%n",buf.limit());
totalBytes += buf.remaining();
totalParts++;
BufferUtil.put(buf,completeBuf);
done = (frame.remaining() <= 0);
}
Assert.assertThat("Created Parts",totalParts,is(expectedParts));
Assert.assertThat("Created Bytes",totalBytes,is(payload.length + expectedHeaderSize));
// Parse complete buffer.
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
Parser parser = new Parser(policy);
FrameParseCapture capture = new FrameParseCapture();
parser.setIncomingFramesHandler(capture);
BufferUtil.flipToFlush(completeBuf,0);
parser.parse(completeBuf);
// Assert validity of frame
WebSocketFrame actual = capture.getFrames().get(0);
Assert.assertThat("Frame.opcode",actual.getOpCode(),is(OpCode.BINARY));
Assert.assertThat("Frame.payloadLength",actual.getPayloadLength(),is(payload.length));
// Validate payload content for proper masking
ByteBuffer actualData = actual.getPayload().slice();
Assert.assertThat("Frame.payload.remaining",actualData.remaining(),is(payload.length));
while (actualData.remaining() > 0)
{
Assert.assertThat("Actual.payload[" + actualData.position() + "]",actualData.get(),is((byte)0x55));
}
}
}