package org.marketcetera.marketdata.module; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.List; import java.util.concurrent.Callable; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.marketcetera.core.LoggerConfiguration; import org.marketcetera.core.publisher.ISubscriber; import org.marketcetera.marketdata.MarketDataFeedTestBase; import org.marketcetera.marketdata.MarketDataRequestBuilder; import org.marketcetera.marketdata.bogus.BogusFeedModuleFactory; import org.marketcetera.marketdata.core.manager.MarketDataProviderNotAvailable; import org.marketcetera.marketdata.core.module.MarketDataCoreModule; import org.marketcetera.marketdata.core.module.MarketDataCoreModuleFactory; import org.marketcetera.marketdata.core.module.ReceiverModule; import org.marketcetera.marketdata.core.module.ReceiverModuleFactory; import org.marketcetera.module.*; import org.marketcetera.util.log.SLF4JLoggerProxy; import com.google.common.collect.Lists; /* $License$ */ /** * Tests {@link MarketDataCoreModule}. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: MarketDataCoreModuleTest.java 16901 2014-05-11 16:14:11Z colin $ * @since 2.4.0 */ public class MarketDataCoreModuleTest { /** * Runs once before all tests. * * @throws Exception if an unexpected error occurs */ @BeforeClass public static void beforeClass() throws Exception { LoggerConfiguration.logSetup(); } /** * Runs before each test. * * @throws Exception if an unexpected error occurs */ @Before public void setup() throws Exception { moduleManager = new ModuleManager(); moduleManager.init(); moduleManager.start(BogusFeedModuleFactory.INSTANCE_URN); receiver = new EventReceiver(); receiverUrn = moduleManager.createModule(ReceiverModuleFactory.PROVIDER_URN, "receiver"); ReceiverModule.getModuleForInstanceName("receiver").subscribe(receiver); } /** * Runs after each test. * * @throws Exception if an unexpected error occurs */ @After public void cleanup() throws Exception { moduleManager.stop(); } /** * Tests start/stop/status module operations. * * @throws Exception if an unexpected error occurs */ @Test public void testModuleOperations() throws Exception { // instance exists (auto-created) ModuleInfo info = moduleManager.getModuleInfo(MarketDataCoreModuleFactory.INSTANCE_URN); assertNotNull(info); assertNotNull(info.getCreated()); assertNotNull(info.getStarted()); // instance started (auto-started) assertEquals(ModuleState.STARTED, info.getState()); new ExpectedFailure<ModuleStateException>(Messages.MODULE_NOT_STARTED_STATE_INCORRECT) { @Override protected void run() throws Exception { moduleManager.start(MarketDataCoreModuleFactory.INSTANCE_URN); } }; new ExpectedFailure<ModuleException>(Messages.CANNOT_DELETE_SINGLETON) { @Override protected void run() throws Exception { moduleManager.deleteModule(MarketDataCoreModuleFactory.INSTANCE_URN); } }; new ExpectedFailure<ModuleException>(Messages.CANNOT_CREATE_SINGLETON) { @Override protected void run() throws Exception { moduleManager.createModule(MarketDataCoreModuleFactory.PROVIDER_URN); } }; moduleManager.stop(MarketDataCoreModuleFactory.INSTANCE_URN); info = moduleManager.getModuleInfo(MarketDataCoreModuleFactory.INSTANCE_URN); assertEquals(ModuleState.STOPPED, info.getState()); moduleManager.start(MarketDataCoreModuleFactory.INSTANCE_URN); info = moduleManager.getModuleInfo(MarketDataCoreModuleFactory.INSTANCE_URN); assertEquals(ModuleState.STARTED, info.getState()); } /** * Tests handling of various request types. * * @throws Exception if an unexpected error occurs */ @Test public void testPayloadTypes() throws Exception { new ExpectedFailure<UnsupportedRequestParameterType>() { @Override protected void run() throws Exception { moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN, this) }); } }; new ExpectedFailure<IllegalRequestParameterValue>() { @Override protected void run() throws Exception { moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN) }); } }; new ExpectedFailure<IllegalRequestParameterValue>() { @Override protected void run() throws Exception { moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN, null) }); } }; // String, which is allowed, but with nonsensical contents new ExpectedFailure<IllegalRequestParameterValue>() { @Override protected void run() throws Exception { moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN, "this is not a valid market data request") }); } }; // valid request, but invalid provider new ExpectedFailure<MarketDataProviderNotAvailable>() { @Override protected void run() throws Exception { moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN, "symbols=METC:provider=notaprovider:content=TOP_OF_BOOK") }); } }; // valid market data request String validRequest = "symbols=METC:provider=bogus:content=TOP_OF_BOOK"; assertNotNull(MarketDataRequestBuilder.newRequestFromString(validRequest)); DataFlowID flow = moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN, validRequest), new DataRequest(receiverUrn) }); MarketDataFeedTestBase.wait(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return receiver.data.size() >= 2; } }); moduleManager.cancel(flow); // try again with a MarketDataRequest object receiver.data.clear(); validRequest = "symbols=GOOG:provider=bogus:content=TOP_OF_BOOK"; flow = moduleManager.createDataFlow(new DataRequest[] { new DataRequest(MarketDataCoreModuleFactory.INSTANCE_URN, MarketDataRequestBuilder.newRequestFromString(validRequest)), new DataRequest(receiverUrn) }); MarketDataFeedTestBase.wait(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return receiver.data.size() >= 2; } }); moduleManager.cancel(flow); } /** * Receives test events. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: MarketDataCoreModuleTest.java 16901 2014-05-11 16:14:11Z colin $ * @since 2.4.0 */ private static class EventReceiver implements ISubscriber { /* (non-Javadoc) * @see org.marketcetera.core.publisher.ISubscriber#isInteresting(java.lang.Object) */ @Override public boolean isInteresting(Object inData) { return true; } /* (non-Javadoc) * @see org.marketcetera.core.publisher.ISubscriber#publishTo(java.lang.Object) */ @Override public void publishTo(Object inData) { SLF4JLoggerProxy.debug(MarketDataCoreModuleTest.class, "Received: {}", inData); data.add(inData); } /** * stores data received */ private final List<Object> data = Lists.newArrayList(); } /** * receives test events */ private EventReceiver receiver; /** * test receiver module used to verify events */ private ModuleURN receiverUrn; /** * test module manager value */ private ModuleManager moduleManager; }