package forklift.integration; import static org.junit.Assert.assertTrue; import forklift.connectors.ForkliftMessage; import forklift.decorators.MultiThreaded; import forklift.decorators.OnMessage; import forklift.decorators.Producer; import forklift.decorators.Queue; import forklift.integration.server.TestServiceManager; import forklift.producers.ForkliftProducerI; import forklift.schemas.AvroMessage; import org.junit.After; import org.junit.Before; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; /** * Abstract class which provides support for some common integration testing scenarios. * <pre> * 1. Starts up and exposes a TestService Manager at the start of every test. * The testServiceManager starts up embedded Zookeeper, Kafka, and Schema-Registry servers * 2. Various Consumer classes * 3. sentMessageIds and consumedMessageIds. Implementing classes should ensure that they * populate the sentMessageIds set. * 4. The messageAsserts function which provides some useful output and asserts that the sentMessageIds set * and consumedMessageIds set are equal. * </pre> * */ public abstract class BaseIntegrationTest { protected static final Logger log = LoggerFactory.getLogger(BaseIntegrationTest.class); protected static Set<String> sentMessageIds = ConcurrentHashMap.newKeySet(); protected static Set<String> consumedMessageIds = ConcurrentHashMap.newKeySet(); protected TestServiceManager serviceManager; @After public void after() { serviceManager.stop(); } @Before public void setup() { serviceManager = new TestServiceManager(); serviceManager.start(); sentMessageIds = ConcurrentHashMap.newKeySet(); consumedMessageIds = ConcurrentHashMap.newKeySet(); } protected void messageAsserts(){ log.info("SentIds: " + sentMessageIds.size() + " consumedIds: " + consumedMessageIds.size()); assertTrue(sentMessageIds.equals(consumedMessageIds)); assertTrue(sentMessageIds.size() > 0); } @Queue("forklift-string-topic") public static class StringConsumer { @forklift.decorators.Message private ForkliftMessage forkliftMessage; @forklift.decorators.Message private String value; @Producer(queue = "forklift-string-topic") private ForkliftProducerI injectedProducer; @OnMessage public void onMessage() { if (value == null) { return; } consumedMessageIds.add(forkliftMessage.getId()); } } @MultiThreaded(10) @Queue("forklift-string-topic") public static class MultiThreadedStringConsumer { @forklift.decorators.Message private ForkliftMessage forkliftMessage; @forklift.decorators.Message private String value; @Producer(queue = "forklift-string-topic") private ForkliftProducerI injectedProducer; @OnMessage public void onMessage() { if (value == null) { return; } consumedMessageIds.add(forkliftMessage.getId()); } } @Queue("forklift-object-topic") public static class ForkliftObjectConsumer { @forklift.decorators.Message private ForkliftMessage forkliftMessage; @forklift.decorators.Message private TestMessage testMessage; @Producer(queue = "forklift-string-topic") private ForkliftProducerI injectedProducer; @OnMessage public void onMessage() { if (testMessage == null || testMessage.getText() == null) { return; } consumedMessageIds.add(forkliftMessage.getId()); } } @Queue("forklift-map-topic") public static class ForkliftMapConsumer { @forklift.decorators.Message private ForkliftMessage forkliftMessage; @forklift.decorators.Message private Map<String, String> mapMessage; @Producer(queue = "forklift-string-topic") private ForkliftProducerI injectedProducer; @OnMessage public void onMessage() { if (mapMessage == null || mapMessage.size() == 0) { return; } consumedMessageIds.add(forkliftMessage.getId()); } } @Queue("forklift-avro-topic") public static class ForkliftAvroConsumer { @forklift.decorators.Message private ForkliftMessage forkliftMessage; @forklift.decorators.Message private AvroMessage value; @Producer(queue = "forklift-avro-topic") private ForkliftProducerI injectedProducer; @OnMessage public void onMessage() { if (value == null) { return; } consumedMessageIds.add(forkliftMessage.getId()); } } }