/* *************************************************************************************** * 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.view.window; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.scopetest.EPAssertionUtil; import com.espertech.esper.core.support.SupportSchedulingServiceImpl; import com.espertech.esper.core.support.SupportStatementContextFactory; import com.espertech.esper.epl.expression.time.ExprTimePeriodEvalDeltaConstGivenDelta; import com.espertech.esper.supportunit.bean.SupportMarketDataBean; import com.espertech.esper.supportunit.event.EventFactoryHelper; import com.espertech.esper.supportunit.view.SupportBeanClassView; import com.espertech.esper.supportunit.view.SupportViewDataChecker; import junit.framework.TestCase; import java.util.Map; public class TestTimeBatchView extends TestCase { private final static long TEST_INTERVAL_MSEC = 10000; private TimeBatchView myView; private SupportBeanClassView childView; private SupportSchedulingServiceImpl schedulingServiceStub; public void setUp() { // Set the scheduling service to use schedulingServiceStub = new SupportSchedulingServiceImpl(); // Set up length window view and a test child view myView = new TimeBatchView(new TimeBatchViewFactory(), SupportStatementContextFactory.makeAgentInstanceViewFactoryContext(schedulingServiceStub), new ExprTimePeriodEvalDeltaConstGivenDelta(TEST_INTERVAL_MSEC), null, false, false, null); childView = new SupportBeanClassView(SupportMarketDataBean.class); myView.addView(childView); } public void testViewPushNoRefPoint() { long startTime = 1000000; schedulingServiceStub.setTime(startTime); assertTrue(schedulingServiceStub.getAdded().size() == 0); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); Map<String, EventBean> events = EventFactoryHelper.makeEventMap( new String[]{"a1", "b1", "b2", "c1", "d1"}); // Send new events to the view - should have scheduled a callback for X msec after myView.update(new EventBean[]{events.get("a1")}, null); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC) != null); schedulingServiceStub.getAdded().clear(); EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("a1")}, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); // Data got batched, no data release till later schedulingServiceStub.setTime(startTime + 5000); myView.update(new EventBean[]{events.get("b1"), events.get("b2")}, null); EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("a1"), events.get("b1"), events.get("b2")}, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); assertTrue(schedulingServiceStub.getAdded().size() == 0); // Pretend we have a callback, check data, check scheduled new callback schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("a1"), events.get("b1"), events.get("b2")}); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC) != null); schedulingServiceStub.getAdded().clear(); // Pretend callback received again, should schedule a callback since the last interval showed data schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 2); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("a1"), events.get("b1"), events.get("b2")}); // Old data is published SupportViewDataChecker.checkNewData(childView, null); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC) != null); schedulingServiceStub.getAdded().clear(); // Pretend callback received again, not schedule a callback since the this and last interval showed no data schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 3); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); assertTrue(schedulingServiceStub.getAdded().size() == 0); // Send new event to the view - pretend we are 500 msec into the interval schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 3 + 500); myView.update(new EventBean[]{events.get("c1")}, null); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC - 500) != null); schedulingServiceStub.getAdded().clear(); EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("c1")}, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); // Data got batched, no data release till later // Pretend callback received again schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 4); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("c1")}); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC) != null); schedulingServiceStub.getAdded().clear(); // Send new event to the view schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 4 + 500); myView.update(new EventBean[]{events.get("d1")}, null); assertTrue(schedulingServiceStub.getAdded().size() == 0); EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("d1")}, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); // Pretend callback again schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 5); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("c1")}); SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("d1")}); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC) != null); schedulingServiceStub.getAdded().clear(); // Pretend callback again schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 6); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("d1")}); SupportViewDataChecker.checkNewData(childView, null); // Pretend callback again schedulingServiceStub.setTime(startTime + TEST_INTERVAL_MSEC * 7); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); } public void testViewPushWithRefPoint() { long startTime = 50000; schedulingServiceStub.setTime(startTime); myView = new TimeBatchView(new TimeBatchViewFactory(), SupportStatementContextFactory.makeAgentInstanceViewFactoryContext(schedulingServiceStub), new ExprTimePeriodEvalDeltaConstGivenDelta(TEST_INTERVAL_MSEC), 1505L, false, false, null); childView = new SupportBeanClassView(SupportMarketDataBean.class); myView.addView(childView); Map<String, EventBean> events = EventFactoryHelper.makeEventMap( new String[]{"A1", "A2", "A3"}); // Send new events to the view - should have scheduled a callback for X msec after myView.update(new EventBean[]{events.get("A1"), events.get("A2"), events.get("A3")}, null); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(1505L) != null); schedulingServiceStub.getAdded().clear(); EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("A1"), events.get("A2"), events.get("A3")}, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, null); // Data got batched, no data release till later // Pretend we have a callback, check data, check scheduled new callback schedulingServiceStub.setTime(startTime + 1505); myView.sendBatch(); EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator()); SupportViewDataChecker.checkOldData(childView, null); SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("A1"), events.get("A2"), events.get("A3")}); assertTrue(schedulingServiceStub.getAdded().size() == 1); assertTrue(schedulingServiceStub.getAdded().get(TEST_INTERVAL_MSEC) != null); } }