package io.vertx.serviceproxy.clustered;
import com.jayway.awaitility.Awaitility;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.eventbus.ReplyException;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.serviceproxy.ServiceException;
import io.vertx.serviceproxy.ServiceExceptionMessageCodec;
import io.vertx.serviceproxy.testmodel.MyServiceException;
import io.vertx.serviceproxy.testmodel.MyServiceExceptionMessageCodec;
import io.vertx.serviceproxy.testmodel.SomeEnum;
import io.vertx.serviceproxy.testmodel.SomeVertxEnum;
import io.vertx.serviceproxy.testmodel.TestDataObject;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author <a href="http://escoffier.me">Clement Escoffier</a>
*/
public class ClusteredTest {
AtomicReference<Vertx> providerNode = new AtomicReference<>();
AtomicReference<Vertx> consumerNode = new AtomicReference<>();
@Before
public void setUp() {
Vertx.clusteredVertx(new VertxOptions().setClustered(true).setClusterHost("127.0.0.1"), ar -> {
Vertx vertx = ar.result();
vertx.eventBus().registerDefaultCodec(MyServiceException.class,
new MyServiceExceptionMessageCodec());
providerNode.set(vertx);
vertx.deployVerticle(ServiceProviderVerticle.class.getName());
});
Vertx.clusteredVertx(new VertxOptions().setClustered(true).setClusterHost("127.0.0.1"), ar -> {
Vertx vertx = ar.result();
vertx.eventBus().registerDefaultCodec(MyServiceException.class,
new MyServiceExceptionMessageCodec());
consumerNode.set(vertx);
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> providerNode.get() != null);
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> consumerNode.get() != null);
}
@Test
public void testHello() {
AtomicReference<String> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
service.hello("vert.x", ar -> {
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() ->
"hello vert.x".equalsIgnoreCase(result.get()));
}
@Test
public void testEnumAsParameter() {
AtomicReference<Boolean> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
service.methodUsingEnum(SomeEnum.WIBBLE, ar -> {
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null && result.get());
}
@Test
public void testEnumAsResult() {
AtomicReference<SomeEnum> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
service.methodReturningEnum(ar -> {
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() == SomeEnum.WIBBLE);
}
@Test
public void testVertxEnumAsResult() {
AtomicReference<SomeVertxEnum> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
service.methodReturningVertxEnum(ar -> {
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() == SomeVertxEnum.BAR);
}
@Test
public void testWithDataObject() {
AtomicReference<TestDataObject> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
TestDataObject data = new TestDataObject().setBool(true).setNumber(25).setString("vert.x");
service.methodWithDataObject(data, ar -> {
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
TestDataObject out = result.get();
assertThat(out.getNumber()).isEqualTo(25);
assertThat(out.isBool()).isTrue();
assertThat(out.getString()).isEqualTo("vert.x");
}
@Test
public void testWithListOfDataObject() {
AtomicReference<List<TestDataObject>> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
TestDataObject data = new TestDataObject().setBool(true).setNumber(25).setString("vert.x");
TestDataObject data2 = new TestDataObject().setBool(true).setNumber(26).setString("vert.x");
service.methodWithListOfDataObject(Arrays.asList(data, data2), ar -> {
if (ar.failed()) {
ar.cause().printStackTrace();
}
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
List<TestDataObject> out = result.get();
assertThat(out.get(0).getNumber()).isEqualTo(25);
assertThat(out.get(0).isBool()).isTrue();
assertThat(out.get(0).getString()).isEqualTo("vert.x");
assertThat(out.get(1).getNumber()).isEqualTo(26);
assertThat(out.get(1).isBool()).isTrue();
assertThat(out.get(1).getString()).isEqualTo("vert.x");
}
@Test
public void testWithListOfJsonObject() {
AtomicReference<List<JsonObject>> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
TestDataObject data = new TestDataObject().setBool(true).setNumber(25).setString("vert.x");
TestDataObject data2 = new TestDataObject().setBool(true).setNumber(26).setString("vert.x");
service.methodWithListOfJsonObject(Arrays.asList(data.toJson(), data2.toJson()), ar -> {
if (ar.failed()) {
ar.cause().printStackTrace();
}
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
List<JsonObject> out = result.get();
TestDataObject out0 = new TestDataObject(out.get(0));
TestDataObject out1 = new TestDataObject(out.get(1));
assertThat(out0.getNumber()).isEqualTo(25);
assertThat(out0.isBool()).isTrue();
assertThat(out0.getString()).isEqualTo("vert.x");
assertThat(out1.getNumber()).isEqualTo(26);
assertThat(out1.isBool()).isTrue();
assertThat(out1.getString()).isEqualTo("vert.x");
}
@Test
public void testWithJsonObject() {
AtomicReference<TestDataObject> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
TestDataObject data = new TestDataObject().setBool(true).setNumber(25).setString("vert.x");
service.methodWithJsonObject(data.toJson(), ar -> {
result.set(new TestDataObject(ar.result()));
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
TestDataObject out = result.get();
assertThat(out.getNumber()).isEqualTo(25);
assertThat(out.isBool()).isTrue();
assertThat(out.getString()).isEqualTo("vert.x");
}
@Test
public void testWithJsonArray() {
AtomicReference<JsonArray> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
TestDataObject data = new TestDataObject().setBool(true).setNumber(25).setString("vert.x");
JsonArray array = new JsonArray();
array.add("vert.x").add(data.toJson());
service.methodWithJsonArray(array, ar -> {
result.set(ar.result());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
TestDataObject out = new TestDataObject(result.get().getJsonObject(1));
assertThat(array.getString(0)).isEqualToIgnoringCase("vert.x");
assertThat(out.getNumber()).isEqualTo(25);
assertThat(out.isBool()).isTrue();
assertThat(out.getString()).isEqualTo("vert.x");
}
@Test
public void testWithFailingResult() {
AtomicReference<Throwable> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
service.methodWthFailingResult("Fail", ar -> {
assertThat(ar.cause() instanceof ServiceException).isTrue();
assertThat(((ServiceException)ar.cause()).failureCode()).isEqualTo(30);
assertThat(((ServiceException)ar.cause()).getDebugInfo()).isEqualTo(new JsonObject().put("test", "val"));
result.set(ar.cause());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
}
@Test
public void testWithFailingResultServiceExceptionSubclass() {
AtomicReference<Throwable> result = new AtomicReference<>();
Service service = Service.createProxy(consumerNode.get(), "my.service");
service.methodWthFailingResult("cluster Fail", ar -> {
assertThat(ar.cause() instanceof MyServiceException).isTrue();
assertThat(((MyServiceException)ar.cause()).failureCode()).isEqualTo(30);
assertThat(((MyServiceException)ar.cause()).getExtra()).isEqualTo("some extra");
result.set(ar.cause());
});
Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> result.get() != null);
}
}