package org.marketcetera.marketdata.csv; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.marketcetera.marketdata.Capability.LATEST_TICK; import static org.marketcetera.marketdata.Capability.TOP_OF_BOOK; import java.math.BigDecimal; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import org.junit.BeforeClass; import org.junit.Test; import org.marketcetera.core.LoggerConfiguration; import org.marketcetera.event.AskEvent; import org.marketcetera.event.BidEvent; import org.marketcetera.event.Event; import org.marketcetera.event.TradeEvent; import org.marketcetera.marketdata.Capability; import org.marketcetera.marketdata.MarketDataModuleTestBase; import org.marketcetera.marketdata.MarketDataRequestBuilder; import org.marketcetera.module.*; /** * Subclass from the main Market data test and verify that basic module functionality works * @author toli kuznets * @version $Id: CSVFeedModuleTest.java 16154 2012-07-14 16:34:05Z colin $ */ public class CSVFeedModuleTest extends MarketDataModuleTestBase { private static final String DATA_DIR = "src/test/sample_data/"; @BeforeClass public static void beforeClass() { LoggerConfiguration.logSetup(); } @Override protected void populateConfigurationProvider(ConfigurationProviderTest.MockConfigurationProvider inProvider) { inProvider.addValue(CSVFeedModuleFactory.INSTANCE_URN, "MarketdataDirectory", DATA_DIR); } @Override protected Capability[] getExpectedCapabilities() { return new Capability[] { TOP_OF_BOOK,LATEST_TICK }; } @Override protected String getProvider() { return CSVFeedModuleFactory.IDENTIFIER; } @Override protected ModuleFactory getFactory() { return new CSVFeedModuleFactory(); } @Override protected ModuleURN getInstanceURN() { return CSVFeedModuleFactory.INSTANCE_URN; } @Test(timeout = 60*1000) // 60 secs /** Setup a data flow where we receive events in our custom listener * Verify that the right events are coming through * Expecting one trade: * 12345,GOOG,N,400,100,TRADE */ public void testCSVMarketData_Trade() throws Exception { final BlockingQueue<Event> events = new ArrayBlockingQueue<Event>(50); moduleManager.addSinkListener(new SinkDataListener() { @Override public void receivedData(DataFlowID inFlowID, Object inData) { events.add((Event) inData); } }); CSVFeed feed = CSVFeedFactory.getInstance().getMarketDataFeed(); feed.doLogin(CSVFeedCredentials.getInstance(0, false, DATA_DIR, MockCSVFeedEventTranslator.class.getName())); MarketDataRequestBuilder builder = MarketDataRequestBuilder.newRequest(); DataFlowID dfid = moduleManager.createDataFlow(new DataRequest[] { new DataRequest(getInstanceURN(), builder.withSymbols("GOOG.csv") .withContent("LATEST_TICK").create()) }); try { Event event = events.take(); assertTrue(event.toString(), event instanceof TradeEvent); TradeEvent theTrade = (TradeEvent) event; assertEquals("GOOG", theTrade.getInstrument().getSymbol()); assertEquals(12345, theTrade.getTimeMillis()); assertEquals("N", theTrade.getExchange()); assertEquals(new BigDecimal("400"), theTrade.getPrice()); assertEquals(new BigDecimal("100"), theTrade.getSize()); assertEquals("GOOG", theTrade.getInstrument().getSymbol()); } finally { moduleManager.cancel(dfid); } } @Test(timeout = 60*1000) // 60 secs /** Setup a data flow where we receive events in our custom listener * Expecting 22 events, 2 asks, 20 bids * Verify that the right events are coming through * Expecting one trade: * 12345,GOOG,N,400,100,TRADE */ public void testCSVMarketData_TOB() throws Exception { final BlockingQueue<Event> events = new ArrayBlockingQueue<Event>(50); moduleManager.addSinkListener(new SinkDataListener() { @Override public void receivedData(DataFlowID inFlowID, Object inData) { events.add((Event) inData); } }); CSVFeed feed = CSVFeedFactory.getInstance().getMarketDataFeed(); feed.doLogin(CSVFeedCredentials.getInstance(0, false, DATA_DIR, MockCSVFeedEventTranslator.class.getName())); DataFlowID dfid = moduleManager.createDataFlow(new DataRequest[] { new DataRequest(getInstanceURN(), MarketDataRequestBuilder.newRequest().withSymbols("GOOG.csv") .withContent("TOP_OF_BOOK").create()) }); try { int nBids=0, nAsks = 0; for (int i=0; i<22; i++) { Event theEvent = events.take(); if(theEvent instanceof AskEvent) { nAsks++; } else if(theEvent instanceof BidEvent) { nBids++; } else { fail("Unexpected event: "+theEvent); } } assertEquals("bids", 20, nBids); assertEquals("asks", 2, nAsks); } finally { moduleManager.cancel(dfid); } } /* (non-Javadoc) * @see org.marketcetera.marketdata.MarketDataModuleTestBase#dataRequestFromString() */ @Override public void dataRequestFromString() throws Exception { } /* (non-Javadoc) * @see org.marketcetera.marketdata.MarketDataModuleTestBase#dataRequestProducesData() */ @Override public void dataRequestProducesData() throws Exception { } }