/*
* *************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* 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.scopetest.EPAssertionUtil;
import junit.framework.TestCase;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.support.bean.SupportMarketDataBean;
import com.espertech.esper.support.event.EventFactoryHelper;
import com.espertech.esper.support.schedule.SupportSchedulingServiceImpl;
import com.espertech.esper.support.view.SupportBeanClassView;
import com.espertech.esper.support.view.SupportStatementContextFactory;
import com.espertech.esper.support.view.SupportViewDataChecker;
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(null, SupportStatementContextFactory.makeAgentInstanceViewFactoryContext(schedulingServiceStub), 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(null, SupportStatementContextFactory.makeAgentInstanceViewFactoryContext(schedulingServiceStub), 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);
}
public void testComputeWaitMSec()
{
// With current=2300, ref=1000, and interval=500, expect 2500 as next interval and 200 as solution
long result = TimeBatchView.computeWaitMSec(2300, 1000, 500);
assertEquals(200, result);
result = TimeBatchView.computeWaitMSec(2300, 4200, 500);
assertEquals(400, result);
result = TimeBatchView.computeWaitMSec(2200, 4200, 500);
assertEquals(500, result);
result = TimeBatchView.computeWaitMSec(2200, 2200, 500);
assertEquals(500, result);
result = TimeBatchView.computeWaitMSec(2201, 2200, 500);
assertEquals(499, result);
result = TimeBatchView.computeWaitMSec(2600, 2200, 500);
assertEquals(100, result);
result = TimeBatchView.computeWaitMSec(2699, 2200, 500);
assertEquals(1, result);
result = TimeBatchView.computeWaitMSec(2699, 2700, 500);
assertEquals(1, result);
result = TimeBatchView.computeWaitMSec(2699, 2700, 10000);
assertEquals(1, result);
result = TimeBatchView.computeWaitMSec(2700, 2700, 10000);
assertEquals(10000, result);
result = TimeBatchView.computeWaitMSec(2700, 6800, 10000);
assertEquals(4100, result);
result = TimeBatchView.computeWaitMSec(23050, 16800, 10000);
assertEquals(3750, result);
}
}