/*
***************************************************************************************
* 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 TestTimeWindowView extends TestCase {
private final static long TEST_WINDOW_MSEC = 60000;
private TimeWindowView 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 TimeWindowView(SupportStatementContextFactory.makeAgentInstanceViewFactoryContext(schedulingServiceStub), new TimeWindowViewFactory(), new ExprTimePeriodEvalDeltaConstGivenDelta(TEST_WINDOW_MSEC), null);
childView = new SupportBeanClassView(SupportMarketDataBean.class);
myView.addView(childView);
}
public void testViewPushAndExpire() {
long startTime = 1000000;
schedulingServiceStub.setTime(startTime);
assertTrue(schedulingServiceStub.getAdded().size() == 0);
Map<String, EventBean> events = EventFactoryHelper.makeEventMap(
new String[]{"a1", "b1", "b2", "c1", "d1", "e1", "f1", "f2"});
EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator());
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, null);
// 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_WINDOW_MSEC) != null);
schedulingServiceStub.getAdded().clear();
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("a1")}, myView.iterator());
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("a1")});
// Send more events, check
schedulingServiceStub.setTime(startTime + 10000);
myView.update(new EventBean[]{events.get("b1"), events.get("b2")}, null);
assertTrue(schedulingServiceStub.getAdded().size() == 0);
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("a1"), events.get("b1"), events.get("b2")}, myView.iterator());
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("b1"), events.get("b2")});
// Send more events, check
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC - 1);
myView.update(new EventBean[]{events.get("c1")}, null);
assertTrue(schedulingServiceStub.getAdded().size() == 0);
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("a1"), events.get("b1"), events.get("b2"), events.get("c1")}, myView.iterator());
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("c1")});
// Pretend we are getting the callback from scheduling, check old data and check new scheduling
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC);
myView.expire();
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("b1"), events.get("b2"), events.get("c1")}, myView.iterator());
SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("a1")});
SupportViewDataChecker.checkNewData(childView, null);
assertTrue(schedulingServiceStub.getAdded().size() == 1);
assertTrue(schedulingServiceStub.getAdded().get(10000L) != null);
schedulingServiceStub.getAdded().clear();
// Send another 2 events
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC);
myView.update(new EventBean[]{events.get("d1")}, null);
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("d1")});
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC + 1);
myView.update(new EventBean[]{events.get("e1")}, null);
assertTrue(schedulingServiceStub.getAdded().size() == 0);
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("e1")});
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("b1"), events.get("b2"), events.get("c1"), events.get("d1"), events.get("e1")}, myView.iterator());
// Pretend callback received
assertTrue(schedulingServiceStub.getAdded().size() == 0);
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC + 10000);
myView.expire();
SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("b1"), events.get("b2")});
SupportViewDataChecker.checkNewData(childView, null);
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("c1"), events.get("d1"), events.get("e1")}, myView.iterator());
assertTrue(schedulingServiceStub.getAdded().size() == 1);
assertTrue(schedulingServiceStub.getAdded().get(49999L) != null);
schedulingServiceStub.getAdded().clear();
// Pretend callback received
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC + 59999);
myView.expire();
SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("c1")});
SupportViewDataChecker.checkNewData(childView, null);
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("d1"), events.get("e1")}, myView.iterator());
assertTrue(schedulingServiceStub.getAdded().size() == 1);
assertTrue(schedulingServiceStub.getAdded().get(1L) != null);
schedulingServiceStub.getAdded().clear();
// Send another event
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC + 200);
myView.update(new EventBean[]{events.get("f1"), events.get("f2")}, null);
assertTrue(schedulingServiceStub.getAdded().size() == 0);
SupportViewDataChecker.checkOldData(childView, null);
SupportViewDataChecker.checkNewData(childView, new EventBean[]{events.get("f1"), events.get("f2")});
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("d1"), events.get("e1"), events.get("f1"), events.get("f2")}, myView.iterator());
// Pretend callback received, we didn't schedule for 1 msec after, but for 100 msec after
// testing what happens when clock resolution or some other delay happens
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC + 60099);
myView.expire();
SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("d1"), events.get("e1")});
SupportViewDataChecker.checkNewData(childView, null);
EPAssertionUtil.assertEqualsExactOrder(new EventBean[]{events.get("f1"), events.get("f2")}, myView.iterator());
assertTrue(schedulingServiceStub.getAdded().size() == 1);
assertTrue(schedulingServiceStub.getAdded().get(101L) != null);
schedulingServiceStub.getAdded().clear();
// Pretend callback received
schedulingServiceStub.setTime(startTime + TEST_WINDOW_MSEC + 60201);
myView.expire();
SupportViewDataChecker.checkOldData(childView, new EventBean[]{events.get("f1"), events.get("f2")});
SupportViewDataChecker.checkNewData(childView, null);
EPAssertionUtil.assertEqualsExactOrder(null, myView.iterator());
assertTrue(schedulingServiceStub.getAdded().size() == 0);
}
public EventBean[] makeEvents(String[] ids) {
return EventFactoryHelper.makeEvents(ids);
}
}