/*
***************************************************************************************
* 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.regression.pattern;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderIsolated;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.client.time.CurrentTimeEvent;
import com.espertech.esper.client.util.DateTime;
import com.espertech.esper.supportregression.util.SupportEngineFactory;
import junit.framework.TestCase;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class TestPatternMicrosecondResolution extends TestCase {
private Map<TimeUnit, EPServiceProvider> epServices;
public void setUp() {
epServices = SupportEngineFactory.setupEnginesByTimeUnit();
}
public void tearDown() {
epServices = null;
}
public void testPatternIntervalMicrosecond() {
long time = DateTime.parseDefaultMSec("2002-05-30T09:00:00.000");
long currentTime = System.currentTimeMillis();
EPServiceProvider engineMillis = epServices.get(TimeUnit.MILLISECONDS);
EPServiceProvider engineMicros = epServices.get(TimeUnit.MICROSECONDS);
runAssertionPattern(engineMillis, 0, "timer:interval(1)", 1000);
runAssertionPattern(engineMicros, 0, "timer:interval(1)", 1000000);
runAssertionPattern(engineMillis, 0, "timer:interval(10 sec 5 msec)", 10005);
runAssertionPattern(engineMicros, 0, "timer:interval(10 sec 5 msec 1 usec)", 10005001);
runAssertionPattern(engineMillis, 0, "timer:interval(1 month 10 msec)", timePlusMonth(0, 1) + 10);
runAssertionPattern(engineMicros, 0, "timer:interval(1 month 10 usec)", timePlusMonth(0, 1) * 1000 + 10);
runAssertionPattern(engineMillis, currentTime, "timer:interval(1 month 50 msec)", timePlusMonth(currentTime, 1) + 50);
runAssertionPattern(engineMicros, currentTime*1000+33, "timer:interval(3 month 100 usec)", timePlusMonth(currentTime, 3)*1000 + 33 + 100);
runAssertionPattern(engineMillis, time, "timer:at(1, *, *, *, *, *)", time + 60000);
runAssertionPattern(engineMicros, time*1000+123, "timer:at(1, *, *, *, *, *)", time*1000 + 60000000 + 123);
// Schedule Date-only
runAssertionPattern(engineMillis, time, "timer:schedule(iso:'2002-05-30T09:01:00')", time + 60000);
runAssertionPattern(engineMicros, time*1000+123, "timer:schedule(iso:'2002-05-30T09:01:00')", time*1000+60000000);
// Schedule Period-only
runAssertionPattern(engineMillis, time, "every timer:schedule(period: 2 minute)", time + 120000);
runAssertionPattern(engineMicros, time*1000+123, "every timer:schedule(period: 2 minute)", time*1000+123 + 120000000);
// Schedule Date+period
runAssertionPattern(engineMillis, time, "every timer:schedule(iso:'2002-05-30T09:00:00/PT1M')", time + 60000);
runAssertionPattern(engineMicros, time*1000+345, "every timer:schedule(iso:'2002-05-30T09:00:00/PT1M')", time*1000+60000000);
// Schedule recurring period
runAssertionPattern(engineMillis, time, "every timer:schedule(iso:'R2/PT1M')", time + 60000, time + 120000);
runAssertionPattern(engineMicros, time*1000+345, "every timer:schedule(iso:'R2/PT1M')", time*1000+345+60000000, time*1000+345+120000000);
// Schedule date+recurring period
runAssertionPattern(engineMillis, time, "every timer:schedule(iso:'R2/2002-05-30T09:01:00/PT1M')", time + 60000, time + 120000);
runAssertionPattern(engineMicros, time*1000+345, "every timer:schedule(iso:'R2/2002-05-30T09:01:00/PT1M')", time*1000+60000000, time*1000+120000000);
// Schedule with date computation
runAssertionPattern(engineMillis, time, "timer:schedule(date: current_timestamp.withTime(9, 1, 0, 0))", time + 60000);
runAssertionPattern(engineMicros, time*1000+345, "timer:schedule(date: current_timestamp.withTime(9, 1, 0, 0))", time*1000 + 345 + 60000000);
}
private void runAssertionPattern(EPServiceProvider epService, long startTime, String patternExpr, long ... flipTimes) {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("iso");
isolated.getEPRuntime().sendEvent(new CurrentTimeEvent(startTime));
SupportUpdateListener listener = new SupportUpdateListener();
EPStatement stmt = isolated.getEPAdministrator().createEPL("select * from pattern[" + patternExpr + "]", "s0", null);
stmt.addListener(listener);
int count = 0;
for (long flipTime : flipTimes) {
isolated.getEPRuntime().sendEvent(new CurrentTimeEvent(flipTime - 1));
assertFalse("Failed for flip " + count, listener.getAndClearIsInvoked());
isolated.getEPRuntime().sendEvent(new CurrentTimeEvent(flipTime));
assertTrue("Failed for flip " + count, listener.getAndClearIsInvoked());
count++;
}
isolated.getEPRuntime().sendEvent(new CurrentTimeEvent(Long.MAX_VALUE));
assertFalse(listener.getAndClearIsInvoked());
isolated.destroy();
}
private static long timePlusMonth(long timeInMillis, int monthToAdd) {
Calendar cal = GregorianCalendar.getInstance();
cal.setTimeInMillis(timeInMillis);
cal.add(Calendar.MONTH, monthToAdd);
return cal.getTimeInMillis();
}
}