From a47b56a07ed74c81054573423311dd02bed6be8e Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Thu, 18 Nov 2021 00:12:45 +0100 Subject: [PATCH] Code cleanup, introduce event bus tests --- .../td/JacksonTdObjectJsonSerializer.java | 72 ------------------- .../main/java/io/volvox/td/RandomUUID.java | 19 ----- .../src/main/java/io/volvox/td/TdClient.java | 1 + .../java/io/volvox/td/TdEventBusClient.java | 4 +- .../java/io/volvox/td/TdNativeClient.java | 5 +- .../src/main/java/io/volvox/td/TdObject.java | 18 ----- .../main/java/io/volvox/td/TdObjectCodec.java | 17 ++++- .../io/volvox/td/TdObjectJsonSerializer.java | 65 ++++++++++++++++- .../src/main/java/io/volvox/td/TdService.java | 4 +- .../java/io/volvox/td/TdSessionResource.java | 6 -- ...dException.java => TelegramException.java} | 4 +- .../java/io/volvox/td/TdEventBusTest.java | 30 ++++++++ .../java/io/volvox/td/TdResourceTest.java | 17 ++--- 13 files changed, 120 insertions(+), 142 deletions(-) delete mode 100644 service-td/src/main/java/io/volvox/td/JacksonTdObjectJsonSerializer.java delete mode 100644 service-td/src/main/java/io/volvox/td/RandomUUID.java delete mode 100644 service-td/src/main/java/io/volvox/td/TdObject.java rename service-td/src/main/java/io/volvox/td/{TdException.java => TelegramException.java} (78%) create mode 100644 service-td/src/test/java/io/volvox/td/TdEventBusTest.java diff --git a/service-td/src/main/java/io/volvox/td/JacksonTdObjectJsonSerializer.java b/service-td/src/main/java/io/volvox/td/JacksonTdObjectJsonSerializer.java deleted file mode 100644 index 0bf7f0e..0000000 --- a/service-td/src/main/java/io/volvox/td/JacksonTdObjectJsonSerializer.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.volvox.td; - -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; -import com.fasterxml.jackson.databind.jsontype.NamedType; -import it.tdlight.common.Init; -import it.tdlight.common.utils.CantLoadLibrary; -import it.tdlight.jni.TdApi; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Modifier; -import javax.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class JacksonTdObjectJsonSerializer implements TdObjectJsonSerializer { - - private final ObjectMapper objectMapper; - - static { - try { - Init.start(); - } catch (CantLoadLibrary e) { - throw new RuntimeException(e); - } - } - - public JacksonTdObjectJsonSerializer() { - var objectMapper = new ObjectMapper(); - var validator = BasicPolymorphicTypeValidator.builder(); - // Iterate TdApi inner classes - for (Class declaredClass : TdApi.class.getDeclaredClasses()) { - // Register only TDLib objects - if (TdApi.Object.class.isAssignableFrom(declaredClass)) { - if (Modifier.isAbstract(declaredClass.getModifiers())) { - // Register abstract base type - - objectMapper.addMixIn(declaredClass, AbstractTypeMixIn.class); - validator.allowIfBaseType(declaredClass); - } else { - // Register named subtype - - validator.allowIfSubType(declaredClass); - objectMapper.registerSubtypes(new NamedType(declaredClass, declaredClass.getSimpleName())); - } - } - } - this.objectMapper = objectMapper; - } - - @Override - public TdApi.Object deserialize(InputStream json) { - try { - return objectMapper.readValue(json, TdApi.Object.class); - } catch (IOException e) { - throw new UnsupportedOperationException(e); - } - } - - @Override - public String serialize(TdApi.Object object) { - try { - return objectMapper.writeValueAsString(object); - } catch (JsonProcessingException e) { - throw new UnsupportedOperationException(e); - } - } - - @JsonTypeInfo(use = JsonTypeInfo.Id.NAME) - public abstract static class AbstractTypeMixIn {} -} diff --git a/service-td/src/main/java/io/volvox/td/RandomUUID.java b/service-td/src/main/java/io/volvox/td/RandomUUID.java deleted file mode 100644 index d63f3fd..0000000 --- a/service-td/src/main/java/io/volvox/td/RandomUUID.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.volvox.td; - -import java.util.UUID; -import javax.enterprise.context.Dependent; - -@Dependent -public class RandomUUID { - - final String uuid; - - public RandomUUID() { - this.uuid = UUID.randomUUID().toString(); - } - - @Override - public String toString() { - return uuid; - } -} diff --git a/service-td/src/main/java/io/volvox/td/TdClient.java b/service-td/src/main/java/io/volvox/td/TdClient.java index ee0fbf8..7068708 100644 --- a/service-td/src/main/java/io/volvox/td/TdClient.java +++ b/service-td/src/main/java/io/volvox/td/TdClient.java @@ -6,6 +6,7 @@ import it.tdlight.jni.TdApi; import it.tdlight.jni.TdApi.Update; public interface TdClient { + Multi updates(); Uni send(TdApi.Function function); diff --git a/service-td/src/main/java/io/volvox/td/TdEventBusClient.java b/service-td/src/main/java/io/volvox/td/TdEventBusClient.java index 30fcce7..0d17db6 100644 --- a/service-td/src/main/java/io/volvox/td/TdEventBusClient.java +++ b/service-td/src/main/java/io/volvox/td/TdEventBusClient.java @@ -70,9 +70,9 @@ public class TdEventBusClient implements TdClient { } @ConsumeEvent(value = "td.send", codec = TdObjectCodec.class) - public void onSendRequest(Message msg) { + public void onSendRequest(Message msg) { this.send(msg.body().getObject()).subscribe().with(message -> msg.reply(message, SEND_OPTS), ex -> { - if (ex instanceof TdException tdException) { + if (ex instanceof TelegramException tdException) { msg.fail(tdException.getCode(), tdException.getMessage()); } else { msg.fail(500, ex.toString()); diff --git a/service-td/src/main/java/io/volvox/td/TdNativeClient.java b/service-td/src/main/java/io/volvox/td/TdNativeClient.java index e52dc69..8ada491 100644 --- a/service-td/src/main/java/io/volvox/td/TdNativeClient.java +++ b/service-td/src/main/java/io/volvox/td/TdNativeClient.java @@ -1,6 +1,5 @@ package io.volvox.td; -import io.quarkus.runtime.StartupEvent; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import it.tdlight.common.ReactiveTelegramClient; @@ -59,7 +58,7 @@ public class TdNativeClient implements TdClient { .transformToUni(item -> { if (item.getConstructor() == Error.CONSTRUCTOR) { TdApi.Error error = (TdApi.Error) item; - return Uni.createFrom().failure(new TdException(error.code, error.message)); + return Uni.createFrom().failure(new TelegramException(error.code, error.message)); } else { return Uni.createFrom().item(item); } @@ -75,7 +74,7 @@ public class TdNativeClient implements TdClient { .transformToUni(item -> { if (item.getConstructor() == Error.CONSTRUCTOR) { TdApi.Error error = (TdApi.Error) item; - return Uni.createFrom().failure(new TdException(error.code, error.message)); + return Uni.createFrom().failure(new TelegramException(error.code, error.message)); } else { return Uni.createFrom().item(item); } diff --git a/service-td/src/main/java/io/volvox/td/TdObject.java b/service-td/src/main/java/io/volvox/td/TdObject.java deleted file mode 100644 index 869f969..0000000 --- a/service-td/src/main/java/io/volvox/td/TdObject.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.volvox.td; - -import it.tdlight.jni.TdApi; - -@SuppressWarnings("CdiInjectionPointsInspection") -public class TdObject { - - private final TdApi.Object object; - - public TdObject(TdApi.Object object) { - this.object = object; - } - - public T getObject() { - //noinspection unchecked - return (T) object; - } -} diff --git a/service-td/src/main/java/io/volvox/td/TdObjectCodec.java b/service-td/src/main/java/io/volvox/td/TdObjectCodec.java index 4320328..6847479 100644 --- a/service-td/src/main/java/io/volvox/td/TdObjectCodec.java +++ b/service-td/src/main/java/io/volvox/td/TdObjectCodec.java @@ -5,10 +5,9 @@ import io.vertx.core.eventbus.MessageCodec; import it.tdlight.jni.TdApi; import it.tdlight.jni.TdApi.Deserializer; import javax.enterprise.context.ApplicationScoped; -import javax.inject.Singleton; @ApplicationScoped -public class TdObjectCodec implements MessageCodec { +public class TdObjectCodec implements MessageCodec { @Override public void encodeToWire(Buffer buffer, TdObject t) { BufferUtils.encode(buffer, out -> t.getObject().serialize(out)); @@ -33,4 +32,18 @@ public class TdObjectCodec implements MessageCodec { // Always "-1" return -1; } + + public static class TdObject { + + private final TdApi.Object object; + + public TdObject(TdApi.Object object) { + this.object = object; + } + + public T getObject() { + //noinspection unchecked + return (T) object; + } + } } diff --git a/service-td/src/main/java/io/volvox/td/TdObjectJsonSerializer.java b/service-td/src/main/java/io/volvox/td/TdObjectJsonSerializer.java index 6f4ce52..edb6ffe 100644 --- a/service-td/src/main/java/io/volvox/td/TdObjectJsonSerializer.java +++ b/service-td/src/main/java/io/volvox/td/TdObjectJsonSerializer.java @@ -1,11 +1,70 @@ package io.volvox.td; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; +import com.fasterxml.jackson.databind.jsontype.NamedType; +import it.tdlight.common.Init; +import it.tdlight.common.utils.CantLoadLibrary; import it.tdlight.jni.TdApi; +import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Modifier; +import javax.enterprise.context.ApplicationScoped; -public interface TdObjectJsonSerializer { +@ApplicationScoped +public class TdObjectJsonSerializer { - TdApi.Object deserialize(InputStream json); + private final ObjectMapper objectMapper; - String serialize(TdApi.Object object); + static { + try { + Init.start(); + } catch (CantLoadLibrary e) { + throw new RuntimeException(e); + } + } + + public TdObjectJsonSerializer() { + var objectMapper = new ObjectMapper(); + var validator = BasicPolymorphicTypeValidator.builder(); + // Iterate TdApi inner classes + for (Class declaredClass : TdApi.class.getDeclaredClasses()) { + // Register only TDLib objects + if (TdApi.Object.class.isAssignableFrom(declaredClass)) { + if (Modifier.isAbstract(declaredClass.getModifiers())) { + // Register abstract base type + + objectMapper.addMixIn(declaredClass, AbstractTypeMixIn.class); + validator.allowIfBaseType(declaredClass); + } else { + // Register named subtype + + validator.allowIfSubType(declaredClass); + objectMapper.registerSubtypes(new NamedType(declaredClass, declaredClass.getSimpleName())); + } + } + } + this.objectMapper = objectMapper; + } + + public TdApi.Object deserialize(InputStream json) { + try { + return objectMapper.readValue(json, TdApi.Object.class); + } catch (IOException e) { + throw new UnsupportedOperationException(e); + } + } + + public String serialize(TdApi.Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new UnsupportedOperationException(e); + } + } + + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME) + public abstract static class AbstractTypeMixIn {} } diff --git a/service-td/src/main/java/io/volvox/td/TdService.java b/service-td/src/main/java/io/volvox/td/TdService.java index 1864350..92f79f1 100644 --- a/service-td/src/main/java/io/volvox/td/TdService.java +++ b/service-td/src/main/java/io/volvox/td/TdService.java @@ -4,8 +4,6 @@ import io.quarkus.runtime.ShutdownEvent; import io.quarkus.vertx.ConsumeEvent; import io.vertx.core.eventbus.EventBus; import io.vertx.core.eventbus.Message; -import it.tdlight.tdnative.NativeClient; -import it.tdlight.tdnative.NativeLog; import java.util.Map.Entry; import java.util.Optional; import java.util.Set; @@ -29,7 +27,7 @@ public class TdService { Instance sessionInstances; @ConsumeEvent(value = "td.start-session") - private void onStartSession(Message msg) { + public void onStartSession(Message msg) { var sessionId = this.startSession(); msg.reply(sessionId); } diff --git a/service-td/src/main/java/io/volvox/td/TdSessionResource.java b/service-td/src/main/java/io/volvox/td/TdSessionResource.java index d987b6e..fe5b3a7 100644 --- a/service-td/src/main/java/io/volvox/td/TdSessionResource.java +++ b/service-td/src/main/java/io/volvox/td/TdSessionResource.java @@ -1,17 +1,11 @@ package io.volvox.td; -import io.quarkus.runtime.StartupEvent; import io.smallrye.mutiny.Uni; import it.tdlight.jni.TdApi; import it.tdlight.jni.TdApi.Function; import it.tdlight.jni.TdApi.Object; import java.io.InputStream; import java.util.NoSuchElementException; -import java.util.Objects; -import javax.annotation.PostConstruct; -import javax.enterprise.context.Dependent; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Observes; import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.POST; diff --git a/service-td/src/main/java/io/volvox/td/TdException.java b/service-td/src/main/java/io/volvox/td/TelegramException.java similarity index 78% rename from service-td/src/main/java/io/volvox/td/TdException.java rename to service-td/src/main/java/io/volvox/td/TelegramException.java index 0207a56..1da5953 100644 --- a/service-td/src/main/java/io/volvox/td/TdException.java +++ b/service-td/src/main/java/io/volvox/td/TelegramException.java @@ -1,11 +1,11 @@ package io.volvox.td; -public class TdException extends Exception { +public class TelegramException extends Exception { private final int code; private final String message; - public TdException(int code, String message) { + public TelegramException(int code, String message) { super(code + ": " + message); this.code = code; this.message = message; diff --git a/service-td/src/test/java/io/volvox/td/TdEventBusTest.java b/service-td/src/test/java/io/volvox/td/TdEventBusTest.java new file mode 100644 index 0000000..7c85232 --- /dev/null +++ b/service-td/src/test/java/io/volvox/td/TdEventBusTest.java @@ -0,0 +1,30 @@ +package io.volvox.td; + +import io.quarkus.test.junit.QuarkusTest; +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; +import io.vertx.mutiny.core.eventbus.EventBus; +import io.vertx.mutiny.core.eventbus.Message; +import java.util.UUID; +import javax.inject.Inject; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +@QuarkusTest +public class TdEventBusTest { + + @Inject + EventBus bus; + + @Test + public void testStartSession() { + Uni uni = bus.request("td.start-session", null).map(Message::body); + + UniAssertSubscriber subscriber = uni.subscribe().withSubscriber(UniAssertSubscriber.create()); + + String item = subscriber.awaitItem().assertCompleted().getItem(); + + Assertions.assertNotNull(item); + Assertions.assertDoesNotThrow(() -> UUID.fromString(item)); + } +} diff --git a/service-td/src/test/java/io/volvox/td/TdResourceTest.java b/service-td/src/test/java/io/volvox/td/TdResourceTest.java index 47c1d5b..4619ff4 100644 --- a/service-td/src/test/java/io/volvox/td/TdResourceTest.java +++ b/service-td/src/test/java/io/volvox/td/TdResourceTest.java @@ -1,22 +1,15 @@ package io.volvox.td; -import io.quarkus.test.junit.QuarkusTest; -import io.restassured.specification.Argument; -import java.util.List; -import java.util.Set; -import org.hamcrest.CoreMatchers; -import org.hamcrest.core.IsNot; -import org.hamcrest.text.IsEmptyString; -import org.hamcrest.text.MatchesPattern; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.text.IsEmptyString.emptyOrNullString; +import io.quarkus.test.junit.QuarkusTest; +import java.util.Set; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + @QuarkusTest public class TdResourceTest {