package com.espertech.esper.example.transaction; 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; public class TestFindMissingEventStmt extends TestStmtBase { private static final int TIME_WINDOW_SIZE_MSEC = 1800 * 1000; private SupportUpdateListener listener; public void setUp() { super.setUp(); listener = new SupportUpdateListener(); FindMissingEventStmt stmt = new FindMissingEventStmt(epService.getEPAdministrator()); stmt.addListener(listener); // Use external clocking for the test epService.getEPRuntime().sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL)); } public void testFlow() { TxnEventA a[] = new TxnEventA[20]; TxnEventB b[] = new TxnEventB[20]; TxnEventC c[] = new TxnEventC[20]; int seconds = 1 * 60; // after 1 minutes sendEvent(new CurrentTimeEvent(seconds * 1000)); sendEvent(a[0] = new TxnEventA("id0", seconds * 1000, "c1")); sendEvent(b[0] = new TxnEventB("id0", seconds * 1000)); sendEvent(c[0] = new TxnEventC("id0", seconds * 1000, "s1")); seconds = 2 * 60; sendEvent(new CurrentTimeEvent(seconds * 1000)); sendEvent(a[1] = new TxnEventA("id1", seconds * 1000, "c1")); seconds = 3 * 60; sendEvent(new CurrentTimeEvent(seconds * 1000)); sendEvent(b[2] = new TxnEventB("id2", seconds * 1000)); seconds = 4 * 60; sendEvent(new CurrentTimeEvent(seconds * 1000)); sendEvent(b[3] = new TxnEventB("id3", seconds * 1000)); sendEvent(c[3] = new TxnEventC("id3", seconds * 1000, "s1")); seconds = 5 * 60; sendEvent(new CurrentTimeEvent(seconds * 1000)); sendEvent(a[4] = new TxnEventA("id4", seconds * 1000, "c1")); sendEvent(c[4] = new TxnEventC("id4", seconds * 1000, "s1")); seconds = 6 * 60; sendEvent(new CurrentTimeEvent(seconds * 1000)); sendEvent(a[5] = new TxnEventA("id5", seconds * 1000, "c1")); sendEvent(b[5] = new TxnEventB("id5", seconds * 1000)); listener.reset(); sendEvent(new CurrentTimeEvent(TIME_WINDOW_SIZE_MSEC + 1 * 60 * 1000)); // Expire "id0" from window assertFalse(listener.isInvoked()); sendEvent(new CurrentTimeEvent(TIME_WINDOW_SIZE_MSEC + 2 * 60 * 1000)); // Expire "id1" from window assertReceivedEvent(a[1], null); sendEvent(new CurrentTimeEvent(TIME_WINDOW_SIZE_MSEC + 3 * 60 * 1000)); assertReceivedEvent(null, b[2]); sendEvent(new CurrentTimeEvent(TIME_WINDOW_SIZE_MSEC + 4 * 60 * 1000)); assertFalse(listener.isInvoked()); sendEvent(new CurrentTimeEvent(TIME_WINDOW_SIZE_MSEC + 5 * 60 * 1000)); assertFalse(listener.isInvoked()); sendEvent(new CurrentTimeEvent(TIME_WINDOW_SIZE_MSEC + 6 * 60 * 1000)); assertReceivedTwoEvents(a[5], b[5]); } private void assertReceivedEvent(TxnEventA expectedA, TxnEventB expectedB) { assertEquals(1, listener.getOldDataList().size()); assertEquals(1, listener.getLastOldData().length); EventBean combinedEvent = listener.getLastOldData()[0]; compare(combinedEvent, expectedA, expectedB); listener.reset(); } private void assertReceivedTwoEvents(TxnEventA expectedA, TxnEventB expectedB) { assertEquals(1, listener.getOldDataList().size()); assertEquals(2, listener.getLastOldData().length); // The order is not guaranteed if (listener.getLastOldData()[0].get("A") == expectedA) { compare(listener.getLastOldData()[0], expectedA, null); compare(listener.getLastOldData()[1], null, expectedB); } else { compare(listener.getLastOldData()[1], expectedA, null); compare(listener.getLastOldData()[0], null, expectedB); } listener.reset(); } private static void compare(EventBean combinedEvent, TxnEventA expectedA, TxnEventB expectedB) { assertSame(expectedA, combinedEvent.get("A")); assertSame(expectedB, combinedEvent.get("B")); assertNull(combinedEvent.get("C")); } }