package org.deephacks.westty.tests;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import org.deephacks.confit.ConfigContext;
import org.deephacks.confit.admin.AdminContext;
import org.deephacks.confit.jaxrs.AdminContextJaxrsProxy;
import org.deephacks.westty.config.DataSourceConfig;
import org.deephacks.westty.config.ProtobufConfig;
import org.deephacks.westty.config.ServerConfig;
import org.deephacks.westty.internal.jaxrs.JaxrsApplication;
import org.deephacks.westty.protobuf.ProtobufClient;
import org.deephacks.westty.protobuf.ProtobufSerializer;
import org.deephacks.westty.spi.IoExecutors;
import org.deephacks.westty.test.SQLExec;
import org.deephacks.westty.test.TestBootstrap;
import org.deephacks.westty.test.WesttyJUnit4Runner;
import org.deephacks.westty.tests.JsonEntity.Protocol;
import org.deephacks.westty.tests.ServerMessages.CreateRequest;
import org.deephacks.westty.tests.ServerMessages.JsonMessage;
import org.deephacks.westty.tests.ServerMessages.ListRequest;
import org.deephacks.westty.tests.ServerMessages.ListResponse;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.LoggerFactory;
import org.vertx.java.core.Handler;
import org.vertx.java.core.eventbus.EventBus;
import org.vertx.java.core.eventbus.Message;
import javax.inject.Inject;
import java.util.List;
import java.util.UUID;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.junit.matchers.JUnitMatchers.hasItem;
@RunWith(WesttyJUnit4Runner.class)
public class ServerIntegrationTest {
private static final ProtobufSerializer serializer = new ProtobufSerializer();
private static final String TABLE = "CREATE TABLE JSON (ID varchar(255), JSON varchar(1024), PROTOCOL varchar(255));";
private static final ProtobufClient protobuf = new ProtobufClient(new IoExecutors(), serializer, new ProtobufConfig());
private static final JaxrsClient jaxrs = new JaxrsClient();
private static final String URI_PREFIX = JaxrsApplication.JAXRS_CONTEXT_URI + ServerEndpoint.JAXRS_PATH;
private static final ConfigContext config = ConfigContext.get();
@Inject
private EventBus bus;
@TestBootstrap
public static void bootstrap() throws Exception {
Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.DEBUG);
serializer.registerResource("META-INF/server.desc");
DataSourceConfig dataSourceConfig = config.get(DataSourceConfig.class);
SQLExec sql = new SQLExec(dataSourceConfig.getUser(), dataSourceConfig.getPassword(), dataSourceConfig.getUrl());
sql.execute(TABLE);
sql.executeResource("META-INF/install_config_derby.ddl", false);
}
/**
* Test that jpa can be used from a jaxrs endpoint.
*/
@Test
public void test_jaxrs_and_jpa() {
AdminContext admin = AdminContextJaxrsProxy.get(ServerConfig.DEFAULT_IP_ADDRESS, ServerConfig.DEFAULT_HTTP_PORT, "jaxrs");
admin.list(ServerConfig.class);
JsonEntity entity = new JsonEntity(UUID.randomUUID().toString(), Protocol.JAXRS, "test");
jaxrs.posthttp(URI_PREFIX + "/create", JsonUtil.toJson(entity));
List<JsonEntity> list = JsonUtil.fromJsonList(jaxrs.gethttp(URI_PREFIX + "/list"));
assertThat(list, hasItem(entity));
}
/**
* Test that multiple jpa transactionl methods can
* be executed and rollbacked as one transaction.
*/
@Test
public void test_nested_jpa_transaction(){
JsonEntity entity = new JsonEntity(UUID.randomUUID().toString(), Protocol.JAXRS, "test");
jaxrs.posthttp(URI_PREFIX + "/nested", JsonUtil.toJson(entity));
List<JsonEntity> list = JsonUtil.fromJsonList(jaxrs.gethttp(URI_PREFIX + "/list"));
assertThat(list, not(hasItem(entity)));
}
/**
* Test that jpa can be used from a protobuf endpoint.
*/
@Test
public void test_protobuf_and_jpa() throws Exception {
String id = UUID.randomUUID().toString();
JsonMessage msg = JsonMessage.newBuilder().setId(id).setJson("msg").build();
CreateRequest request = CreateRequest.newBuilder().setJson(msg).build();
Integer channelId = protobuf.connect();
protobuf.callAsync(channelId, request);
Thread.sleep(500);
ListResponse response = (ListResponse) protobuf.callSync(channelId, ListRequest.newBuilder().build());
for (JsonMessage json : response.getJsonList()) {
if(json.getId().equals(id)){
return;
}
}
fail("Missing json message");
}
/**
* Test that jpa can be used from a eventbus endpoint.
*/
@Test
public void test_eventbus_and_jpa() throws Exception {
String id = UUID.randomUUID().toString();
final JsonEntity entity = new JsonEntity(id, Protocol.PROTOBUF, "msg");
bus.send(ServerEndpoint.CREATE_EVENTBUS_ADDRESS, JsonUtil.toJson(entity));
Thread.sleep(1000);
class TestHandler implements Handler<Message<String>> {
private JsonEntity result;
@Override
public void handle(Message<String> event) {
this.result = JsonUtil.fromJson(event.body);
}
public JsonEntity getResult() {
return result;
}
}
TestHandler handler = new TestHandler();
bus.send(ServerEndpoint.GET_EVENTBUS_ADDRESS, id, handler);
Thread.sleep(1000);
assertThat(entity, is(handler.getResult()));
}
/**
* Test that jpa can be used from a job.
*/
@Test
public void test_job_and_jpa(){
}
}