/* *************************************************************************************** * 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.nwtable; import com.espertech.esper.client.Configuration; import com.espertech.esper.client.EPServiceProviderManager; import com.espertech.esper.client.EPStatement; import com.espertech.esper.client.scopetest.EPAssertionUtil; import com.espertech.esper.client.scopetest.SupportUpdateListener; import com.espertech.esper.core.service.EPServiceProviderSPI; import com.espertech.esper.core.service.EPStatementSPI; import com.espertech.esper.core.service.StatementType; import com.espertech.esper.epl.named.NamedWindowLifecycleEvent; import com.espertech.esper.metrics.instrumentation.InstrumentationHelper; import com.espertech.esper.supportregression.bean.SupportBean; import com.espertech.esper.supportregression.bean.SupportBean_A; import com.espertech.esper.supportregression.client.SupportConfigFactory; import com.espertech.esper.supportregression.epl.SupportNamedWindowObserver; import junit.framework.TestCase; public class TestInfraStartStop extends TestCase { private EPServiceProviderSPI epService; private SupportUpdateListener listenerWindow; private SupportUpdateListener listenerSelect; public void setUp() { Configuration config = SupportConfigFactory.getConfiguration(); config.getEngineDefaults().getLogging().setEnableQueryPlan(true); epService = (EPServiceProviderSPI) EPServiceProviderManager.getDefaultProvider(config); epService.initialize(); listenerWindow = new SupportUpdateListener(); listenerSelect = new SupportUpdateListener(); if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());} } protected void tearDown() throws Exception { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();} listenerWindow = null; listenerSelect = null; } public void testStartStopDeleter() { runAssertionStartStopDeleter(true); runAssertionStartStopDeleter(false); } public void testStartStopConsumer() { runAssertionStartStopConsumer(true); runAssertionStartStopConsumer(false); } public void testStartStopInserter() { runAssertionStartStopInserter(true); runAssertionStartStopInserter(false); } private void runAssertionStartStopInserter(boolean namedWindow) { // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); stmtCreate.addListener(listenerWindow); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); EPStatement stmtInsert = epService.getEPAdministrator().createEPL(stmtTextInsertOne); // create consumer String[] fields = new String[] {"a", "b"}; String stmtTextSelect = "select a, b from MyInfra as s1"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // send 1 event sendSupportBean("E1", 1); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}}); // stop inserter stmtInsert.stop(); sendSupportBean("E2", 2); assertFalse(listenerWindow.isInvoked()); assertFalse(listenerSelect.isInvoked()); // start inserter stmtInsert.start(); // consumer receives the next event sendSupportBean("E3", 3); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E1", 1}, {"E3", 3}}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E3", 3}}); // destroy inserter stmtInsert.destroy(); sendSupportBean("E4", 4); assertFalse(listenerWindow.isInvoked()); assertFalse(listenerSelect.isInvoked()); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionStartStopConsumer(boolean namedWindow) { // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); stmtCreate.addListener(listenerWindow); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // create consumer String[] fields = new String[] {"a", "b"}; String stmtTextSelect = "select a, b from MyInfra as s1"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // send 1 event sendSupportBean("E1", 1); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}}); // stop consumer stmtSelect.stop(); sendSupportBean("E2", 2); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); } assertFalse(listenerSelect.isInvoked()); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}}); // start consumer: the consumer has the last event even though he missed it stmtSelect.start(); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtSelect.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}}); // consumer receives the next event sendSupportBean("E3", 3); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); // destroy consumer stmtSelect.destroy(); sendSupportBean("E4", 4); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E4", 4}); } assertFalse(listenerSelect.isInvoked()); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionStartStopDeleter(boolean namedWindow) { SupportNamedWindowObserver observer = new SupportNamedWindowObserver(); NamedWindowLifecycleEvent theEvent; if (namedWindow) { epService.getNamedWindowMgmtService().addObserver(observer); } // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); assertEquals(namedWindow ? StatementType.CREATE_WINDOW : StatementType.CREATE_TABLE, ((EPStatementSPI) stmtCreate).getStatementMetadata().getStatementType()); stmtCreate.addListener(listenerWindow); if (namedWindow) { theEvent = observer.getFirstAndReset(); assertEquals(NamedWindowLifecycleEvent.LifecycleEventType.CREATE, theEvent.getEventType()); assertEquals("MyInfra", theEvent.getName()); } // stop and start, no consumers or deleters stmtCreate.stop(); if (namedWindow) { theEvent = observer.getFirstAndReset(); assertEquals(NamedWindowLifecycleEvent.LifecycleEventType.DESTROY, theEvent.getEventType()); assertEquals("MyInfra", theEvent.getName()); } stmtCreate.start(); if (namedWindow) { assertEquals(NamedWindowLifecycleEvent.LifecycleEventType.CREATE, observer.getFirstAndReset().getEventType()); } // create delete stmt String stmtTextDelete = "on " + SupportBean_A.class.getName() + " delete from MyInfra"; EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // create consumer String[] fields = new String[] {"a", "b"}; String stmtTextSelect = "select irstream a, b from MyInfra as s1"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // send 1 event sendSupportBean("E1", 1); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); } else { assertFalse(listenerWindow.isInvoked()); assertFalse(listenerSelect.isInvoked()); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}}); // Delete all events, 1 row expected sendSupportBean_A("A2"); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E1", 1}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetOldAndReset(), fields, new Object[]{"E1", 1}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, null); sendSupportBean("E2", 2); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E2", 2}}); // Stop the deleting statement stmtDelete.stop(); sendSupportBean_A("A2"); assertFalse(listenerWindow.isInvoked()); // Start the deleting statement stmtDelete.start(); sendSupportBean_A("A3"); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E2", 2}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetOldAndReset(), fields, new Object[]{"E2", 2}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, null); sendSupportBean("E3", 3); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E3", 3}}); stmtDelete.destroy(); sendSupportBean_A("A3"); assertFalse(listenerWindow.isInvoked()); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private SupportBean_A sendSupportBean_A(String id) { SupportBean_A bean = new SupportBean_A(id); epService.getEPRuntime().sendEvent(bean); return bean; } private SupportBean sendSupportBean(String theString, int intPrimitive) { SupportBean bean = new SupportBean(); bean.setTheString(theString); bean.setIntPrimitive(intPrimitive); epService.getEPRuntime().sendEvent(bean); return bean; } }