package fr.ybonnel.simpleweb4j;
import fr.ybonnel.simpleweb4j.handlers.websocket.WebSocketListener;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import static fr.ybonnel.simpleweb4j.SimpleWeb4j.resetDefaultValues;
import static fr.ybonnel.simpleweb4j.SimpleWeb4j.setPort;
import static fr.ybonnel.simpleweb4j.SimpleWeb4j.start;
import static fr.ybonnel.simpleweb4j.SimpleWeb4j.websocket;
import static org.junit.Assert.assertEquals;
public class WebSocketTest {
private Random random = new Random();
private List<String> messagesReceived;
private int port;
@Before
public void startServer() {
resetDefaultValues();
port = Integer.getInteger("test.http.port", random.nextInt(10000) + 10000);
messagesReceived = new ArrayList<>();
websocket("/websocket/:name", (routeParams) ->
WebSocketListener.<String, String>newBuilder(String.class)
.onConnect((session) -> {
try {
session.sendMessage(
"Hello " + routeParams.getParam("name") + routeParams.getParam("suffixe"));
} catch (IOException ignore) {
}
})
.onMessage((session, message) -> {
messagesReceived.add(message);
try {
session.getSession().disconnect();
} catch (IOException ignore) {
}
})
.onClose((session, cause) -> {
System.out.println(cause.getStatusCode() + " : " + cause.getReason());
})
.onError((session, throwable) -> {
})
.build());
setPort(port);
start(false);
}
@After
public void stopServer() throws Exception {
SimpleWeb4j.stop();
}
@Test
public void testWebSocket() throws Exception {
WebSocketClient client = new WebSocketClient();
client.start();
List<String> clientReceived = new ArrayList<>();
Session session = client.connect(
new org.eclipse.jetty.websocket.api.WebSocketAdapter() {
@Override public void onWebSocketText(String message) {
clientReceived.add(message);
}
},
new URI("ws://localhost:" + port + "/websocket/world?suffixe=!"))
.get();
long timeBeforeWait = System.nanoTime();
while (clientReceived.isEmpty()
&& (System.nanoTime() - timeBeforeWait < TimeUnit.SECONDS.toNanos(1))) {
Thread.sleep(50);
}
session.getRemote().sendString("\"Hello Server\"");
timeBeforeWait = System.nanoTime();
while (messagesReceived.isEmpty()
&& (System.nanoTime() - timeBeforeWait < TimeUnit.SECONDS.toNanos(1))) {
Thread.sleep(50);
}
session.close();
assertEquals(1, clientReceived.size());
assertEquals("\"Hello world!\"", clientReceived.get(0));
assertEquals(1, messagesReceived.size());
assertEquals("Hello Server", messagesReceived.get(0));
}
}