package eu.play_project.dcep.distributedetalis.test;
import static eu.play_project.play_commons.constants.Event.EVENT_ID_SUFFIX;
import static org.junit.Assert.assertTrue;
import java.net.URI;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import javax.inject.Singleton;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import junit.framework.Assert;
import org.apache.cxf.BusFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.event_processing.events.types.UcTelcoCall;
import org.glassfish.jersey.moxy.json.MoxyJsonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.ontoware.rdf2go.model.Model;
import org.ontoware.rdf2go.model.node.impl.URIImpl;
import org.ow2.play.governance.platform.user.api.rest.PublishService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.play_project.platformservices.eventvalidation.InvalidEventException;
import eu.play_project.platformservices.eventvalidation.Validator;
import eu.play_project.play_commons.constants.Stream;
import eu.play_project.play_commons.eventtypes.EventHelpers;
import eu.play_project.play_eventadapter.AbstractReceiverRest;
import eu.play_project.play_eventadapter.AbstractSenderRest;
import eu.play_project.play_eventadapter.NoRdfEventException;
public class EcConnectionManagerVirtuosoTest {
private static final String REST_URI = "http://localhost:9085/notifyRest";
private static final List<Model> eventSink = Collections.synchronizedList(new ArrayList<Model>());
private static Logger logger = LoggerFactory.getLogger(EcConnectionManagerVirtuosoTest.class);
private static Server notifyReceiverRest;
@BeforeClass
public static void setupBeforeClass() throws Exception {
TestListenerRest listener = new TestListenerRest(eventSink);
final ResourceConfig rc = new ResourceConfig()
.register(listener)
.register(MoxyJsonFeature.class);
BusFactory.getDefaultBus(true);
notifyReceiverRest = new Server(URI.create(REST_URI).getPort());
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
ServletHolder h = new ServletHolder(new ServletContainer(rc));
context.addServlet(h, "/");
notifyReceiverRest.setHandler(context);
notifyReceiverRest.start();
logger.info("Test server started.");
}
@Test
public void testRestfulSendAndReceive() throws InvalidEventException {
/*
* (1) Send event
*/
AbstractSenderRest rdfSender = new AbstractSenderRest("http://example.com/topic", REST_URI);
String eventId = EventHelpers.createRandomEventId("UnitTest");
UcTelcoCall event = new UcTelcoCall(EventHelpers.createEmptyModel(eventId),
eventId + EVENT_ID_SUFFIX, true);
event.setEndTime(Calendar.getInstance());
event.setStream(new URIImpl(Stream.TaxiUCCall.getUri()));
rdfSender.notify(event);
/*
* (2) Wait for the event to be received:
*/
try {
synchronized (this) {
this.wait(1000);
}
} catch(InterruptedException e) {
Assert.fail(e.getMessage());
}
/*
* (3) Check if event is receieved
*/
Assert.assertEquals(1, eventSink.size());
Validator v = new Validator().checkModel(eventSink.get(0));
assertTrue("The created event did not pass the PLAY sanity checks for events.", v.isValid());
}
@AfterClass
public static void tearDownAfterClass() {
try {
notifyReceiverRest.stop();
} catch (Exception e) {
logger.error("Exception while stoppping REST server. Nothing we can do now. " + e.getMessage());
}
notifyReceiverRest.destroy();
logger.info("Test server stopped.");
}
@Path("/notifyRest") // overwrite the Path from interface PublishService
@Singleton
static class TestListenerRest extends Application implements PublishService {
private final List<Model> eventSink;
private final Logger logger = LoggerFactory.getLogger(TestListenerRest.class);
private final AbstractReceiverRest rdfReceiver = new AbstractReceiverRest() {};
public TestListenerRest() { // For JAXB
this.eventSink = null;
}
public TestListenerRest(List<Model> eventSink) {
this.eventSink = eventSink;
logger.info("Test listener started.");
}
@Override
public Response notify(String resource, String message) {
logger.info("Test listener received event.");
try {
eventSink.add(rdfReceiver.parseRdfRest(message));
} catch (NoRdfEventException e) {
logger.error("Test listener encountered error.", e);
Assert.fail("Test listener encountered error: " + e.getMessage());
}
return null;
}
}
}