package org.jboss.pitbull.test;
import org.jboss.pitbull.client.WebSocketBuilder;
import org.jboss.pitbull.server.HttpServer;
import org.jboss.pitbull.server.HttpServerBuilder;
import org.jboss.pitbull.server.handlers.WebSocketHandler;
import org.jboss.pitbull.websocket.BinaryFrame;
import org.jboss.pitbull.websocket.TextFrame;
import org.jboss.pitbull.websocket.WebSocket;
import org.jboss.pitbull.websocket.WebSocketVersion;
import org.jboss.resteasy.util.Hex;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class WebSocketTest
{
public static HttpServer http;
@BeforeClass
public static void startup() throws Exception
{
http = new HttpServerBuilder().connector().add().connector().https().add()
.workers(1)
.maxRequestThreads(1).build();
http.start();
}
@AfterClass
public static void shutdown() throws Exception
{
http.stop();
}
public static class TextHandler implements WebSocketHandler
{
@Override
public String getProtocolName()
{
return null;
}
@Override
public void onReceivedFrame(WebSocket socket) throws IOException
{
TextFrame frame = (TextFrame)socket.readFrame();
System.out.println("Received: " + frame.getText());
try
{
Thread.sleep(10); // sleep so reads can buffer up.
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
socket.writeTextFrame(frame.getText());
}
}
public static class BinaryHandler implements WebSocketHandler
{
@Override
public String getProtocolName()
{
return null;
}
@Override
public void onReceivedFrame(WebSocket socket) throws IOException
{
BinaryFrame frame = (BinaryFrame)socket.readFrame();
System.out.println("Server bytes: " + Hex.encodeHex(frame.getBytes()));
try
{
Thread.sleep(10); // sleep so reads can buffer up.
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
socket.writeBinaryFrame(frame.getBytes());
}
}
@Test
public void testFrames() throws Exception
{
testTextFrames(WebSocketVersion.HYBI_00);
testTextFrames(WebSocketVersion.HYBI_13);
testBinaryFrames(WebSocketVersion.HYBI_13);
}
private void testTextFrames(WebSocketVersion version) throws Exception
{
TextHandler handler = new TextHandler();
http.register("/websocket", handler);
try
{
WebSocket socket = WebSocketBuilder.create(version).connect("ws://localhost:8080/websocket");
testTextFrame(socket);
socket = WebSocketBuilder.create(version).connect("wss://localhost:8443/websocket");
testTextFrame(socket);
}
finally
{
http.unregister(handler);
}
}
private void testTextFrame(WebSocket socket) throws IOException
{
socket.writeTextFrame("hello world");
TextFrame frame = (TextFrame)socket.readFrame();
Assert.assertEquals("hello world", frame.getText());
for (int i = 0; i < 10; i++)
{
socket.writeTextFrame(Integer.toString(i));
}
for (int i = 0; i < 10; i++)
{
frame = (TextFrame)socket.readFrame();
Assert.assertEquals(Integer.toString(i), frame.getText());
}
}
private void testBinaryFrames(WebSocketVersion version) throws Exception
{
BinaryHandler handler = new BinaryHandler();
http.register("/websocket", handler);
try
{
WebSocket socket = WebSocketBuilder.create(version).connect("ws://localhost:8080/websocket");
testBinaryFrame(socket);
socket = WebSocketBuilder.create(version).connect("wss://localhost:8443/websocket");
testBinaryFrame(socket);
}
finally
{
http.unregister(handler);
}
}
private void testBinaryFrame(WebSocket socket) throws IOException
{
ArrayList<byte[]> frames = new ArrayList<byte[]>(10);
Random random = new Random();
for (int i = 0; i < 10; i++)
{
byte[] bytes = new byte[10];
random.nextBytes(bytes);
System.out.println("client bytes: " + Hex.encodeHex(bytes));
frames.add(bytes);
socket.writeBinaryFrame(bytes);
}
for (int i = 0; i < 10; i++)
{
BinaryFrame frame = (BinaryFrame)socket.readFrame();
byte[] bytes = frames.get(i);
Assert.assertTrue(Arrays.equals(bytes, frame.getBytes()));
}
}
}