Skip to content

Commit

Permalink
Add test for SSE
Browse files Browse the repository at this point in the history
  • Loading branch information
asafalima committed Oct 10, 2017
1 parent ab5d27b commit 0e55e17
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 4 deletions.
12 changes: 12 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,12 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
Expand All @@ -223,6 +229,12 @@
<version>1.1.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<developers>
Expand Down
45 changes: 45 additions & 0 deletions src/test/java/io/logz/guice/jersey/ServerSentEventsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package io.logz.guice.jersey;

import io.logz.guice.jersey.resources.SseResource;
import io.logz.guice.jersey.supplier.JerseyServerSupplier;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Test;

import javax.ws.rs.client.Entity;
import javax.ws.rs.sse.SseEventSource;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;

public class ServerSentEventsTest {

@Test
public void testEventSource() throws Exception {
ResourceConfig resourceConfig = new ResourceConfig().registerClasses(SseResource.class);
JerseyServerSupplier.createServerAndTest(resourceConfig, target -> {
CountDownLatch latch = new CountDownLatch(1);
AtomicReference<String> receivedMessage = new AtomicReference<>();
SseEventSource eventSource = SseEventSource.target(target.path(SseResource.PATH)).build();
eventSource.register((inboundEvent) -> {
receivedMessage.set(inboundEvent.readData());
latch.countDown();
});

eventSource.open();
target.path(SseResource.PATH).request().post(Entity.text("message"));

try {
assertThat(latch.await(30, TimeUnit.SECONDS)).isTrue()
.withFailMessage("Waiting for message to be delivered has timed out.");
} finally {
eventSource.close();
}

assertThat(receivedMessage.get()).isEqualTo("message")
.withFailMessage("Unexpected SSE event data value.");
});
}

}
46 changes: 46 additions & 0 deletions src/test/java/io/logz/guice/jersey/resources/SseResource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.logz.guice.jersey.resources;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.sse.Sse;
import javax.ws.rs.sse.SseEventSink;
import java.io.IOException;

import static java.util.Objects.requireNonNull;

@Path(SseResource.PATH)
public class SseResource {

public static final String PATH = "sse";

private static volatile SseEventSink eventSink = null;

@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void getMessageQueue(@Context SseEventSink sink) {
eventSink = requireNonNull(sink);
}

@POST
public void addMessage(final String message, @Context Sse sse) throws IOException {
final SseEventSink localSink = eventSink;
if (localSink != null) {
localSink.send(sse.newEventBuilder().name("custom-message").data(String.class, message).build());
}
}

@DELETE
public void close() throws IOException {
final SseEventSink localSink = eventSink;
if (localSink != null) {
eventSink.close();
}
eventSink = null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,19 @@
import javax.ws.rs.client.WebTarget;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class JerseyServerSupplier {

private static final Logger LOGGER = LoggerFactory.getLogger(JerseyServerSupplier.class);

public static void createServerAndTest(ResourceConfig resourceConfig, Consumer<WebTarget> tester) throws Exception {
public static void createServerAndTest(ResourceConfig resourceConfig, Tester tester) throws Exception {
JerseyConfigurationBuilder configurationBuilder = JerseyConfiguration.builder()
.withResourceConfig(resourceConfig);

createServerAndTest(configurationBuilder, tester);
}

public static void createServerAndTest(JerseyConfigurationBuilder configurationBuilder, Consumer<WebTarget> tester) throws Exception {
public static void createServerAndTest(JerseyConfigurationBuilder configurationBuilder, Tester tester) throws Exception {
int port = AvailablePortFinder.getNextAvailable();
configurationBuilder.addPort(port);
JerseyConfiguration configuration = configurationBuilder.build();
Expand All @@ -41,7 +40,7 @@ public static void createServerAndTest(JerseyConfigurationBuilder configurationB

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http:https://localhost:" + port).path(configuration.getContextPath());
tester.accept(target);
tester.test(target);
} finally {
server.stop();
}
Expand All @@ -55,4 +54,9 @@ private static JerseyServer createServer(JerseyConfiguration configuration) {
.getInstance(JerseyServer.class);
}

public interface Tester {

void test(WebTarget target) throws Exception;

}
}

0 comments on commit 0e55e17

Please sign in to comment.