package org.jooby.ws;
import static org.junit.Assert.assertEquals;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.jooby.test.ServerFeature;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Sets;
import com.ning.http.client.AsyncHttpClient;
import com.ning.http.client.AsyncHttpClientConfig;
import com.ning.http.client.ws.WebSocket;
import com.ning.http.client.ws.WebSocketTextListener;
import com.ning.http.client.ws.WebSocketUpgradeHandler;
public class WebSocketPauseResumeFeature extends ServerFeature {
static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
{
ws("/ws", ws -> {
CountDownLatch latch = new CountDownLatch(1);
ws.pause();
// 2nd ignored
ws.pause();
executor.schedule(() -> {
ws.resume();
// 2nd call ignored
ws.resume();
latch.countDown();
}, 1, TimeUnit.SECONDS);
ws.onMessage(message -> {
ws.send("=" + message.value(), () -> {
latch.await();
ws.close();
});
});
});
}
private AsyncHttpClient client;
@Before
public void before() {
client = new AsyncHttpClient(new AsyncHttpClientConfig.Builder().build());
}
@After
public void after() {
client.close();
}
@Test
public void pauseAndResume() throws Exception {
Set<String> messages = new HashSet<>();
CountDownLatch latch = new CountDownLatch(2);
client.prepareGet(ws("ws").toString())
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
new WebSocketTextListener() {
@Override
public void onMessage(final String message) {
messages.add(message);
latch.countDown();
}
@Override
public void onOpen(final WebSocket websocket) {
websocket.sendMessage("hey!");
}
@Override
public void onClose(final WebSocket websocket) {
latch.countDown();
}
@Override
public void onError(final Throwable t) {
}
}).build())
.get();
if (latch.await(1L, TimeUnit.SECONDS)) {
assertEquals(Sets.newHashSet("=hey!"), messages);
}
}
}