package com.xoom.oss.feathercon.websocket;
import com.xoom.oss.feathercon.FeatherCon;
import com.xoom.oss.feathercon.WebSocketEndpointConfiguration;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.websocket.ContainerProvider;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import java.net.URI;
public class WebSocketTestWithStaticEndpointClass {
private FeatherCon server;
@Before
public void setup() throws Exception {
WebSocketEndpointConfiguration.Builder wsb = new WebSocketEndpointConfiguration.Builder();
WebSocketEndpointConfiguration wsconfig = wsb.withEndpointClass(ServerSocket.class).build();
FeatherCon.Builder serverBuilder = new FeatherCon.Builder().withPort(0);
server = serverBuilder.withWebSocketConfiguration(wsconfig).build();
server.start();
}
@After
public void shutdown() throws Exception {
server.stop();
}
@Test
public void testSocket() throws Exception {
ClientSocket clientSocket = new ClientSocket();
String message = "Hello";
URI uri = URI.create(String.format("ws://localhost:%d/events", server.getHttpPort()));
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
try {
Session session = container.connectToServer(clientSocket, uri);
session.getBasicRemote().sendText(message);
while (clientSocket.spin) ;
session.close();
} finally {
// Force lifecycle stop when done with container.
// This is to free up threads and resources that the
// JSR-356 container allocates. But unfortunately
// the JSR-356 spec does not handle lifecycles (yet)
if (container instanceof LifeCycle) {
((LifeCycle) container).stop();
}
}
} catch (Throwable t) {
t.printStackTrace(System.err);
}
Assert.assertEquals(clientSocket.messageEchoed, "echo:" + message);
}
}