// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.websocket.common.io.payload; import static org.hamcrest.Matchers.is; import java.nio.ByteBuffer; import java.util.Arrays; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.TypeUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.websocket.common.WebSocketFrame; import org.eclipse.jetty.websocket.common.frames.TextFrame; import org.eclipse.jetty.websocket.common.test.ByteBufferAssert; import org.eclipse.jetty.websocket.common.test.UnitGenerator; import org.eclipse.jetty.websocket.common.util.Hex; import org.junit.Assert; import org.junit.Test; public class DeMaskProcessorTest { private static final Logger LOG = Log.getLogger(DeMaskProcessorTest.class); @Test public void testDeMaskText() { // Use a string that is not multiple of 4 in length to test if/else branches in DeMaskProcessor String message = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF01"; WebSocketFrame frame = new TextFrame().setPayload(message); frame.setMask(TypeUtil.fromHexString("11223344")); ByteBuffer buf = UnitGenerator.generate(frame); LOG.debug("Buf: {}",BufferUtil.toDetailString(buf)); ByteBuffer payload = buf.slice(); payload.position(6); // where payload starts LOG.debug("Payload: {}",BufferUtil.toDetailString(payload)); DeMaskProcessor demask = new DeMaskProcessor(); demask.reset(frame); demask.process(payload); ByteBufferAssert.assertEquals("DeMasked Text Payload",message,payload); } @Test public void testDeMaskTextSliced() { final byte msgChar = '*'; final int messageSize = 25; byte message[] = new byte[messageSize]; Arrays.fill(message,msgChar); TextFrame frame = new TextFrame(); frame.setPayload(ByteBuffer.wrap(message)); frame.setMask(Hex.asByteArray("11223344")); ByteBuffer buf = UnitGenerator.generate(frame); LOG.debug("Buf: {}",BufferUtil.toDetailString(buf)); ByteBuffer payload = buf.slice(); payload.position(6); // where payload starts LOG.debug("Payload: {}",BufferUtil.toDetailString(payload)); LOG.debug("Pre-Processed: {}",Hex.asHex(payload)); DeMaskProcessor demask = new DeMaskProcessor(); demask.reset(frame); ByteBuffer slice1 = payload.slice(); ByteBuffer slice2 = payload.slice(); // slice at non-multiple of 4, but also where last buffer remaining // is more than 4. int slicePoint = 7; slice1.limit(slicePoint); slice2.position(slicePoint); Assert.assertThat("Slices are setup right",slice1.remaining() + slice2.remaining(),is(messageSize)); demask.process(slice1); demask.process(slice2); LOG.debug("Post-Processed: {}",Hex.asHex(payload)); Assert.assertThat("Payload.remaining",payload.remaining(),is(messageSize)); for (int i = payload.position(); i < payload.limit(); i++) { Assert.assertThat("payload[" + i + "]",payload.get(i),is(msgChar)); } } }