package org.jooby.test; import static org.junit.Assert.assertEquals; import java.nio.charset.StandardCharsets; import java.util.concurrent.CountDownLatch; import org.jooby.Jooby; import org.jooby.MediaType; import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; import com.ning.http.client.AsyncHandler; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.AsyncHttpClientConfig; import com.ning.http.client.FluentCaseInsensitiveStringsMap; import com.ning.http.client.HttpResponseBodyPart; import com.ning.http.client.HttpResponseHeaders; import com.ning.http.client.HttpResponseStatus; /** * Internal use only. * * @author edgar */ @RunWith(JoobySuite.class) public abstract class SseFeature extends Jooby { private int port; private AsyncHttpClient client; @Before public void before() { client = new AsyncHttpClient(new AsyncHttpClientConfig.Builder().build()); } @After public void after() { client.close(); } public String sse(final String path, final int count) throws Exception { CountDownLatch latch = new CountDownLatch(count); String result = client.prepareGet("http://localhost:" + port + path) .addHeader("Content-Type", MediaType.sse.name()) .addHeader("last-event-id", count + "") .execute(new AsyncHandler<String>() { StringBuilder sb = new StringBuilder(); @Override public void onThrowable(final Throwable t) { t.printStackTrace(); } @Override public AsyncHandler.STATE onBodyPartReceived(final HttpResponseBodyPart bodyPart) throws Exception { sb.append(new String(bodyPart.getBodyPartBytes(), StandardCharsets.UTF_8)); latch.countDown(); return AsyncHandler.STATE.CONTINUE; } @Override public AsyncHandler.STATE onStatusReceived(final HttpResponseStatus responseStatus) throws Exception { assertEquals(200, responseStatus.getStatusCode()); return AsyncHandler.STATE.CONTINUE; } @Override public AsyncHandler.STATE onHeadersReceived(final HttpResponseHeaders headers) throws Exception { FluentCaseInsensitiveStringsMap h = headers.getHeaders(); assertEquals("close", h.get("Connection").get(0).toLowerCase()); assertEquals("text/event-stream; charset=utf-8", h.get("Content-Type").get(0).toLowerCase()); return AsyncHandler.STATE.CONTINUE; } @Override public String onCompleted() throws Exception { return sb.toString(); } }).get(); latch.await(); return result; } }