package com.sixt.service.framework.kafka.messaging;
import com.google.inject.*;
import com.google.protobuf.Parser;
import com.sixt.service.framework.OrangeContext;
import com.sixt.service.framework.ServiceProperties;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
public class ReflectionTypeDictionaryFactoryTest {
@Test
public void testCreateFromClasspath() {
// The ReflectionTypeDictionaryFactory is robust by design, so it does not throw any Exception.
// Need to check the log output for the error test cases.
// Dependency injection magic
ServiceProperties serviceProperites = new ServiceProperties();
Module[] modules = new Module[1];
modules[0] = new TestInjectionModule(serviceProperites);
Injector injector = Guice.createInjector(modules);
ReflectionTypeDictionaryFactory rtdf = new ReflectionTypeDictionaryFactory(injector);
TypeDictionary dictionary = rtdf.createFromClasspath();
MessageHandler<? extends com.google.protobuf.Message> handler = dictionary.messageHandlerFor(MessageType.of(TypeDictionaryTest.class));
assertNotNull(handler);
MessageHandler<? extends com.google.protobuf.Message> unknownHandler = dictionary.messageHandlerFor(MessageType.of(TestMessageWithNoHandler.class));
assertNull(unknownHandler);
Parser parser = dictionary.parserFor((MessageType.of(TypeDictionaryTest.class)));
assertNotNull(parser);
assertNull(dictionary.parserFor(new MessageType("UnknownType")));
}
static class TestInjectionModule extends AbstractModule {
private final ServiceProperties serviceProperties;
TestInjectionModule(ServiceProperties serviceProperties) {
this.serviceProperties = serviceProperties;
}
@Override
protected void configure() {
bind(ServiceProperties.class).toInstance(serviceProperties);
}
}
}
class HandlerOne implements MessageHandler<TypeDictionaryTest> {
@Override
public void onMessage(Message<TypeDictionaryTest> msg, OrangeContext context) {
}
}
class HandlerTwo implements MessageHandler<TypeDictionaryTest> {
@Inject
public HandlerTwo(ServiceProperties properties) {
}
@Override
public void onMessage(Message<TypeDictionaryTest> msg, OrangeContext context) {
}
}
class UntypedHandler implements MessageHandler {
@Override
public void onMessage(Message msg, OrangeContext context) {
}
}
class NoDefaultConstructorHandler implements MessageHandler<TypeDictionaryTest> {
public NoDefaultConstructorHandler(int cruftlevel) {
}
@Override
public void onMessage(Message<TypeDictionaryTest> msg, OrangeContext context) {
}
}
class NonAccessibleDefaultConstructorHandler implements MessageHandler<TypeDictionaryTest> {
private NonAccessibleDefaultConstructorHandler() {
}
@Override
public void onMessage(Message<TypeDictionaryTest> msg, OrangeContext context) {
}
}