// // ======================================================================== // 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; import static org.hamcrest.Matchers.is; import java.nio.ByteBuffer; import java.util.Arrays; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.websocket.api.WebSocketPolicy; import org.eclipse.jetty.websocket.common.frames.TextFrame; import org.eclipse.jetty.websocket.common.test.IncomingFramesCapture; import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; public class GeneratorParserRoundtripTest { @Rule public LeakTrackingBufferPoolRule bufferPool = new LeakTrackingBufferPoolRule("GeneratorParserRoundtrip"); @Test public void testParserAndGenerator() throws Exception { WebSocketPolicy policy = WebSocketPolicy.newClientPolicy(); Generator gen = new Generator(policy,bufferPool); Parser parser = new Parser(policy,bufferPool); IncomingFramesCapture capture = new IncomingFramesCapture(); parser.setIncomingFramesHandler(capture); String message = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; ByteBuffer out = bufferPool.acquire(8192,false); try { // Generate Buffer BufferUtil.flipToFill(out); WebSocketFrame frame = new TextFrame().setPayload(message); ByteBuffer header = gen.generateHeaderBytes(frame); ByteBuffer payload = frame.getPayload(); out.put(header); out.put(payload); // Parse Buffer BufferUtil.flipToFlush(out,0); parser.parse(out); } finally { bufferPool.release(out); } // Validate capture.assertNoErrors(); capture.assertHasFrame(OpCode.TEXT,1); TextFrame txt = (TextFrame)capture.getFrames().poll(); Assert.assertThat("Text parsed",txt.getPayloadAsUTF8(),is(message)); } @Test public void testParserAndGeneratorMasked() throws Exception { Generator gen = new Generator(WebSocketPolicy.newClientPolicy(),bufferPool); Parser parser = new Parser(WebSocketPolicy.newServerPolicy(),bufferPool); IncomingFramesCapture capture = new IncomingFramesCapture(); parser.setIncomingFramesHandler(capture); String message = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; ByteBuffer out = bufferPool.acquire(8192,false); BufferUtil.flipToFill(out); try { // Setup Frame WebSocketFrame frame = new TextFrame().setPayload(message); // Add masking byte mask[] = new byte[4]; Arrays.fill(mask,(byte)0xFF); frame.setMask(mask); // Generate Buffer ByteBuffer header = gen.generateHeaderBytes(frame); ByteBuffer payload = frame.getPayload(); out.put(header); out.put(payload); // Parse Buffer BufferUtil.flipToFlush(out,0); parser.parse(out); } finally { bufferPool.release(out); } // Validate capture.assertNoErrors(); capture.assertHasFrame(OpCode.TEXT,1); TextFrame txt = (TextFrame)capture.getFrames().poll(); Assert.assertTrue("Text.isMasked",txt.isMasked()); Assert.assertThat("Text parsed",txt.getPayloadAsUTF8(),is(message)); } }