/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.example.marketdatafeed; import com.espertech.esper.client.Configuration; import com.espertech.esper.client.EPServiceProvider; import com.espertech.esper.client.EPServiceProviderManager; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.scopetest.SupportUpdateListener; import com.espertech.esper.client.time.CurrentTimeEvent; import com.espertech.esper.client.time.TimerControlEvent; import junit.framework.TestCase; public class TestTicksFalloffStatement extends TestCase { private EPServiceProvider epService; private SupportUpdateListener listener; public void setUp() { Configuration configuration = new Configuration(); configuration.getEngineDefaults().getThreading().setInternalTimerEnabled(false); configuration.addEventType("MarketDataEvent", MarketDataEvent.class.getName()); epService = EPServiceProviderManager.getProvider("TestTicksPerSecondStatement", configuration); epService.initialize(); epService.getEPRuntime().sendEvent(new CurrentTimeEvent(0)); new TicksPerSecondStatement(epService.getEPAdministrator()); TicksFalloffStatement stmt = new TicksFalloffStatement(epService.getEPAdministrator()); listener = new SupportUpdateListener(); stmt.addListener(listener); // Use external clocking for the test epService.getEPRuntime().sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL)); } public void testFlow() { sendEvents(1000, 50, 150); // Set time to 1 second, send 100 feed A and 150 feed B sendEvents(1500, 50, 50); sendEvents(2000, 60, 130); sendEvents(2500, 40, 70); sendEvents(3000, 50, 150); sendEvents(3500, 50, 50); sendEvents(4000, 50, 150); sendEvents(4500, 50, 50); sendEvents(5000, 50, 150); sendEvents(5500, 50, 50); sendEvents(6000, 50, 24); assertFalse(listener.isInvoked()); sendEvents(6500, 50, 50); sendEvents(7000, 50, 150); assertReceived(FeedEnum.FEED_B, (200 * 5 + 74) / 6, 74); sendEvents(7500, 50, 50); sendEvents(8000, 50, 150); sendEvents(8500, 50, 50); sendEvents(9000, 60, 150); sendEvents(9500, 40, 50); sendEvents(10000, 50, 150); sendEvents(10500, 70, 50); sendEvents(11000, 30, 150); sendEvents(11500, 50, 50); sendEvents(12000, 40, 150); assertFalse(listener.isInvoked()); sendEvents(12500, 30, 150); sendEvents(13000, 50, 150); assertReceived(FeedEnum.FEED_A, (100 * 9 + 70) / 10, 70); } private void assertReceived(FeedEnum feedEnum, double average, long count) { assertTrue(listener.isInvoked()); assertEquals(1, listener.getLastNewData().length); EventBean theEvent = listener.getLastNewData()[0]; assertEquals(feedEnum, theEvent.get("feed")); assertEquals(average, theEvent.get("avgCnt")); assertEquals(count, theEvent.get("feedCnt")); listener.reset(); } private void sendEvents(long timestamp, int numFeedA, int numFeedB) { epService.getEPRuntime().sendEvent(new CurrentTimeEvent(timestamp)); send(FeedEnum.FEED_A, numFeedA); send(FeedEnum.FEED_B, numFeedB); } private void send(FeedEnum feedEnum, int numEvents) { for (int i = 0; i < numEvents; i++) { epService.getEPRuntime().sendEvent(new MarketDataEvent("CSC", feedEnum)); } } }