blob: 6314007282bdb89c3ebed2c0c83a832d17766cd4 [file] [log] [blame]
//
// ========================================================================
// 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.extensions;
import static org.hamcrest.Matchers.*;
import java.nio.ByteBuffer;
import java.util.Collections;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
import org.eclipse.jetty.websocket.api.extensions.Extension;
import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
import org.eclipse.jetty.websocket.api.extensions.Frame;
import org.eclipse.jetty.websocket.common.Parser;
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.IncomingFramesCapture;
import org.eclipse.jetty.websocket.common.test.UnitParser;
import org.junit.Assert;
public class ExtensionTool
{
public class Tester
{
private String requestedExtParams;
private ExtensionConfig extConfig;
private Extension ext;
private Parser parser;
private IncomingFramesCapture capture;
private Tester(String parameterizedExtension)
{
this.requestedExtParams = parameterizedExtension;
this.extConfig = ExtensionConfig.parse(parameterizedExtension);
Class<?> extClass = factory.getExtension(extConfig.getName());
Assert.assertThat("extClass", extClass, notNullValue());
this.parser = new UnitParser(policy);
}
public String getRequestedExtParams()
{
return requestedExtParams;
}
public void assertNegotiated(String expectedNegotiation)
{
this.ext = (Extension)factory.newInstance(extConfig);
this.capture = new IncomingFramesCapture();
this.ext.setNextIncomingFrames(capture);
this.parser.configureFromExtensions(Collections.singletonList(ext));
this.parser.setIncomingFramesHandler(ext);
}
public void parseIncomingHex(String... rawhex)
{
int parts = rawhex.length;
byte net[];
for (int i = 0; i < parts; i++)
{
String hex = rawhex[i].replaceAll("\\s*(0x)?","");
net = TypeUtil.fromHexString(hex);
parser.parse(ByteBuffer.wrap(net));
}
}
public void assertHasFrames(String... textFrames)
{
Frame frames[] = new Frame[textFrames.length];
for (int i = 0; i < frames.length; i++)
{
frames[i] = new TextFrame().setPayload(textFrames[i]);
}
assertHasFrames(frames);
}
public void assertHasFrames(Frame... expectedFrames)
{
int expectedCount = expectedFrames.length;
capture.assertFrameCount(expectedCount);
for (int i = 0; i < expectedCount; i++)
{
WebSocketFrame actual = capture.getFrames().poll();
String prefix = String.format("frame[%d]",i);
Assert.assertThat(prefix + ".opcode",actual.getOpCode(),is(expectedFrames[i].getOpCode()));
Assert.assertThat(prefix + ".fin",actual.isFin(),is(expectedFrames[i].isFin()));
Assert.assertThat(prefix + ".rsv1",actual.isRsv1(),is(false));
Assert.assertThat(prefix + ".rsv2",actual.isRsv2(),is(false));
Assert.assertThat(prefix + ".rsv3",actual.isRsv3(),is(false));
ByteBuffer expected = expectedFrames[i].getPayload().slice();
Assert.assertThat(prefix + ".payloadLength",actual.getPayloadLength(),is(expected.remaining()));
ByteBufferAssert.assertEquals(prefix + ".payload",expected,actual.getPayload().slice());
}
}
}
private final WebSocketPolicy policy;
private final ExtensionFactory factory;
public ExtensionTool(WebSocketPolicy policy, ByteBufferPool bufferPool)
{
this.policy = policy;
this.factory = new WebSocketExtensionFactory(policy,bufferPool);
}
public Tester newTester(String parameterizedExtension)
{
return new Tester(parameterizedExtension);
}
}